Jmol.___JmolDate="$Date: 2025-08-08 04:46:51 -0500 (Fri, 08 Aug 2025) $"
Jmol.___fullJmolProperties="src/org/jmol/viewer/Jmol.properties"

# THIS IS THE TRUNK - for development and release


# Developers: to add a description of changes you have made,
#  add it on a line below the "Jmol.___JmolVersion=..." line.
#  Don't use Jmol.___ in your text, as that is the key for stripping out
#  the information saved in the JAR version of this file.
#  The quotes above	 look odd for a parameter file, but they are 
#  important for the JavaScript version of Jmol.
#
# A full Jmol/JSpecView/JSmol release requires the following:
#
# 1. Generate a new version number. This should be done as in the following examples, 
#    listed in order of appearance:
#
#    previous     new
#
#    14.8.10  14.8.11-beta-2016-12-20 a beta release of 14.8.11 with a timestamp for Dec 20, 2016
#    14.8.10  14.8.11                 bug fixes only - patch level
#    14.8.10  14.9.1                  new features - minor version level (tag for Maven, create branch)
#    14.8.10  15.1.1                  new features - major version level (tag for Maven, create branch)
#
#  The distinction between major and minor is arbitrary.
#
#  Note that -beta releases will be to https://sourceforge.net/projects/jmol/files/Jmol-beta
#  while full releases will be to https://sourceforge.net/projects/jmol/files/Jmol.
#
# 2. Create a new Jmol.___... line and remove "Jmol.___" from the line for the
#    previous release; failure to do remove this line will use the original release number, 
#    not the new one, since this is a property file.
#
# 3. If this is legacy Jmol (SourceForge) run the Ant task build-1-unzip-jsmol-to-site.xml
#     and then do a clean build of the project (Eclipse Project...clean...Jmol)
#
# 4. You should be able to test the JavaScript in JSmol.htm in the /site directory. 
#
# 5. Now run build-2-jsmol.zip.xml to create the full jsmol.zip file in the appletweb/ folder.
#    This creates the compressed files; you can test now the HTML in the site/jsmol directory.
# 
# 6. Run jmol build.xml (including dist, which also initiates a release now)
#
# 7. For legacy Jmol, you will have to go to SourceForge and manually create 
#    a new release directory and drop the three zip files and this jmol.propertiese file into it. 
#    They will be in the build/release/version... subfolder 
#    (or figure out how to do that with a private key, because I couldn't)
#
# TODO: fix UNDO
# TODO: check RN=X=NR stereo# TODO: should suppress painting during adding of hydrogens
# TODO: SMILES adding a stereocenter if the preceding chain matches a future chain.
# FEATURE REQUEST: dock/undock consoles to main window.
# TODO: allow FIXED to work with MODELKIT MINIMIZE

Jmol.___JmolVersion="16.3.33" // (legacy) also 16.3.34 (swingJS) 

bug fix (legacy only): PyMOL putty rendering broken in 16.3.15 (2025.04.10)

bug fix (JSpecView, for IUPAC FAIRSpec only): JDX header delivery incomplete

new feature: format("STRING", ";base64,MSwyLWJpcygzLWNobG9yby00LDUtZGltZXRob3h5cGhlbnlsKWV0aGFuZS56aXA=")
  -- decodes base64 string 
  -- in this case, giving "1,2-bis(3-chloro-4,5-dimethoxyphenyl)ethane.zip"

JmolVersion="16.3.31" // (legacy) also 16.3.32 (swingJS) 

bug fix: incommensurately modulated magnetic CIF file reading issues

bug fix: COMPARE failing
 -- for example:
        load "=3HG5";
        compare {*:A or :C} {*:B or :D} SUBSET{*.CA} ATOMS ROTATE TRANSLATE 2.0;

bug fix: {a}.distance.min({b}) not working
 -- for example:
        load "=3HG5"
        compare {*:A or :C} {*:B or :D} SUBSET{*.CA} ATOMS ROTATE TRANSLATE 2.0
        x= {:A.CA}.distance.min({:B.CA})
        {:A.CA}.property_d = x
        {:B.CA}.property_d = x
        color property_d
        backbone -0.3
    
new feature: set defaultDrawArrowScale -x.x
 -- negative value scales the arrow head width instead of length
 
 -- for example:
      draw width 0.2 vector {0 0 0} {1 1 1};
      set defaultDrawArrowScale -0.67;
 

JmolVersion="16.3.29" // (legacy) also 16.3.30 (swingJS) 

bug fix: removing ",z" from plane and frieze group operations listing and drawing

bug fix: minor issues with FINDSPACEGROUP JSON->spinCIF conversion and reading spinCIF files


JmolVersion="16.3.27" // (legacy) also 16.3.28 (swingJS) 

bug fix: jsmol.js (legacy only) problem with incomplete initialization of applet gives 0-size image error
 
bug fix: CIF reading and processing of operations can fail with 2/3+x rather than the usual x+2/3

new feature: spinCIF and FINDSPINGROUP output readers
 -- 
note: use of variables starting with $ is not documented. 
    These are object references
        draw ID d... : 
          $d the center of this drawing
          $d[1] the first point
        for example:
            $ draw id p plane {0 0 0} {1 1 1} {1 0 0}
            $ print $p
              {0.75 0.25 0.25}
            $ print $p[1]
              {0.0 0.0 0.0}
            $ print $p[2]
              {1.0 1.0 1.0}
            $ print $p[3]
              {1.5 0.5 0.5} 
            $ draw id p symop 3
              print $p
            
new feature: symop(@2, "basis") or symop(@@2, "basis") {1.1}.symop(@2)
 -- returns the single-atom bitset of the basis atom for this atom
    (the first atom that is symmetry-equivalent with this atom, as part
    of the asymmetric unit)
 -- optional choice of specific model (@@2 for current)
 -- essentially the same as {this && site=@{@@2.site}}[1] but simpler
 -- the {1.1}.symop(@2) form is useful if checking a model that is not the current one
     
new feature: symop(@@2, "cif2")
 -- returns a simple CIF-2 format descriptor of all operations that 
    transform the basis atom for the site to this atom's position
    with the specific translation needed, in the form:
    
     <id> [tx ty tz] 
    
    For example, 
    
    $ load =ams/quartz 1 packed
    $ print symop(@@3, "cif2")

        2 [0 0 0]
        3 [0 0 0]
        
new feature: atom.spin
 -- for spin space groups only
 -- reports the index (1-based) of the spin operation for this atom

new feature: _M.spinList
 -- list of spin operations (such as "u,-v,w") 
 -- _M.spinList[atom.spin] gets the operation string. 
 -- This list is collected during processing of the spinCIF file.
 
bug fix: SMARTS searching not distinguishing /open/ from /openstrict/ properly
 -- /open/ should not check aromatic ring planarity, while /openstrict/ should.
 -- SMARTS options include:
 
    Jmol 0D: (not settable)  just check bonding; no planarity issue in 0D (that is, SMARTS against SMILES)
    Jmol default 3D: /strict/ check bonding and planarity, using "chemist's" Hueckel rules
    OpenSMILES 0D or 3D: /open/, just check bonding using OpenSMILES Hueckel rules; 
    OpenSMILES 3D: /openstrict/ check bonding and planarity, using OpenSMILES Hueckel rules
    turn off aromaticity checks: /noaromatic/ -- just disregard aromatic aspects entirely


JmolVersion="16.3.25" // (legacy) also 16.3.26 (swingJS) 

bug fix: symop(3,"array") should return .draw script with id "sym_", not "array"
 
bug fix: spin space group loading updated for too many atoms
 
new feature: PNG, JPG and JPG64 image encoders allow for specified DPI (dots per inch)
 -- indicated quality > 90 is interpreted as DPI
 -- PNG values from 1-9 are still (rarely used?) compression options (2 is default for 9 < quality < 90)
 -- JPG values from 1-90 are still JPG image quality 
       (default 100 - "highest quality" for JPG; 75 for JPG64)
 -- quality as DPI sets the quality to its default value
 -- default DPI is now 300 dpi
 -- quality comes after any image size indication
 -- for example:
 
  write PNGJ 600 "xxxx.png" 
  
        OK PNGJ 126817 xxxx.png; quality=2; DPI=600; width=797; height=558
        
  write IMAGE 300 400 600 "t.jpg"

        OK JPG 65864 t.jpg; quality=100; DPI=600; width=300; height=400

new feature: spinop(3,"uvw")
 -- generates spin-operator u,v,w string format
 
new feature: x = matrix(stringMatrix) 
 -- allows stringMatrix to contain functions and math expressions
 -- used in spinCIF reader: 
 
   mh2c = matrix("[[1,1/sqrt(3),0],[0,2/sqrt(3),0],[0,0,1]]");
  
new feature: delay (seconds or milliseconds) scriptToRun
 -- adds optional script to run after this time
 -- halts  currently running script
 
new feature: x = matrix(axis,angle)
 -- generates the transformation matrix associated with an axis-angle (angle in degrees)
 
new feature: VASP POSCAR reader reads # MAGMOM line for magnetic moments
 -- feature of files created by FINDSYMGROUP

JmolVersion="16.3.23" // (legacy) also 16.3.24 (swingJS) 

bug fix: load *xxxx should use lower case for retrieving mmCIF files from PDBe.

bug fix: struts do not connect directly to rockets or trace

bug fix: write OBJ does not create rockets or vectors

new feature: BCIF, mmCIF, and MMTF file readers auto-detect carbohydrate residues
 -- uses _chem_comp.type containing "saccharide" 
 -- for example:
  
      load *3kle
      select carbohydrate
      print {selected}.group.pivot.keys.join(",")

        GLC,Z9N
 
new feature: getProperty("cifInfo", fname+ ";keys=tag1,tag2,tag3...")
 -- retrieve CIF file structure for only specific tags
 -- now exits parsing once all loop data for the given tags are found
 -- avoids memory overflow in very large mmcif files
 -- must be complete tags (partial tags can also be found, but won't close reading) 
 -- for example:

        cifinfo = getProperty("cifInfo", "*3kle;keys=_chem_comp.id,_chem_comp.type,_chem_comp.name" ).models[1];

new feature: array.find(regex, "index")
 -- carries out a REGEX pattern search within an array of strings
 -- returns an array of indexes (1-based) of elements found with this string
 -- for example:
 
        cifinfo = getProperty("cifInfo", "*3kle;keys=_chem_comp.id,_chem_comp.type,_chem_comp.name" ).models[1];
        ccids = cifinfo._chem_comp_id; // NAG
        cctypes = cifinfo._chem_comp_type; // saccharide
        ccnames = cifinfo._chem_comp_name; // N-Acetyl...
        list = cctypes.find("saccharide", "index");
        for (var j in list) {
           print ccids[j] + " " + ccnames[j]
        }
        
            GLC alpha-D-glucopyranose
            Z9N alpha-D-fructofuranose
        
new feature array.find(regex,"i|m|v", "index")
 -- carries out a REGEX pattern search
 -- using "i" (case-insenstive) or "m" (match) or "v" (not-present) or some combination of these
 -- adding "index" returns the index of element
 -- for example:  

        $ a = ["Alpha", "Beta", "gamma"]
        $ print a.find("A").join(",")
        
          Alpha
        
        $ print a.find("A","i").join(",")
        
          Alpha,Beta,gamma
        
        $ print a.find("A","i", "index").join(",")
        
          1,2,3


JmolVersion="16.3.21" // (legacy) also 16.3.22 (swingJS) 

bug fix: PDBe *xxxx should not require lower case entry

bug fix: (Legacy JavaScript only) array sorting may fail in script saving.

new feature: more spin space group support
 - adds     _space_group_spin.rotation_axis_xyz
   same as  _space_group_spin.rotation_axis
 - adds support for spin frame with reciprocal lattice a*, b*, c*
   limitation: any x* in expression turns all x into x*
   
new feature: CIF loader for magnetic structures adds filter "spinonly"
 - only atoms that have spin are read
 
new feature: matrix.array() same as matrix.array

new feature: point(arrayOfArrays) produces array of points

bug fix: OBJ/MTL exporter has inverted Tr (translucency) setting x; should be 1-x

bug fix: Cartesian exporters (IDTF, Maya, OBJ, VRML) not rendering vector cylinders


JmolVersion="16.3.19" // (legacy) also 16.3.20 (swingJS) 

bug fix: (JavaScript legacy only) array sorting fails for arrays of arrays and sort(columnNumber);

bug fix: !(atomset) fails to recognize that some atoms 
         may have been deleted.

new feature: CIF loader for magnetic structures adds filter "spinonly"
 - only atoms that have spin are read
 
new feature: more spin space group support
 - adds     _space_group_spin.rotation_axis_xyz
   same as  _space_group_spin.rotation_axis
 - adds support for spin frame with reciprocal lattice a*, b*, c*
   limitation: any x* in expression turns all x into x*
   
new feature: matrix.array() same as matrix.array

new feature: point(arrayOfArrays) produces array of points

new feature: spinCIF reading of formulas sqrt, cos, sin, tan in spin descriptions


JmolVersion="16.3.17" // (legacy) also 16.3.18 (swingJS) 

new feature: load filter "biomolecule 1;bmchains=_"
 -- underscore indicates to generate new chain IDs by appending a number prefixed with '_'
 -- prevents ambiguity of C becoming "C1" and C1 already being present (1o0u, though in this case
   there are no added chains)
   
 $ load *1auy filter "biomolecule 1;bmchains=_"
 $ print this.chains.pivot.keys.join(" ")

   A A_1 A_10 A_11 A_12 ... C_7 C_8 C_9

bug fix:  select bonds @x doesn't accept an array variable
 -- where x is an array, perhaps from 
 
        x = getProperty("bondinfo").select("(_bpt) where color='[xffff00]'")

 -- really the only way to select bonds programmatically efficiently
 -- previously, this could only be a literal array, with brackets:
 
        select bonds [2,3,4]
        
new feature: CIF reader updates support for magnetic spin space groups (SSGs) "spinCIF" format
 -- reads the following (provisional) spinCIF tags:
 
    _atom_site_spin_moment.axis_u
    _atom_site_spin_moment.axis_v
    _atom_site_spin_moment.axis_w
    _atom_site_spin_moment.label
    _atom_site_spin_moment.magnitude
    _atom_site_spin_moment.symmform_uvw
    _space_group_spin.collinear_direction_xyz
    _space_group_spin.coplanar_perp_uvw
    _space_group_spin.coplanar_perp_xyz
    _space_group_spin.coplanar_plane_rotation_angle
    _space_group_spin.name_SpSG_Chen
    _space_group_spin.number_SpSG_Chen
    _space_group_spin.rotation_angle
    _space_group_spin.rotation_axis_xyz
    _space_group_spin.transform_spinframe_P_abc
    _space_group_symop_spin_lattice.id
    _space_group_symop_spin_lattice.uvw
    _space_group_symop_spin_lattice.xyz
    _space_group_symop_spin_operation.id
    _space_group_symop_spin_operation.uvw
    _space_group_symop_spin_operation.xyz
  
new feature: ROTATE VECTORS axis degrees
 -- rotates magnetic structure magnet moments about the given axis (just a single point) the specified number of degrees
 -- optional axis, rotates using the axis specified in the CIF file
    or {0 0 1} if no axis from:
    
    _space_group_spin.coplanar_perp_uvw
    _space_group_spin.rotation_axis_xyz

 -- also works with magCIF files
 
new feature: SPIN VECTORS axis degrees
 -- same as ROTATE VECTORS, but starts the vectors spinning
 -- canceled with any ROTATE VECTOR command or RESET VECTORS or SPIN OFF
    
new feature: RESET VECTORS
 -- resets magnetic structure magnetic moment rotation to the original in a CIF file
 -- operates on the current model only
 -- same as rotate VECTORS (with on additional parameters)


JmolVersion="16.3.15" // (legacy) also 16.3.16 (swingJS) 
[this version was re-posted to SourceForge to remove the pickle file logging to c:/temp/pse/pickle.log]

bug fix: PyMOL reader upgrade to handle many more features.
 - sphere/stick logic conforms to PyMOL 3.0
 - may not be perfect, but it is very close to perfect
 - better multiple bonds, supporting valence, stick_valence_scale, stick_h_scale, 
 - better spheres, supporting stick_ball, stick_ball_ratio, stick_radius
 - better support for multiple molecules in multiples states (Jmol frames)
 - better support for PyMOL Compiled Graphic Object (CGO) meshes 
 - many thanks to Joel Sussman and Jaime Prilusky for test PSE files

JmolVersion="16.3.13" // (legacy) also 16.3.14 (swingJS) 

bug fix: MODELKIT command does not work in JmolData.jar or JmolDataD.jar

bug fix: JSmol broken in 16.3.12

JmolVersion="16.3.11" // (legacy) also 16.3.12 (swingJS) 

bug fix: CIF reader broken for older _symmetry_equiv_pos_as_xyz key in 16.3.9/10

bug fix: abs(x) where x is an integer just returns x.

bug fix: load from PubChem fails for inchi
 - for example: 
	$ load :inchi:InChI=1S/CH3NO/c2-1-3/h1H,(H2,2,3)    

bug fix: CLEG should allow reference Hall symbol with setting change:
 - for example:
 
    modelkit zap spacegroup "[-C 2c 2]:a,-c,b"
    print spacegroup().spaceGroupInfo.hm == "B m m b"

bug fix: assigning formal charge to an aromatic atom fails after atom deletion

new feature: (Java and JavaScript) inchiString.inchi("smiles") converts InChI to SMILES. 
 -- utilizes JNA-Inchi structure created from an InChI to generate SMILES strings. 
 -- net effect is that InChI strings can be converted to structures via SMILES. 
 -- passes tetrahedral, cumulene, and alkene stereochemistry tests
 -- InChI does not implement atropisomer stereochemistry
 -- InChI created using {*}.inchi("FixedH") will differentiate tautomers

new feature: {*}.inchi("standard").smiles() will correct for amides
 - returns amide, NC(=O)R, not imidol, N=C(O)R from InChI

new feature: {*}.inchi("standard").smiles("fixedh")
 - returns inchi-priority tautomer (imidol, N=C(O)R, not amide, NC(=O)R, for example)

new feature: Java inchi upgraded to 1.07.2
 - incorporates jna-inchi-1.4-SNAPSHOT.jar
 - Thank you, David Lowe, John Mayfield, et al.!
 
new feature: this.inchi("version")
 - reports internal inchi version from WASM/JavaScript or JNA/Java
 - finds the C string for inchi C mode_h definition APP_DESCRIPTION 
   in the native inchi library currently in use
 - at this time, Java reports:
     InChI version 1, Software 1.07.2 (API Library)
 - at this time, JavaSript reports:
     InChI version 1, Software 1.07.2 (inchi-1 executable)
 
new feature: this.color = "green" and all.color = "green"
 - use of "this" and "all" extended to same context as general 
   context of user-defined variables.   

JmolVersion="16.3.9" // (legacy) also 16.3.10 (SwingJS)

bug fix: lcaocartoon @4 LONEPAIR "lp" not displaying dots
bug fix: lcaocartoon @4 RADICAL "lp" not displaying dots
bug fix: lcaocartoon DELETE does not delete radical or lone pair, only lobes

bug fix: early demo pages are back on line, by demand

	https://chemapps.stolaf.edu/jmol/docs/examples-10.2/new.htm
	https://chemapps.stolaf.edu/jmol/docs/examples-10.3/new.htm
	https://chemapps.stolaf.edu/jmol/docs/examples-11/new.htm
	https://chemapps.stolaf.edu/jmol/docs/examples-12/new.htm

bug fix: anisotropic bonding should not be able to be set for double bonds

bug fix: unit cell with set picking dragMolecule should not allow SHIFT-DRAG (z-shift)
bug fix: unit cell with set picking dragMolecule Should allow ALT-DRAG (rotate)
bug fix: {atoms}.within("unitcell") should relate to their own model's unit cell, 
         not just the currently visible one.

bug fix: Hall description of 252:_2 (Jmol mirror of nonstandard 254:_2 found as =ams/quartz 1)
 -- was 152:a,b,c;0,0,-1/3 and p 31 2" (0 0 -4) 
 -- now 152:a,b,c;0,0,-1/3 and p 31 2" (0 0 4); 
 -- now a mirror image of quartz:
 
  load =ams/quartz 1 packed
  draw spacegroup all
  a = {*}.fx.all
  b = {*}.fy.all
  {*}.fx = b
  {*}.fy = a
  calculate spacegroup

bug fix: SpaceGroupFinder not always finding group
 -- idea of removing groups that when a   

bug fix: matrix("20>>3") fails
 -- logic bug in recursive subgroup search truncates the search early
 -- should give:
 
   $ print matrix("20>>3","map").indexPath
  20>[2]>5>[2]>3
  
  $ print matrix("230>>3","map").indexPath
  230>[3]>142>[2]>70>[2]>15>[2]>5>[2]>3
  
bug fix: show CHEMICAL INCHIKEY should not include "inchikey="

bug fix/feature change: NCI/CADD resolver inchi call
 -- switched to /file?format=stdinchi from /stdinchi
 -- problem was noticed with conversion of SMILES to InChI.

bug fix: SHOW SYMOP 3 should show same as SHOW SYMOP 4 "label"
 -- for =ams/quartz 1, should be "3(+) (0 0 -1/3) screw axis", not "null null 3(+) (0 0 -1/3) screw axis"

new feature: adds support for magnetic spin space groups (SSGs)
 - alternative to magCIF
 - reads preliminary scif ("spin CIF") files. 

new feature: load xxx.scif FILTER "spinframe=-a+b,-a-2b,c"
 - replaces value in CIF:
 _space_group_spin.transform_spinframe_Pp_abc  'a+b,-a,c' 

new feature: load filename fill SPIN
 - fills the spin frame rather than the real frame
 - just for showing spins in their frame
 - experimental
 
new feature: unitcell("spin")
 - returns the spin frame unit cell if an sCIF file was read
 
new feature: UNITCELL spin
 - returns the spin frame unit cell in [center,a,b,c] format

new feature: (JavaScript only) InChI WASM upgraded to InChI 1.07
 - switched to inchi-web.wasm, from the InChI-SwingJS project
 - allows InChI to stereochemically correct structure
 
new feature: (Java only) JNI-InChI replaced with JNA-InChI
 - maintained by Daniel Lowe and John Mayfield
 - slower than JNI, but a much simpler interface
 
new feature: {*}.smiles()
 - calculates SMILES for the selected atoms

new feature: <b>this</b> or <b>this.x</b>
 - similar to <b>all</b>, but limited to only atoms in frames currently visible
 - same as {thisModel}.x (which still may be more than one model)
 
new feature: (JmolSwingJS only, not legacy) smilesString.inchi("ocl")
 - uses the OpenChemLibrary to directly convert smiles strings to InChI. 
 - legacy still uses NCI/CADD CIR

new feature: {*}.inchi("model") or smiles.inchi("model") or inchi.inchi("model")
 - returns a map of the internal InChI ouput model, include keys "atoms", "bonds", and "stereo"
 - If {*} or SMILES is used, this model will have 3D coordinates
 - If a SMILES string is used, a MOL file equivalent will be created from 

new feature: {*}.inchi("ocl model") or smiles.inchi("model") or inchi.inchi("model")
 - returns a map of the internal InChI ouput model, include keys "atoms", "bonds", and "stereo"
 
new feature: matrix4.rxyz
 -- 3x4 (rotation|translation) representation of 4x4 rotation-translation matrices
 -- generates rational fractions only for exact 48ths; other values are left as decimals
 -- works with symop() when result is a 4x4 matrix or a list of 4x4 matrices   

$ print matrix("x,y,z;1/2,1/3,1/4")
[
  [1.0  0.0  0.0  0.5]
  [0.0  1.0  0.0  0.3333333333333333]
  [0.0  0.0  1.0  0.25]
  [0.0  0.0  0.0  1.0] ]
$ print matrix("x,y,z;1/2,1/3,1/4").rxyz
(
  1    0    0  |   1/2
  0    1    0  |   1/3
  0    0    1  |   1/4
)

$ load =ams/quartz 1 packed
$ print symop(3, "xyz")
-y,x-y,z-1/3
$ print symop(3).rxyz
(
  0   -1    0  |    0
  1   -1    0  |    0
  0    0    1  |  -1/3
)


new feature: matrix(...,"rxyz")
  -- same as matrix(...).rxyz 

$ print matrix("x,x-y,z;1/2,1/3,1/4", "rxyz")
(
  1    0    0  |   1/2
  1   -1    0  |   1/3
  0    0    1  |   1/4
)

new feature: symop(...,"rxyz")
  -- same as symop(...).rxyz
  
$ load =ams/quartz 1 packed
$ print symop(3, "xyz")
-y,x-y,z-1/3
$ print symop(3, "rxyz")
(
  0   -1    0  |    0
  1   -1    0  |    0
  0    0    1  |  -1/3
)

JmolVersion="16.3.7" // (legacy) also 16.3.8 (SwingJS)

new feature: PLY surface exporter
 -- both ascii and binary (little-endian)
 -- example:
 
	load $caffeine
	isosurface molecular map mep
	write isosurface "c:/temp/t.ply"
	write isosurface "c:/temp/t-bin.ply" as PLB
	isosurface slab none slab within 3 @4
	write isosurface "c:/temp/tslab.ply"
	write isosurface "c:/temp/tslab.ply" as PLB

new feature: {*}.find("SMILES/ALL")   
 -- default for Jmol is to provide SMILES for just the first 
    covalently bonded component in the atom set. 
    the ALL option includes all molecular entities.

bug fix: OBJ surface exporter fails to write .mtl file

bug fix: SELECT search(...) broken in 16.3.6

bug fix: script console should allow [UP-ARROW] return to DATA command
   
bug fix: CDX/CDXML reader should read "bold" bond as single, not 0

bug fix: CDX/CDXML reader does not read square-bracketed repeat counts

bug fix: MOL writer should ouput "either" stereochemistry

bug fix: MOL writer output for "FAR" bond should be "6" not "3"

bug fix: ZIP file reader in Java may fail on some (improperly formed) ZIP files

bug fix: Bond type "either" can also be of use in 3D, not just 2D
 -- for example, when reading a CDX or CDXML file with "EITHER" indicated, 
    we can still track that origin after conversion to 3D and not show 
    stereochemistry at that atom in SMILES or InChI.

new feature: load DATA with base64-encoded data starting with ";base64,"
 -- loads model data that is base64 encoded
 -- can be binary data such as CDX or ASCII such as MOL
 -- for example (loads quartz model as encoded CIF file):

load data "model"
;base64,ZGF0YV9nbG9iYWwKX2NlbGxfbGVuZ3RoX2EgNC45MTYKX2NlbGxfbGVuZ3RoX2IgNC45MTYKX2NlbGxfbGVuZ3RoX2MgNS40MDU0
Cl9jZWxsX2FuZ2xlX2FscGhhIDkwCl9jZWxsX2FuZ2xlX2JldGEgOTAKX2NlbGxfYW5nbGVfZ2FtbWEgMTIwCl9zeW1tZXRyeV9z
cGFjZV9ncm91cF9uYW1lX0gtTSAnUCAzMiAyIDEnCmxvb3BfCl9zcGFjZV9ncm91cF9zeW1vcF9vcGVyYXRpb25feHl6CiAgJ3gs
eSx6JwogICd5LHgsMi8zLXonCiAgJy15LHgteSwyLzMreicKICAnLXgsLXgreSwxLzMteicKICAnLXgreSwteCwxLzMreicKICAn
eC15LC15LC16Jwpsb29wXwpfYXRvbV9zaXRlX2xhYmVsCl9hdG9tX3NpdGVfZnJhY3RfeApfYXRvbV9zaXRlX2ZyYWN0X3kKX2F0
b21fc2l0ZV9mcmFjdF96ClNpICAgMC40Njk3MCAgIDAuMDAwMDAgICAwLjAwMDAwCk8gICAwLjQxMzUwICAgMC4yNjY5MCAgIDAu
MTE5MTAK
end "model" packed
   
new feature: DATA "model";base64,...end "model"
 -- same as LOAD DATA, but does not allow for 
    load parameters
 -- loads model data that is base64 encoded
 -- can be binary data such as CDX or ASCII such as MOL
 -- for example (loads cyclohexanol as encoded CDX file):
 
data "model"
;base64,VmpDRDAxMDAEAwIBAAAAAAAAAAAAAACAAAAAAAMAFgAAAENoZW1EcmF3IDIyLjIuMC4zMzAwCAAHAAAAdC5jZHgEAhAAIuJYAGlC
jQCzFpoAhtLmAAEJCAAAAAAAAAAAAAIJCAAAAOsBAACUAwAJAAANCAEAAQgHAQABOgQBAAE7BAEAAEUEAQABPAQBAABKBAEAAAwG
AQABDwYBAAENBgEAAEIEAQAAQwQBAABEBAEAAAoICAADAGAAyAADAAsICAAUAAAA8AADAAkIBAAzswIACAgEAAAAAgAHCAQAAAAB
AAYIBAAAAAQABQgEAAAAHgAECAIAeAADCAQAAAB4ACMIAQAFDAgBAAAoCAEAASkIAQABKggBAAEyCAEAACsIAQAoLAgBAAoCCBAA
AAAkAAAAJAAAACQAAAAkAAEDAgAAAAIDAgABAAADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/
////AAD//wABJAAAAAIAAwDkBAUAQXJpYWwUAOQEDwBUaW1lcyBOZXcgUm9tYW4ACHgAAAMAAAJYAlgAAAAAGPwTIP+a/5oZYhOG
A2cFKAP8AAIAAAJYAlgAAAAAGPwTIAABAAAAZAAAAAEAAQEBAAAAAScPAAEAAQAAAAAAAAAAAAAAAAACABkBkAAAAAAAYAAAAAAA
AAAAAAEAAAAAAAAAAAAAAAAAAAAAtAsCAAAAtQsUAAAAQ2hlbWljYWwgRm9ybXVsYTogtgsOAAAARXhhY3QgTWFzczogtwsUAAAA
TW9sZWN1bGFyIFdlaWdodDoguAsHAAAAbS96OiC5CxYAAABFbGVtZW50YWwgQW5hbHlzaXM6ILoLEQAAAEJvaWxpbmcgUG9pbnQ6
ILsLEQAAAE1lbHRpbmcgUG9pbnQ6ILwLEQAAAENyaXRpY2FsIFRlbXA6IL0LEQAAAENyaXRpY2FsIFByZXM6IL4LEAAAAENyaXRp
Y2FsIFZvbDogvwsQAAAAR2liYnMgRW5lcmd5OiDACwkAAABMb2cgUDogwQsGAAAATVI6IMILDwAAAEhlbnJ5J3MgTGF3OiDDCxAA
AABIZWF0IG9mIEZvcm06IMQLCAAAAHRQU0E6IMcLCAAAAExvZ1M6IMgLBwAAAHBLYTogyQsCAAAAygsCAAAACwwCAAEACgwBAAAJ
DAEAAAwMBQAAACgjKQGAFwAAAAQCEAAAAAAAAAAAAAAA0AIAABwCFggEAAAAJAAYCAQAAAAkABkIAAAQCAIAAQAPCAIAAQADgAUA
AAAEAhAAIuJYAGlCjQCzFpoAhtLmAAoAAgAEAASAAgAAAAACCAAAgGwA7MSNAAoAAgABADcEAQABAAAEgAQAAAAAAggAAICKAOzE
jQAKAAIAAwA3BAEAAQAABIAGAAAAAAIIAACAmQAAwKcACgACAAUANwQBAAEAAASACAAAAAACCAAAgIoAE7vBAAoAAgAHADcEAQAB
AAAEgAoAAAAAAggAAIBsABO7wQAKAAIACQA3BAEAAQAABIAMAAAAAAIIAACAXQAAwKcACgACAAsANwQBAAEAAASAFAAAAAACCAD/
f10AJrbbAAoAAgATAAIEAgAIACsEAgABAEgEAAA3BAEAAQaAAAAAAAACCABmZmEAhtLXAAQCEAAi4lgAhtLXAP9/YQCG0uYAIwgB
AAACBwIAAAAFBwEAAQAHDgABAAAAAwBgAMgAAABPSAkHDgABAAAAAwBgAMgAAABPSAAAAAAFgA4AAAAKAAIADQAEBgQAAgAAAAUG
BAAEAAAACgYBAAEAAAWADwAAAAoAAgAOAAQGBAAEAAAABQYEAAYAAAAKBgEAAQAABYAQAAAACgACAA8ABAYEAAYAAAAFBgQACAAA
AAoGAQABAAAFgBEAAAAKAAIAEAAEBgQACAAAAAUGBAAKAAAACgYBAAEAAAWAEgAAAAoAAgARAAQGBAAKAAAABQYEAAwAAAAKBgEA
AQAABYATAAAACgACABIABAYEAAwAAAAFBgQAAgAAAAoGAQABAAAFgBUAAAAKAAIAFAAEBgQACgAAAAUGBAAUAAAACgYBAAEAAAAA
AAAAAAAA 
end "model"

JmolVersion="16.3.5" // (legacy) also 16.3.6 (SwingJS)

bug fix: Jmol doesn't recognize WSL (Windows Subsystem for Linux) protocols
  -- this protocol allows access from Windows to 
     a linux subsystem file, both for reading and writing
  -- load "//wsl$/Ubuntu/home/user1/test.mol"
  -- write "file://wsl$/Ubuntu/home/user1/test2.mol"
  
bug fix: write Jmol doesn't accept proper Windows file:// descriptions
  -- vertical bar in place of colon -- "file:///C|/temp/t3.mol"

bug fix: SHOW SPACEGROUP <n> does not work
  -- just noting that this function reports Jmol's 
     space group operations as calculated from Hall 
     symbols. These may be in a different order than
     those found at the BCS. For the BCS listing, use 
     
     print spacegroup(n)
     
	 where n is 1-230 or a Hermann-Mauguin name or 
	 "hall:xxx	" where xxx is Hall symbol, as in
	 
	 print spacegroup("hall:P 2 -2bc")
	 
	 or a list of operations, such as 
	 
	 print spacegroup("x,y,z;x,y,-z")
	 
	 

new feature: SHOW SPACEGROUP NAMES
 -- displays the list of 230 space group names
 -- opens https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen
 -- see also SHOW SPACEGROUP LIST


JmolVersion="16.3.3" // (legacy) also 16.3.4 (SwingJS)

new feature: x = matrix("")
 -- returns matrix for current model
 
new feature: modelkit ... spacegroup ""
 -- uses current space group for the command

bug fix: JmolData.jar and Jmol.jar -x or -nx or -n do not allow CAPTURE
 -- this fix enables CAPTURE even with nodisplay (-n) or with autoexit (-x)
 -- recommend also adding -o so you can follow what is happening
 -- note that JmolData.jar is MUCH MUCH faster than Jmol.jar -nx
 -- no GUI necessary
 -- for example
		java -jar JmolData.jar -J "load t.mol;capture 'ts.gif' spin;"
      
bug fix: Jmol starting up with Java 11 can fail to start
 -- removing dependency on sun.awt.image.TookKitImage
  
bug fix: MODELKIT SPACEGROUP p/3 should work without quotes

bug fix: DRAW SPACEGROUP   for planar group should shorten "c" axis to just 1 angstrom

bug fix: unitcell info for plane group should not indicate c, alpha, or beta.   

bug fix: reading incommensurate CIF with subsystem broken
 
bug fix: UNITCELL @n switch for subsystem CIF broken

bug fix: MODELKIT ADD WYCKOFF ALL PACKED can add extra atoms

bug fix: SET PICKING DRAGATOM doesn't always works smoothly
         and reports "cannot move atom" while still moving it (sometimes)
 -- cases where a glide or screw translation can result in invariance
 -- specifically SG 224 Wyckoff i and plane group p/12 Wyckoff c
   

JmolVersion="16.3.1" // (legacy) also 16.3.2 (SwingJS)

note: Jmol 16.3 significantly increases Jmol's coverage in relation to 
      space groups and their related plane, layer, rod, and frieze groups.
      In particular, it represents a relatively full incorporation of the
      results at the Bilbao Crystallographic Server in relation to the
      programs GENPOS, WYCKPOS, MAXSUB, and SUBBROUPGRAPH for all of these
      group types. 
      
      Jmol 16.3 incorporates from the BCS 746 space group, 17 plane, 156 layer, 
      190 rod, and 14 frieze settings (through index 9) as well as 9947 space, 
      245 plane, 2722 layer, 1607 rod, and 125 frieze maximal group-subgroup relationships.

      Jmol 16.3 completes the development of novel 3D interactive visualizations 
      of space, plane, layer, rod, and frieze group models. 
      
      Jmol 16.3 extends the CLEG (Concise Linear Encoding of crystallographic 
      space Group settings group-subgroup relationships) to all of these group types.

      Jmol 16.3 greatly expands the matrix() method and MODELKIT SPACEGROUP
      command to allow easy calculation and visualizion of group setting and 
      group-subgroup relationships for all of these types of groups in preparation 
      for further development in the area of space group sections and projections.  

	  Jmol 16.3 provides the capability to easily calculate group-subgroup
      transformation matrices for any group setting to any other group setting, 
      not just reference settings and not just maximal subgroups. This is made 
      possible by the addition of an algorithm that systematically navigates the 
      full listing of maximal subgroups found at the BCS (for space, plane, 
      layer, rod, and frieze groups), selecting the subset of these relationships 
      specific to the request.


feature change: x = matrix("16>>3") or x = matrix("16>sub>3")
 -- finds a subgroup path from space group 16 to space group 3
 -- DOES NOT HAVE TO BE A MAXIMAL SUBGROUP
 -- unlike BCS SUBSEARCH, has the limitation that it does not include 
    iterative loops of space groups such as (16>>4>>4>>2)
 -- matrix("16>sub(depth=1)>3") returns only maximal subgroup transformations

new feature: x = matrix("16>>3", "map")
 -- return a map containing information about this transformation:
 
 	print matrix("23>>3","map")
	{
	  "cleg"  :  "23>-b-c,a,c>5>a,b,c>3"
	  "depth"  :  2
	  "index"  :  4
	  "indexPath"  :  "23>[2]>5>[2]>3"
	  "trm"  :  "-b-c,a,c"
	  "trmat"  :
	  [
	  [0.0	1.0	0.0	0.0]
	  [-1.0	0.0	0.0	0.0]
	  [-1.0	0.0	1.0	0.0]
	  [0.0	0.0	0.0	1.0] ]
	}

new feature: x = matrix("16>>3", "list")
 -- return a full listing of map information covering all possible 
    chains of subgroups leading from one group to another.
    For example, for layer group 16 to 1:
    
    print matrix("l/16>>l/1","list").select("(indexPath)")
   	
   		16>[8]>2>[2]>1
		16>[16]>12>[12]>1

new feature: x = matrix("16>>3", mapItem)
 -- convenience access to items in a listing, currently including
	  "cleg" "depth" "index" "indexPath" "trm" and "trmat"
 -- same as matrix("16>>3","list").select("(xxxx)")
 -- for example:
 
		 print matrix("l/32>>l/1","trm")

		a+b,-a,c
 
   	
new feature: x = matrix("23>sub(params)>3")
 -- (params) any combination of:
    (index=i,depth=d)
    or 
    (indexMin=i1,indexMax=i2,depthMin=d1,depthMax=d2)
 -- searches for group-subgroup relationship have having 
    the specified or specified range of index and/or 
    the specified or specified range of depth
 -- index can be mixed with depth or depthMin/Max
 -- depth can be mixed with index or indexMin/Max      
 -- depthMin/Max can be mixed with indexMin/Max   
 -- for example:
 
 
new feature: similar to matrix("23>(params)>3" for MODELKIT SPACEGROUP
 -- modelkit spacegroup "23>>3" no longer has to be maximal subgroup
 -- for example:
 
	modelkit zap spacegroup 23
	draw u1 unitcell
	draw s1 spacegroup all
	modelkit spacegroup ">>3"
	draw s2 spacegroup all
	draw u2 unitcell
	draw u2 unitcell color red
 -- modelkit spacegroup "23>sub>3" still refers to maximal subgroup only

new feature: x = matrix("23>sub(1,2)>3")
 -- selects for the 2nd conjugation entry for the 1st occurrence of subgroup 3
    in the ITA listing 
 
JmolVersion="16.2.37" // (legacy) also 16.2.38 (SwingJS)

bug fix: various issues with subgroups path description for expanded cell routes

bug fix: switching SHOW SPACEGROUP DIAGRAM to University College London hypertextbook site 
 -- now making calls to http://img.chem.ucl.ac.uk/sgp/large/sgp.htm 
 -- ITA wiley site has been placed behind a paywall

bug fix: various fixes relating to new subperiodic group features

bug fix: unitcell and DRAW UNITCELL for subperiodic and plane groups 
 -- modification to more clearly indicate nonperiodic axes
     
test: test/script/16.2 passing 72 tests

JmolVersion="16.2.35" // (legacy) also 16.2.36 (SwingJS)

buf fix: various fixes relating to new subperiodic groups feature

bug fix: SPIN and CAPTURE SPIN and CAPTURE ROCK broken in 16.2.33. 

bug fix: set labelKey doesn't allow for two keys only differing in case
 -- such as Wyckoff positions "a" and "A" for Space Group 47. 
 
feature change: load =mp/..... removed; 
 -- this Materials Project service is no longer available


JmolVersion="16.2.33" // (legacy) also 16.2.34 (SwingJS)

NOTE: LACA2024 refers to ideas generated from the 
      Latin American Crystallographic Association meeting, Sept 23-26, 2024 

new feature: (LACA2024) MOVETO timeSeconds DIRECTION [1 0 0]
 -- reorients a crystal structure along the given crystallographic direction
 -- DIRECTION here means "viewing down the axis {1 0 0/1}"
 -- uses a quaternion difference to calculate the most direct rotation

new feature: (LACA2024) set labelKey TRUE/FALSE
  -- when set TRUE, adds a key on the right
  -- removes any key created with set elementKey
  -- removed if set elementkey is issued
  -- key indicates atom color correspondence with atom labels (alphabetically)
  -- key is disabled when:
       -- a color corresponds to more than one label
       -- a given label corresponds to more than one atom color
  -- note that LABEL HIDE can still be used
  -- particularly useful for showing wyckoff positions 
  -- example:
  
  	modelkit spacegroup 62
	modelkit add wyckoff all packed
	label %[wyckoffm]
	set labelkey
    label hide
    set picking dragatom

    modelkit draw spacegroup 47
    modelkit add wyckoff all packed
    label %[wyckoff]
    label hide
    set labelkey
 
         
new feature: (LACA2024) set mode2d (experimental)
  -- when set TRUE, disables mouse rotation

new feature: (LACA2024) using set dragAtom with symmetry, a "collision" with a 
    symmetry element results in a red warning halo around all equivalent atoms.  

new feature: (LACA2024) modelkit unitcell {0 1 0}
  -- retains space group as long as this is a unit lattice shift

new feature: (LACA2024) modelkit unitcell {0 1 0} packed
  -- retains space group as long as this is a unit lattice shift
  -- packs the new unit cell
  -- CONNECT is not executed; if bonding is required, follow by the CONNECT command

new feature: (LACA2024) MODELKIT ADD <element> <position> Wyckoff ALL PACKED
  -- adds a full set of atoms for each Wyckoff position
  -- uses the list "Al B C D Fe F Ga He I Ge K Li Mg N Os P Ca Rh S T U V W Xe Yb Zn Am"
     to provide 27 different colors and sizes (Space Group 47 uses all of these)
  -- Aluminum for "a", Boron for "b", etc. 
  -- <element> is an element symbol to be used to specify the general position
  -- default is "O" (which is not on this list already)
  -- <position> is an optional fractional position and defaults to {0.53, 0.20, 0.16}
  -- PACKED is optional
  -- for examp	le:
 
 	   modelkit draw spacegroup 47
       modelkit add wyckoff all packed
 	   label %[wyckoffm]; labels hide
 	   set labelKey
  
  	   modelkit zap spacegroup 148
       modelkit add O {0.1 0.11 0.15} wyckoff all packed
       spacefill 0.3
       
new feature: (LACA2024) x = plane([u v w])
  -- u v w are fractional coordinates, generally integers -- do not use "1/2" here
  -- generates the plane perpendicular to the given direct space fractional vector {u v w/1}  

new feature: (LACA2024) x = {*}.plane([u v w])
  -- u v w are fractional coordinates, generally integers -- do not use "1/2" here
  -- generates an array of coordinates that are the projection onto the 
     plane perpendicular to the given direct space fractional vector {u v w/1}  

new feature: (LACA2024) compare <atoms> <coordinates> MORPH
  -- smoothly and linearlly converts atom coordinates to the specified list of coordinates.  
  -- example projecting all atoms onto a plane in a crystal structure
  
    compare {*} @{{*).plane([1 1 1])} MORPH

new feature: (LACA2024) SHOW WYCKOFF
  -- lists Wyckoff positions without multiplicities

new feature: (LACA2024) SHOW WYCKOFFM
  -- lists Wyckoff positions with multiplicities

new feature: (LACA2024) DRAW VECTOR NOHEAD pt1 v1
  -- uses point and vector, but displays just the cylinder without an arrow head
  -- introduced in Jmol 11.5.40 (June 2008!) but undocumented and broken

new feature: (LACA2024) adds support for plane, layer, rod, and frieze groups.
 -- CLEG designations add prefixes p/ l/ r/ f/ 
 -- full support for adding atoms, designating Wyckoff positioning, and moving atoms around
 -- introduces a new way to show nonperiodic dimensions using "open-ended" unit cells
 -- prefixes also work with Hermann-Mauguin names. 
    (this was necessary because there is cross-over between names among the group types)
 -- subgroups are not supported yet
 -- for example:
 
 	modelkit draw spacegroup p/15;
 	modelkit add wyckoff all packed;

 	modelkit draw spacegroup l/p6/mmm;
 	modelkit add wyckoff all packed;
 
bug fix: RESET should restore crystal structure to "center unitcell"
    
test: updated test/scripts/16.2.spt (72 tests)

JmolVersion="16.2.31" // (legacy) also 16.2.32 (SwingJS)


new feature: spacegroup(10, "settings")
 -- gets a list of all ITA setting info for the specified space group
new feature: spacegroup("settings")
 -- gets a list of all ITA settings for the current space group

new feature: spacegroup(10, "setting")
 -- gets the default setting for the specified space group
new feature: spacegroup(10.1, "setting")
 -- gets the ITA setting information for the specified space group
new feature: spacegroup("setting")
 -- gets the setting information for the current space group setting
 -- for example:
     
		modelkit zap spacegroup 23
		print spacegroup("setting").hm;

			I 2 2 2
			
bug fix: draw symop "y,x,-z-1/3" { atomIndex = 2 }  broken in 16.2.28


JmolVersion="16.2.29" // (legacy) also 16.2.30 (SwingJS)

development note: {workspace}/test/scripts/16.2.spt cumulative for 16.2 (starting with 16.2.27!)

bug fix: MOLDEN reader not counting coefficients in some cases

bug fix: set picking rotateBond, assignBond not working

bug fix: modelkit zap spacegroup "P 2/m 1 1" does not create compatible unit cell 
 -- nonstandard Hermann-Mauguin name
 -- 10.3 OK, but P 2/m 1 1 fails

bug fix: modelkit spacegroup not returning error message
 -- should report errors in syntax or space group names
  	
bug fix: modelkit spacegroup "R...:r" fails
 -- :r here is not an abbreviation, just Hermann-Mauguin name part

bug fix: modelkit draw spacegroup may miss some symmetry elements
 -- particularly for rhombohedral settings of cubic groups
 -- for example:
    
      modelkit draw spacegroup 225:1/2b+1/2c,1/2a+1/2c,1/2a+1/2b
      draw * off; draw *bar_4* on 
    
    should show eleven complete rosettes
     

new feature: modelkit spacegroup "225:p"
  -- ":p" specially for Jmol "primitive"
  -- many settings not found in the International Tables
  -- example:
    
	modelkit zap spacegroup "225:p"
	print spacegroup().operations.count

	  48

new feature: CASTEP reader adds filer "NOSYM" to skip symmetry generation

new feature: spacegroup("list")
 -- displays a multiline string listing of all Jmol space group settings
 -- form:
 
 	    10.1	P 1 2/m 1	10:a,b,c
  
new feature: spacegroup(n, "list")
 -- displays a multiline string listing of name info for the specified space group number
 -- for example:
 
     print spacegroup(10)
     
	    10.1	P 1 2/m 1	10:a,b,c
		10.2	P 1 1 2/m	10:c,a,b
		10.3	P 2/m 1 1	10:b,c,a

new feature: modelkit spacegroup xxx:p
 -- special ":p" extension for IT numbers (10 or 10.3) or HM names
 -- "primitive"
 -- attaches the matrix to the primive for centered cells (A,B,C,F,I).
 
# all 58 16.2 tests passing
     
JmolVersion="16.2.27" // (legacy) also 16.2.28 (SwingJS)

new feature: spacegroup() method accepts Hermann-Mauguin names for subgroups:
   print spacegroup("P2/m", "subgroups")
   print spacegroup("P2/m", "subgroups").subgroups.select("(subgroupHM)").format("JSON")
		[ "P-1","P2","Pm","P2/m","P2/m","P21/m","C2/m","P2/c" ]
   print spacegroup("P2/m", "P2/c")[1].trms.select("(trm)")
		a-c,b,2c;0,0,1/2
		a-c,b,2c
		-2a-c,b,2a;1/2,0,0
		-2a-c,b,2a
		a,b,2c;0,0,1/2
		a,b,2c     

new feature: point("(1/2,1/3,1/4)")
  -- expressions evaluated
  -- opposite of {x,y,z}.rxyz
  -- for example:
	$ print point("(1/2,1/4,1/8)")
		{0.5 0.25 0.125}
   	$ print point("(cos(60),sin(60),sqrt(2))")
		{0.5 0.8660254 1.4142135}

new feature: CASTEP reader accepts mathematical expressions for lattices, symmetry matices and atom positions

new feature: CASTEP reader processes SYMMETRY_GENERATE keyword
  -- follows load with MODELKIT SPACEGROUP
  
new feature: symop([ops],type)
  -- generates an array of [ symop(ops[1],type), symop(ops[2],type),...]
  -- useful for various symop() calls
 
new feature: matrix("A2/m") or matrix("10.4")
  -- returns setting transform for space group setting idenfifier

new feature: spacegroup(10.2).hm or spacegroup("10:b,c,a").hm 
  -- returns Hermann-Mauguin name

new feature: spacegroup(10).n
  -- returns number of settings
  -- useful with spacegroup(10).its[2].hm (returns Hermann-Mauguin name of second ITA setting)
  
new feature: matrix("13>>15>>14>>2")
  -- calculates the transform matrix (P,p) for this subgroup chain
  -- names can be Hermann-Mauguin names

new feature: matrix("h"), matrix("r")
  -- short-cut to matrices for rhombohedral-to-hexagon and hexagonal-to-rhombohedral transforms

new feature: matrix.format("xyz"), matrix.format("abc")
  -- same as matrix(matrix,"xyz"), matrix(matrix,"abc")
  -- more natural, as formatting is what we are doing here
  
bug fix: CASTEP reader not reading unit cells for phonon trajectories

bug fix: draw SPACEGROUP ALL may report g-glide when actual is n-glide
  -- case was modelkit spacegroup "12:b,-a-c,c";draw spacegroup all

bug fix: print symop("wyckoff") underecounts multiplicity for centering I->F

bug fix: LOAD ..... CENTROID 0.5 does not work
  -- should expand the range where the molecular center is.
  
buf fix: (JavaScript only) symop(@3,@3,"array") can report incorrect rotationAngle due to missed Infinity/NaN in JavaScript

bug fix: ECHO/SCALE DEPTH not compatible with SCALE @34

bug fix: enabling MODELKIT ZAP SPACEGROUP 146:r; MODELKIT SPACEGROUP >h>146

bug fix: space group name "C m m b" not recognized

buf fix: arrayOfMaps.array(k)
 -- should create an array if all values of arrayOfMaps[i].k are integers, and there
    is a single sequence of values starting from 0 or 1, and all values are <= 10000
    with no gaps 
 
bug fix: creating OpenSmiles with atom class as property_atomclass should not list [C:0]
 -- for example:
 
  	$ load $2-butanol
	$ @2.property_atomclass=2
	$ @3.property_atomclass=3
	$ @5.property_atomclass=5
	$ print {*}.find("smiles/open")

    should report 
    
		C[C@H:2]([OH:5])[CH2:3]C

    not
    
    	[CH3:0][C@H:2]([OH:5])[CH2:3][CH3:0]

	$ print {*}.find("smiles", "C[C@H:2]([OH:5])[CH2:3]C")
	
	then reports 
	
		({0:14})
	
	but
		
	$ print {*}.find("smiles", "C[C@H:2]([OH:5])[CH2:6]C")
	
	reports ({})
	  
new feature: script-based CAPTURE with delays extended to non-looping GIF. 
 -- for example, a once-through rocking motion with a 2-second delay at both ends:
 
 CAPTURE "t.gif" SCRIPT "rotate y 20 20;delay 2;rotate y -40 -40;delay 2;rotate y 20 20"
 
 -- LOOP before the SCRIPT parameter results in GIF looping
     
new feature: AUDIO command
 -- replaces mostly undocumented LOAD AUDIO
 
 	AUDIO ID id "filename" <action>
    -- provides an identifier for referencing
    -- default id "audio1"
    -- opens and starts an audio clip from a file
    -- first stops any running audio clip with this id
    -- does not stop other running audio clips (i.e. they can overlap)
    -- optional action (most likely START, LOOP, or PAUSE)
    -- default actions are START and, at end of playing, CLOSE
    -- explicit action directs Jmol to NOT close the clip, allowing it to be started again
       in which case the user is responsible for running AUDIO OFF or AUDIO ID ... CLOSE
    
    AUDIO ID id <action>
    -- default id "audio1"
    -- presumes an audio clip with this id has been opened
    -- executes the action on this the audio clip
    -- <action> is one of START|LOOP|PAUSE|PLAY|STOP|CLOSE
       START: starts an audio clip from the beginning
       LOOP: starts an	audio clip and restarts the clip when it is done playing
       PAUSE: pauses an audio clip
       PLAY: plays an audio clip wherever it was last stopped
       STOP: stops an audio clip and resets it to the starting point
       CLOSE: stops an audio clip and releases its resources, including its ID
       
    AUDIO OFF
    -- closes all audio clips and releases their resources
     
new feature: audioCallback
    -- reports a map containing details about the audio clip and its status (2nd parameter)
       and the status as a string (3rd parameter)
    -- status firing depends upon various factors and may be unpredictable in indicating completion
       (Java may report "pause" for both an actual pause and a termination, possibly not releasing resources)       
     
new feature: MODELKIT SPACEGROUP >r> PACKED
  -- trailing ">" means "no change of space group
  -- allows conversion r to h or h to r just after standard load.
   
new feature: MODLEKIT SPACEGROUP "<<13"  
  -- super rather than sub
  -- substituted as ">super>13"
     
example code:

/*
 * show subgroup chain using BCS format
 * 
 * for example:
 *
 *  showsubs("C2/c > P21/c > P21")
 *
 *  showsubs([13 15 14 2])
 */
function showsubs(chain) {
  save orientation o;
  draw * delete;
  // chain = "C2/c > P21/c > P21"
  var colors = ["red", "orange", "yellow", "green", "blue", "violet" ];
  if (chain.type == "array")
	chain = chain.join(">");
  var groups = chain.replace(" ","").replace(">>",">").split(">");
  
  var drawIDs = [];
  for (var i = 1; i<= groups.length; i++) {
    var sg = groups[i];
    if (i == 1) {
      print sg;
      modelkit zap spacegroup @sg;
    } else {
      print ">>" + sg;
      modelkit spacegroup @{">>" + sg};
    }
    restore orientation o
    var dsg = "sg"+sg + "_";
    drawIDs.push(dsg);
    draw ID @{"uc"+sg + "_"} unitcell color @{colors[((i-1)%6)+1]} @sg;
    draw ID @dsg spacegroup all;
    draw ID @{dsg + "*"} off;
    delay 2
  }
  set echo bottom left;
  for (var i = drawIDS.length; i > 0; --i) {
    draw sg* off;
    draw ID @{drawIDs[i] + "*"} on;
    echo @{groups[i]}
    delay 2;
  }
  draw ID * on;
  echo @chain;
  restore orientation o;
 }

 //showsubs([13 15 14 2])
 showsubs("C2/c > P21/c > P21")


JmolVersion="16.2.25" // (legacy) also 16.2.26 (SwingJS)

new feature: AUDIO command
 -- replaces mostly undocumented and preliminary LOAD AUDIO
 
 	AUDIO ID id "filename" <action>
    -- provides an identifier for referencing
    -- default id "audio1"
    -- opens and starts an audio clip from a file
    -- first stops any running audio clip with this id
    -- does not stop other running audio clips (i.e. they can overlap)
    -- optional action (default START; most likely START, LOOP, or PAUSE)
    -- default actions are START and, at end of playing, CLOSE
    -- explicit action directs Jmol to NOT close the clip, allowing it to be started again
       in which case the user is responsible for running AUDIO OFF or AUDIO ID ... CLOSE
    -- example: 
    
         audio ID a1 "https://chemapps.stolaf.edu/jmol/jsmol/iucrdemo/tada.wav"   
    
    AUDIO ID id <action>
    -- default id "audio1"
    -- presumes an audio clip with this id has been opened
    -- executes the action on this the audio clip
    -- <action> is one of START|LOOP|PAUSE|PLAY|STOP|CLOSE
       START: starts an audio clip from the beginning
       LOOP: starts an audio clip and restarts the clip when it is done playing
       PAUSE: pauses an audio clip
       PLAY: plays an audio clip wherever it was last stopped
       STOP: stops an audio clip and resets it to the starting point
       CLOSE: stops an audio clip and releases its resources, including its ID
       
    AUDIO OFF
    -- closes all audio clips and releases their resources
     
new feature: audioCallback
    -- reports a map containing details about the audio clip and its status (2nd parameter)
       and the status as a string (3rd parameter)
    -- status firing depends upon various factors and may be unpredictable in indicating completion
       (Java may report "pause" for both an actual pause and a termination, possibly not releasing resources)       
     
JmolVersion="16.2.25" // (legacy) also 16.2.26 (SwingJS)

bug fix: (JavaScript only) script processing broken in 16.2.23 for JavaScript only 

JmolVersion="16.2.23" // (legacy) also 16.2.24 (SwingJS) [abandoned]

feature change: scripts embedded within PNGJ, JMOL, and ZIP formats have tighter security.
 -- necessary for new ability to hand-modify scripts within these file types
 -- in general, these scripts are expected to be state scripts generated by Jmol,
    however, it is possible (now) to modify these scripts using jmol 
 -- this fix makes no change to files created by Jmol; rather, it
    ensures that replaced scripts will only access files within their containing files
 -- they may not load local files external to their own contents
 -- they may not use the file() or load() method
 -- they may not use the write command or the write() method
 -- they may not use the javascript command or the eval() method

bug fix: (Java only) write hand-modified PNGJ file fails in Java

bug fix: isosurface EDS fails
 -- updating to continuing EBI BCIF file format changes
 -- includes multiple encoder compatibility, including mol*, CoordinateServer, ModelServer, DensityServer, and Volume-Server
 
bug fix: bond/wireframe changes prior to atom deletion may not be saved correctly in state
 -- problem is with select BONDS only in association with atom deletion
 -- PNGJ files saved with this and future version of Jmol should read property with previous versions of Jmol 

bug fix: MO and ISOSURFACE generation after atom deletion not saved properly in the state
 -- after atom deletion, components of MO or ISOSURFACE may be different,
    but the state generates the deletion AFTER the MO and ISOSURGACE commands are processed
 -- this fix introduces the deletion at the time of the MO or ISOSURFACE generation into
    the MO or ISOSURFACE command. 
 -- scripts created with future versions will generate correct isosurfaces when executed in previous versions
 -- script screated with future versions will run but still not generate correct MOs when executed in previous versions
    
bug fix: CALCULATE STRUTS fails for $LOAD =4mwb
 -- singleton MET amino acid as ligand was not handled 

bug fix: CIFReader should read atomName from _jmol_atom_name block
 -- _jmol_atom_name is created by WRITE CIF
 
bug fix: SHELXReader support for space-starting comment lines

new feature: atom property translucent
 -- 0.0 to 1.0, with 0 being opaque and 1 being transparent 
 -- for example, select translucent = 0.5; select translucent > 0

new feature: atom.property_part
 -- the SHELX PART or CIF atom_site_disorder_group as a float value
 -- note that for negative part, the fragments are given unique
    altloc values that range from 1-9A-Za-z. 'A' and 'a' can be 
    distinguished using LIKE, as in SELECT ALTLOC LIKE 'a'
 -- for space groups with m symmetry operatiosn and n parts, 
    if m*n > 53 then altloc values will restart at "A" after reaching 'z'. 
    This may result in undesired bonding between parts. 
 -- atom.property_part is not produced for mmCIF or binaryCIF files
 -- property_part overrides altloc value for WRITE CIF

new feature: CONFIG -n and SELECT CONFIG=-n for SHELX and non-PDB CIF
 -- negative configuration number
 -- selects property_part=0 or property_part=n or property_part=-n


JmolVersion="16.2.21" // (legacy) also 16.2.22 (SwingJS)

bug fix: PyMOLReader handling of measurement and atom labels refined
bug fix: PyMOLReader skipping display of nonbonded atoms (water as red stars)
bug fix: PyMOLReader mishandling unique settings for valence

new feature: PyMOLReader FILTER "SHOWVALENCE"
 -- may be needed for PyMOL files that have not been saved with valence setting ON
    in order to show multiple bonds in Jmol
 -- note that PyMOL valence_mode setting is NOT implemented in Jmol
 
 
JmolVersion="16.2.19" // (legacy) also 16.2.20 (SwingJS)

bug fix: SHELX reader LATT 1 does not add "x,y,z" so does not also add "-x,-y,-z"

bug fix: DRAW ARROW can produce very long head
 -- now limited to 1.5 * width of arrowhead (4.5 * width of arrow shaft)

bug fix: PyMOLReader does not recognize default label position (skips labels and measurements)
bug fix: PyMOLReader assigns wrong background color
bug fix: PyMOLReader fails to read file when it includes a default (null) measurement dash setting
bug fix: PyMOLReader creates measurement dots that are too large

bug fix: CIFReader fails to read multiple structures if _shelx_hkl_file is found

bug fix: MODELKIT SPACEGROUP 10:bca not reversion any prior nonstandard setting  

bug fix: MODELKIT SPACEGROUP 145:a-b,a+2b,c fails
 -- had not completed implementation of expanded unit cells for settings

# new features from the Denver 2024 ACA meeting:
# see https://github.com/BobHanson/CLEG/tree/main/presentations
# for the presentation "A Concise Linear Encoding of Crystallographic Space Group Settings
# and Group-Subgroup Relationships"
#
# also see https://crystals.symotter.org/ for 
# the new Jmol Space Group Visualizer. https://spacegroups.symotter.org
# presented by Dean Johnston at the ACA meeting

new feature: CIFReader filter "StopOnSHELXHKL"
 -- stops reading file when _shelx_hkl_file is found
 -- should not be used with multiple structures
 -- default FALSE; prior version this was (effectively) default TRUE
    but that causes problems for multiple-stucture CIF files

new feature: SHELX reader and CIFReader by default assign translucent 0.5 to symmetry-related disorder
 -- PART -n
 -- for example, when a solvent is alternatively on one side or another of a C2 rotation

new feature: matrix("!b,c,a>a-c,b,2c;0,0,1/2>a,-a-c,b")
 -- calculates the transformation from a CLEG chain
 -- same as matrix("!b,c,a")*matrix(">a-c,b,2c;0,0,1/2")*matrix("a,-a-c,b")
 -- also works for operations expressed in x,y,z

feature change: DRAW SPACEGROUP ALL glide arrows thicker and colored green
 -- the thin yellow lines were hard to see on slides in Denver

scripting note: algorithm for generating operations from generators:

	// start with the array of "x,y,z" generators
	function getGeneralPositions(gen) {
	 var a = [];
	 var b = [matrix("x,y,z")];
	 var s= ""
	 for (var i = 1; i <= gen.length; i++) {
		for (var j = 1; j <= b.length; j++) {
			var m = matrix(gen[i])*matrix(b[j]);
			// normalize to positive ("unitary") translations only
			// by pulling the translation out, turning it into cartesians, and then unifying it,
			// then adding it back into the 3x3 to regenerate a 4x4 operation
			m = m%1 + (m%2).xyz.uxyz
			var xyz = matrix(m,"xyz");
			var key = ";"+xyz+";";
			if (s.find(key) == 0) {
				// only add already-unfound operations
				s += key;
				b.push(m);
				a.push(xyz);
			}
		}
	 }
	 return a;
	}
 
 scripting note: Using CLEG notation; showing the 3D model of Figure 1.5.1.8 based on
   matrices in Table 1.5.1.1, p. 79
   Primitive hexagonal cell P with a, b, c and the three triple hexagonal 
   cells H with a1; b1; c; a2; b2; c; a3; b3; c. The origin for all cells is the same.
   International Tables for Crystallography (2016). Vol. A, Section 1.5.1.2, p. 82.
   https://onlinelibrary.wiley.com/iucr/itc/Ac/ch1o5v0001/sec1o5o1o2.pdf

	modelkit zap spacegroup 145
	draw u0 unitcell color white
	draw s0 spacegroup all
	
	modelkit spacegroup 145:a-b,a+2b,c
	draw u1 unitcell color pink
	draw s1 spacegroup all
	
	modelkit spacegroup 145:2a+b,-a+b,c
	draw u2 unitcell color red
	draw s2 spacegroup all
	
	modelkit spacegroup 145:a+2b,-2a-b,c
	draw u3 unitcell color purple
	draw s3 spacegroup all

	modelkit spacegroup 145
	 

JmolVersion="16.2.17" // (legacy) also 16.2.18 (SwingJS)

new feature: SHELX reader adds support for PART
 -- *.altloc set by PART number
 -- use display config=1 to show PARTS 0+1, config=2 to show PARTS 0+2
 -- noting that OpenBabel 3.1.1 does not write disorder to CIF when reading PART and writes invalid CIF when CIF->CIF
 
new feature: WRITE CIF adds altloc
 -- _atom_site_disorder_assembly A
 -- _atom_site_disorder_group [altLoc value]
 
bug fix: SHELX reader does not apply LATT > 0 (centrosymmetric) operation

bug fix: SHELX reader not reading occupancy
 
bug fix: CIF writer may gernerate P1 when space group is from file loading rather than structure creation

bug fix: CIF reader fails to bond molecules properly when the structure has an _atom_site_aniso block

bug fix: STL exporter makes isosurface meshes too thick

bug fix: DRAW SYMOP should not draw "wings" on screw axes, since it draws curved angle arrow already

bug fix: {"y": z.x}.format("JSON") fails when z is a map

bug fix: Wyckoff position b not found for CSD XAZTAW and BROFRM05
         The problem is what to do with xx.yyyyy(zz) for precision. 
         I had given that 5 places, but more consideration suggests that
         the presence of error value should limit the precision to 4. 
         This worked in both of these cases. 
         (All this is somewhat of an approximation.)
         Precision can also be set using a load filter:
         
            load xxxx.cif ... filter "precision=3"
         

JmolVersion="16.2.15" // (legacy) also 16.2.16 (SwingJS)

bug fix: x = symop(n) broken for n a symmetry operator number

bug fix: draw symop [4x4 matrix] not working

bug fix: MODELKIT DRAW SPACEGROUP should use prefix "sg" not "sym"

bug fix: various minor aspects of DRAW SPACEGROUP ALL and MODELKIT DRAW SPACEGROUP
 -- new color coding for n-axes
 -- new color coding and larger icons for n-bar axes
 -- missing split planes (mirror+glide and glide+glide)
 -- missing additional 2-fold rotations tangent to corners in hexagonal groups
 

JmolVersion="16.2.13" // (legacy) also 16.2.14 (SwingJS)

bug fix: select UNITCELL should be inclusive, [0,1] (broken in 14.32.18)
 -- not the same as within(unitcell), which is [0,1) exclusive

bug fix: polyhedra COLLAPSED EDGES  does not just act on current polyhedra

bug fix: polyhedra POINTS miscolors isotopes

bug fix: atom color change using color <element name>  not reflected in element key

bug fix: MODELKIT SET KEY not working correctly (broken in 16.2.1)
 -- had been changed to "ELEMENTKEY" without documentation
 -- now just an alias for MODELKIT SET ELEMENTKEY
 -- not supposed to persist through ZAP
 
new feature: SET ELEMENTKEY ON/OFF (actually introduced in 16.2.1)
 -- adds or removes an element key in the upper right for ALL models
 -- key is a list of a colored DRAW point and a b/w ECHO with ids "_!_elkey_<modelIndex>_*"
 -- overrides current settings from MODELKIT SET ELEMENTKEY 
 -- only visible when just a single model is visible
 -- recognizes different isotope colors
 -- does not appear if atoms of the same element or isotope have different colors
 -- setting itself is not explicitly saved in the state
 -- presence of DRAW objects in a state sets MODELKIT SET ELEMENTKEY ON 
    for associated models when restored, preserving the key for those 
    models that had them when saved
 -- persistent through ZAP

new feature: MODELKIT SET ELEMENTKEY ON/OFF (actually introduced in 16.2.1)
 -- adds or removes an element key as per SET ELEMENTKEY ON/OFF, but only for the CURRENT model only
 -- indirectly saved in state as the presence of the associated DRAW objects
 -- key does NOT persist through ZAP
 
new feature: frank (bottom right corner "Jmol") displays "JmolD" for JmolD.jar and JmolDataD.jar


JmolVersion="16.2.11" // (legacy) also 16.2.12 (SwingJS)

bug fix: various minor issues with DRAW SPACEGROUP ALL

NOTE: Introducing here the idea of a "3D interactive space group symmetry model".
      Something like a space group diagram or a general position 
      diagram, but in 3D. Symmetry elements can be filtered out 
      to reveal patterns in the remaining subset; aspects of
      group-subgroup relationships can be depicted, either from a
      purely symmetry-related perspective or in the context of an
      actual structure or a set of related structures. Specific atom-atom
      symmetry relationships can be explored.

new feature: MODELKIT DRAW SPACEGROUP [name or number] [packed]
 -- clears the model with ZAP, then creates the space group symmetry model
 -- draws the full set of symmetry elements
 -- optionally (if PACKED), adds a nitrogen atom in the default general position
 -- shortcut for 
 
    zap;
    modelkit spacegroup ... ;
    draw spacegroup ALL;
    modelkit add N;
    
 -- coding example:

     function showAllSpaceGroups() {
       for (var i = 1; i <= 230; i++) {
       	  modelkit draw spacegroup @i packed;
       	  set echo top right;
       	  echo @i;
       	  refresh;
       }
     } 

	 showAllSpaceGroups; // note that some cubics take quite a bit of time

	function makeSpaceGroupMovie() {
	    zap;
	    background white;
	    capture "spaceGroupMovie.gif";
	    for (var i = 1; i <= 230; i++) {
	       	  modelkit draw spacegroup @i packed;
	       	  set echo top right;
	       	  echo @i;
	       	  refresh;
	    }
	    capture end;
	}
	
	makeSpaceGroupMovie()
	
	 
new feature: SHOW SPACEGROUP TABLE <group>
 -- displays space group tables from Bilbao Crystallographic Server the user's browser
 -- https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen?gnum=110&what=gp&list=Standard%2FDefault+Setting
 -- adds to SHOW SPACEGROUP DIAGRAM (see 16.2.9 release, below)
 -- optional <group> may be a space group name or number
 -- default is to use the current space group
 -- example:
   
    	show spacegroup table
     	show spacegroup table 13
    	show spacegroup table P2/c
 
new feature: syncCallback for mouse-following
 -- allows actions to take place 
	set syncmouse
	sync on
	set synccallback "jmolscript:color atoms property sz"

JmolVersion="16.2.9" // (legacy) also 16.2.10 (SwingJS)

bug fix:  fixes a miscalculation of glide 'g' vs. 'n' in SHOW SYMOP and in colors for DRAW SPACEGROUP

bug fix: DRAW SPACEGROUP failing after SHOW SYMOP

feature change: DRAW SPACEGROUP  display adds triangles, squares, and hexagons at tail of rotation arrows

feature change: new colors and styles for axes
 -- axes with order > 2 now show their order and screw-pitch using pictograms similar to ITA:
   
    2-fold   no pictogram; red for 2, grey for 21
    3-fold   triangle      red for 3, orange for 3{+) < 1/2, blue for 3{+) > 1/2
			               spinner cw for 3{+) < 1/2, ccw for 3{+) > 1/2               
	4-fold   square        red for 4, orange for 4{+) < 1/2, blue for 4{+) >= 1/2
             			   spinner cw for 4{+) < 1/2, ccw for 4{+) > 1/2               
	6-fold   hexagon       red for 6, orange for 6(+) < 1/2, blue for 6(+) >= 1/2
             			   spinner cw for 6{+) < 1/2, ccw for 6{+) > 1/2               
	
 -- good examples are space groups 76-80, 151-180
 
feature change: new color scheme for planes
 -- note how name first letter correlates with type:

	mirror   magenta
    a-glide  azure
   	b-glide  blue
   	c-glide  cyan
   	d-glide  gray (colorless, like a diamond)
   	e-glide  (split color for a+b, b+c, a+c  (still working on getting all of these -- see SG 64)
   	g-glide  green
   	n-glide	 orange (esp: naranja)

 -- nice examples:
	-- m+n (SG 65, 69)
	-- a, b, and c (SG 72, 73)
	-- a, b, n, and mirror (SG 74)
    -- d (SG 43, 70, 122)
    -- m, n, d (SG 109)
    -- a, b, c, d (SG 110)
    
new feature: SHOW SPACEGROUP DIAGRAM xxx
 -- displays International Tables space group diagram for specified
    space group by number or Hermann-Mauguin name in user's browser. 
 -- specified origin might be lower on the page.
 -- for example:
 
 	show spacegroup diagram P4/mmm
 	
	opens  https://onlinelibrary.wiley.com/iucr/itc/Ac/ch2o3v0001/sgtable2o3o123
 
new feature: DRAW *xxx* ONLY
 -- shortcut for DRAW * OFF; DRAW *xxx* ON
 -- very convenient for turning on and off aspects of complicated DRAW SPACEGROUP ALL:
  
      DRAW *X_g* ONLY     // X = a, b, c, d, g, n (e is a combination of a/b, a/c, b/c; see Group 68)
 	  DRAW *bar_N* ONLY   // N = 3, 4, 6
 	  DRAW *rot_N* ONLY   // N = 2, 3, 4, 6
 	  DRAW *screw_N* ONLY // N = 2, 3, 4
 	  DRAW *inv* ONLY     // inversion centers
 	  DRAW *mirror* ONLY  // mirror planes only
  
 -- note that a six-fold axis will contain three arrows: 2-fold, 3-fold, and 6-fold
 -- likewise for 6-bar/3-fold and 4-fold-2-fold, 4-bar/2-fold
 	 
 	  	 
new feature: MODELKIT ZAP...
 -- same as   ZAP; MODELKIT ...

 	 
JmolVersion="16.2.7" // (legacy) also 16.2.8 (SwingJS)

bug fix: three nonstandard settings not showing correct JmolID. 

bug fix: Wyckoff positions for nonstandard space group settings not available
 -- Jmol now calculates Wyckoff positions for any nonstandard setting 
 -- 134 additional nondefault settings (from BCS wp-list) added

bug fix: ++x; and --x; never fully implemented;
 -- specifically the stand-alone statements
 
bug fix: using map1["x"] = ++map["y"] does not properly make a copy
 -- later incrementing of one value was also changing the other
 
bug fix: zap; modelkit spacegroup 5:a,-b,-a-c should work

bug fix: Starting with Jmol 16.1.32, Jmol should accept CIF files with duplicate atom_site_label entries, but it doesn't
  - it will add numbers if two identical atom_site_label values are found
  - an warning message is reported in the Java console only.
  
feature change: AFLOWLIB database updated
 -- now "https://www.aflowlib.org/p/%AFLOWID%.cif" 
 -- still no AJAX CORS access
 -- should be no effect on usability
  
new feature: dropping requirement for double quotes in MODELKIT SPACEGROUP ...
 -- just isn't necessary generally
 -- if spaces are present, then quotes are required
 -- semicolon will be incorporated provide there is no space after it
 -- for example:
 
   zap; modelkit spacegroup 5:a,-b,-a-c;0,0,0 packed
   zap; modelkit spacegroup "P 2/m"
 
new feature: MODELKIT SPACEGROUP <CLEG expression>
 -- full CLEG implementation for subgroups.
 -- for example:
 
    modelkit spacegroup "C 2 2 21 >> P 21 21 2 >> P1 21 1"
    
    same as 
    
    modelkit spacegroup "20>b,c,a;1/4,0,0>18>c,a,b;1/4,0,0>4" 

    or, in this case, because they are default settings and the first-listed subgroups: 
    
    modelkit spacegroup 20>>18>>4 

 -- reports overall transformation, in this case:
 
	 a,b,c;1/4,0,1/4
	 20>b,c,a;1/4,0,0>18>c,a,b;1/4,0,0>4
	 basis=({0:3})
 
 -- sample script function:
 
	function showSubgroup(i1, i2, p1,p2) {
	  var tr = "";
	  if (!i2) {
		if (i1.type == "integer") {
			print spacegroup(i1,0,"subgroups")
			return;
		}
		tr = i1;
		i1 = tr.split(">")[1];
	  }
	  if (!tr) {
	  	var sub = "sub";
	  	if (p2) {
	  	  sub = spacegroup(i1,i2,p1,p2);
	  	} else if (p1.type == "string" && p1.length > 0) {
	  	  sub = p1;
	  	} else {
	    	  sub = spacegroup(i1,i2,1,1);
	  	}
		if (sub[0] == "!") {
		  print "can't do that " + sub;
		  return;
	  	}
	  	tr = "" + i1 + ">" + sub + ">" + i2;
	  }
	  save orientation o1
	  zap
	  set echo bottom left
	  echo @tr
	  set scriptreportinglevel = 3;
	  modelkit spacegroup @i1
	  restore orientation o1
	  draw uc1 unitcell color red
	  draw sg1 spacegroup all  
	  modelkit add P wyckoff "G"
	  modelkit spacegroup @tr packed
	  set scriptreportinglevel = 0;
	  color property site 
	  draw uc2 unitcell color yellow
	  draw sg2 spacegroup all
	  flash = false;
	  if (flash) {
	    delay 2
	    for (var i = 0; i < 3; i++) {
		delay 1
		draw sg1* on
		draw sg2* off
		delay 1
		draw sg1* off
		draw sg2* on
	    }
	  } else {
	    draw sg1* translucent 0.8
	  }
	}
	 
	showsubgroup "20>>18>>4"
	     
    
JmolVersion="16.2.5" // (legacy) also 16.2.6 (SwingJS)

bug fix: Some SHELX files not reading
 -- not clear why some and not others. But it is fixed.

bug fix: "standard" PNG and JPG files created by Jmol not readable back into Jmol
 -- embedded state scripts were not being checked
 -- note: Jmol automatically saves its state within standard JPG and PNG files
          unlike PNGJ files, where the state and all necessary files are saved 
	      Generally not recommended, since any loaded files still must be retrieved again.
	      But with MODELKIT SPACEGROUP, there is no model file to read; 
	      so these standard PNG and JPG files should be readable.

bug fix: JPG file drop improperly resolved as MMTF
 -- JPG should be read for its embedded script file, not as MMTF
 
bug fix: load =aflowlib/62.3 spacegroup "x,y,z;x,-y,z" does not set display name correctly in upper left information

bug fix: unit cell not read from state after use of MODELKIT SPACEGROUP specifcally when atoms are present

bug fix: x = spacegroup("Pnma") failing
 -- specifically for Hermann-Mauguin names, Hall names, and AFLOWLIB/n.m

bug fix: AFLOWLIB database changed
 -- now "https://www.aflowlib.org/prototype-encyclopedia/%AFLOWID%/findsym.cif" 
 -- no problem for saved PNGJ files
 -- load =AFLOWLIB/n.m requires this fix
 
new feature: load =aflowlib/<AFLOWID>
 -- allows reading of specific AFLOW Encyclopedia of Crystallographic Prototypes by ID
 -- for example:
 
  load =aflowlib/A3BC_tP5_99_ac_b_a-002 packed
  
new feature: x = spacegroup("AFLOWLIB/A3B14C2D3*")
 -- note that the ID starts with the empirical cell formula ending with "_"     
 -- returns an array of "=aflowlib/n.m<tab>AFLOWID" entries
    which can be split to give either the load string or the AFLOW iD
 -- for example:
 
	$ print spacegroup("AFLOWLIB/A7B2_*")
	=aflowlib/63.34 	A7B2_oC36_63_cgh_f-001
	=aflowlib/164.13	A7B2_hP9_164_ac2d_d-001
	=aflowlib/164.14	A7B2_hP9_164_ai_d-001
	=aflowlib/166.44	A7B2_hR18_166_a2cdh_2c-001
	=aflowlib/227.18	A7B2_cF144_227_2ef_e-001
	
	$ print spacegroup("AFLOWLIB/A7B2_*").split("\t",true).col(1)
	=aflowlib/63.34
	=aflowlib/164.13
	=aflowlib/164.14
	=aflowlib/166.44
	=aflowlib/227.18
	
	$ print spacegroup("AFLOWLIB/A7B2_*").split("\t",true).col(2)
	A7B2_oC36_63_cgh_f-001
	A7B2_hP9_164_ac2d_d-001
	A7B2_hP9_164_ai_d-001
	A7B2_hR18_166_a2cdh_2c-001
	A7B2_cF144_227_2ef_e-001

  -- check of empirical cell formula:
  
	$ load =aflowlib/63.34 packed
	$ print {cell=555}.find("CELLFORMULA", true)
	Ca 2 Ag 7
	$ print {cell=555}.find("CELLFORMULA")
	Ca 8 Ag 28
	
new feature: x = spacegroup("AFLOWLIB/all")
 -- returns array of arrays of information maintained in org/jmol/symmetry/sg/json/aflow_structures.json
 -- note that whenever there is an AFLOW Encyclopedia update, this information could go stale
    and "=AFLOWLIB/3.10" might change. However, it is unlikely that the AFLOW ID will change. 

new feature: load ... centroid 0.5
 -- expands the centroid limit in fractions of a unit direction
 -- same as load ... packed 0.5 centroid, but more intuitive

  
JmolVersion="16.2.3" // (legacy) also 16.2.4 (SwingJS)

demo page: https://chemapps.stolaf.edu/jmol/jsmol/iucrdemo
  -- supplement to a forthcoming publication
  -- lots of examples of using the MODELKIT SPACEGROUP command

note: completion of the MODELKIT SPACEGROUP implementation initiated in 15.2.30/14.2.30

bug fix: (JavaScript) no spinner showing at startup. 
                      Jmol_spinner.gif was missing in site/jsmol/j2s/img

bug fix: (JavaScript chemapps) the php/jsmol.php AJAX relay was failing due to 
                               the presence of both header('Access-Control-Allow-Origin: *') in jsmol.php
                               and .htaccess file in site/, causing a "multiple header" error.
                               The .htaccess file was kept, and the php header was removed. 
                               
bug fix: (legacy JavaScript only) right-click on pop-up menu throws background error 
                                  and fails to place submenu correctly
                                  (traced to minor jMenu incompatibility with jQuery 3.7.1)  

bug fix: (JavaScript) Jmol javascript command containing call back to Jmol.script() 
                           fails to execute callback script

bug fix: (JavaScript) JSpecView and other pages fail to open due to Enum and 
                           ArrayList coding bugs recently introduced that are only used in JSpecView

bug fix: animation range not responsive to load append

bug fix: PDB reader needs to allow PDB files with BIOMT but no CRYST1/SCALE headers

bug fix: SHELX reader fails due to LATT processing failure

bug fix: display of symmetry elements in SHOW and DRAW minor issues

bug fix: DRAW UNITCELL with {555 666 1} notation should show all interior edges of 
         block of cells

bug fix: more work on subgroup-group relations
 - still finalizing code for using transformations such as "a+b,a-b,c;1/2,1/2,0"
 - for example, to create a group, add atoms, and display a packed subgroup, coloring by site:
 
		zap
		modelkit spacegroup 18
		draw unitcell color red
		modelkit add P wyckoff "G"
		modelkit spacegroup "18 >c,a,b;0,1/4,0>4" packed
		color property site
		draw spacegroup all


feature change: DRAW UNITCELL default changed to MESH NOFILL
 - was normal default of FILL NOMESH, but this is much better
 - overridden by explicit NOMESH or FILL
 - does not affect states, as they are explicit, not default

feature change: x = spacegroup("153") or x = spacegroup(153)
 - one parameter, just a number from 1 to 230
 - was Jmol's idiocyncratic Hall-notation-derived operator list
 - now ITA standard list
 - same list; just a different order
 - spacegroup() by itself shows current, possibly file-derived, operators. 

new feature: x = spacegroup("153:")
 - with colon
 - returns Jmol's internal setting and original listing

new feature:  DRAW UNITCELL AXES
 - draws axes red/green/blue (no labels) with unit cell.
   
new feature: spacegroup(g1,g2,i1,i2)
 - same as spacegroup(g1,g2,i1,i2,"subgroups")
 - "subgroups" is unnecessary
  
new feature: x = spacegroup("Hall:p 32 2\" (0 0 2)")
 - translates Hall notation to XYZ list 
 - outputs a map similar to x = spacegroup(154) with at least 
   keys HallSymbol, operationCount, and operationsXYZ; 
   possibly, if known, also:
   
	    HermannMauguinSymbol
		clegId
		crystalClass
		ita
		itaIndex
		jmolId
   
 
new feature: x = {*}.rxyz
 - returns rational fraction if within +/- 0.001 of n/2,3,4,6,8,12,24,48
 - returns rounded to 0.001 if not
 - string value with parentheses: "(1/2 1/2 1/2)"

new feature: fpt.rxyz
 - returns rational of fractional.
 - {1/2 1/2 1/2}.rxyz == "(1/2 1/2 1/2)" 

new feature: x = matrix(...)
  - creates a 3x3 or 4x4 matrix
  - options include (by example):
	  matrix("x-y+1/2,x+y,z")     // row-based
	  matrix("a+b+1/2,b-a,c")     // column-based
	  matrix("a+b,b-a,c;1/2,0,0") // ITA transform notation, col-based
	  matrix([1,2,3,4,5,6,7,8,9]) // 3x3 from array[9]
	  matrix([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]) // 4x4 from array[16]
	  matrix([1,2,3] [4,5,6] [7,8,9]) // 3x3 from array[3][3]
	  matrix([1,2,3,4] [5,6,7,8] [9,0,1,2] [3,4,5,6]) // 4x4 from array[4][4]

      P = matrix("c,a,b;1/2,0,0");      
      f = {0.5 0.25 0.5};
      print P*f;
       
         {0.75 0.5 0.5}

new feature: x = matrix(..., "abc")
new feature: x = matrix(..., "xyz")
  - returns the string form of a 4x4 matrix, either in abc-column format or xyz-row format
  
new feature: MODELKIT SPACEGROUP <setting> 
 - Jmol will automatically adjust unit cell if necessary. 
 - should be used after ZAP or LOAD
 - for example:
 
 		function test(n,i) {
			if (!i) { 
				load @{"=aflowlib/" + n} + " packed";  
				center unitcell;
				print "nSettings=" +  spacegroup("ITA/" + n).n;
				test(n,1); 
			} else {
				draw delete;
				modelkit spacegroup @{"" + n + "."+i} packed;
				draw ID @{"sg"+i} spacegroup all;
				center visible;
				axes 0.1;
				connect auto;
				moveto axis c1;
			}
		}
 	
 		test(23)
 			
 	opens an example AFLOW Encyclopedia of Crystallographic Prototypes, then 
 	switches to a one of the available settings, packing the new unit cell
    and displays all symmetry operations. Finally, does some clean up and 
    goes to the standard ITA "c1" axis view. (looing toward 0 along c axis in the top left corner) 

new feature: MODELKIT SPACEGROUP "n >sub> m"
  - switch from crystallographic group to maximal subgroup
  - uses (unpublished) CLEG notation (more details to follow)
  - chooses first-listed transformation
  - typically a translationengleichen (translation-preserving) transformation
  
  - for example: MODELKIT SPACEGROUP "13 >sub> 10"
  
	function showSubgroup(i1, i2) {
	  if (!i2) {
		print spacegroup(i1,0,"subgroups");
		return;
	  }
	  save orientation o1;
	  zap;
	  modelkit spacegroup @i1;
	  restore orientation o1;
	  center unitcell;
	  draw uc1 unitcell color red;
	  draw sg1 spacegroup all;
	  modelkit add P wyckoff "G";
	  modelkit spacegroup @{"" + i1 + ">sub>" + i2} packed;
	  color property site;
	  draw uc2 unitcell color yellow;
	  draw sg2 spacegroup all;
	  delay 2;
	  for (var i = 0; i < 10; i++) {
		delay 1;
		draw sg1* on;
		draw sg2* off;
		delay 1;
		draw sg1* off;
		draw sg2* on;
	  }
	  draw sg1* on;
	  draw sg2* on;
	}
	
    showSubgroup 107
    showSubgroup 107 42
    
new feature: unitcell NONE 
 - removes unit cell and spacegroup
 - removes unit cell and spacegroup information from model auxiliary info _M
 - allows nonperiodic manipulation of atom positions
  
new feature: SHELX reader returns Q-peaks as "Xx" (unknown atom); was returning "C"

new feature: x = spacegroup("ITA/4:c,a,b")
 - finds the ITA spacegroup setting with this specific transformation.
 - text match so must be exact form:  
 	[rotation;translation], e.g. a,b,c;0,0,0   
    "2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c"  
	"a+b,-a+b,c;-1/4,-1/4,-1/4"		 

new feature: x = spacegroup(itaNo, itaTo, index1, index2, "subgroups") 
 - returns information on group-subgroup relationships 
 - based on Bilbao Crystallographic Server public data
 - uses set of JSON data files - see 
 - return depends upon values:
 
     spacegroup(4,"subgroups")       // all maximal subgroup data for space group 4
	 spacegroup(4,0,"subgroups")     // an array of known subgroup numbers
     spacegroup(4,5,"subgroups") 	 // list of all 4 >> 5
     spacegroup(4,5,1,"subgroups")   // first-listed 4 >> 5 as a map
     spacegroup(4,0,2,"subgroups")   // second listed subgroup as a map
     spacegroup(4,0,2,1,"subgroups") // second listed subgroup, first transformation
     spacegroup(4,5,1,2,"subgroups") // first listing for 4>>5, second transformation
     spacegroup(4,0,0,0,"subgroups") // an array of arrays of [isub, ntrm, subIndex, type]

  where
   
   *  [ isub, ntrm, subIndex, idet, trType ]
   *  
   *  isub: subgroup ITA number
   *  ntrm: transformation count
   *  subIndex: index of this group-subgroup relationship
   *  idet:  determinant if determinant >= 1; -1/determinant if determinant < 1
   *  trType: 1 translationengelieche, 
   *          3 klassengleiche "ct" loss of centering translation, 
   *          4 klassengleiche "eu" enlarged unit cell

   
JmolVersion="16.2.1" // (legacy) also 16.2.2 (SwingJS)

bug fix: when unit cells are modified, Symmetry should not be assumed to be unchanged.

bug fix: unit cell information should only show space group if symmetry if the unit cell is appropriate

bug fix: with set picking SYMMETRY, double-clicks should not start measurements

bug fix: LOAD SUPERCELL should retain symmetry-relataed cell as "conventional"

new feature: "contrast" color
 -- for LABEL and ECHO, particularly
 -- chooses WHITE or BLACK, depending upon the Jmol window background color
 -- saved in the state as [xfedcba]
 
new feature: set picking SYMMETRY now aliased with set picking SYMOP

new feature: MODELKIT SPACEGROUP "HALL:xx xx xx" will create a space group from a Hall or extended Hall description
 -- future enhancement will allow any HALL description
 -- see  "Space-group notation with an explicit origin", S. R. Hall, Acta Cryst. (1981). A37, 517-525 https://doi.org/10.1107/S0567739481001228
         http://macxray.chem.upenn.edu/LATT.pdf thank you, Patrick Carroll
		 http://cci.lbl.gov/sginfo/hall_symbols.html
		 http://cci.lbl.gov/cctbx/explore_symmetry.html
 
new feature: MODELKIT SPACEGROUP ... UNITCELL [a b c alpha beta gamma] PACKED
 -- after ZAP, creates a new space group with the given unit cell
 -- optionally packing it, if not after ZAP
 -- if the unit cell is incompatible with the space group, a similar compatible cell is used
 
 
version: Version 16.2 represents a major advance in capability for Jmol, particularly in the 
         area of space groups and symmetry in relation to 16.1.1, released 2023.01.24. 
         The following is the listing of 90 new features since then, culled from this file and sorted. 
         More detail on these can be found below.

new feature: CONFIGURATION -n
new feature: CONFIGURATION "A"
new feature: "contrast" color
new feature: crystal structure set picking dragMolecule with ALT implemented 
new feature: DRAW "<hover>xxx</hover>...."
new feature: DRAW boundbox $[isosurface id]
new feature: DRAW boundbox BEST $[isosurface id]
new feature: DRAW HOVERLABEL "xxx"
new feature: DRAW SPACEGROUP @a n
new feature: DRAW SPACEGROUP @n
new feature: DRAW SPACEGROUP ALL 
new feature: DRAW SYMOP [3,4,5] @1
new feature: ECHO/DRAW with ID starting with "_!_" 
new feature: Jmol application -A --scriptarguments flag
new feature: LOAD "$?" load structure from NCI/CADD with prompt
new feature: LOAD "*?" load PDB ID from EBI with prompt
new feature: LOAD ":?" load structure from pubChem with prompt
new feature: LOAD "=?" load PDB ID from RCSB with prompt
new feature: LOAD "==?" load chemical component from RCSB with prompt
new feature: LOAD .... fill "rhombohedral"
new feature: LOAD .... fill "trigonal"
new feature: LOAD =aflowlib/155.2
new feature: LOAD...FILTER "lowPrecision" 
new feature: LOAD...FILTER "PRECISION=n" where n is up to 16 digits
new feature: LOAD - allow CIFReader to ignore COD 2107628 unmodulated operations in presence of modulated
new feature: LOAD - AMS reader
new feature: LOAD - BilbaoReader allows LOAD ... spacegroup ":n" to force origin, where n is 1 or 2
new feature: LOAD - Binary CIF file structure reading. The BinaryCIF file format
new feature: LOAD - CIFReader "ignoreGeomBond" (was SwingJS only)
new feature: LOAD - CIFReader FILTER option NOWYCKOFF
new feature: LOAD - CIFReader reads atom_site_wyckoff_label
new feature: LOAD - CrystalMaker CMDF (binary) file reader
new feature: LOAD - Jmol will accept CIF files with duplicate atom_site_label entries
new feature: MACRO AFLOW adds SHOWSG(n,i,addSymmetry)
new feature: MEASURE .... "default"
new feature: MEASURE SELECT ALL
new feature: MEASURE SELECT...
new feature: MEASURE SELECTED
new feature: MEASURE SELECTED ...
new feature: MINIMIZE GROUP {atoms} 
new feature: MINIMIZE ONLY {atoms} 
new feature: MINIMIZE SELECT {atoms} 
new feature: MODELKIT ADD <elem> WYCKOFF <Aa-z>
new feature: MODELKIT MINIMIZE
new feature: MODELKIT MOVETO @atoms @points
new feature: MODELKIT SET KEY ON/OFF
new feature: MODELKIT SPACEGROUP "HALL:xxxxx" will create a space group from a Hall or extended Hall description
new feature: MODELKIT SPACEGROUP "x,y,z;x,-y,z;..."
new feature: MODELKIT SPACEGROUP ... UNITCELL ...
new feature: MODELKIT VIBRATION WYCKOFF; VIBRATION ON
new feature: POLYHEDRA OFFSET {x, y, z} WIGNERSEITZ
new feature: POLYHEDRA OFFSET 1.0 BRILLOUIN n   where n > 1
new feature: POLYHEDRON LIST
new feature: popup menu adds "atom picking..." Drag Atom and Drag Molecule
new feature: RESTORE UNITCELL name
new feature: SAVE UNITCELL name
new feature: SELECT CONFIG=0
new feature: SET minimizationReportSteps
new feature: SET picking DRAGMOLECULE for crystal structures
new feature: SET picking SYMMETRY now aliased with set picking SYMOP
new feature: SET symmetryHM TRUE
new feature: SMILES/ALLCOMPONENTS flag for generation of SMILES having multiple components
new feature: threaded symmetry-aware UFF minimization of crystal structures.
new feature: UFF minimization with application of symmetry for 
new feature: UNITCELL [a,b,c,alpha,beta,gamma]
new feature: UNITCELL RHOMBOHEDRAL and UNITCELL TRIGONAL (or HEXAGONAL - same)
new feature: ZAP;MODELKIT SPACEGROUP ... UNITCELL [a b c alpha beta gamma] PACKED
new feature: x = (array of SMILES strings).find("SMARTS" or "SMILES", pattern)
new feature: x = _args() and _args(n)
new feature: x = _arguments and _argumentCount added to SET CALLBACK "jmolscript:..."
new feature: x = {*}.find("spacegroup", "parent") 
new feature: x = {atomset}.atoms and {atomset}.label("%[atoms]")
new feature: x = 3x3matrix%1
new feature: x = 3x3matrix%2
new feature: x = atomset.search(pat)
new feature: x = compare(A, B, map) and compare(A, B, map, "stddev")
new feature: x = function special variables _caller, _callers, _name
new feature: x = pattern(<smarts string>) 
new feature: x = search(target, pattern)
new feature: x = spacegroup("ITA/155.1") 
new feature: x = spacegroup("ITA/ALL") 
new feature: x = symop("count")
new feature: x = symop(matrix,option)
new feature: x = symop("wyckoff")
new feature: x = symop("wyckoff", "c")
new feature: x = symop("wyckoff","C")
new feature: x = symop("wyckoff","G")
new feature: x = symop("wyckoff","S")
new feature: x = @@3.symop("wyckoff",option)
new feature: x = {atom}.wyckoff, label %[wyckoff], color PROPERTY WYCKOFF 
new feature: x = string.pop()
new feature: x = string.push("xx")

This extends the initial set of 85 new crystallographic features introduced in version 15.2:
   
new feature: CALCULATE POINTGROUP {atoms}
new feature: CALCULATE SPACEGROUP 
new feature: CALCULATE SPACEGROUP {atoms}
new feature: CENTER UNITCELL 
new feature: DRAW HKL {1 1 1 x.x} 
new feature: DRAW HKL {1 1 1} OFFSET x.x
new feature: DRAW INTERCEPT UNITCELL xxx LATTICE {na nb nc}... HKL ....
new feature: DRAW intersection [unitcell or boundbox description] [line or plane description]
new feature: DRAW intersection [unitcell or boundbox description] LINE @1 @2 
new feature: DRAW intersection [unitcell or boundbox description] ON [line or plane description]
new feature: DRAW POINTGROUP {atoms} CENTER xx
new feature: DRAW UNITCELL xxx LATTICE {na nb nc}
new feature: GETPROPERTY unitCellInfo
new feature: ISOSURFACE SLAB designations "a=" "b=" "c=" "-a=" "-b=" "-c=" "ab" "bc" "ac" "-ab" "-bc" "-ac"
new feature: LOAD .... SPACEGROUP "Hall:P 2y"
new feature: LOAD [some crystal structure] filter "POLYMERX"
new feature: LOAD [some crystal structure] filter "SLABXY"
new feature: LOAD spacegroup 213 unitcell [5 5 5 90 90 90]
new feature: LOAD xxxx.mol FILTER "no3D" 
new feature: LOAD xxxx.mol FILTER "noHydrogen" (Or just "NOH")
new feature: MINIMIZE now works (minimally) with a crystal structure. 
new feature: MODELKIT ON/OFF
new feature: MODELKIT ADD "C" point [PACKED]
new feature: MODELKIT ADD "Cl" {1/2 1/3 1/3}
new feature: MODELKIT ADD "Cl" {1/2 1/3 1/3} PACKED
new feature: MODELKIT ADD @1 
new feature: MODELKIT ADD @1 "Cl" {1/2 1/3 1/3}
new feature: MODELKIT ADD @1 "Cl" {1/2 1/3 1/3} PACKED
new feature: MODELKIT ADD @1 "N"
new feature: MODELKIT ADD @1 "N" PACKED
new feature: MODELKIT ADD @1 PACKED
new feature: MODELKIT ADD @2 "C" [PACKED]
new feature: MODELKIT ADD @2 [PACKED]
new feature: MODELKIT ADD {xxx} PACKED
new feature: MODELKIT ADD C [array of points] 
new feature: MODELKIT ADD/DELETE/MOVETO 
new feature: MODELKIT CONNECT @1 @2 [0,1,2,3,4,5,p,m] (default 1)
new feature: MODELKIT DELETE {atoms}
new feature: MODELKIT FIXED NONE
new feature: MODELKIT FIXED PLANE plane
new feature: MODELKIT FIXED VECTOR point1 point2
new feature: MODELKIT MOVETO @1 {1/2 0 0}
new feature: MODELKIT MUTATE
new feature: MODELKIT PACKED
new feature: MODELKIT ROTATE axis1 axis2 {atoms} degrees
new feature: MODELKIT SET autobond true
new feature: MODELKIT SET hidden true
new feature: MODELKIT SPACEGROUP
new feature: MODELKIT SPACEGROUP "P1"
new feature: MODELKIT SPACEGROUP 123
new feature: MODELKIT SPACEGROUP 123 packed
new feature: MODELKIT SPACEGROUP ... UNITCELL [a b c alpha beta gamma] PACKED
new feature: MODELKIT SPACEGROUP "ITA/itno.setting" (e.g. "ITA/155.2")
new feature: MODELKIT SPACEGROUP "HALL:xx xx xx" 
new feature: MODELKIT UNDO/REDO
new feature: MODELKIT UNITCELL [unitcell description]
new feature: ModelKitCallback 
new feature: MOVETO AXES [-][ab, bc, ca, ba, cb, ac][1, 2, 3, 4]
new feature: plane designations "ab" "ab1" "ac "ac1" "bc" bc1" short for {0 0 1/1 0} {0 0 1/1 c} etc. 
new feature: set picking dragAtom TRUE now recognizes symmetry for crystal structures
new feature: UNITCELL FILL {na nb nc} 
new feature: UNITCELL OFFSET @1; UNITCELL OFFSET {atoms}
new feature: UNITCELL SUPERCELL {na nb nc} 
new feature: UNITCELL SURFACE {h k l} [height | scale%] [offset or offset%] [TOP]
new feature: x = @@1.symop(2, "invariant")
new feature: x = @1.pointgroup("spacegroup")
new feature: x = @1.symop("invariant")
new feature: x = [{point},{point},...].find("equivalent", flags) {
new feature: x = {*}.find("spacegroup") -- discovers the space group for a model 
new feature: x = {*}.find("spacegroup","x,y,-z")
new feature: x = {*}.inchi("fixedh?")
new feature: x = {*}.inchi("standard")
new feature: x = {1/2 1/2 1/2}.symop("invariant")
new feature: x = {1/2 1/2 1/2}.symop(2, "invariant")
new feature: x = {atoms}.pointGroup()
new feature: x = hkl(1 0 0 0.3) to produce plane offset by 0.3 Angstroms from the origin.
new feature: x = load(filename, asbinary, async) or load(filename, nbytesMax, async) or load(filename, "JSON", async)
new feature: x = search(atomset)
new feature: x = spacegroup("123") or spacegroup(123)
new feature: x = spacegroup("x,y,z&-x,y,z") or spacegroup("&x,y,z;-x,y,z") or spacegroup("x,y,z;-x,y,z&")
new feature: x = spacegroup("x,y,z;-x,y,z")
new feature: x = spacegroup("x,y,z;-x,y,z", [a, b, c, alpha, beta, gamma])
new feature: x = spacegroup(6, [a, b, c, alpha, beta, gamma])
new feature: x = symop(2, "invariant")
new feature: x = symop(3,@1,"array") adds "xyzNormalized"
new feature: ZOOM UNITCELL 0
new feature: ZOOMTO UNITCELL 0

bug fix: changing unit cell using just UNITCELL rather than MODELKIT UNITCELL improperly retains symmetry
 -- when the unit cell is offset, symmetry should drop to P1
 -- when the unit cell is RESET or otherwise returned to the one associated
    with the space group, symmetry should be returned
    
bug fix: unit cell information displayed should represent the space group accurately
 -- file-based symmetry initially should reflect the opertors from the file
 -- after MODELKIT SPACEGROUP, the information should reflect a specific 
    setting in Jmol and ITA, if found.

new feature: MODELKIT SPACEGROUP ... UNITCELL ...
 -- adds the ability to set the space group and unit cell at the same time
 -- unit cell parameters must be compatible with the space group, or the action is aborted
 -- unit cell can be expressed in one of three formats:
    -- as the array [a b c alpha beta gamma] 
    -- as the array  of cartesian vectors [origin, va, vb, vc}
    -- as the setting transtormation string "a,b,c;0,0,0"  

new feature: set symmetryHM TRUE
 -- for show/calculate/draw POINTGROUP
 -- TRUE switches to Hermann-Mauguin (2m, 2/m2/m2/m) notation
 -- FALSE switches back to the default Schoenflies (C2v, D2h) notation 

example script:

 -- creating a group-subgroup comparison, where the transform between settings is known
 -- based on information at https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-tranmax?way=up&super=20&sub=4&index=2&client=maxsub&what=&path=&series=&conj=all&type=t
 
	zap
	modelkit spacegroup 20
	draw u20 unitcell color orange mesh nofill "uc-20"
	modelkit add P Wyckoff G
	// switching to sg 4 -- note that the listed transform matrix 
	// is for subgroup to supergroup; we need the opposite here, thus the "!" prefix
	modelkit spacegroup 4 unitcell "!1/2a+1/2b,c,1/2a-1/2b"
	// drawing unit cell and operations
	draw uc4 unitcell diameter 0.01 color orange mesh nofill "uc-4"
	color property site
	draw id "s12" symop @1 @2
	draw id "s43" symop @4 @3
	draw id "s56" symop @5 @6
	draw id "s87" symop @8 @7
	draw id "sg4" spacegroup all
	//write c:\\temp\\iucr\\g20-sg4-w-4-draw.png as PNGJ
	// switching back to sg 20:
	modelkit spacegroup 20 unitcell "1/2a+1/2b,c,1/2a-1/2b"
	print symop("wyckoff")
	print {*}.wyckoff.pivot;
	// switching to sg 4:   
	modelkit spacegroup 4 unitcell "!1/2a+1/2b,c,1/2a-1/2b"
	print symop("wyckoff")
	print {*}.wyckoff.pivot;


JmolVersion="16.1.63" // (legacy) also 16.1.64 (SwingJS)

bug fix: (legacy JavaScript only) secondary structure reading broken in 16.1.59

bug fix (legacy JavaScript only) script fails when referencing undeclared variable

bug fix: PDB file with all UNK residues considered "not PDB" and skips reading sequence number
 -- logic changed to also check for only one residue number
 
new feature: MODELKIT VIBRATION WYCKOFF; VIBRATION ON
 -- atoms "rattle" in their Wyckoff position
 -- just for fun; not a real vibration

new feature: MODELKIT SET KEY ON/OFF
 -- adds an element key in the upper right corner
 -- must be individually added per frame and after file loading
 -- only visible when only a single model is visible
 -- element symbols colors use black/white contrasting with background
 -- recognizes different isotope colors
 -- does not get created appear if atoms of the same element have different colors
 -- automatically updated if MODELKIT ADD/ASSIGN/DELETE are used
 
new feature: ECHO/DRAW with ID starting with "_!_" 
 -- reserved for "single-model-only" echo and draw 
 -- hidden when more than one frame is visible
 -- used by element key so that keys do not overlap
  bug fix: PWMAT reader failing with SUPERCELL option

bug fix: SHOW DATA * fails
bug fix: SHOW DATA TYPES fails

bug fix: saved state for draw [x y %] ignored when read back in.

bug fix: modelkit moveto @8 {2 3 4} not working properly
 -- should behave the way modelkit ADD C {3 3 3} works, 
    which is whether or not there is a cyrstal structure
 -- should adhere to modelkit SET ADDHYDROGEN setting of true or false
  
bug fix: CIF reader should only check repeated atom label within a given blocks
 -- problem was with files that have anisotropic parameters before _atom_site
 -- solution is to only check for duplicates within single loop blocks
 -- test case: LOAD =COD/2004513 centroid; wireframe only ; ellipsoids on
 
bug fix: (Java only) Jmol Script Console <TAB> completion of file names starting with " 
    double quote adding "null" when no match is found; should just terminate with "/"

bug fix: crystallographic set picking draw molecule does not work if a fragment is found
 -- should expand/move selection to the largest molecule with the same set of sites

documentation correction: getproperty "dataInfo" not getProperty "data", and description 
  is incorrect. This should read:
  
  	x=getProperty("dataInfo", "types") or GETPROPERTY DATAINFO TYPES
  
  		returns an array of two strings: ["types",<list>]
  		where <list> is a string that is a comma-separated list of data names

	x=getProperty("dataInfo", "*") or GETPROPERTY DATAINFO *
  
		returns the array of data names
  
	x=getProperty("dataInfo", "property_xxx") // case ignored
	
		return an array that consists of:
		
			[1] the exact-case name of the property
			[2] the array of values
			[3] a bitset indicating the associated atoms
			[4] an integer used internally
			[5] a string that will be non-null if the value is from the loaded file
			
    getProperty("DATAINFO") and GETPROPERTY DATAINFO both default to "TYPES"
    			   
 
bug fix: set echo ID "X" {0 0 0}  does not place the echo at {0 0 0}

bug fix: set echo ID "X" offset {0 0 0} results in a very tiny font with SET FONTSCALING TRUE

bug fix: echo @x with trailing space gives "@x" instead of the value of variable x

bug fix: echo "\\@{...}" loses "\\" when saved in state

bug fix: POLYHEDRA command should allow keywords following center specification: POLYHEDRA @6 COLLAPSED

bug fix: (legacy only) dragging a molecule around to rotate it should continue
         after the mouse leaves the applet space (Fix was in JSmolCore.js, part of JSmol.min.js)

bug fix: print symop("wyckoff") only prints the {x,y,z} general coordinate; should print all

bug fix: print symop("wyckoff", label) should include centering
  -- for example:
  
	 $ modelkit spacegroup 20
	 $ print symop("wyckoff", "a")
		 (x,0,0) (-x,0,1/2)  (x+1/2,1/2,0)  (-x+1/2,1/2,1/2)

feature change: (legacy only) now using jQuery 3.7.1
 -- previous version of jQuery (jQuery 1.11.0) is still there is needed
  
new feature: symop("wyckoff","C")
 -- returns centering as an array, possibly empty
 -- for example:
 
	 $ modelkit spacegroup 20
	 $ print symop("wyckoff", "C")
 	   {0.5, 0.5, 0}
 	
new feature: symop("wyckoff","S")
 -- returns centering as a string
 -- for example:
 
	 $ modelkit spacegroup 20
	 $ print symop("wyckoff", "C")
 	   (1/2,1/2,0)
 	
new feature: symop("wyckoff","G")
 -- returns general position coordinates as a string
 -- for example:
 
	 $ modelkit spacegroup 20
	 $ print symop("wyckoff", "G")
	   (x,y,z) (-x,-y,z+1/2) (-x,y,-z+1/2) (x,-y,-z) (x+1/2,y+1/2,z) (-x+1/2,-y+1/2,z+1/2) (-x+1/2,y+1/2,-z+1/2) (x+1/2,-y+1/2,-z)


JmolVersion="16.1.61" // (legacy) also 16.1.62 (SwingJS)

-- release deleted -- see 16.1.63

JmolVersion="16.1.59" // (legacy) also 16.1.60 (SwingJS)

-- release deleted -- see 16.1.63

JmolVersion="16.1.57" // (legacy) also 16.1.58 (SwingJS)

bug fix: (legacy only) bad release 16.1.55 removed. (accidentally put 16.1.57 in 16.1.55 folder)

new feature: x = symop("count")
 -- returns the number of symmetry operators
 

JmolVersion="16.1.55" // (legacy) also 16.1.56 (SwingJS)

bug fix: (JavaScript, legacy) ellipsoids do not render
 -- 16.1.53 release was flawed
 
bug fix: (JavaScript, legacy) BCIF file format not recognized as binary by JSmol file reader
 -- legacy JSmol only (Jmol-SwingJS reads all files as binary)
 -- solution was to add .bcif to Jmol._binaryTypes string in JSmolCore.js (part of JSmol.min.js) 
 
bug fix: (Legacy JavaScript only) SET LANGUAGE does not work 
 -- jsmol/idioma directory is no longer necessary, but JS native code was still
    pointing to it
 -- JavaScript and Java now both use org/jmol/translation/JmolApplet/*.po

bug fix; FRAME ALIGN {*} first model is incorrectly offset
 
bug fix: Binary CIF Reader not adding secondary structure fields

bug fix: MODELKIT SPACEGROUP xxx does not set atom site correctly. 

bug fix: POLYHEDRON BRILLOUIN not fully functional

new feature: POLYHEDRON LIST
 -- provides information about current polyhedra

new feature: POLYHEDRA OFFSET 1.0 BRILLOUIN n   where n > 1
 -- produces an "exploded view" of 1st-nth BRILLOUIN zones
  
new feature: POLYHEDRA OFFSET {x, y, z} WIGNERSEITZ
 -- creates a Wigner-Seitz unit cell that is centered on the given point
 -- accepts fractional coordinates such as {1/2 1/2 1/2} or {1 1 1/1}
  
new feature: UNITCELL [a,b,c,alpha,beta,gamma]
 -- sets unit cell to the array of parameters, with no offset
 -- same as UNITCELL "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."
 
new feature: SAVE UNITCELL name
 -- name is optional and defaults to ""
 -- saves the current unit cell with the given name
 -- names are preserved across file loading and ZAP
 
new feature: RESTORE UNITCELL name
 -- restores the saved unit cell with the given name
 -- if no name is given, uses last saved name

new feature: crystal structure set picking dragMolecule with ALT implemented 
 -- rotates all equivalent molecules appropriately around their centers
 -- all molecules will be locked if any of their atoms will break symmetry by moving
 -- example (space group #41 Aba2):
 
	  load "https://chemapps.stolaf.edu/jmol/jsmol/data/k04041.cif" {1 1 1}; 
	  set picking dragMolecule
    
    or open 
    
      https://chemapps.stolaf.edu/jmol/jsmol/simple.htm?%20%20load%20%22data/k04041.cif%22%20{1%201%201};%20set%20picking%20dragMolecule
    
    Now drag or alt-drag a molecule. All molecules will move appropriately 
    according to their symmetry. 
    
    Challenge: Can you figure out the symmetry elements for this
    space group just by moving the molecules? If not, try:
    
      draw spacegroup all
      
    and then move them some more. Where are the C2 axes? The glide planes? 
    How are each pair of molecules related by a symmetry operation?
  

JmolVersion="16.1.53" // (legacy) also 16.1.54 (SwingJS)

bug fix: (legacy only) build issue with jsmol.zip prevents JSmol from working

bug fix: jsmol.php fails to relay HashMap.js
  - wrong content header for utf-8 characters; j2smol.php updated
  - removed utf-8 characters in HashMap.js, Hashtable.js, and LinkedHashMap.js
  - removed HashMap dependency in SymmetryOperation added in 16.1.43/44
  - removed LinkedHashMap dependency in BCIFReader

bug fix: CIF reader unnecessarily adding atom label numbers (broken in 16.1.51/52

bug fix: script queue is clearing prematurely; only the first-queued script runs (broken in 16.1.47/48)

bug fix: modulated structure CIF reader never implemented PACKING x.x

bug fix: magCIF files fail to load after CIF precision adjustment

bug fix: load SUPERCELL can double size of supercell

bug fix: load SUPERCELL misassigns atom site, making set picking dragMolecule not work properly

new feature: set picking DRAGMOLECULE for crystal structures
 -- allows dragging ONLY if the selected molecule's symmetry allows all atoms to be translated
 -- includes all equivalent molecules for which symmetry allows this translation 

feature change: {*}.find("spacegroup") should not automatically reduce to the parent unit cell if currently a supercell
 -- change to 15.2.20/14.32.20

new feature: {*}.find("spacegroup", "parent") 
 -- reduces to the parent unit cell if currently a supercell
 -- for example, to show the parent cell of a supercell:
 
      unitcell @{{*}.find("spacegroup", "parent").unitcell}
      
      
JmolVersion="16.1.51" // (legacy) also 16.1.52 (SwingJS)

new feature: Binary CIF file structure reading. The BinaryCIF file format
   https://github.com/molstar/BinaryCIF  "BinaryCIF is a data format that 
   stores text based CIF files using a more efficient binary encoding. 
   It enables both lossless and lossy compression of the original CIF file."
    
   - Prior to this release, BCIF was only supported in Jmol for molecular 
   	 electron density map files. 
   - Shortcut =xxxx.bcif  goes to https://models.rcsb.org/xxxx.bcif
   - VERY large files can be loaded successfully. Recommendation is
     to use SET AUTOBOND FALSE and to load with filter "*.C" for backbone only:

	 t = now()     
     set autobond false;
     load =8glv.bcif filter "*.C";
     spacefill on;
     color chain;
     print now(t)
     
   - times for transfer and display can be less than 1/2 of that for CIF files

feature adjustment: SCALE improved

bug fix: packing range using LOAD ... PACKED 0.3   broken in 16.1.49/50


JmolVersion="16.1.49" // (legacy) also 16.1.50 (SwingJS)

bug fix: DRAW ID "xx" SYMOP... does not recognize ID

bug fix: DRAW ID "xx" SPACEGROUP does not recognize ID

bug fix: load of crystal structure should adjust field of view to full unit cell

bug fix: American Minerologist Society (load =ams/quartz) now https, not http
 - Jmol will automatically convert http to https in old scripts. 
 - older installations will need updating. 
 
bug fix: echo ID xx {x y z} does not default to LEFT, instead a 2-angstrom shift to the right.

bug fix: (16.1.47 only) DRAW SPACEGROUP 150 ALL fails 

bug fix: (JSpecView) error reading files with (c) symbol or other non-UTF-8 special characters.

buf fix: (JavaScript Legacy only) refactoring of Hashtable to use JavaScript Map in legacy transpiler
 - should be considerably faster

bug fix: (JavaScript only) fixes CIF writer with SET DOUBLEPRECISION

bug fix: CIF writer does not respect originating precision of CIF data. 
 - problem 1 was that garbage was being added to CIF fractional coordinate
   output due to digital representations of numbers. 
 - problem 2 was that imprecise description of twelfths in CIF input ("0.3333")
   were not being represented as their fraction. 
 - problem 3 was that due to this misrepresentation, packing could be off, 
   calculation of space group, and determination of Wyckoff positions all 
   could be off. 
     
bug fix: (JmolD only) double precision output truncating for XYZ file 
 - changed from 10.5 to 16.10 format.

bug fix: (JavaScript and JmolD only) double precision output for CIF file truncating.

new feature: print @@3.symop("wyckoff",option)
 - returns a string of wyckoff information depending upon the option
 - uses Bilbao Crystallographic Database WYCKOFF results
    - see https://github.com/BobHanson/Jmol-SwingJS/blob/master/src/org/jmol/symmetry/sg/json
 - option absent, null, "", or "label"
 	- return wyckoff position label calculated for this atom, such as "g"
 	- compare with {atom}.wyckoff, which will calculate the Wyckoff position
 	  only if not found in the CIF file. (Note that AFLOW Encyclopedia files 
 	  for example, LOAD =aflowlib/125.1, do contain _atom_site_Wyckoff_label) 
 - option "coord"
 	- returns the Wyckoff position coordinate string, such as "(0,x,y)"
 	- if centering was needed, that centering is added: "(1/4,0,3/4)+(1/2,0,1/2)"
 - option "coords"
    - returns the list of coordinates for this atom's Wyckoff position label
      including space-separated label, centerings, and positions
    - for example:
    	$ zap
		$ modelkit spacegroup 225
		$ modelkit add Ti wyckoff d
		$ print @@2.symop("wyckoff","coords")
		d +(0,1/2,1/2)+(1/2,0,1/2)+(1/2,1/2,0)  (0,1/4,1/4) (0,3/4,1/4) (1/4,0,1/4) (1/4,0,3/4) (1/4,1/4,0) (3/4,1/4,0)
 - option "*"
    - returns the full set Wyckoff information for this space group
      as set of lines, starting with the centering and then listing the 
      Wyckoff position labels and coordinates in order of precedence (a,b,...)
    - same as just symop("wyckoff").
    
 - for example:
	$ load =aflowlib/225.1 packed filter "precision=3"
	$ print {*}.wyckoff.pivot
	{
	  "a"  :  14
	  "i"  :  72
	}
 	$ print @1.wyckoff
	a

	$ print @7.symop("wyckoff")
	a

	$ print @1.symop("wyckoff","coord") 
	(0,1/4,1/4)

	$ print @7.fxyz

	$ print @60.symop("wyckoff","coord")
	(-y,y,1/2)+(1/2,0,1/2)

	$ print @2.symop("wyckoff","coords")
	d +(0,1/2,1/2)+(1/2,0,1/2)+(1/2,1/2,0)  (0,1/4,1/4) (0,3/4,1/4) (1/4,0,1/4) (1/4,0,3/4) (1/4,1/4,0) (3/4,1/4,0)

	$ print @2.symop("wyckoff","*") // or $ print symop("wyckoff")
	
	+(0,1/2,1/2)+(1/2,0,1/2)+(1/2,1/2,0)
	a (0,0,0)
	b (1/2,1/2,1/2)
	c (1/4,1/4,1/4) (1/4,1/4,3/4)
	d (0,1/4,1/4) (0,3/4,1/4) (1/4,0,1/4) (1/4,0,3/4) (1/4,1/4,0) (3/4,1/4,0)
	e (x,0,0) (-x,0,0) (0,x,0) (0,-x,0) (0,0,x) (0,0,-x)
	f (x,x,x) (-x,-x,x) (-x,x,-x) (x,-x,-x) (x,x,-x) (-x,-x,-x) (x,-x,x) (-x,x,x)
	g (x,1/4,1/4) (-x,3/4,1/4) (1/4,x,1/4) (1/4,-x,3/4) (1/4,1/4,x) (3/4,1/4,-x) (1/4,x,3/4) (3/4,-x,3/4) (x,1/4,3/4) (-x,1/4,1/4) (1/4,1/4,-x) (1/4,3/4,x)
	h (0,y,y) (0,-y,y) (0,y,-y) (0,-y,-y) (y,0,y) (y,0,-y) (-y,0,y) (-y,0,-y) (y,y,0) (-y,y,0) (y,-y,0) (-y,-y,0)
	i (1/2,y,y) (1/2,-y,y) (1/2,y,-y) (1/2,-y,-y) (y,1/2,y) (y,1/2,-y) (-y,1/2,y) (-y,1/2,-y) (y,y,1/2) (-y,y,1/2) (y,-y,1/2) (-y,-y,1/2)
	j (0,y,z) (0,-y,z) (0,y,-z) (0,-y,-z) (z,0,y) (z,0,-y) (-z,0,y) (-z,0,-y) (y,z,0) (-y,z,0) (y,-z,0) (-y,-z,0) (y,0,-z) (-y,0,-z) (y,0,z) (-y,0,z) (0,z,-y) (0,z,y) (0,-z,-y) (0,-z,y) (z,y,0) (z,-y,0) (-z,y,0) (-z,-y,0)
	k (x,x,z) (-x,-x,z) (-x,x,-z) (x,-x,-z) (z,x,x) (z,-x,-x) (-z,-x,x) (-z,x,-x) (x,z,x) (-x,z,-x) (x,-z,-x) (-x,-z,x) (x,x,-z) (-x,-x,-z) (x,-x,z) (-x,x,z) (x,z,-x) (-x,z,x) (-x,-z,-x) (x,-z,x) (z,x,-x) (z,-x,x) (-z,x,x) (-z,-x,-x)
	l (x,y,z) 

new feature: symop("wyckoff")
 - retrieves full list of current space group's Wyckoff positions
 - same as but simpler than {*}.symop("wyckoff")

new feature: symop("wyckoff", "c")
 - just gives the list of coordinates for the "c" Wyckoff position

new feature: LOAD...FILTER "lowPrecision" 
 - precision set to 4 (+/-0.0001) for fractional coordinates  
 - specifies that crystal structure readers should not attempt to raise the 
   precision to single- or double-precision even if the file contains double-precision data
 - also sets PACKED 0.0001 rather than the standard default value of 0.02 
   (which tends to allow too many atoms to be included)
  
new feature: LOAD...FILTER "PRECISION=n" where n is up to 16 digits
 - specifies the precision to use for a given CIF file
 - can also be used to lower the precision 
   For example, AFLOWLIB files tend to have their precision hidden by padding
   with zeros:
   
	   U1 U   4 a 0.00000 0.00000 0.00000 1.00000
	   B1 B  48 i 0.50000 0.66600 0.66600 1.00000
       
   This could cause trouble with some edge cases, so one could use FILTER "PRECISION=3"
   in thise case to explicitly ignore the padding and turn, "0.666" into "0.66666667".
     
Note regarding precision:

      The issue of double or float (aka "single") precision has a long history in Jmol. 
	  Early on, using floats seemed reasonable, as it was the more memory-efficient than 
	  using double. And it seemed unnecessary to do anything more precise. 
	 
	  But it has always been a problem (and boon!) that JavaScript is DOUBLE precision by 
	  design. This resulted in very slight differences between Java and JavaScript in Jmol, 
	  particularly for loading crystal structures, where there is often a very thin line 
	  between being "in" the unit cell and being "out" or being close to a symmetry element
	  or not. Or being the same atom produced by two different symmetry operations or not.
	  The problem was largely solved in 2014 for Jmol 14.3.5 by trimming float and double 
	  precision in both Java and JavaScript down to common level during the reading of 
	  crystal structures. This normalization of coordinates and other key values in file 
	  reading allowed Java and JavaScript to load files identically.
	  
	  Ah, but then in 2022 we started to see crystal structures derived from computation, 
	  where full double precision is expected. The question was how to get JavaScript 
	  working in double precision even if its originating Java was in float precision.
	  This was a significant challenge. The solution was to create the "doublePrecision" 
	  setting in Jmol 14.32.42 (2022.03.24), which specifically allows Jmol legacy 
	  JavaScript to retain its full double precision without doing anything in Java. 
	  Of course, that meant that PNGJ files and other scripts might read a structure 
	  differently in Java than in JavaScript, particularly if there are atoms present 
	  that are very close to a unit cell face when LOAD...PACKED is used. But that was 
	  still a good solution for browser based applications such as the Q-Studio crystal 
	  building web interface we were developing for PWMAT. 
	  
	  The problem has been that of not finding all the places where Jmol was normalizing 
	  the double values of JavaScript with the float values of Java.
	 
	  Thus the above bug fixes. 
	  
	  The current situation is as follows:
	  
		"legacy" JSmol JavaScript will handle double precision properly after
		
			SET doublePrecision TRUE
			
	  	"legacy" Java Jmol cannot process crystal structures in full double precision. 
	  	The default value of doublePrecision for legacy Java Jmol is FALSE, and it cannot
	  	be changed.

		Jmol-SwingJS (Java "JavaD.jar" and JavaScript) is completely double-precision 
		and is unaffected by this setting. Its default is TRUE, and that value cannot
		be changed. 

		So this is all about legacy JavaScript JSmol.
		
		Two file readers, CIF and PMAT, will set doublePrecision automatically. 
		These readers detect the precision of the data from the number of decimal
		places in the fractional coordinates. "0.6667" would indicate four digits
		of precision, for example. If a CIF file has 10 or more decimal digits, 
		doublePrecision will be set TRUE while reading. In addition, if a PWMAT file 
		is read, doublePrecision will always be set TRUE. These are temporary settings, 
		only for file reading. So if this is all you are using it for, you do not need 
		to set doublePrecision TRUE yourself. 
		
		In addition, if you are using legacy JavaScript, you should set this value true
		when you start up Jmol in any of the following situations:
		
		* You are finding the space group for a structure using CALCULATE SPACEGROUP.
		* You are building a crystal structure using the Jmol ModelKit
		* You are setting the space group using MODELKIT SPACEGROUP.
		* You are dragging symmetry-equivalent atoms of a crystal structure using set DRAGATOM.
		* You are labeling atoms or selecting them using Wyckoff positions. 

		All of these crystal structure-related operations are best done with the 
		lowest tolerances possible -- that is, the highest precision. But it is also
		quite possible that you will not notice any particular issue here.
		
		The problem occurs because experimentally based CIF files by nature have low 
		precision -- perhaps only four or five significant digits. For these structures, 
		we do NOT want to have high precision all the time. If we did, the values in the 
		files might not be mathematically close enough to the ideal to make these functions
		work reliably. 
		
		
JmolVersion="16.1.47" // (legacy) also 16.1.48 (SwingJS)

bug fix: MODELKIT SPACEGROUP ... for no-atom structure does not properly set unit cell lengths

bug fix: LOAD ==HEM (PDB ligand) loading broken in 16.1.45 (2023.11.06)

bug fix: LOAD =ams/quartz broken in 16.1.45

bug fix: CIFReader may misread incommensurately modulated files that have multiple structures

bug fix: SCALE maximum length 1/2 what it should be with set antialiasDisplay off

bug fix: fixes DRAW SPACEGROUP ALL for unit glide in #88, missing planes in #156

bug fix: fixes DRAW SPACEGROUP (ALL) diamond glides of +/-3/4 listed as "g" instead of "d"

bug fix: fixes DRAW SPACEGROUP (ALL) diamond glides of +/-3/4 instead of -/+1/4 

new feature: LOAD .... fill unitcell rhombohedral
 - fills a rhombohedral unit cell for a structure that is trigonal in file
 - ignored unless the symmetry is trigonal
 - does NOT transform operators -- for that, follow this with MODELKIT SPACEGROUP "..."

new feature: LOAD .... fill unitcell trigonal
 - fills a trigonal unit cell for a structure that is rhombohedral in file
 - ignored unless the symmetry is trigonal
 - does NOT transform operators -- for that, follow this with MODELKIT SPACEGROUP "..."

new feature: LOAD ... fill unitcell "2a,a-b,..."
 - allows generic fill of specified unit cell
 - can be used with any space group
 - will accept packing lattice such as {2 2 2} just before FILL
 - does not transform operators -- for that, follow this with MODELKIT SPACEGROUP "..."
 - for example: 
 
   load =aflowlib/148.1 fill unitcell "2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c" 
   modelkit spacegroup "148:r"
   draw spacegroup all
   
new feature: LOAD =aflowlib/155.2
 - loads the second AFLOW prototype in spacegroup 155 at https://www.aflowlib.org/prototype-encyclopedia
 - full listing of thes AFLOW codes codes employed is in
 - https://github.com/BobHanson/Jmol-SwingJS/tree/master/src/org/jmol/symmetry/sg/json/aflow_structures.json
 

JmolVersion="16.1.45" // (legacy) also 16.1.46 (SwingJS)

bug fix: GaussianReader misreading high-level spherical MO data (9G, 11H, 13I)

new feature: x = spacegroup("ITA/ALL") 
 - provides detailed information about general positions, generators, and Wyckoff positions 
   for all space groups and their additional ITA settings (611 in all) as found using  
   https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen
 - keys include: 
		gen      array of generators
		gp       array of general positions 
		id       HM name such as P23
		jmolId  full ITA name, with setting, such as 8:b1 or 227:2; may be "ita?." 
		set      setting index in this space group: 1, 2, 3, ...
		sg       space group number: 1, 2, 3, ...
		tm       transformation matix descriptor for this setting: "a,b,c" or "a-3/8,b-3/8,c-3/8" 
		u		 unabridged ITA title, such as "P n -3 m  [origin 2]"
		wpos     Wyckoff positions, a map with keys:
		             cent   an array of centerings (if applicable)
					 pos    the Wyckoff position; an array of maps with keys:
					 			 desc	  the ITA description, such as "1" or "m.."
					 			 geom     the type of position, one of "point", "line" or "plane"
					 			 label    the single-character label [a-zA]
					 			 mult     the multiplicity

new feature: x = spacegroup("ITA/155.1") 
 - retrieves the first JSON structure in org/jmol/symmetry/sg/json/ita_155.json
 
new feature: UNITCELL RHOMBOHEDRAL and UNITCELL TRIGONAL (or HEXAGONAL - same)
 - allows switching back and forth between rhombohedral and hexagonal unit cells. 
 - does not change the space group (assumes currently rhombohedral if trigonal or hexangonal is chosen
   and vice versa)
 - does not check to see that this is reasonable
 - applies for rhombohedral:  UNITCELL "2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c"
 - applies for trigonal:  UNITCELL "a-b,b-c,a+b+c"
 
new feature: MODELKIT ADD <elem> WYCKOFF <Aa-z>
 - adds an atom in a representative position for the given Wyckoff position. 
 - generates all symmetry-equivalent atoms. 
 - for example: modelkit add C wyckoff d
 - the "seed" position is at the relatively arbitrary position of (2.3/5, 2.3/7, 2.3/9). 
 - this point is projected onto the specified Wyckoff position element (point, line, or plane). 
 - after generation, this point can be moved within the confines of the Wyckoff position
   constraint using SET PICKING DRAGATOM 


JmolVersion="16.1.43" // (legacy) also 16.1.44 (SwingJS)

new feature: MACRO AFLOW adds SHOWSG(n,i,addSymmetry)
 - displays example i of every space group (n) -- though not every setting
 - taps https://www.aflowlib.org/prototype-encyclopedia/
 - see AFLOW Encyclopedia of Crystallographic Prototypes, 
   https://www.aflowlib.org/prototype-encyclopedia; 
   M. J. Mehl, D. Hicks, C. Toher, O. Levy, R. M. Hanson, 
   G. L. W. Hart, and S. Curtarolo, 
   The AFLOW Library of Crystallographic Prototypes: Part 1, 
   Comp. Mat. Sci. 136, S1-S828 (2017). 
   (doi=10.1016/j.commatsci.2017.01.017) and related publications
 - n is space group number, from 1 to 230
 - i is index 1-m where m is the number of space groups in the encyclopedia for that number
 - addSymmetry TRUE to add DRAW SPACEGROUP ALL to show operations
  
bug fix: MODELKIT SPACEGROUP <name or number> does not work if there are no atoms
 - now creates a generally satisfactory unit cell when no atoms are present
 - unit cells are not adjusted to have different a,b,c for "unique origin" groups

bug fix: (SwingJS only) SHOW SPACEGROUP loses operator translations in SHOW SPACEGROUP

bug fix: show Symmetry/SpaceGroup/Symop will show g-glide, not d-glide for cubic 3/4,1/4,1/4 glides

bug fix: (undocumented) -matrix (unary minus; 3x3 or 4x4) should transpose, not 
 - careful -- 4x4 transpose is all four rows for columns
     
feature change: DRAW SPACEGROUP simplified (was basically unusable)
 - just shows geometric elements, not targets

feature change: DRAW SYMOP n and DRAW SYMOP "x,-y,z" no longer default to using the first atom. 
 - new default is the origin, {0 0 0} 
 - allows for consistency after MODEL SPACEGROUP xxx, when there are no atoms.

new feature: 3x3matrix%1
 - returns trace 
 
new feature: 3x3matrix%2
 - returns determinant
 
new feature: x = symop(matrix,option)
 - allows introduction of a matrix as a  symmetry operation
 - accepts various options such as "xyz"; default is still matrix
 
new feature: MODELKIT SPACEGROUP "x,y,z;x,-y,z;..."
 - allows creating a space group from a full operation list
 
new feature: DRAW SPACEGROUP ALL 
 - displays all "additional geometric elements" (planes, axes, points)
   resulting from adding translations to the described symmetry operation

new feature: DRAW HOVERLABEL "xxx"
 - allows for a hover label that appears whether or not drawHover is on.
 
new feature: DRAW "<hover>xxx</hover>...."
 - used for saving the hover label in a state
   (or, at least it allows no error in earlier versions; will show up as text)

new feature: CIFReader reads atom_site_wyckoff_label

new feature: CIFReader FILTER option NOWYCKOFF
 - to skip reading atom_site_wyckoff_label (for Jmol development testing purposes, primariy)

new feature: {atom}.wyckoff, label %[wyckoff], color PROPERTY WYCKOFF 

JmolVersion="16.1.41" // (legacy) also 16.1.42 (SwingJS)

new feature: AMS reader
 - adds Atomic charge as partial charge for last model and all vibrations

bug fix: select config='' fails for residue-order alternate locations
 - when all 'A' listed first, then all 'B' for a residue

bug fix: select config=-n fails for residue-order alternate locations 

bug fix: select config=0 fails for residue-order alternate locations

JmolVersion="16.1.39" // (legacy) also 16.1.40 (SwingJS)

new feature: string.push("xx")
  -- appends a string to a string

new feature: string.pop()
  -- pops a character off a string
  
new feature: {atomset}.atoms and {atomset}.label("%[atoms]")
  -- same as {atomset}.label("[%n]%r:%c.%a")
  -- specifically does not include altloc
  -- can be used to identify associated altlocs efficiently
  -- example use:
  
  			history off
			load =5pol
			altlocKeys = {}
			altlocAtoms = {};
			theatoms = {altloc!=''}
			for (var a in theatoms){
				var name = a.atom;
				if (!altlocKeys[name]) {
					altlocKeys[name] = "";
					altlocAtoms[name] = ({});
				}
				altlocKeys[name].push(a.altloc);
				altlocAtoms[name] |= a.atomIndex;
			}
			history on
			
     resulting in the creation of the arrays altlocKeys and altlocAtoms, which
     group alternate location codes and atom sets by atom name:
     
     	{ 
     	  "[8RP]201:A.C1": "D",
     	   ...
     	  "[MET]23:B.SD"  : "CD"
     	}
     	
     	and 
     	
     	{
     	  "[8RP]201:A.C1"  :  ({2093}),
     		...
     	  "[MET]23:B.SD"  :  ({1039 1040})
     	}
     
new feature: AMS reader
 - version extension of ADF reader
 - adds Atomic charge as partial charge for last model and all vibrations

bug fix: patch #40 ADF/AMS output support (Diego Gayaga)
 - support for ADF output files was not working
 - for geometry optimizations, only the initial geometry was grabbed
   without actually being able to visualize the optimized structure. 
   Moreover, vibrational displacements were being applied to this initial structure, 
   which was not consistent. 
 - newer versions of the ADF code are now named Amsterdam Modeling Suite (AMS) 
   instead of ADF; these files were also not properly supported.
 - bonding energy as a model property is also added.

 
JmolVersion="16.1.37" // (legacy) also 16.1.38 (SwingJS)

bug fix: set picking dragAtom does not update measurements

bug fix: MODELKIT MOVETO @1 {1/2 1/3 1/2} does not update measurements

bug fix: UNITCELL SURFACE {h k l height offset} can fail to find 90-deg option

bug fix: DRAW POINTGROUP or CALCULATE POINTGROUP can result in C2h instead of C2v
         because it a check for linearity was not normalizing prior to taking the dot product
         For example, (nonlinear) SO2. 

bug fix: export of X3D creates abnormally large unit cell lines due to error in passing width parameter to __CartesianExporter

bug fix: GaussianReader -- Fixes need to detect pure/Cartesian formalism when basis set is read from chk file. (by marco-foscato)

bug fix: CONNECT AROMATIC AUTO fails to generate double bonds for carbonyl groups

bug fix: CONNECT AROMATIC AUTO fails to create triple bonds

new feature: select CONFIG=0
  - selects for all atoms that have fewer than two alternate locations. 
  - these are the atoms that, using an atom-based (FirstGlance) rather than a residue-based (PDB spec)
    interpretation of "conformation" will be included in every conformation. 
  - equivalent to {config=-1 & config=-2 & ... & config=-N} where N is the number of 
    altloc possibilities for a model, specifically {thismodel && altloc!=''}.altloc.pivot.keys.count
   


JmolVersion="16.1.35" // (legacy) also 16.1.36 (SwingJS)

new feature: DRAW SPACEGROUP @a n
  - draws just the nth non-identity operation for which 
  	the specified atom @a (in the current model only, same as @@a) is invariant
  - note that the identity operation is not included in this set
  - If the the atom is in a general position or n is greater
    than the number invariant operations, nothing is drawn.
  - if n is absent or zero, all invariant operations are drawn.
  - for example:
  
     load =ams/marcasite 1 packed
     draw spacegroup @2
     
       -x,y,z mirror plane
  
     draw spacegroup @3
     
       -x,y,z mirror plane
	   x,-y,-z C2 axis
       -x,-y,-z Ci: 0 0 0

     draw spacegroup @3 2
	   x,-y,-z C2 axis
       

bug fix: uc = unitcell("a=5.469,b=5.469,c=5.469,alpha=120,beta=90,gamma=90") fails
  - (broken in Jmol 16.1.16); 


JmolVersion="16.1.33" // (legacy) also 16.1.34 (SwingJS)

bug fix: LOAD "" not working after drag-drop of structure text into Jmol
bug fix: ROTATE(SELECTED) {atoms} [4x4 matrix] miscalculates translation
  - when in the order [4x4 matrix] {atoms} it is fine, 
    but when it is {atoms} first, then the {atoms} are used only
    as a center, and while the rotation is about {0 0 0}, the translation is 
    not done properly
bug fix: COMPARE ... SMILES  does not accept multiple components
  - when two molecules are selected, only one gets used
  - now applies "/allcomponents" flag
bug fix: (JavaScript only) LOAD APPEND of CIF file containing _atom_type_radius_bond may fail to bond some atoms
bug fix: (JavaScript only) JSCONSOLE and JSCONSOLE CLEAR script commands broken.

new feature: SMILES/ALLCOMPONENTS flag for generation of SMILES having multiple components
  - without this flag, only single-component SMILES are created for salts, for example.
  - additional components are separated by "." and no ring-connectors
  
new feature: CONFIGURATION -n
 - suggestion by Eric Martz
 - specifically a negative number here
 - allows checking specific lettered configurations based on their index in the string of altlocs
 - allows checking specific lettered configurations
 - atom-based configuration setting
 - specifically for biomolecules: 
 --- for n from 1 to the number of alternative locations in a model
 --- sets configuration to
 	   (all atoms with nth altloc)
 	   + (first listed entry for chain, residue, insertion code, and atom name
 	       when altloc for this atom is not found)
 - for non-biomolecules same as for positive value; just includes
 	   (all atoms with no altloc) + (all atoms with nth altloc)
 - note that for biomolecules, positive configuration number
    gives the nth entry in the set of altlocs *for a given residue* 
 - note that selecting a configuration number greater than one and 
   greater than the number of altloc possibilities for a model
   returns no atoms
         	     
new feature: CONFIGURATION "A"
 - suggestion by Eric Martz
 - allows checking specific lettered configurations
 - atom-based configuration setting
 - specifically for biomolecules: 
 --- sets configuration to
 	   (all atoms with specified altloc)
 	   + (first listed entry for chain, residue, insertion code, and atom name
 	       when specified altloc for this atom is not found)
 - for non-biomolecules same as for positive value; just includes
 	   (all atoms with no altloc) + (all atoms with this altloc)
 - specifying "" or " " delivers all case without alternative locations     	     
 
new feature: BilbaoReader allows LOAD ... spacegroup ":n" to force origin, where n is 1 or 2
 - for example, in a case where the text is given as a different origin:

#Exercise 2.1B (ZrSiO4: origin 1)
# Space Group ITA number
141
# Lattice parameters
6.60 6.60 5.88 90 90 90
# Number of independent atoms in the asymmetric unit
3
# [atom type] [number] [WP] [x] [y] [z]
Zr 1 4a   0 0 0
Si 1 4b   0 0 0.5
O  1 16h  0 0.2 0.34


JmolVersion="16.1.31" // (legacy) also 16.1.32 (SwingJS)

bug fix: WRITE CIF does not add occupancy
bug fix: SET PICKING DRAGSELECTED broken
bug fix: MINIMIZE GROUP not working correctly

new feature: Jmol will accept CIF files with duplicate atom_site_label entries
  - it will add numbers if two identical atom_site_label values are found
  - an warning message is reported in the Java console only.
  
new feature: function special variables _caller, _callers, _name
  - _caller is only the direct calling JmolScript function
  - _callers is the stack of all calling JmolScript functions
  
new feature: _args() and _args(n)
  - same as _arguments and _arguments[n], but better for callbacks
  - more efficient access to jmolscript: callack arguments than _arguments
  - does not require translation of all arguments into script variables; only as needed 
  - can be used for functions and scripts as well.
  - consistent with syntax added in 14.32.58 but not yet documented

new feature: allow CIFReader to ignore COD 2107628 unmodulated operations in presence of modulated
  - _space_group_symop_ssg_operation_algebraic in preference to _space_group_symop_operation_xyz
  - can this possibly be a valid CIF option, to have both of these???

new feature: CIFReader "ignoreGeomBond" (was SwingJS only)
 - explicitly ignores all GEOM_BOND records
 

JmolVersion="16.1.29" // (legacy) also 16.1.30 (SwingJS)

new feature: _arguments and _argumentCount added to SET CALLBACK "jmolscript:..."
  - similar to using parameters with scripts, as in SCRIPT "test.spt"(3,5)
  - allows reading of parameters within callbacks within Java. (JavaScript has the parameters already)
  - for example:
  			set loadStructCallback "jmolscript:print 'file is ' + _ARGUMENTS[2]"
     		set dragdropCallback "jmolScript:if (_ARGUMENTS[5].find('config')) dropFileType='pwmat'"

bug fix: CONFIGURATION command with no parameters causes state save to fail
bug fix: CONFIGURATION <n> command does not update shapes with nonzero hermiteLevel 
bug fix: echoCallback should not be able to infinitely call itself.


JmolVersion="16.1.27" // (legacy) also 16.1.28 (SwingJS)

new feature: (array of SMILES strings).find("SMARTS" or "SMILES", pattern)
 - efficiently searches each target SMILES in array for pattern
 - returns array of same length with 1 (found) or 0 (not found) for each target SMILES
 - for example:
 	$ print ["CCCC","C(O)CC","C(N)CC","CC(N)CC"].find("SMARTS","CCO").format("JSON")
	[ 0,1,0,0 ]
 	$ print ["CCCC","C(O)CC","C(N)CC","CC(N)CC"].find("SMILES","CCCN").format("JSON")
	[ 0,0,1,0 ]
	
bug fix: modulated structure Crenel-only (no Lagrange or Fourier) fails to trigger occupational visualization
bug fix: ModelKit MINIMIZE command can use wrong symmetry operators with multiple structures
bug fix: Modelkit MINIMIZE command displays all models instead of just one after minimization
bug fix: Modelkit MINIMIZE fails if multiple models are displayed (should show error that it only works with one model displayed)


JmolVersion="16.1.25" // (legacy) also 16.1.26 (SwingJS)

bug fix: standard minimization does not refresh properly
bug fix: standard minimization does not set atom positions properly after dragMinimize
bug fix: JME 2D-MOL files do not properly indicate they are 2D in _M
bug fix: LOAD <2D mol file> FILTER "2D" may invert stereochemistry (broken in 14.31.53)


JmolVersion="16.1.23" // (legacy) also 16.1.24 (SwingJS)

new feature: threaded symmetry-aware UFF minimization of crystal structures.
  - command: MODELKIT MINIMIZE [optional parameters] same as MINIMIZE command
  - temporarily creates a new model in a hidden frame that expands the model
    to a full 3x3 unit cell
  - efficient minimization of just the asymmetric unit; other atoms are generated
  - adds a 5-angstrom fixed set of atoms around that 
    (adjustable using the RANGE parameter of the MODELKIT MINIMIZE command)
  - runs UFF exclusively
  - threaded, so allows user interaction during minimization
    (which should be minimal, but does allow MINIMIZATION STOP, for example)
  - does not require a fully packed model. For example:
    
       load =ams/quartz 1; modelkit minimize; modelkit packed; connect auto
       
    gives the same structure as: 
  
       load =ams/quartz 1 packed; modelkit minimize
       
    because all optimization of the asymmetric unit alone within 
    the context of a fully elaborated periodic structure. The actual 
    atoms do not need to exist.
    
      
JmolVersion="16.1.21" // (legacy) also 16.1.22 (SwingJS)

bug fix: popup menu File...Load...Open PDB for JavaScript does not work
bug fix: popup menu File...Load...Open MOL for JavaScript does not work
bug fix: compare({...}, {...}) and compare({...},{...},"stddev") broken in Jmol 14.31.55
bug fix: load "?" broken for JavaScript

new feature: compare(A, B, map) and compare(A, B, map, "stddev")
 - A or B can be atom set or array of points
 - map is an integer array indicating the ordering of A that matches B
 - for example, if A is [@1,@2,@3] and B is in order [@2,@3,@1]
   then the map array would be [2 3 1], since B[1](i.e. @2) matches a[2]
   and B[2] matches A[3], and B[3] matches A[1].
 - A may have more elements than B, provided the map has the same elements as B

new feature: load "=?" load PDB ID from RCSB with prompt
new feature: load "==?" load chemical component from RCSB with prompt
new feature: load "*?" load PDB ID from EBI with prompt
new feature: load "$?" load structure from NCI/CADD with prompt
new feature: load ":?" load structure from pubChem with prompt


JmolVersion="16.1.19" // (legacy) also 16.1.20 (SwingJS)

bug fix: JanaReader modulation fix (broken in 16.1.16)
bug fix: MSRdr (modulated structure reader) fix (broken in 16.1.16)
bug fix: @2.identify and ({2}) do not work (for single atom sets; broken in Jmol 12.3.2 Oct 2011!!)
 - fix test:
 $ load $caffeine
 $ label %a
 $ print @2.identify
   C2 #2
 $ print @2.label()
   C2 #2
 $ print @2.label("")
   C2

bug fix: bondsets do not remain bondsets after operations
 - fix test:
 $ load $caffeine
 $ x = connected({_C},{_O})
 $ print x
   [{2 14}]
 $ print x | 3
   [{2 3 14}]
 $ print (x | 3) and ! ({14})
   [{2 3}]

bug fix: color @bondset colors atoms, not bonds
 - fix test:
 $ load $caffeine
 $ x = connected({_C},{_O})
 $ color @x yellow
 
bug fix: bondset.identify and bonset.label() fail
 - fix test:
 $ load $caffeine
 $ x = connected({_C},{_O})
 $ print x[1]
   [{2}] 
 $ print x[1].identify  // number, order, atoms, distance
   3 2 C3 #3 -- O4 #4 1.215961
 $ print x[1].label() // same 
   3 2 C3 #3 -- O4 #4 1.215961
 $ print x[1].label("") // [atom1] distance [atom2] #number 
   [C3 #3] 1.216 [O4 #4] #3 


JmolVersion="16.1.17" // (legacy) also 16.1.18 (SwingJS)

bug fix: set picking assignatom_P  (specifically phosphorus) fails (second try!)
bug fix: MINIMIZE crystal structure better optimization
bug fix: LOAD APPEND VAR does not work
bug fix: LOAD "" should return last actual file loaded, not "string" if LOAD VAR or LOAD INLINE was used

new feature: MODELKIT MINIMIZE
 - for crystal structures in the current model only
 - does not need anything more than the asymmetric unit atoms
 - carries out a minimization on the asymmetric unit within a 27-cell block {444 666 1}
 - applies that minimization to all atoms in the current model
 - temporarily creates a new CIF model, minimizes it, then deletes it
 - can accept a limited number of additional parameters such as SILENT and 
 - Equivalent to
 
	 function minimizeXtal() {
        if (within("unitCell") == 0) return;
		var m = {thisModel};
		var au = {thisModel & !symmetry};
		var x = write("cif");
		var usethread = useMinimizationThread;
		var apnew = appendNew;
		set useMinimizationThread false;
		set appendNew true;
		load append var x {444 666 1};
		frame last;
		minimize;
		set useMinimizationThread @usethread;
		set appendNew @apnew;
		var pts = {thisModel & symop=1555}.xyz.all;
		zap {thisModel};
		frame @m;
		modelkit moveto @au @pts;
	 }
  
new feature: MODELKIT MOVETO @atoms @points
 - bulk conversion of a set of atom positions, applying symmetry
 - similar to MODELKIT MOVETO @atom @xyz, but for a set of atoms
 - atoms may be just the asymmetric unit
 - points is a set of points, same length as atoms
 
JmolVersion="16.1.15" // (legacy) also 16.1.16 (SwingJS)

bug fix: draw SYMMETRY for linear molecules indicates C2 or D2 rather than C_infinity
bug fix: incommensurately modulated CIF files fail with certain Fourier coefficient methods
         (broken when "id" was added to the registry keys for MSCIF file records).
bug fix: unitcell SURFACE fails in some cases

new feature: MINIMIZE SELECT {atoms} 
 - Minimizes a set of atoms within the context of atoms around those atoms.
 - The surrounding atoms will not be moved, but the forces they apply to 
   the selected atoms will be part of the calculation.
 - for example: 
    
	set appendnew false
	load $water
	load append $acetone
	minimize SELECT {water}

    # The water molecule is moved away from
    # the acetone molecule during minimization.
    # The acetone molecule is not moved.

new feature: MINIMIZE GROUP {atoms} 
 - minimizes a group such as CH3 ignoring all other atoms but without modifying the bond to its connecting atom
 - for example: 
    
     load $caffeine
     minimize GROUP {within(smarts, "[C][H]")}
     # the H atoms of the three CH3 groups will move ever so slightly
     # the C atoms will not move
  
new feature: MINIMIZE ONLY {atoms} 
 - Minimizes a set of atoms ignoring all other atoms.
 - Useful if minimizing a small molecule near a surface, for example,
   without having it drift away from the surface due to VDW repulsion.
   
 - If a molecular fragment, UFF force field will be used. 
 - Default option for MINIMIZE {atoms}
 - for example: 
    
     load $caffeine
     minimize ONLY {within(smarts, "C=O")}

     # the C=O groups will be moved around as though
     # they were not connected to the rest of the molecule   

NOTE: the MINIMIZE command has subtly different SELECT options:

  minimize ONLY {water}      // atoms are minimized independently of any other atoms
  minimize GROUP {water}     // same as {water} but connected bonds are not changed
  minimize SELECT {water}    // atoms are minimized, but forces of nearby atoms are included
  minimize {water}           // same as minimize ONLY {water}

new feature: UFF minimization with application of symmetry for 
             crystal structures. 
   - minimizes just the asymmetric unit, concurrently 
     transfering the changes to all equivalent atoms
   - always uses the UFF force field (as adapted for better angle minimization)
   - simply use MINIMIZE by itself
   - for best results, load the structure with a padding of cells around the centeral 
     unit cell, for example:  
     
        load =ams/quartz 1 {444 666 1} 
        minimize
        write quartz-uff.cif
        
     (Note that the written CIF file will just have two atoms, minimized for the whole unit cell.)

new feature: draw SYMOP [3,4,5] @1
 - draws the given array of symops (1-based) for atom 1
 
new feature: DRAW SPACEGROUP @n
  - draws just the operations for which the specified atom 
    (in the current model only) is invariant
  - If the the atom is in a general position, nothing is drawn.
  - for example:
  
     load =ams/marcasite 1 packed
     draw spacegroup @2
     
       -x,y,z mirror plane
  
     draw spacegroup @3
     
       -x,y,z mirror plane
	   x,-y,-z C2 axis
       -x,-y,-z Ci: 0 0 0
       
            
JmolVersion="16.1.13" // (legacy) also 16.1.14 (SwingJS)

bug fix: MINIMIZE {atoms} does not work with crystal structure 
         when atoms are added prior to changing space group using LOAD APPEND with SET APPENDNEW FALSE         
  load =ams/quartz 1 packed;set appendnew false;load append $water;modelkit spacegroup P1
  minimize {water}

new feature: popup menu adds "atom picking..." Drag Atom and Drag Molecule

new feature: Jmol application -A --scriptarguments flag
 - used in conjunction with -s --script 
 - allows adding _arguments array variable to a script file on the command line
 - example:
 
     jmol -s "test.spt" -A "2,3,4"
   
   where test.spt is 
     
     print "" + _arguments[1] + " and " + _arguments [2] + " and " + _arguments[3]

   result is
   
     2 and 3 and 4
          
new feature: draw boundbox $[isosurface id]

new feature: draw boundbox BEST $[isosurface id]

new feature: CIFReader "ignoreGeomBond"
 - explicitly ignores all GEOM_BOND records
 
bug fix: RESET should clear custom boundbox
bug fix: pdbAddHydrogens can create atomNo duplicates. 
bug fix: mmCIF struct_conn with FILTER "addbonds" may miss bonds (6mqj, 7rfw)
bug fix: simple mutation 3-letter code fails, for example: mutate 33 LYS


JmolVersion="16.1.11" // (legacy) also 16.1.12 (SwingJS)

bug fix: incommensurately modulated CIF missing modulations when params split off into separate loops

bug fix: CIF "_space_group_it_number" not recognized

bug fix: WRITE CIF creates invalid CIF files that now cause failed reading
 -- Problem was that Jmol was updated to require CIF standard
    that all _atom_site_label must be unique. (OUCH!)
 -- Corrected only such that CIF files starting with
    "# primitive CIF file created by Jmol" will append a number to each label
    thus allowing reading of these legacy files.
    
bug fix: Jmol does not recognize ASCII CrystalMaker CMF files from EPINET 
 -- due to use of tab character after TITL

new feature: CrystalMaker CMDF (binary) file reader
 -- minimal reader; atoms, unit cell and symmetry only; does not read bonds or rendering
 

JmolVersion="16.1.9" // (legacy) also 16.1.10 (SwingJS)

bug fix: InChI from 2D MOL or SDF not recognizing stereochemistry

bug fix: Incommensurately modulated CIF with two structures 
         with two different modulation dimensions will fail
         (z034DL74QTM.cif)

bug fix: measurements not correctly changing size dynamically with antialiasdisplay
bug fix: measurements not preserving explicitly set units in state
bug fix: measure 2.5 3.5 {_N} {_O} delete deletes all measures
bug fix: measures not retaining specific units

new feature: measure SELECT...
  -- selects the specified measures for actions without creating or removing it
  -- if the described measure does not exist, the command is ignored
  -- for example:
  
  load $caffeine
  measure {_N} {_O} all
  measure SELECT 4.5 {_N} {_O}
  color measures yellow
  measure SELECT 3.5 4.5 {_N} {_O} color green

new feature: measure SELECT ALL
  -- selects all measures

new feature: measure SELECTED
  -- list the currently selected measures
  
new feature: measure SELECTED ...
  -- carry out the change only on the currently selected measures
  -- "default" (quoted) parameter sets the format string and units to default values
  -- for example:
  
  load $caffeine
  measure {_N} {_O} all
  measure SELECT 4.5 {_N} {_O} color orange
  measure SELECT 4.5 {_N} {_O} "pm"
  measure SELECT 4.5 {_N} {_O} color orange "pm"
  
  or

  measure SELECT 4.5 {_N} {_O}
  measure SELECTED color orange
  measure SELECTED delete

new feature: MEASURE .... "default"
  - resets units and label format to null (indicating default units and format)
    

JmolVersion="16.1.9" // (legacy) also 16.1.10 (SwingJS)

bug fix: measurements not preserving explicitly set units in state
 - note that if SET MEASUREMENTUNITS is used after a measurement is made,
   then that measurement's units are explicitly set
bug fix: InChI from 2D MOL or SDF not recognizing stereochemistry

JmolVersion="16.1.7" // (legacy) also 16.1.8 (SwingJS)

bug fix: load "" after load DATA .... fails to load string-based file data

new feature: pat = pattern(<smarts string>) 
 -- compiles a SMARTS pattern for later use.
 -- example: 
     var smarts = pattern('NCN')

new feature: atomset.search(pattern)
 -- carry out a SMARTS search on set of atoms with a precompiled pattern
     var smarts = pattern('NCN')
     load $caffeine
     var atoms = {*}.search(smarts)
     print atoms

new feature: target = search(atomset)
 -- predefines a target for repetitive SMARTS searching
 -- example: 
     load $caffeine
     var target = search({*})
     print target.search("NCN")

new feature: target.search(stringPattern)
 -- search a predefined target with a string pattern
 -- example: 
     load $caffeine
     var target = search({*})
     print target.search("NCN")

new feature: search(target, pattern)
 -- search a predefined target with a string or precompiled pattern 
 -- example: 
     load $caffeine
     var target = search({*})
     print target.search("NCN")
     var smarts = pattern('NCN')
     print search(target, smarts)

JmolVersion="16.1.5" // (legacy) also 16.1.6 (SwingJS)

bug fix: JVXL fails if the first surface voxel is the tenth voxel
 -- in that case, the lead compression character for edge data is "-", leading to "--"
    at the start of the buffer. But for reasons lost to history (sometime before 2012), 
    if the string has two minus signs at the start, those are removed. No idea why!!!

JmolVersion="16.1.3" // (legacy) also 16.1.4 (SwingJS)

bug fix: draw symop
bug fix: symop(13,"angle") and "axisVector" return unexpected results 
 -- Although all is correct, vector may be downward and associated angle may be negative
 -- Switching to convention where vector is upward and all angles are positive
  
JmolVersion="16.1.1" // (legacy) also 16.1.2 (SwingJS)

note: switching to even tertiary version number for double-precision-only Jmol-SwingJS
note: switching to odd tertiary version number for legacy Jmol
note: use of Java JmolD.jar (SwingJS) recommended for general use Java version
note: use of SwingJS-compatible JavaScript works but does not yet utilize extensive packaging 
note: leading to slower JavaScript loading of the SwingJS (GitHub) version of Jmol
note: release will be at SourceForge for both products

new feature: adds JME 2-D Editor Tool (Java only; Tools top menu item)
 -- drag-drop CDX and CDXML files for 2D rendering using legacy JME
 -- convert to/from 3D
 -- automatically cleans ill-positioned fragments and "nicknames", such as Ph, OTs, etc.
 -- cleans fragments using NCI/CADD development server (cirx) with =smiles2D and =smiles3D 
 -- leverages JNIInChI to check structures
 -- allows creation of 2D MOL and 2D CDXML files from any 2D or 3D model
 
 new feature: =smiles2d and =smiles3d
 -- implements NCI/CADD development server
 -- guaranteed 2D and 3D MOL file return
 -- uses 
      =smiles2d as "https://cirx.chemicalcreatures.com/chemical/structure/%FILE/file?format=sdf&get3d=false"
      =smiles3d as "https://cirx.chemicalcreatures.com/chemical/structure/%FILE/file?format=sdf&get3d=true"
 -- allows for future modification of that pathway back to NCI/CADD home
 -- example:
 
   load $$C(C)Cc2c(OC)c(Cl)ccc2            // 2D
   load $$C(C)C1c2c(OC1)c(Cl)ccc2          // 3D ???
   load =smiles2d/C(C)C1c2c(OC1)c(Cl)ccc2  // 2D for sure

bug fix: Sc in SMILES not read
bug fix: SMILES issue with kukule matching with aaaa smarts
bug fix: mdcrd topology file reader not reading bonding information
bug fix: (JavaScript only) mousemove should not trigger canvas.focus(), as that makes Chrome and Edge jump if the window is partially off screen
bug fix: "...smiles...".find("...smiles...") bug in treating aromatic pattern/target
 -- proper behavior is that "c1ccccc1".find("C1=CC=CC=C1") should find nothing,
 -- while  "C1=CC=CC=C1".find("c1ccccc1") should work. The key here is that the 
 -- explicit pattern C1C=CC=CC=C1 is a literal request, which does not match generic structure c1ccccc1.
 -- But "c1ccccc1" should generally find the aromatic character of the structure "C1=CC=CC=C1".
 -- This highlights the issue that SMILES meant to be SMARTS *targets* should neve have aromatic "c". 
 -- This is because that would require a perfectly equivalent aromatic model in order to be found. 
 -- Any slight divergence of model causes the SMARTS search to fail. But if the target is in 
 -- Kekule form, the SMARTS algorithm should be able to match that using whatever algorithm it 
 -- uses for aromaticity. This bug was causing both searches to fail. 
  
JmolVersion="14.32.83" // also 15.2.83
new feature: generalized FILTER "NOH"
 -- for 2D structures (MOL, V3000, CDX, CDXML, JME
 -- loads the structure as is, without adding H or converting to 3D
 -- useful for processes that simply want to create SMILES or InChI

new feature: generalized FILTER "NOMIN"
 -- for 2D structures, loads the structure with added hydrogens but without converting to 3D

new feature: ChemDraw CDXReader
 -- reads CDX files to 2D or 3D
 -- only minimal amount of information necessary for loading
 -- cleans files of unattached "phantom" atoms
 -- recognizes partial bonds and multiple-attachment bonds (e.g. ferrocene)
    converting these to partial bonds
 -- can be used to generate SMILES, InChI, InChIKey, 2D-MOL files
 -- recognizes "either stereochemistry" wavy bond -- translates to InChI ?

new feature: allowing @1.symop(@2,...) rather than @1.symop(@1, @2,...)
 
bug fix: CDXML reader for multiple attachments, other upgrades
bug fix: CDXML reader connectivity for attachments within strings of characters
bug fix: axes do not retain font changes after rotation if both xyz and abc are present
bug fix: addition of H atoms to crystal structures when unit cell is showing 
         should not add H if it is out of unit cell periodic boundaries and no other
         atom is already out of those boundaries.
bug fix: ModelKit not processing  MODELKIT ADD @1 "N" {0 1/4 1/4} properly
bug fix: ModelKit not giving correct hover label after dragging to bond for crystal structure
bug fix: deleting atoms with measurements can cause rendering to fail

bug fix: MMFF minimization using 2D instead of 3D parameters
    
JmolVersion="14.32.82" // also 15.2.82

bug fix: ModelKit menu may not work on second click of an item
bug fix: V3000 MOL reading deleting H atoms inappropriately
bug fix: V3000 MOL should disregard any nonbonded Xx atom (as from a label)
bug fix: SMILES from model that has been converted from 2D may not show stereochemistry
bug fix: JNI-InChI not set up for 2D stereochemistry (wedge/hash).
bug fix: ChemDraw CDXML reader should allow for atom with invalid valence
bug fix: Java application File...New should not pass status listener on as userStatusListener

new feature: In ModelKitMode, hovering over an atom and pressing keys can change element
 -- for single-character symbols, just press the letter --- c o n etc.
 -- for two-character symbols, hold down the shift key for BOTH letters --- NI OS LI etc 
 -- invalid element names are ignored silently
 -- only for non-touchscreen context

new feature: print {1.1}.find("SMILES","MF")
 -- determines the molecular formula based on a SMILES string from the atomset

new feature: print {1.1}.find("SMILES","MF", true)
 -- determines the empirical formula based on a SMILES string from the atomset

new feature: print "CCCC".find("SMILES","MF")
 -- determines molecular formula of a SMILES string

new feature: print "CCCC".find("SMILES","MF", true)
 -- determines the empirical formula of a SMILES string

new feature: LOAD xxxx.mol FILTER "noHydrogen" (Or just "NOH")
 -- loads the model in 2D with no additional hydrogens and no minimization
 -- allows for SMILES and InChI creation directly from the 2D model

new feature: LOAD xxxx.mol FILTER "no3D" 
 -- loads the model in 2D with no conversion to 3D, particularly for V3000 and ChemDraw
 -- no effect for standard 3D models
 
JmolVersion="14.32.81" // also 15.2.81


new feature: LCAOCARTOON create "anti-sp3a"
  -- adds a small anti-sense back-lobe to an sp3 cartoon.
  
new feature: LCAOCARTOON create "-anti-sp3a"
  -- with prefix minus sign reverses the direction of the orbital and adds a small back-lobe

new feature: LCAOCARTOON REVERSE [optional TRUE|FALSE] (default TRUE)
  -- switches the color of two-lobe orbitals such as px and anti-sp3
  -- as for other LCAOCARTOON parameters, REVERSE persists until changes
  -- for example:


     load $1-bromo-2-butene;
     lcaocartoon @1 reverse false color green yellow "-anti-sp3a";
     lcaocartoon @2 reverse true  color green yellow "-anti-sp3a";

  same as
 
     load $1-bromo-2-butene;
     lcaocartoon @1 color green yellow "-anti-sp3a";
     lcaocartoon @2 reverse "-anti-sp3a";
 
  same as
 
     load $1-bromo-2-butene;
     lcaocartoon reverse false color green yellow;
     lcaocartoon @1 create "-anti-sp3a";
     lcaocartoon reverse;
     lcaocartoon @2 create "-anti-sp3a";  
     
  
bug fix: modelkit sets boundbox to default value {-10 -10 -10} to {10 10 10} during adding H atoms
bug fix: minimizer does not fire StructureModifiedCallback; now does, with mode 3/-3 (coord change)
bug fix: PDBWriter does not properly identify CONECT records
bug fix: invertStereo fails for alkenes
bug fix: Pymol reader fails in relation to parent groups
bug fix: WebExport fails
bug fix: V3000 reader misreads continuation lines
bug fix: Automatic 2D->3D conversion for multi-model files fails (should minimize just first model)
bug fix: print x.select("properties where properties[2] == 3") does not work, because "properties" being turned into "property"
bug fix: map.format("JSON") should sort map items


JmolVersion="14.32.80" // also 15.32.80

new feature: write("PNGJ",TRUE)
 -- TRUE indicates we want a byte array, not a map
 -- besides "PNGJ" can be "ZIP", "JMOL" or "ZIPALL"
 -- note that these bytes can be encoded as Base64 using format("base64",write("PNGJ",true))

bug fix: set picking rotateBond does not work in touch-only environment 
bug fix: various modelkit menu issues

 
JmolVersion="14.32.79" // also 15.2.79

bug fix: ModelKit fixes for set picking rotateBond and hover labels when ModelKit is not ON
bug fix: CifReader can skip a line if loop processor is processing non-loop keys starting with "atom_"
bug fix: write("OBJ") does not fail gracefully
bug fix: Frank-click popup menu fails to open

code: simplified pixelGrabber avoids Java issue causing annoying but caught NPE in sun OffscreenImageSource code


JmolVersion="14.32.78" // also 15.2.78

bug fix: 15.2.73/14.32.73 state script fix broke Proteopedia hack
bug fix: in certain cases, labels may not be cleared in state by LABEL ""
bug fix: Topology CIF reader fails to bond asymmetric unit atoms
bug fix: set picking invertstereo doesn't allow inversion at times that it should
bug fix: ModelKit increase/decrease charge broken (15.2.28) 

JmolVersion="14.32.77" // also 15.2.77

bug fix: CifReader should not totally ignore disorder set -n
 -- supports up to 26 (A-Z) new altloc values, one for each symmetry operator
 
bug fix: ISOSURFACE CUTOFF +xxxx does not work for volume data surfaces 

JmolVersion="14.32.76" // also 15.2.76

bug fix: SET PICKING DRAGMINIMIZE  should generally 
         move attached H atoms even if ModelKit is not open as long as there is no unit cell.

bug fix: ModelKit icons missing

JmolVersion="14.32.75" // also 15.2.75

bug fix: WRITE ISOSURFACE incorrect for COLOR DENSITY CUTOFF [min,max]

JmolVersion="14.32.74" // also 15.2.74

bug fix: load("cache://....") does not work for cached files
bug fix: ISOSURFACE TYPE "Xsf" [1, "rho1.xsf", 1, "rho2.xsf"] should apply type to both files
bug fix: WRITE ISOSURFACE does not save cutoff range for color density

new feature: load(filename, asbinary, async) or load(filename, nbytesMax, async) or load(filename, "JSON", async)
 -- 3rd parameter TRUE loads file asynchronously in HTML5


JmolVersion="14.32.73" // also 15.2.73

bug fix: XSF surface files with over about 267 atoms not recognizing presence of surface data

bug fix: scripts that include SCRIPT INLINE commands explicitly made from show("state") 

		script inline "# Jmol state version 14.32.72  2022-08-17 10:30;
		...

	treated as though they themselves are state scripts, causing the bondingVersion to be 
	set to 1 upon exit of the script and resulting in unexpected changes in later calls to CONNECT AUTO. 
 
bug fix: reading file with 0 bytes should indicate EOF (end of file) exception, not wrong format message

new feature: ModelKit SPACEGROUP "123" or ModelKit SPACEGROUP 123
 -- allows setting of the space group after loading 
 -- accepts any name of a space group accepted by the spacegroup() function or a number from 1 to 230
 -- note that some space group names have extensions:  "6:a", "6:b", "6:c". If these are given
    simply as "6" or the number 6, then one of these options will be used.
 -- will not set the space group if the current unit cell is not appropriate for the given space group
 -- can accept semicolon-separated Jones-Faithful operation listing: "x,y,z;-x,-y,-z"
    which can be obtained for any space group by:  
 
    x = spaceGroup(123).spaceGroupInfo.operationsXYZ.join(";") 
 
    or for the current space group by 
    
    x = _M.symmetryOperations.join(";")
    
 -- using operation lists is recommended over using names, as this covers all possible space groups
    and avoids any ambiguity in settings
    
new feature: ModelKit SPACEGROUP "123" packed
 -- also packs the unit cell after assigning the space group 

new feature: ModelKit PACKED
 -- packs the unit cell
 
new feature: ModelKit ADD {xxx} PACKED
 -- packs the unit cell just for the specified subset of atoms
 
new feature: x = spacegroup("123") or spacegroup(123)
 -- returns a map containing keys:
	    HallSymbol
		HermannMauguinSymbol
		crystalClass
		ita
		jmolId
		operationCount
		operationsXYZ		
 -- note that some space group names have extensions:  "6:a", "6:b", "6:c". If these are given
    simply as "6" or the number 6, then one of these options will be delivered.
 -- if a space group name is given that is not recognized, such as "6:d" or "400", "?" will be returned.
 
new feature: x = spacegroup("x,y,z;-x,y,z")
 -- similar to spacegroup("123") but finds the space group with this set of operations
 
new feature: x = spacegroup("x,y,z&-x,y,z") or spacegroup("&x,y,z;-x,y,z") or spacegroup("x,y,z;-x,y,z&")
 -- use of "&" instead of ";" or adding "&" at the beginning or end of the string
 -- gives an array of space group names for space groups that have AT LEAST these operators, maybe more
 -- for example:
   
	$ print spacegroup("-x,-y,-z;-x,y,z;-x,-y,z;x,y,-z;-x,-y,-z;-x,-y,z;-y,-x,z+1/2&").format("JSON")

	[ "131","226" ]

new feature: x = spacegroup(6, [a, b, c, alpha, beta, gamma])
 -- adding an array of unit cell parameters can sometimes help in distinguishing among space group settings, 
    at least for simple cases where the setting is dependent upon the "unique" axis

new feature: x = spacegroup("x,y,z;-x,y,z", [a, b, c, alpha, beta, gamma])
 -- adding an array of unit cell parameters to an operator list will ensure that the returned space group
    is consistent with the given unit cell. For example, 
    
		$ print spaceGroup("&x,y+1/2,z+1/2", [5,5,5,90,90,90]).count
		64

		$ print spaceGroup("&x,y+1/2,z+1/2", [5,5,6,90,90,90]).count
		50    

		$ print spaceGroup("&x,y+1/2,z+1/2", [5,5,6,90,90,120]).count
		0    

    because the second case does not include 14 matching cubic groups, and there are no hexaganol groups with this operation.
    
    
JmolVersion="14.32.72" // P also 15.2.72

bug fix: saving state after connect AUTO to ModelKit-added atoms uses H atom radius instead of final atom radius


JmolVersion="14.32.71" // P also 15.2.71

bug fix: isosurface slab designations "xy" "xz" "yz" "-xy", "-xz" "-yz" etc. are not correct

new feature: isosurface slab designations "a=" "b=" "c=" "-a=" "-b=" "-c=" "ab" "bc" "ac" "-ab" "-bc" "-ac"
 -- like x, y, and z, but for unit cell axes
   for example: 
   		load spacegroup 1 unitcell [3 3 3 60 60 60]
   		isosurface sphere 5.0 slab -a=1
 -- note that negative options and unit cell options are not documented

new feature: color property xxxx [quoted schemeFileNameOrURL]
 -- adds nine more standard color schemes, including five "universally readable" scientific
 	palettes (batlow,cividis,kry,thermal,viridis) as discussed in https://www.nature.com/articles/s41467-020-19160-7
    as well as four more (inferno,magma,plasma,turbo) that are from the R-Project viridis package 
    	https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.html
    
    for example:
 
 	load *1crn
 	color property atomno "viridis"

 -- scheme palettes are located as *.lut.txt in the src/org/jmol/util/colorschemes/ directory 
 -- column format .lut.txt (three columns of r g b per line, either 0-255 or 0-1, or four columns where first column is the index 1-256)
 -- also reads files using https://... from any online source in binary or ASCII formats:
 		binary [optional 32-bit header ignored][rrrr...(256)][gggg...(256)][bbbb...(256)] 768 or 800 bytes total
    	ASCIIt (either three columns of r g b per line, or four columns index r g b)
    
    for example:
 
 	load *1crn
 	color property atomno "https://github.com/fiji/fiji/blob/master/luts/cool.lut?raw=true"

 -- filenames also work in the color() function:

  print color("viridis").colors
 
  print color("https://github.com/Image-Py/imagepy/blob/master/imagepy/data/luts/Others/morgenstemning.lut?raw=true").colors
  
 -- for more color palette look-up table files, see
      https://github.com/fiji/fiji/tree/master/luts
      https://github.com/Image-Py/imagepy/tree/master/imagepy/data/luts
	  https://sites.imagej.net/NeuroCyto-LUTs/luts
 
 
JmolVersion="14.32.70" // P also 15.2.70

bug fix: reading of gzipped jvxl files from PNGJ fails in JavaScript
 -- when caching and reading a file from a zip collection, as in JSmol, FileManager does not unzip the gzipped stream

JmolVersion="14.32.69" // P also 15.2.69

bug fix: WRITE GIF with text background black creates speckled pattern.
  -- for transparent GIF, use background 0x040404

bug fix: SCALE HIDDEN removes units

new feature: JSmol distribution site/jpge  Jmol Point Group Explorer with quizzing and startup options
  - https://chemapps.stolaf.edu/jmol/jsmol/jpge/explore.htm?QUIZMODE
  - https://chemapps.stolaf.edu/jmol/jsmol/jpge/explore.htm?c60
  - https://chemapps.stolaf.edu/jmol/jsmol/jpge/explore.htm?c60&QUIZMODE

JmolVersion="14.32.70" // P also 15.2.70

bug fix: reading of gzipped jvxl files from PNGJ fails in JavaScript
 - when caching and reading a file from a zip collection, as in JSmol, FileManager does not unzip the gzipped stream

  

JmolVersion="14.32.68" // P also 15.2.68

new feature:  {atoms}.pointGroup()
  - returns point group object for the specified atoms, for example {!_H}
  - no limit for number of atoms

new feature: CALCULATE POINTGROUP {atoms}
  - allows subset of atoms to be checked, for example {!_H}
  - reports the point group object for the specified atoms

new feature: draw POINTGROUP {atoms} CENTER xx
  - allows subset of atoms to be used, for example {!_H}
  
  
feature change: draw/show PointGroup no longer has atom number limitation -- just be advised!

feature change: pointGroupDistanceTolerance and pointGroupLinearTolerance removed from state

bug fix: MPJmolApp (Molecular Playground) broken by earlier refactoring of JmolPanel (broken in Jmol 14.31.0)

JmolVersion="14.32.67" // P also 15.2.67  (re-released)

bug fix: UNITCELL SURFACE {4 1 0 0} specifically fails for x=4; search fo plane/lattice intercept not sufficiently wide
bug fix: unitcell change should be preserved as "reset" value after issuing MOKELKIT SPACEGROUP P1  
bug fix: JME conversion fails for C=C (JME ethylene)

new feature: JSONReader expanded to include JSON from Symmetry @ Otterbein

clarification: Note that the 

  ModelKit SPACEGROUP P1

command "sets" the unit cell to its current value, as modified, for example, by: 

  uc=unitcell("a=5.286,b=4.086,c=4.086,alpha=90,beta=90,gamma=90");
  ModelKit unitcell @uc

That is, anytime after issuing ModelKit SPACEGROUP P1, issuing 

  unitcell RESET

will reset to the unit cell to the value that it was when the spacegroup was set to P1. 


JmolVersion="14.32.66" // P also 15.2.66 

new feature: ORCA reading molecular orbitals; preliminary only, minimally tested


JmolVersion="14.32.65" // P also 15.2.65 

bug fix: atom.site not properly incremented with load and appendnew false
bug fix: PWMAT/CIF writers may not remove all duplicate atoms before saving file
bug fix: scale units for SCALE should indicated in the SCALE command itself
bug fix: measurement units defined in MEASURE command should be preserved in state
bug fix: issuing a set measurementUnits command is supposed to reset labels for measurements involving selected atoms

JmolVersion="14.32.64" // P also 15.2.64 (reissued2)

new feature: ORCA input/output reader

bug fix: MMCIF reader broken by 15.2.59 on 2022.06.01
bug fix: invalid COMPARE with .... atoms {atomset1} and not atomset2 crashes Jmol
bug fix: COLOR ECHO TRANSLUCENT missing space char in state
bug fix: certain SCALE objects appear transparent with antialiasDisplay 
bug fix: scale units should be in a state that includes echo JC.scaleName or the SCALE command (reverted in v..65)
bug fix: set FONTSIZE by itself crashes Jmol
bug fix: draw pointgroup does not draw planes

JmolVersion="14.32.63" // P also 15.2.63

bug fix: draw [0 0] [100 100] broken LONG ago
bug fix: (JavaScript only) script callback during animation removes all delays (cyclohexne ring flip) - broken in Jmol 14.32.15
bug fix: (JavaScript only) ModelKit bond assignment does not refresh automatically, appearing a though nothing happened.

JmolVersion="14.32.62" // P also 15.2.62

new feature: implements ModelKit ROTATE axis1 axis2 {atoms} degrees
 -- proper symmetry handling
 -- will not move fixed atoms
 
bug fix: (JavaScript only) ModelKit atom clicking does not work broken in 14.32.8

JmolVersion="14.32.61" // P also 15.2.61

new feature: (JavaScript only) implements Jmol._lastAppletID
 - indicates that last applet that has taken ownership of the mouse (focus)

bug fix: load PDB, then write CIF fails
bug fix: PWmatReader fix for "global" data blocks
 - see _M.globalPWmatData 
bug fix: crystal+dragAtom error for "implicit" planes

JmolVersion="14.32.60" // P also 15.2.60

bug fix: x == y can fail for integers derived from arrays not a script itself

new feature: Optimade reader 
 - https://github.com/Materials-Consortia/OPTIMADE/blob/master/optimade.rst
 - adds required fields for Jmol: chemical_formula_descriptive,lattice_vectors,dimension_types,cartesian_site_positions,species_at_sites,species,";  
 - example: load Optimade::https://optimade.materialsproject.org/v1/structures?filter=nelements=6&page_limit=1

		load http://optimade.2dmatpedia.org/v1/structures
	
		load https://nomad-lab.eu/prod/rae/optimade/v1/structures?filter=nperiodic_dimensions=1

		load https://crystallography.net/cod/optimade 
 
bug fix: CifReader _shelx_* tags can be skipped, as some are > 1 MB of text

 
JmolVersion="14.32.59" // P also 15.2.59

bug fix: OptimadeReader broken
bug fix: OptimadeReader requires Optimade:: prefix
 - now checking for "optimade" or "api_version" 
bug fix: CifReader should allow ADP definition before atom_site block


JmolVersion="14.32.58" // P also 15.2.58

new feature: PDB and related types FILTER "ALLHET" 
 -- by itself, does nothing
 -- in conjunction with any other atom filter, such as /=2, *.CA, etc., 
    passes any HETATM regardless of that filter

new feature ModelKit ADD C [array of points] 
 -- efficient adding of many points of the same type
 -- for example:
      load =ams/quartz 1 packed
      polyhedra unitcell {_Si}
      pts = {_Si}.polyhedra.all.select("(vertices)").join()
      ModelKit ADD N @pts
      
new feature: global user variables dropFileType and dropFileName
  -- allows detecting filename within a dragDropCallback handler
  -- allows setting the file type from within a dragDropCallback handler
  -- method will get the file name, though not the data. 
  -- user variable dropFileType, initially equal to "" 
     can be changed to the desired file type with, for example, 
     
     		set dragdropCallback "jmolScript:if (_ARGS(5).find('config')) dropFileType='pwmat'"
     
  -- user variable dropFileName will hold the file name so that that can used
     to help determine the type.
  -- the actual file data are NOT available in Java, though they may be in 
     JavaScript, since that this point the file will have been cached in JavaScript.
  -- user variable doDrop, initially set to TRUE can be set to FALSE to tell
     Jmol to not load this file.
  -- note that _ARGS() for this callback include:
     [ "DRAGDROP", mode(0), x, y, fileName ]
     so, in 1-based JmolScript, _ARGS(5) is the fileName; 
     in 0-based JavaScript, it is argument 4 
      
bug fix: NaN should be a decimal and should be testable as such. 
but fix: String "NaN" should be considered equal to NaN for direct comparison. 
bug fix: some cases of modulation in Incommensurate CIF files missed
bug fix: @1.modulation("O",t) should report as 0-1 scale, unrounded not 0-100 rounded
bug fix: symop() function not distinguishing between point group and space group check "x,y,z" and "C2.1"
         causing x = symop("x,y,-z", @3) to fail
bug fix: loading of CIF file with spaces in operations duplicates "x,y,z" 

 
JmolVersion="14.32.57" // P also 15.2.57

new feature: symop(3,@1,"array") adds "xyzNormalized"

bug fix: draw SYMOP 40 @1 @5 and show symop 40 @1 @5 should report actual operation, not space group operation
bug fix: draw SYMOP rotation inversion drawing of intermediate not correct; switched to rotation then inversion
but fix: show symop, show spacegroup can have "null" for operations

JmolVersion="14.32.56" // P also 15.2.56

(into Jmol 14 only from precision branch)

new feature: load spacegroup 213 unitcell [5 5 5 90 90 90]
 -- creates an empty structure with the designated space group and unit cell
 -- user is expected to match the correct type of unit cell to the given space group.

bug fix: incommensurately and subsection modulated CIF can miss some parameters (14.31.61)
bug fix: MMCIF files with single entries rather than loops could fail
bug fix: MMCIF files with DSSR or RNA3D extensions could fail.

bug fix: DRAW SYMOP broken
 
JmolVersion="14.32.55" // P also 15.2.55
(into Jmol 14 only from Jmol-SwingJS precision branch)

feature change: axes POSITION [x y] "xyz" with symmetry
  -- crystal structures only
  -- switches to a second small axis set that is Cartesian
  -- [x y] or [x y%] screen position
  -- uses the specified label for the axes labels
  -- label can be one, two, or three characters, for showing just x, 
     just xy, or xyz, respectively
  -- cleared using AXES POSITION OFF (axes on unit cell only)
  -- replaced with abc using "abc" instead of "xyz" (with no axes on unit cell itself)

new feature: axes POSITION [x y] "xyzabc"
  -- same as "xyz" but still shows unitcell axes
  
new feature: global user variable dragDropFileType
  -- allows setting the file type from within a dragDropCallback handler
  -- method will get the file name, though not the data. 
  -- user variable dragDropFileType, initially set to "" can be set to the desired file type
  -- user variable doDrop, initially set to TRUE can be set to FALSE to ignore the drop

bug fix: deleting atoms from PDB fails
bug fix: ModelKit dragAtom does not update measurements
bug fix: DataManager can crash if atoms are created after making atom property arrays 
bug fix: axes position show allow unit cell axes to be turned off
  -- axes position [60 60] "abc" // just small abc
  -- axes position [60 60] "xyz" // just small xyz
  -- axes position [60 60] "xyzabc" // small xyz and unit cell abc
  -- axes position off // just unitcell  
bug fix: load append PWMAT file into structure (appendNew false) fails because no symmetry operators declared

JmolVersion="14.32.54" // P also 15.2.54

(into Jmol 14 only from precision)
bug fix: COMPARE {atomset} ATOMS {at1} [coord1] {at2} [coord2] .... fails  
bug fix: JavaScript negative int double missing minus sign


JmolVersion="14.32.53" // P also 15.2.53

(into Jmol 14 only from precision)
bug fix: PWmatReader fails to adjust atom properties for skipped atoms
bug fix: PWmatReader fails to retain properties after ModelKit ADD ... 
bug fix: adding an atom removes atom properties
bug fix: filter "*.CA" does not work

JmolVersion="14.32.52" // also 15.2.52p

(into Jmol 14 only from precision)
bug fix: hkl(0 0 0) crashes Jmol (MathExt line 2869)
bug fix: openStringInline may have null htParams (Viewer line 3184)

new feature: WRITE "pwslab" (cmdext line 4154 and others, propman line 1204, PWMATWriter line 57)
 - like WRITE "pwmat" but does not pack {x y 0} layer to {x y 1}


JmolVersion="14.32.51" // also 15.2.51

bug fix: loading string line does not check for filter "filetype=xxx;"
bug fix: LOAD ... FILTER "NOPACK" not working properly (and never did?)
bug fix: unitcell scale {1/2 1 1} fractional should work
bug fix: LOAD ... SUPERCELL should set space group to P1
bug fix: allow set picking dragMolecule with P1 space group

code: JC.globalBooleans consolidated

JmolVersion="14.32.50" // (b)  also 15.2.50

bug fix: ModelKit not initializing to set picking assign_atom_C
bug fix: PWmatReader failing with trailing garbage


new feature: load [some crystal structure] filter "SLABXY"
new feature: load [some crystal structure] filter "POLYMERX"
 -- loads a crystal structure as a slab or polymer
 -- packs only in the periodic directions
 -- compatible only with P1 symmetry
 -- load =ams/quartz 1 packed;load inline @{write("CIFP1")} {3 3 1} filter "SLABXY"

new feature: nonperiodic axes for slabs and polymers now dotted

bug fix: OptimadeReader for slabs and polymers
bug fix: PWMatReader fix for header garbage

code: Symmetry refactoring

JmolVersion="14.32.49" //  also 15.2.49

new feature: ECHO @1 
 - sets the echo at atom 1

new feature: SCALE @1
 - sets the echo at atom 1
 - scale moves with atom and is correct even for set perspectiveDepth TRUE
 
bug fix: SCALE command can crash Jmol - null pointer exception in ECHO
bug fix: background SCALE yellow does not cover full range of scale
bug fix: slow JavaScript LOAD FILTER due to debug comment left in

JmolVersion="14.32.48" //  also 15.2.48

new feature: Optimade reader 
 - https://github.com/Materials-Consortia/OPTIMADE/blob/master/optimade.rst
 - requires qualifier Optimade:: because there is no identifying characteristic of the return
 - example: load Optimade::https://optimade.materialsproject.org/v1/structures?filter=nelements=6&page_limit=1
 
new feature: zoom(to) UNITCELL
 -- all options available as for atoms
 
new feature: center UNITCELL 

bug fix: issues with PWMATWriter unitcell offset
bug fix: allow right-click option for popup_menu binding

bug fix: load "" with qualifier xxx:: does not carry over qualifier


JmolVersion="14.32.47" // (b) also 15.2.47

bug fix: ModelKit add "Si" {0/1 0 0} packed; save state s1
	-does not save site change in state
	
bug fix: removing difference between set fx, fux
	-too confusing
	-no differences for get, only set. 
	-poorly documented

JmolVersion="14.32.46" //  also 15.2.46

bug fix: load PDB filter "BMCHAINS=a" should work -- (lower-case issue)
bug fix: set structureModifiedCallback for attempt to move fixed atom should report "FAILED"
bug fix: {assoc array}.pivot.pivot() not working

new feature: hkl(1 0 0 0.3) to produce plane offset by 0.3 Angstroms from the origin.


JmolVersion="14.32.45" //  also 15.2.45

bug fix: PDBReader fails to treat chain case for filter biomolecule
bug fix: PDBReader can fail when making connections with filter biomolecule
bug fix: attempted LOAD of nonexistant PNGJ file (*.png) can crash Jmol 
bug fix: CIFWriter and PWMATWriter do not round coordinates very close to 1.0000

new feature: SCALE command
 -- a special category of ECHO
 -- also ECHO "%SCALE (units)"
 -- draws a |---| scale in the specified location
 -- adjusts by decades -- 0.01, 0.1, 1, 10, 100, etc.
 -- SCALE ON
    -- turns scale on at bottom left
    -- units dynamic, corresponding to SET measurementUnits
 -- SCALE OFF
    -- turns scale off
 -- SCALE (units)
 -- optional fixed units, where (units) can be one of:
 	 "nanometers" ("nm") 
 	 "picometers" ("pm")
 	 "angstroms" ("a" or "ang")
 	 "bohr" ("atomicunits" or "au") 	 
 -- when perspectiveDepth TRUE, is for center of visible depth based on screen width
 -- like FRANK, persists through file loading and ZAP
 -- additional relevant options same as for SET ECHO command
 -- examples:  
 	SCALE angstroms bottom center 
    
new feature: COLOR SCALE ...
 -- sets the color of the scale
 
new feature: FONT SCALE ...
 -- sets the font of the scale


new default properties: Jmol application (Java and JavaScript) adds two additional preferences:
 -- antialiasDisplay TRUE
 -- measurementUnits "angstroms"
 -- PreferencesDialog will set these as "JmolDefaults"
    
new feature: ECHO "%SCALE (units)" 
 -- same as SCALE (units) ...


JmolVersion="14.32.44" //  also 15.2.44

bug fix: PDB reader with biomolecule filter does not properly select chains
 -- broken in 14.32.25
 -- not relevant to mmCIF or MMTF

bug fix: AMPAC archive ZMatrix reader fix
 -- was not reading ZMatrix, only Cartesian listing
 
bug fix: CONNECT DELETE ... 
 -- initial DELETE syntax should be OK (to be compatible with older Jmol versions)

bug fix: POLYHEDRA COLLAPSED ... 
 -- initial COLLAPSED syntax without FaceOffset should be OK (to be compatible with older Jmol versions)

bug fix: SET ECHO BOTTOM LEFT; ECHO JC.scaleName when perspective depth true
 -- should be for center of visible depth based on screen width
 
bug fix: ModelKit DELETE ... should adjust {thismodel}.site.all
  
buf fix: better check for deleted atoms during atom selection


JmolVersion="14.32.43" //  also 15.2.43 (second upload)

bug fix: duplicate atom number after delete/add

new feature: set echo bottom left; ECHO JC.scaleName
  -- draws a |---| scale in the specified location
  -- uses measurementUnits (angstroms, pm, nm, or au (Bohr))
  -- adjusts by decades -- 0.01, 0.1, 1, 10, 100, etc.
  
new feature: axes POSITION [x y] "xyz"
  -- crystal structures only
  -- adds a second small axis set that is Cartesian
  -- [x y] or [x y%] screen position
  -- still shows unitcell axes
  -- uses the specified label for the axes labels
  -- label can be one, two, or three characters, for showing just x, 
     just xy, or xyz, respectively
  -- cleared using AXES POSITION OFF (axes on unit cell only)
  -- replaced with abc using "abc" instead of "xyz" (with no axes on unit cell itself)

optimization: faster loading of very large (>100K atom) files

JmolVersion="14.32.42" 
  also 15.2.42

new feature: set doublePrecision
  -- for JavaScript specifically, particularly important for crystal structure
  -- allows JavaScript to operate in full double precision mode with no rounding
  -- returns to pre-14.3.5 behavior
  -- disables all float/double reconciliation in Java and JavaScript
  -- CAUTION! May result in state loading problems between Java and JavaScript
  -- CAUTION! May result in problems loading older state scripts
  -- CAUTION! PNGJ images may not load properly
   
new feature: x = {atoms}.within(distance,[points])
  -- returns the subset of {atoms} that are within the specified distance 
     of any point in the array of points.
  -- allows tracking groups of atoms by position after reloading files in a way 
     that might change atom indexes

new feature: x = {atoms}.within(distance,{otheratoms})
  -- returns the subset of {atoms} that are within the specified distance 
     of any atom in {otheratoms}. Atoms in {otheratoms} are excluded.
  -- compare to within(distance, {atoms}), which does not exclude other atoms
     or within(distance, TRUE, {atoms}), which excludes other atoms but does not limit
     return to the {atoms} subset. 
     
  -- for example, easy check for atoms that have the same position using distance = 0.001

bug fix: set appendNew false; load append ... crystal structure ... 
         should transform atoms to cartesian coordinates and set space group to P1
           

JmolVersion="14.32.41" 
  also 15.2.41

bug fix: crystal set picking dragatom fails for some space groups

bug fix: SimpleUnitCell and PWMatReader not copied from Jmol-SwingJS



JmolVersion="14.32.40" 
  also 15.2.40

bug fix: set picking dragatom with crystal structure fails to constrain to line intersecting two planes

bug fix: ModelKit UNITCELL after atom deletion does not move all atoms

bug fix: PWMatReader should propagate site data for property_pwm* throughout sites
         when lattice or supercell is given in LOAD command

bug fix: ModelKit ASSIGN BOND incorrectly reports bond index to callback

JmolVersion="14.32.39" 
  also 15.2.39


cleaner start for ModelKit xtal builder from scratch

load =ams/quartz 1;delete *;
ModelKit add "P" {1/4 1/4 1/4}

load =ams/halite 1;delete *;
ModelKit add "P" {0 1/2 0}



JmolVersion="14.32.38" 
  also 15.2.38

bug fix: CrystalReader should recognize slab for topond output

bug fix: BilbaoReader fix for comments

bug fix: PWMatReader fix for broken positions when have constraints
bug fix: PWMatReader not loading constraints properly
bug fix: Resolver not recognizing PWMatReader options
bug fix: PWMATWriter not removing packing atoms in JavaScript
bug fix: PWMATWriter not rounding positions when very close to twelfths
bug fix: set picking dragatom with crystal not working due to same issue

bug fix: LOAD ... SPACEGROUP "x,y,z;-x,-y,-z"  broken when SET DEBUG TRUE

JmolVersion="14.32.37" removed
JmolVersion="14.32.36" removed


bug fix: PWMatWriter not removing packing atoms in JavaScript
bug fix: PWMatWriter not rounding positions when very close to twelfths
bug fix: PWMatReader not loading constraints properly

bug fix: CrystalReader should recognize slab for topond output

JmolVersion="14.32.35" 
  also 15.2.35

bug fix: load "" PACKED broken in 14.32.33

JmolVersion="14.32.34" 
  also 15.2.34

bug fix: PWMatReader constraints default 1 1 1 
bug fix: PWMatReader resolver fix
bug fix: state saving after crystal ModelKit changes
bug fix: load SMILES ... should allow FILTER "..."
bug fix: last model set should be able to be zapped (untested)

new feature: To get around CIR issue with missing imine stereochemistry:
  -- {thismodel}.inchi("SMILES/imine") will convert InChI N to [17C] or [17c] 
     with [5H] to preserve stereochemistry when loading.  
  -- MolReader will convert [17C,17c] to imine N automatically 
     and remove any [5H] 
  -- tested on about 1000 compounds with 55 that were failing InChiI -> SMILES -> InChI round trip
  
new feature: SMILES generator will NOT remove [H] from nitrogens.
 
JmolVersion="14.32.33" 
  also 15.2.33

bug fix: ModelKit crystal constraint user dragAtom might lock atoms -- fixed
bug fix: InChI->SMILES generates ...N(=O)=O rather than ...[N+](=O)[O-] for nitro compounds
bug fix: Jmol not recognizing MENU files for drag-drop, instead treating them as script files, 
         which disables Jmol due to the redefinition of the COLOR command (use of @COLOR = in menu files)
bug fix: PWMatReader flexibility for whitespace before headings         


JmolVersion="14.32.32" 
  also 15.2.32

bug fix: load ... filter "biomolecule" should not be reporting symmetry operators in menu
bug fix: SpaceGroupInfo for filter "biomolecule" should not report CIF2 style translation 

bug fix: "fixed" selection should not require explicit ModelKit HIDDEN 
bug fix: "fixed" selection should not fix atoms due to colinear axes
bug fix: hidden ModelKit should not display CH4 by defuault after ZAP


JmolVersion="14.32.31" 
  also 15.2.31

bug fix: dragAtom screen coordinate transform not transformed correctly into 3D positions

bug fix: select within(BOUNDBOX, atoms) can skip edge or corner atoms that were used to define it
 -- e.g. load =ams/quartz 1 packed; select within(BOUDNBOX, _O)

bug fix: DRAW SPACEGROUP missing last operation

new feature: set picking dragAtom TRUE now recognizes symmetry for crystal structures
 -- drags atoms only if symmetry-allowed  
    (that is, on an axis or plane)
 -- does not move atoms if they are in fixed special positions

new feature: {1/2 1/2 1/2}.symop("invariant")
 -- similar to @@1.symop("invariant") 
 -- returns an array of symop numbers for axes, planes, and centers of inversion
    for which this position is invariant. 

new feature: symop(2, "invariant")
 -- delivers an object that describes the invariant nature of this symmetry operator. 
 -- for a plane, returns {a, b, c, d} for that plane's equation  ax + by + cz + d = 0;
 -- for an axis, returns [point, vector], where point is on the line, and vector is the unit vector for the axis
 -- for a center of inversion or an n-bar axis, returns the center point
 -- for any operation involving a translation, returns "none"
 -- for the identity operation, returns "identity"
 -- see also @@1.symop("invariant"), 
       which delivers an array of symop numbers for axes, planes, and centers of inversion
       for which this atom's position is invariant.

new feature: @@1.symop(2, "invariant")
 -- same as symop(2, "invariant"), except adjusts return to be through the given atom
 -- presumes the atom is in a special position and not fixed
 -- returns the "true" plane or axis or center of inversion, not just the one for the generating operator

new feature: {1/2 1/2 1/2}.symop(2, "invariant")
 -- same as @@1.symop(2, "invariant"), but for a point rather than an atom
 -- adjusts return to be through the given point
 -- presumes the point is in a special position and not fixed
 -- returns the "true" plane or axis or center of inversion, not just the one for the generating operator

 
 
JmolVersion="14.32.30" 
  also 15.2.30

new feature: PWmatReader default to show centered magnetic vectors as SET VECTORSCENTERED; VECTORS 0.2; 

bug fix: CALCULATE SPACEGROUP should not limit atoms to within unitcell, just unitize and remove duplicates

bug fix: ModelKit HIDDEN should implicitly set modelKitMode TRUE

new feature: set picking dragAtom TRUE now recognizes  

new feature: ModelKit ADD @1 
new feature: ModelKit ADD @1 PACKED
 -- complete the set of atoms in a unit cell, possibly changing element

new feature: ModelKit ADD @1 "N"
new feature: ModelKit ADD @1 "N" PACKED
 -- complete the set of atoms in a unit cell, possibly changing element
 -- will not change space group

new feature: ModelKit ADD "Cl" {1/2 1/3 1/3}
new feature: ModelKit ADD "Cl" {1/2 1/3 1/3} PACKED
 -- adds a new atom at the specified position
 -- complete the set of atoms in a unit cell
 -- will not change space group
 
new feature: ModelKit ADD @1 "Cl" {1/2 1/3 1/3}
new feature: ModelKit ADD @1 "Cl" {1/2 1/3 1/3} PACKED
 -- adds a new atom at the specified position and connects it to @1
 -- complete the set of atoms in a unit cell
 -- will not change space group
 
new feature: ModelKit ADD/DELETE/MOVETO 
 -- all operable automatically from the ModelKit menu
 -- enabled by the presence of symmetry
 -- movement is constrained to "invariant" symmetry elements (axes or planes)
 -- use ModelKit SPACEGROUP "P1" to disable all constraints

new feature: select FIXED
 -- selects all atoms that are locked by symmetry
 
new feature: MINIMIZE now works (minimally) with a crystal structure. 
 -- use load ... {444 666 1}; minimize
 -- no change in space group
 -- asymmetric unit will be minimized with propagation to symmetry-related atoms
 -- minimally effective; mostly to demonstrate constrained positions


JmolVersion="14.32.29" 
  also 15.2.29

bug fix: JavaScript for write CIFP1 fails for Math.abs(Integer.MIN_VALUE) < 0 in Java 
bug fix: ModelKit add {*} packed  not packing

new feature: moveto AXES [-][ab, bc, ca, ba, cb, ac][1, 2, 3, 4]
 -- similar to moveto AXES [a, -a, a1, -a1, a2, a3, a4, b, -b, ...]
 -- allows views perpendicular to any unit cell face
 -- XY1 (where X and Y are one of [a,b,c]) presents the XY face in the plane of the screen 
    with the origin on the bottom left, X to the right, and Y pointing up
 -- XY2, XY3, and XY4 rotates the origin clockwise around the four corners: top left, top right, bottom right
 -- default is 1, so ab is the same as ab1
 -- for rectilinear unit cells in particular, this equates:
 	 AXIS bc2 with AXIS a and AXIS a1
 	 AXIS ca2 with AXIS b and AXIS b1
 	 AXIS ab and AXIS ab1 with AXIS c and AXIS c4
 

JmolVersion="14.32.28" 
  also 15.2.28

bug fix: PWMAT reader/writer fixes

new feature: PDB alpha-carbon-only sheet structure enabled

new feature: ".pivot" function no longer needs ".all" for atom properties
 -- print {*}.elemNo.pivot same as print {*}.elemNo.all.pivot
 
new feature: ModelKit ADD @2 [PACKED]
 -- completes the equivalent positions for an atom in a crystal
 -- will add only as many atoms as necessary
 -- updates {thismodel}.site values
 -- optionally packs the unit cell
 
new feature: ModelKit ADD @2 "C" [PACKED]
 -- completes the equivalent positions for an atom in a crystal
 -- will add only as many atoms as necessary
 -- transforms all specified atom sites to this element
 -- updates {thismodel}.atomName values  ("O2" becomes "C2", for instance)
 -- updates {thismodel}.site values
 -- optionally packs the unit cell

new feature: ModelKit ADD "C" point [PACKED]
 -- completes the equivalent positions for an atom in a crystal
 -- will add only as many atoms as necessary
 -- positions based on the symmetry of the specified point
 -- updates {thismodel}.atomName values  ("O2" becomes "C2", for instance)
 -- updates {thismodel}.site values
 -- optionally packs the unit cell
  
new feature: x = data("xxx*")
 -- returns an array of data keys starting with "xxx"
 -- for instance, x = data("property_MYKEYS_*") to retrieve all your custom keys
 -- then y = data(x[1]) would return the data for the first item in the array of keys

JmolVersion="14.32.27" 
  also 15.2.27

new feature: plane designations "ab" "ab1" "ac "ac1" "bc" bc1" short for {0 0 1/1 0} {0 0 1/1 c} etc. 

new feature: ModelKit MOVETO @1 {1/2 0 0}
 -- moves the atom only if its invariant symmetry is unchanged (that is, doesn't create or destroy atoms)

new feature: ModelKit FIXED VECTOR point1 point2
 -- constrains atom dragging to a given vector
 -- atom will still not move if symmetry does not allow it
 -- replaces any fixed plane
 -- cleared by changing the value of set modelKitMode

new feature: ModelKit FIXED PLANE plane
 -- constrains atom dragging to a given plane
 -- atom will still not move if symmetry does not allow it
 -- replaces any fixed vector
 -- cleared by changing the value of set modelKitMode

new feature: ModelKit FIXED NONE
 -- removes constraint

new feature: @1.symop("invariant")
 -- delivers an array of integers, the symmetry operator indexes other than identity 
    (numbers 2-N) for which the specified atom is unchanged in position when operated upon
 -- for example, the position of an atom on a rotation element or on a mirror plane is unchanged 
    upon rotation or reflection, respectively 
 -- used internally to determine when ModelKit MOVETO can allow a change in position

new feature:  @1.pointgroup("spacegroup")
 -- same as pointgroup("spacegroup", @1)
 -- consistent with @1.spacegroup()


JmolVersion="14.32.26" 
  also 15.2.26

bug fix: CIFWriter fails for JavaScript/legacy; uses String.isEmpty() -- not included in legacy transpiler runtime JavaScript
bug fix: CIFWriter for CIFP1 should accept any atoms, unitizing them, and not limit itself to atoms to within(unitcell)

bug fix: 3x3 and 4x4 matrix multiplication of a vector of points not working

new feature: {atoms}.find("equivalent") {
 -- returns all atoms with the same .site value as any of the atoms specified
 -- these atoms may or may not be within the unit cell
 -- returns at least all atoms in {atoms}

new feature: {point}.find("equivalent") {
 -- returns all equivalent positions by applying all symmetry operators to this point
 -- these points will be only WITHIN the unit cell -- fractional coordinates [0,1)
 -- may or may not return {point} itself

new feature: {point}.find("equivalent", "packed") {
 -- returns all equivalent positions by applying all symmetry operators to this point
 -- these points will include points in the packing layer around the cell -- fractional coordinates [0,1]
 -- may or may not return {point} itself
 
 
new feature: UNITCELL OFFSET @1; UNITCELL OFFSET {atoms}
 -- quick offset to a specific atom or center of atoms
 
new feature: LOAD .... SPACEGROUP "Hall:P 2y"
 -- allows prefix "Hall:" to specify Hall notation
 -- allong with SPACEGROOUP 3 or SPACEGROUP "10:b"
 -- allows for experimentation with different space groups
 
new feature: ModelKit ASSIGN SPACEGROUP "P1"
 -- assign P1 to the space group for the selected model atoms (or model, if no atoms are selected) 
 -- can be reset (in most cases) using ModelKit ASSIGN SPACEGROUP

new feature: ModelKit DELTE {atoms}
 -- deletes all symmetry-equivalent atoms (all atoms with the same .site value as any atoms in this set)
 -- use x = {atoms}.find("equivalentAtoms").length to check how many atoms this will be

new feature: {atoms}.distance()
 -- intuitive, useful
 -- same as {atoms}.distance({0 0 0})
 -- note that {atoms}.length reports the number of atoms in the set

new feature: {1 2 3}.distance()
 -- consistent with {atoms}.distance()
 -- same as {1 2 3}.distance({0 0 0})
  
feature change: {1 2 3}.length
 -- was the useless "-8" and nonintuitive
 -- same as {1 2 3}.distance({0 0 0})
 -- intuitive, expected -- like string, array, associative array, byte array, [{...}] (bond set), and ({...}) (atom set).
 -- note that {1 2 3}.type reports "point", which is more intuitive as well
 -- {1 2 3}.size and {1 2 3}.count still report -8
   
JmolVersion="14.32.25" 
  also 15.2.25

bug fix: PDB/mmCIF/MMTF biomolecule filter fails for simple chain selection (7OJP) 

bug fix: MMTF reading of biomolecule filter fails to bond atoms, resulting in no display 

bug fix: axes labels for origin not shown for unitcell

bug fix: additional work on UNITCELL SURFACE

new feature: DRAW UNITCELL xxx LATTICE {na nb nc}
 -- draws a set of lattice points, including lattice centering
 -- mostly for debugging; possibly useful

new feature: DRAW INTERCEPT UNITCELL xxx LATTICE {na nb nc}... HKL ....
 -- draws as set of lattice points that are on a given plane
 -- mostly for debugging; possibly useful
 
bug fix: UNITCELL SURFACE validation on silicon, iron, quartz
 -- all typical Miller planes (1/0/-1, 1/0/-1, 1/0/-1) checked for 
    standard gamma >= 90, proper right-hand-rotation axes
    using FCC, BCC, and primitives
 -- can be followed by:  u = unitCell(); LOAD "" FILL @u; UNITCELL @u

new feature: SAVE STATE 
 -- by itself, loads the UNDO stack and clears the REDO stack
 -- sets undoAuto FALSE, turning off Java Application Console automatic undo/redo
 -- process is: SAVE STATE...UNDO REDO ...SAVE STATE...SAVE STATE...UNDO...UNDO...

JmolVersion="14.32.24" 
  also 15.2.24

bug fix: ChemDraw CDXML reader was not tested in 15.2.23
 -- now loads proper compounds with (common) protecting groups. 
 -- 2D -> 3D enabled; adds "Nickname" nodes (minimized as fluorine)

undocumented feature:  filter "*.ca;/=3";

bug fix: bonds to transparent atoms should be flat ends, not open

new feature: SET UNDOAUTO FALSE|TRUE
 -- default value TRUE, enabling automatic saving of the state only in the Java application
 -- setting false turns off Java application console automatic undo/redo
    and allows user-defined undo/redo states
 -- disabled by SET PRESERVESTATE FALSE

new feature: SET UNDO
 -- saves the current state on the UNDO stack.
 -- clears the REDO stack
 -- sets undoAuto FALSE
 
new feature SET UNDOMAX n 
 -- sets the maximum number of saved states (default 20) with SET defaultAuto FALSE
 -- setting this value to 0 clears both the UNDO and the REDO stacks

new feature UNDO
 -- when undoAuto is true, in the Jmol application console only, carries out an undo action
 -- when undoAuto is false, or not in the Java application, restores the most recent
    state saved using SET UNDO
    
new feature REDO
 -- when undoAuto is true, in the Jmol application console only, carries out a redo action
 -- when undoAuto is false, or not in the Java application, restores the most recent
    state prior to an UNDO operation

new feature: SHOW UNDO
 -- reports if undoAuto is true or false, and if it is false, reports the sizes of the user
    UNDO and REDO stacks.

new feature: ModelKit UNDO/REDO
 -- a separate undo/redo stack specifically for the ModelKit
 -- undoes or redoes a ModelKit action
 -- disabled by SET PRESERVESTATE FALSE


new feature: UNITCELL SURFACE {h k l} [height | scale%] [offset or offset%] [TOP]
 -- operates on current unit cell, so for repeat use, use unitcell reset
 -- allows creating a unit cell based on a Miller plane
 -- perpendicular to plane, with u = b/k - a/h, v = c/l - b/k (generally)
 -- optional height in Angstroms or scaled relative to hkl distance to origin
 -- optional offset in Angstroms or percent of unit cell height 
 -- default offset sets bottom of unit cell at origin
 -- optional TOP parameter measure from the top of the new unit cell
 -- examples:
    
    load =ams/halite 1 packed
    unitcell reset;unitcell surface {1 1 1} 100% // between {0 0 0} and Miller plane
    unitcell reset;unitcell surface {1 1 1} 100% // between {0 0 0} and Miller plane
    unitcell reset;unitcell surface {1 1 1} 100% 50% // centers unit cell on Miller plane
    unitcell reset;unitcell surface {1 1 1} 50% 150% // half-height cell centered on Miller plane 
    unitcell reset;unitcell surface {1 1 1} 100% -100% // top on {0 0 0}
    unitcell reset;unitcell surface {1 1 1} 100% @{hkl(1 1 1).w} // same as 100% -100%
    unitcell reset;unitcell surface {1 1 1} TOP // same as 100% -100%
    unitcell reset;unitcell surface {1 1 1} 10 TOP // same as 50% -100%

JmolVersion="14.32.23" 
  also 15.2.23

bug fix: LOAD filter for rejecting an element, for example, "!_H", not functional


JmolVersion="14.32.22" 
  also 15.2.22

new feature: Jmol*.jar upgraded to Java 8. 
 -- Note, however, that the legacy transpiler for 14.* versions will not handle Java8+ syntaxes. 
 -- so no switch(String) and no catch(Exception | Exception | Eception) and no try(resource) {...}

bug fix: Jmol.jar/JmolData.jar -i silent flag not respected for CIR resolver resolution messages  

bug fix: JmolData.jar missing net.sf.jniinchi classes

bug fix: ModelKit ASSIGN ATOM "Xx" {x y z} adds new atom "H", not "dummy atom" Xx 

bug fix: PDB/mmCIF/mmTF CONECT records between chains in different BIOMT blocks must be removed
 -- sets the distance limit to 5 Angstroms, just to allow for hydrogen bonds

new feature: {associative array}.pivot()
 -- switches keys for values
 -- result is an associative array of lists
 -- allows quick filtering based on values of a simple associative array
 -- for example:
 
    load =2fk3
    print {*}.chain.all.pivot.pivot()

new feature: {associative array}.pivot("count")
 -- switches keys for values and reports count of each list, not the list itself
 -- allows quick filtering based on values of a simple associative array
 -- for example:
 
    load =2fk3
    print {*}.chain.all.pivot.pivot()
      
new feature: {associative array}.select("... WHEREIN VALUE...")
 -- "WHEREIN VALUE" allows section of associative array items by value
 -- especially handy as [array].pivot.pivot()
 -- for example:
 
    load =1d66
    print {*}.chain.pivot.select("* wherein value > 40")

new feature: {associative array}.select("... WHEREIN KEY...")
 -- "WHEREIN KEY" allows section of associative array items by key
 -- especially handy as [array].pivot.pivot()
 -- can be combined with VALUE checke
 -- for example:
 
    load =1d66
    print {*}.chain.pivot.select("(*) wherein key = 'B' or key = 'A' ").sum



JmolVersion="14.32.21" 
  also 15.2.21

bug fix: CENTER {0 0 0} broken in 15.2.20
bug fix: write PNGJ, ZIP, JMOL do not save internal path to files dropped in 
         Jmol/Java or otherwise having explicit type:: prefixes

JmolVersion="14.32.20" 
  also 15.2.20

bug fix: load FILTER "bmchains" not working as advertised.
 -- for PDB, mmCIF, MMTF
 -- removes duplicate chain ids when applying BIOMOLECULE option
 -- bmchains or bmchains=0 will append symmetry operator > 1 to chain id, so {A B A B A B} becomes {A B A2 B2 A3 B3}  
 -- bmchains=1 will increment chain ids past last identified chain, so {A B A B A B} becomes A B C D E F
 -- bmchains=5 will increment chain ids starting 5 letters after last identified chain starting , so {A B A B A B} becomes A B G H I J
 -- bmchains=a will increment chain ids starting with 'a'
 -- overflow of [A-Za-z] will fall back to bmchains=0 option  (load =1AUY filter "biomolecule 1;bmchains=1") 
  
bug fix: atom.fxyz, .uxyz should follow changes in unit cell size involving supercells.

bug fix: CifWriter atom_site_label not unique

new feature: UNITCELL FILL {na nb nc} 
 -- simple integer multiple unitcell option similar to RANGE {555 ijk 1}
    (meaning show block with lines for each contained unit cell)

new feature: UNITCELL SUPERCELL {na nb nc} 
 -- simple integer option similar to RANGE {555 ijk 0}
    (meaning show as one large unit cell)

new feature: {*}.find("spacegroup") -- discovers the space group for a model 
 -- using the current unit cell, finds a compatible spacegroup or returns P1
 -- uses a novel algorithm that efficiently scans all known operators to 
    rapidly iterate to the only compatible spacegroup for a given unit cell
 -- automatically reduces to the parent unit cell if currently a supercell
 -- assumes the specified atoms are within(unitcell) or packed as (cell=555)
 -- returns one of 531 known space group settings as a map including keys:

		HallSymbol
		HermannMauguinSymbol
		basis
		crystalClass
		ita
		jmolId
		operationCount
		operationsXYZ
		supercell
		unitcell

 -- returned basis value is the asymmetric unit atom set for this setting
 -- returned supercell value is a point {na nb nc} indicating the block of 
    unit cells found, or {1 1 1} if no supercell was found. 
    -- use UNITCELL FILL @{x.supercell} to switch to a block of the smaller unitcells
    -- or UNITCELL SUPERCELL @{x.supercell} to return to this supercell
 -- return value unitcell is a parameter set [a b c alpha beta gamma va vb vc] 
    indicating the exact unit cell described by the supercell, if one was found
 -- missing packed atoms or additional extraneous atoms will return P1 
 -- will return P1 if the space group could not be determined.
    
new feature: CALCULATE SPACEGROUP 
 --	report the space group for the current model 

new feature: CALCULATE SPACEGROUP {atoms}
 --	report the space group for the specfied atoms 

new feature: ModelKit ASSIGN SPACEGROUP
 -- find and set the space group for this model 
 -- models without unit cells will be given a nominal P1 space group with simple 10-Angstrom cubic cell 
 
   
 

JmolVersion="14.32.19" 
  also 15.2.19
  
  new feature: JSpecView Java application allows for headless batch script execution
  
    java -jar jspecview.jar -script "load \"C:/temp/10.zip\";write difdup \"testzip.jdx\";" -nodisplay
    java -Djava.awt.headless=true -jar jspecview.jar -script "load \"C:/temp/10.zip\";write difdup \"testzip.jdx\";"

JmolVersion="14.32.18" 
  also 15.2.18

-- Build 14.32.17 removed -- crystal structures broken due to bad build

bug fix: GaussianReader tensor "csa" broken
bug fix: show UnitCell does not reflect UNITCELL command shifting or scaling
bug fix: axes incorrect for scaled unitcell

undocumented: ELLIPSOID SET option
 -- ellipsoid SET "csa" scale 0.5

new feature: write CIF "t.cif"
 -- writes CIF with symmetry
 -- reverts to P1 symmetry if individual atoms have been added 
    or unitcell has been moved to non-integral position or adjusted in size

new feature: write CIFP1 "t.cif"
 -- writes CIF as P1 symmetry, only including the periodic atoms

new feature: getProperty unitCellInfo
 -- for the current unitcell, including any offset
 -- includes properties matCtoF, matFtoC, params, vectors, volume 
	
new feature: select within(unitcell)
 -- uses the current unitcell, selecting atoms with fractional coordinates
    within the range [0, 1)
 -- effectively returns the set of points that are periodic
 
new feature: select within(unitcell, u)
 -- where u is the result of the unitcell() function
    (that is, an array [o a b c] of origin and three vectors)
 -- uses the specified unitcell, selecting atoms with fractional coordinates
    within the range [0, 1)
 
 
JmolVersion="14.32.17" 
  also 15.2.17

bug fix: Show $s2  for isosurface reports first isosurface only
bug fix: _M.unitCellParams does not update after modifying the unit cell
bug fix: GausssianReader Tensor "csa" broken
bug fix: ScriptEditor many issues
bug fix: ... HKL {1 1 1}  works, but HKL 1 1 1 fails, if not last in a command

new feature: getproperty("atomInfo").select("fx,fy,fz")
 -- adds fractional coordinates to atomInfo
 
new feature: draw boundbox @1 @2 @3 @4...
 -- draws a boundbox with edges in the x, y, and z directions through a set of points

new feature: draw best boundbox @1 @2 @3 @4...
 -- draws the best boundbox through a set of points

new feature: draw best plane @1 @2 @3 @4...
 -- draws the best plane through a set of points

new feature: draw best line @1 @2 @3 @4...
 -- draws the best line through a set of points
 
new feature: draw intersection [unitcell or boundbox description] [line or plane description]
 -- intersects all types of boundboxes and unitcells with any type of plane or line
 
new feature: draw intersection [unitcell or boundbox description] ON [line or plane description]
 -- projects a unitcell or boundbox on any plane 

new feature: draw intersection [unitcell or boundbox description] LINE @1 @2 
 -- extends the specified line to intersect a unitcell or boundbox 

new feature: draw diameter -1 ....
  -- for lines or mesh option
  -- draws a simple line with 1-pixel width 
  
new feature: draw diameter -n ....
  -- for lines or mesh option
  -- draws a dotted 1-pixel line with alternating n on, n off pixels
 
new feature: draw HKL {1 1 1 x.x} 
  -- offsets an HKL plane from the origin by x.x Angstroms 

new feature: draw HKL {1 1 1} OFFSET x.x
  -- alternative to HCL {1 1 1 x.x}
  
new feature: select on @{_M.asymmetricUnit}
  -- _M.asymmetricUnit is the atom bitset for the asymmetric unit
  -- empty string if there is no current unit cell
  
new feature: select on @{_M.asymmetricUnit}
  -- _M.asymmetricUnit is the atom bitset for the asymmetric unit
  
  
  
   
JmolVersion="14.32.16" 
  also 15.2.16

new feature: (JavaScript API) Jmol.setCallback(jmolApplet0, "xxx", function() {......})
 -- where "xxx" is one of the allowed callbacks, namely (case insensitive):
    ANIMFRAME, APPLETREADY, ATOMMOVED, AUDIO, CLICK, DRAGDROP, ECHO,
    ERROR, EVAL, HOVER, IMAGE, LOADSTRUCT, MEASURE, MESSAGE, MINIMIZATION,
    ModelKit, PICK, RESIZE, SCRIPT, SELECT, SERVICE, STRUCTUREMODIFIED, SYNC 
 -- allows anonymous function setting for callbacks rather than using JmolScript SET xxxCallback "funcName"
 
new feature: (JavaScript) Info = { .... , errorCallback: function{....},...}

 -- allows setting of functions rather than function names in Info parameters

new feature: Drag-Drop into Java AppConsole assumed to be script and run

new feature: Drag-Drop into JavaScript output console assumed to be script and run

new feature: Drag-Drop into JavaScript input console displayed
     
  

JmolVersion="14.32.16" 
  also 15.2.16

new feature: (JavaScript API) Jmol.setCallback(jmolApplet0, "xxx", function() {......})
 -- where "xxx" is one of the allowed callbacks, namely (case insensitive):
    ANIMFRAME, APPLETREADY, ATOMMOVED, AUDIO, CLICK, DRAGDROP, ECHO,
    ERROR, EVAL, HOVER, IMAGE, LOADSTRUCT, MEASURE, MESSAGE, MINIMIZATION,
    ModelKit, PICK, RESIZE, SCRIPT, SELECT, SERVICE, STRUCTUREMODIFIED, SYNC 
 -- allows anonymous function setting for callbacks rather than using JmolScript SET xxxCallback "funcName"
 
new feature: (JavaScript) Info = { .... , errorCallback: function{....},...}

 -- allows setting of functions rather than function names in Info parameters
     
new feature: (JavaScript) Info = { .... , errorCallback: function{....},...}

 -- allows setting of functions rather than function names in Info parameters

new feature: Drag-Drop into Java AppConsole assumed to be script and run

new feature: Drag-Drop into JavaScript output console assumed to be script and run

new feature: Drag-Drop into JavaScript input console displayed
     
     
JmolVersion="14.32.15" 
  also 15.2.15

new feature: JmolScript: callbacks have access to parameters of JavaScript callbacks
 -- within the callback, _args() provides full list of arguments
 -- _args(1) first argument, etc.
 -- recommendation to NOT use _args()[0] "last" notation here, as future expansion may add parameters  

new feature: FONT DRAW
 -- allows setting the font for (general) DRAW object text
 
new feature: DRAW TITLE "xxx"
 -- adds (optional) TITLE keyword

new feature: DRAW TITLE COLOR red "xxx"
 -- adds title color option
 
new feature: DRAW TITLE FONT sansSerif bold 20 "xxx"
 -- adds title color option
 -- face and or style are optional; size is required
 -- can use this after draw is already created
      draw @1 @3 "test"
      draw font 20

new feature FONT DRAW ....
 -- allows setting the default font for DRAW objects
 
new feature: set labelPointerWidth
 -- sets the width of the line for SET LABELPOINTER ON
 -- default 2

bug fix: label pointers not properly connecting to label for all offsets   
bug fix: JavaScript float processing allowed to read full double precision
bug fix: measurements recently started showing artificial double precision when only single
bug fix: ModelKit ASSIGN ATOM fails when in xtal mode
bug fix: structureModifiedCallback not reporting fully
bug fix: SET FONTSIZE and FONT LABEL x.x  should not reset font face or style
bug fix: spacefill -23% should indicate ONLY
bug fix: JmolScript: callbacks should not be asynchronous

JmolVersion="14.32.14" 
  also 15.2.14
  
new feature: ModelKit UNITCELL [unitcell description]
 -- same as the UNITCELL command, but also adjusts atom 
    coordinates to retain same fractional positions:
      
       var fxyz = {thismodel}.fxyz.all;
       unitcell ....
       {thismodel}.fxyz = fxyz;

new feature: selectCallback parameters added: nSelected, indexFirst, indexLast+1

bug fix: PWMAT reader needs to allow text on first line
bug fix: unitcell() without atoms in a frame should still return frame's unitcell
bug fix: set labeloffset broken in 14.32.12

JmolVersion="14.32.13" 
  also 15.2.13

bug fix: VASP reader for Cartesian coords not converting automatically to fractional
bug fix: JavaScript getPropertyJSON broken for array data
bug fix: Release 14.32.12 faulty -- files removed.	

JmolVersion="14.32.12" 
  also 15.2.12

new feature: (Java only) inchiString.inchi("SMILES") converts InChI to SMILES. 
 -- utilizes JniInchi structure created from an InChI to generate SMILES strings. 
 -- net effect is that InChI strings can be converted to structures via SMILES. 
 -- passes tetrahedral, cumulene, and alkene stereochemistry tests
 -- InChI does not implement atropisomer stereochemistry
 -- InChI created using {*}.inchi("FixedH") will differentiate tautomers
 

new feature: Adds compare({1.1},{2.1},"isomer",TRUE)
 -- TRUE indicates to also do a tautomer check.
 -- compares InChI with InChI FixedH option
 

new feature: selectCallback
 -- Fires after a scheduled script is completed if SELECT has been issued

new feature: SELECT , ...  (first parameter comma)
 -- Fires selectCallback immediately, not after script is completed
 
new feature: write XSF 
 -- writes XCrysDen files http://www.xcrysden.org/doc/XSF.html
 -- selected atoms only
 -- includes ANIMSTEPS for molecules and crystals

new feature: write PWMAT 
 -- a simple pwmat input (atom.config) file format for just lattice and atoms
 -- selected atoms only
 
code: refactored org.jmol.adapter.writers.* from PropertyManager

bug fix: CMLWriter broken; maybe never worked.
bug fix: format() did not allow for decimal places up to 12.
bug fix: POSCAR reader treating "T" constraint as "tritium" 
bug fix: XCrystDen reader not reading animation properly

JmolVersion="14.32.11" 
  
bug fix: dispose of popupmenu fails (15.2.8)
bug fix: JmolStatusListener should allow for user to also add listener

retired code: Jmol applet, netscape jar and package, java.applet.Applet, and javax.swing.JApplet all moved to /unused/

JmolVersion="14.32.10" 
  also 15.2.10
  
bug fix: Amimation start during pause of previous animation will halt wrong animation thread.

JmolVersion="14.32.9" 
  also 15.2.9
 
new feature: load FILTER "bmchains=0" or "bmchains=1" ("bmchains" by itself defaults to 0)
 - for PDB, mmCIF, MMTF
 - removes duplicate chain ids when applying BIOMOLECULE option
 - bmchains=0 will append symmetry operator > 1 to chain id, so {A B A B A B} becomes {A B A2 B2 A3 B3}  
 - bmchains=1 will increment chain ids, so {A B A B A B} becomes A B C D E F
 - expects chains to be of the type {A B C D ...}


JmolVersion="14.32.8" 
  also 15.2.8
 
 bug fix: removing (deprecated, unnecessary) sun.audio.* references 
 bug fix: ModelKit creating allylic N not sp2; mouse action issues;better bond rotation
 code: refactoring ModelKitPopup; adding ModelKit.java

JmolVersion="14.32.7" 
  also 15.2.7
    
bug fix: JavaScript error on file reading can cause infinite loop
bug fix: toJSON for primitive arrays creating string arrays ["1","2"]
bug fix: dynamic PDB menu items not refreshing after file load if menu is not already created
bug fix: MUTATE with pdbAddHydrogens fails and crashes Jmol

new feature: expanded MUTATE options 
 -- examples:
 
	mutate 33 LYS
	mutate ALA34 G
	mutate {ALA.CA}[2] G	
	mutate {1-3} GAL
	mutate {1-3} A	
	mutate {1-3} ~LYS (that is, LEU-TYR-SER)
	mutate {1-3} G_L
	mutate {1-4} "GLY-AlA"
	mutate ALA34 "myAla.pdb" (from a file)
	mutate ALA34 "==SEP"	(from RCSB)
	mutate @3 @res	(using variables)
	

new feature: MUTATE CREATE option 
 -- creates peptides with specified sequence and secondary structure (phi/psi)
 -- examples:
    mutate create aaaaaaa   // defaults to alpha
    mutate create "lys-ala-ser" // uses one-letter and three-letter codes
    mutate create ppppp "3-10" // 16 pre-defined phi/psi sequences:
    
		"alpha"	[ -65, -40 ]
		"3-10"	[ -74, -4 ]
		"pi"	[ -57.1, -69.7 ]
		"alpha-L"	[ 57.1, 4 ]
		"helix-II"	[ -79, 150 ]
		"collagen"	[ -51, 153 ]
		"beta"	[ -140, 130 ]
		"beta-120"	[ -120, 120 ]
		"beta-135"	[ -135, 135 ]
		"extended"	[ 180, 180 ]
		"turn-I"	[ -60, -30, -90, 0 ]
		"turn-II"	[ -60, 120, 80, 0 ]
		"turn-III"	[ -60, -30, -60, -30 ]
		"turn-I'"	[ 60, 30, 90, 0 ]
		"turn-II'"	[ 60, -120, -80, 0 ]
		"turn-III'"	[ 60, 30, 60, 30 ] 
 
new feature: ModelKit MUTATE
 - same as MUTATE, but associated (and documented) with ModelKit

new feature: ModelKit CONNECT @1 @2 [0,1,2,3,4,5,p,m] (default 1)


 ModelKit [ON(nada)/OFF/DISPLAY/HIDE]
    
  ModelKit CENTER point or atoms (point can be fractional by adding "/1" to at least one coord)

  -- action options include alternatives to the given commands (assign is undocumented)
  
  ModelKit ASSIGN ATOM [symbol|pl|mi] point
  ModelKit ASSIGN ATOM @1 [symbol|pl|mi]
  ModelKit ASSIGN ATOM @1 [symbol|pl|mi] point
  ModelKit ASSIGN BOND (integer) [0,1,2,3,4,5,p,m] (default P)
  ModelKit ASSIGN BOND {atom1 atom2} [0,1,2,3,4,5,p,m] (default P)
  ModelKit ASSIGN BOND @1 @2 [0,1,2,3,4,5,p,m] (default P)

  ModelKit CONNECT @1 @2 [0,1,2,3,4,5,p,m] (default 1)

  ModelKit ROTATE ...  (same as ROTATE for example, ROTATE BOND @1 @2 degrees)
  ModelKit ROTATESELECTED (same as ROTATESLECTED)

 view mode     
  ModelKit SYMOP [n]
  ModelKit SYMOP "x,-y,z"
  ModelKit SYMOP [[4x4 matrix]]
  ModelKit OFFSET [{i j k}/NONE]

  -- configuration options include the following; CAPS is default:
       
  ModelKit SET addHydrogens [TRUE|false]
  ModelKit SET autobond [true|FALSE]
  ModelKit SET clickToSetElement [TRUE|false]
  ModelKit SET showSymopInfo [TRUE|false]
  ModelKit SET bondtype [0,1,2,3,4,5,p,m]
  ModelKit SET element [name or symbol]
  ModelKit SET MODE [molecular|view|edit]
  ModelKit SET UNITCELL [EXTEND|PACKED]

 edit mode -- not implemented

  ModelKit SET SYMMETRY [APPLYFULL|APPLYLOCAL|RETAINLOCAL] // not implemented
  ModelKit POINT point or atoms // not implemented
    
  -- configuration options can be given sequentially within one ModelKit command or in individual commands
  -- examples:
  
  ModelKit set mode view symop 5 center @3 
  ModelKit set mode view symop 5 center @3 offset {0 0 0}   // unitized [0,1)    


JmolVersion="14.32.6" 
  also 15.2.6
  
bug fix: (JavaScript only) insignificant script processing error reported in JavaScript console  
bug fix: InChI for deutero compounds not working
bug fix: InChI failure should show "?" not SMILES

JmolVersion="14.32.5" 
  also 15.2.5

bug fix: show INCHI  broken in 14.32.5

new feature: hack added for reading invalid CIF files created by Materials Studio

Apache Log4J vulnerability checked (not applicable)

Confirming that Jmol.jar (any version) is not affected by the CVE-2021-45046: 
	Apache Log4j2 Thread Context Message Pattern and Context Lookup Pattern vulnerable to 
	a denial of service attack as described by Apache, or any other Log4j2 vulnerability. 

Several checks support this finding:

 1) Jmol is compiled using Java 6. Log4j2.x requires at least Java 7.
 2) Jmol itself does not use Log4j. We use a much simpler, extremely streamlined custom class, 
 	org.jmol.util.Logger, with only a very simple interface.
 3) Jmol does incorporate JNI-InChI 1.03_1, which does utilize Log4j. However, JNI-InChI 1.03_1 
 	utilizes Log4j1, not Log4j2. 
 4) Log4j1.x is not impacted by this vulnerability. 
 5) The suggested mitigation -- simply removing org/apache/logging/log4j/core/lookup/JndiLookup.class 
 	from the distributed JAR file (Jmol.jar, JmolData.jar) is unnecessary, as Jmol.jar does not 
 	contain even the org/apache/logging package, much less any class file that starts with "Jndi". 
 6) As part of this version update the ANT task
 	<delete file="${appjars.dir}/org/apache/logging/log4j/core/lookup/JndiLookup.class" /> 
 	has been added to build.xml just in case any future version of any dependency might include that class.


JmolVersion="14.32.4" 
  also 15.2.4

feature change: ModelKit no longer by default does drag-to-bond with default autobonding
  - autobonding leads to results unexpected by the user -- should not be the default setting
  - use ModelKit SET AUTOBOND TRUE to re-enable this feature if desired
  - easy enough to drag to bond atoms without this
  
new feature: ModelKit set autobond true
 -- when dragging to create a new bond to a new atom, automatically check vicinity of the new atom for bonding
 -- default now set to FALSE
 
new feature: ModelKit set hidden true
 -- hides the ModelKit menu but retains the picking and hover highlights
 
new feature: PWmat atom.config reader http://pwmatus.com/manual

bug fix: ModelKit does not preserve setPicking setting in quiet mode
bug fix: ModelKit autobonding is too aggressive; needs to be settable


JmolVersion="14.32.3" 
  also 15.2.3
  
bug fix: (JavaScript only) insignificant script processing error reported in JavaScript console  
bug fix: various ModelKit issues.

JmolVersion="14.32.2" 
  also 15.2.2

bug fix: ModelKit shows wrong hover labels
bug fix: LOAD APPEND after adding atoms via ModelKit does not by default append new
bug fix: state saved after deleting atoms in modelKitMode uses appendNew true, creating several fragment models
bug fix: Java app ModelKit icon does not clear when a structure is loaded

new feature: ModelKitCallback 
 -- String value is "ON" or "OFF"
 -- for example: set ModelKitcallback "jmolScript:print 'modelKitMode=' + modelKitMode"

new feature: ModelKit command
 -- was introduced for 15.0.2 / 14.29.25, but was not documented
 -- allows scripting of ModelKit functions
 -- turning the ModelKit on/off - same as SET modelKitMode:
 
   ModelKit ON
   ModelKit OFF
 
 -- note that the ModelKit does not have to be ON for the following functionality.  
   
 -- note that the ModelKit does not have to be ON for the following functionality.  
   
 -- configuration options include the following, where (xxx) is optional, CAPS is default:

  
   ModelKit addHydrogens [TRUE|false]  
     -- setting this false turns off the automatic addition of hydrogens  
   ModelKit clickToSetElement [TRUE|false] 
     -- setting this removes the ability to change elements other than H by clicking on them
   ModelKit showSymopInfo
     -- setting this false stops the ModelKit from showing space group symmetry information  
     
  -- configuration options can be given sequentially within one ModelKit command or in individual commands
 
   ModelKit addHydrogens FALSE clickToSetElement TRUE;
   
 -- ModelKit actions:

   ModelKit assign atom @3 "C"
     -- changes atom 3 to carbon, with concomitant bond distance change and addition of H
   ModelKit assign atom "C"  {3 3 3}  
     -- adds a carbon at {3 3 3} but does not bond anything to it
   ModelKit assign atom @25 "O" {3 4.2 3}
     -- adds an O atom connected to @25 and at the default distance on the line between @25 and {3 4.2 3}
   ModelKit assign bond @1 @2 <type>
     -- where type can be 0,1,2,3,4,5,p,m
       - p indicates +, increment (cycles 1 2 3 1)
       - m indicates -, decrement (stops at 0)
     -- with associated changes in hydrogen count
   ModelKit connect @25 @26  
     -- connects two atoms, adjusting hydrogen atoms according to standard hybridization
        
 new feature: SHOW ModelKit addhydrogens
 new feature: SHOW ModelKit clickToSetelement
 new feature: SHOW ModelKit showSymOpInfo
 
 new feature: getProperty("ModelKitinfo")
   -- delivers an associative array of information about the ModelKit 
      
      
JmolVersion="14.31.61"
  also 15.1.61

new feature: JSpecView reading Bruker NMR 1D and 2D directories and ZIP files
  - drag any file from a Bruker directory or the directory itself into JSpecView
  
new feature: allow select within(cell,555)

new feature: symop(pointGroupOperation, atom, pointGroupInfoObject) 
 -  where pointGroupOperation is of the form S6 or S6.1 or S6^3 or S6.1^3
    and ^n means nth power
    and .i means ith element of this type
 - return point result of operation of the point group operation on an atom
   - for example: print symop("C2.1", @3)
 - without atom, returns matrix
   - for example: print symop("C2.1")
 - without pointInfoGroupObject defaults to the point group of the current model, pointGroup()
        
new feature: pointgroup() returns pointGroupInfo object same as getProperty("pointgroupinfo")

bug fix: JmolTable.java example does not point to correct site
bug fix: CIFReader some first models 0 atoms

JmolVersion="14.31.60"
  also 15.1.60

fix for CIFReader not reading multi-model CIF files. 

JmolVersion="14.31.59"
  also 15.1.59
  
bug fix: CIFReader should allow unlooped items for all needed tags  
bug fix: JSpecView writer broken in 15.1.50 2021.08.10

JmolVersion="14.31.58"
  also 15.1.58
  
bug fix: adjustments to TopoCifParser pre-release of Topology.dic

JmolVersion="14.31.57"
  also 15.1.57
  
bug fix: magCIF can not handle fractions 2/5, 3/10, etc.

JmolVersion="14.31.56"
  also 15.1.56
  
bug fix: compare({2.1}, {1.1}, "map", "H") broken


JmolVersion="14.31.55"
  also 15.1.55

new feature: COMPARE {2.1} {1.1} BONDS SMILES HYDROGEN
 - adds HYDROGEN check for aligning methyl and methylene groups properly
 
bug fix: (-1.4567).format("%5.2f") missing minus sign  
bug fix: UnitCell transform should be included in COMPARE FRAME
bug fix: CifReader fix for lack of case sensitivity in some GEOM_* records for some COD and CCDC files
bug fix: FilesReader fails with zip file pipe
bug fix: Polyhedra SMILES not working for chirality check -- was never fully tested
bug fix: Resolver can fail for certain CIF files resolved to MOL incorrectly
bug fix: TopoCif update

new feature: COMPARE additions:

    // compare FRAMES
    // compare {model1} {model2} POLYHEDRA
    // compare {model1} {model2} SUBSET {polyhedra} POLYHEDRA    
    // compare {model1} {model2} ATOMS @atom1 @atom2 POLYHEDRA
    // compare FRAMES POLYHEDRA

new feature: compare() additions

        // A, B, int[] map
        // A, B, int[] map, stddev


JmolVersion="14.31.54"
  also 15.1.54
  
bug fix: TopoCifParser bugs

new feature: load "xxx" filter "TOPOL"
 -load _topol_* data
 -no symmetry applied
 -display net 1 by default
 
new feature: load "xxx" {1 1 1} filter "TOPOL"
 -load _topol_* data
 -display the {1 1 1} unit cell, with symmetry (this could be fill or packed, etc.)
 -display net 1 by default
  
new feature: load "xxx" {1 1 1} filter "TOPOLNet=2"  
 -load _topol_* data
 -display net.id==2 by default
 
new feature: load "xxx" {1 1 1} filter "TOPOLNet=Net_2"  
 -load _topol_* data
 -display net.label=='Net_2' by default


JmolVersion="14.31.53"
  also 15.1.53

bug fix: TopoCifParser bugs fixed
bug fix: {metal} included Xx
bug fix: symop() function not relating file-based operators  
bug fix: print symop(3,"xyzOriginal") does not show original (file-bsaed) symmetry operation 
new feature: symop(3, [1 1 0]) adds specified "cif2-style" translation to symmetry operation. 
new feature: symop(@1, @61, "cif2") returns the "cif2" format of this operation. 
    - developed for working with TopologyCIF data
	- <symop> [i j k]
	- For example:

	$ load =ams/quartz 1 packed
	$ print symop(@1,@3,"cif2")
	2 [0 0 0]
	3 [0 0 0]
	
	$ print symop(@1,@13,"cif2")
	2 [1 0 0]
	3 [1 0 0]

new feature: print symop(...."canonical")
new feature: print symop(n, [i j k], ...)
  $ print symop(3, [1 0 1])
  



JmolVersion="14.31.52"
  also 15.1.52

bug fix: JavaScript does not return to correct scrpt level after DELAY 

JmolVersion="14.31.51"
  also 15.1.51 (take 2)

new feature: ISOSURFACE DENSITY option
 - checks for cryo-EM data from EBI/EMDB and, if that exists, uses it; otherwise uses x-ray diffraction data
bug fix: problems with ISOSURFACE in 14.31.50
bug fix: EM isosurface not saved in state.
 
JmolVersion="14.31.50"
  also 15.1.50
  
bug fix: JSpecView upgrade for misc. JDXReader issues  
bug fix: Jmol file dropper not asking to resize (broken in 15.1.46/14.31.46)
bug fix: Jmol not reading EBI cryo-EM files from density server.
bug fix: Jmol not using EBI submap feature of density server for full-structure volumes

new feature: ISOSURFACE *.../full   
  - returns the FULL EBI volume data, not just one localized around a structure  

JmolVersion="14.31.49"
  also 15.1.49

bug fix: JSpecView not using ##FIRSTX for diff-dup x values after first.
bug fix: JSpecView version not showing

new feature: isosurface "*em"
 - same as *emdb, just simpler.

JmolVersion="14.31.48"
  also 15.1.48
  
  bug fix: JavaScript isosurface asynchronous file loader 
           failing to finalize, causing refresh in later-called 
           function to not return.

  bug fix: Filenames and directories with unicode accents not saved in ZIP, PNGJ, JMOL files.

  bug fix: Locally loaded JavaScript files not save in ZIP, PNGJ, JMOL

JmolVersion="14.31.47"
  also 15.1.47

new feature: isosurface "*emdb/nnnn"
 - retrieves the cryo-EM surface EMD-nnnn 
 - uses http://ftp.ebi.ac.uk/pub/databases/emdb/structures/EMD-%file/map/emd_%file.map.gz
   (https did not work in Java due to certificate issues)

new feature: isosurface "*emdb/=xxxx"
 - looks up the EMDB id for the cryo-EM surface associated with pdb id xxxx
 - first uses https://www.ebi.ac.uk/emdb/api/search/fitted_pdbs:%file?fl=emdb_id,map_contour_level_value&wt=csv 
 - then uses http://ftp.ebi.ac.uk/pub/databases/emdb/structures/EMD-%file/map/emd_%file.map.gz

new feature: isosurface "*emdb" (or "*emdb/" or "*emdb/=")
 - uses the current model's PDB ID with *emdb/=xxxx"
    
JmolVersion="14.31.46"
  also 15.1.46
  
bug fix: Drag-drop of PNGJ can fail due to SCRIPT command not accepting "spt::" type identifier
 
JmolVersion="14.31.45"
  also 15.1.45
 
bug fix: ModelKit changes for atomName and element not saved in state (since Jmol 14.28?)

JmolVersion="14.31.44"
  also 15.1.44

bug fix: Incorrect implementation of double value from string in JCAMP-DX format
bug fix: V3000 reader does not recognize 2D mol file setting
bug fix: 2D->3D can invert stereocenters having C-H bond. 

JmolVersion="14.31.43"
  also 15.1.43

new feature: hbondHDistanceMaximum maximum O--H distance in hydrogen bonds 
 - only in the case of actual hydrogen bonds, not pseudo-hydrogen bonds
 - hbondsDistanceMaximum now aliased to hbondNODistanceMaximum for clarity

JmolVersion="14.31.42"
  also 15.1.42
  
bug fix: GaussianReader fix for reading frequencies giving NullPointerException

bug fix: mmCIF reader was requiring optional auth_XXXX fields
  
bug fix: jspecview reading pimentoGCMS2.dx empty $$MODEL= causes NullPointerException

bug fix: better MMFF94 and UFF for 2D -> 3D  
new feature: adds MMFF2D and UFF2D forcefields that involve stronger
             fields for no-hydrogen (UFF2D) and added-hydrogen (MMFF2D) minimization
new feature: adds set testflag2 TRUE to stop FILTER "2D" after first stage, before UFF2D+MMFF2D minimization

JmolVersion="14.31.41"
  also 15.1.41
  
bug fix: (JSmol only - not SwingJS) ModelKit bond assignment fails due to old transpiler bug
 -- was failing to convert char to int and back properly
  
JmolVersion="14.31.40"
  also 15.1.40
  
bug fix: eval("JSON",json) fix to allow [...] or {...}
bug fix: ellipsoid ISO saved in state with wrong size

new feature: set checkCIR
 -- retrieves the NCI/CADD Chemical Identifier Resolver URL
 -- currently contacts chemapps.stolaf.edu/resolver
 -- places return JSON information into _.cirInfo (note that this is the model set auxiliary info, which is cleared with ZAP or LOAD)
	{
	  "host"  :  "cactus.nci.nih.gov"
	  "rfc6570Template"  :  "https://cactus.nci.nih.gov/chemical/structure{/identifier,representation}{?format,get3d}"
	  "source"  :  "https://chemapps.stolaf.edu/resolver/index.php"
	  "sourceVersion"  :  "0.0.1_2021.05.26b"
	  "status"  :  "unavailable"
	  "testURL"  :  "https://cactus.nci.nih.gov/chemical/structure/methane/smiles?src=jmol-chemapps-resolver"
	 }
 -- stores the global read-only variable _cirStatus as "OK" if successful or "unavailable" if not
 -- run automatically ONLY on the first call to NCR with load $....
 
new feature: Jmol's first load '$' or https://cactus.nci.nih/gov call does checkCIR  

new feature: Loading cactus.nic.nih/gov/chemical/structure file will resolve that name

JmolVersion="14.31.39"
  also 15.1.39

bug fix: GAMESS reader broken

JmolVersion="14.31.38"
  also 15.1.38

bug fix: TopoCIF 0.9.2 upgrade for _topol_node and _topol_net 
bug fix: JSpecView SVG export missing in menu and broken


JmolVersion="14.31.37"
  also 15.1.37

bug fix: removing default dependency for XmlUtils and PO

JmolVersion="14.31.36"
  also 15.1.36

bug fix: capture broken in 14.31.34

JmolVersion="14.31.35"
  also 15.1.35

adds GamessReader MOPAC parameters from F90 files provided by Jimmy Stewart for MO reading
 -- note that GAMESS uses only s and p orbitals for the MOPAC option
adds GamessReader MOPAC option 
 -- forces using MOPAC slaters rather than gaussian contraction when g.c. is present
adds MoldenReader [STO] ANGS and MOPAC options (zeta in 1/Angs; apply MOPAC scaling)

JmolVersion="14.31.34"
  also 15.1.34

bug fix: NBO type change not saved in state
bug fix: NBO auxiliary files (output.36, output.46, etc.) not saved in PNGJ,JMOL,ZIP files
  
JmolVersion="14.31.33"
  also 15.1.33
  
new feature: Allow replacement of PNG data in PNGJ
  
  x = load("toHenry2_pngj.png",true)
  y = load("bob.png")
  x._IMAGE_ = y._DATA
  write var x "toHenryFromBob.png" 
   

JmolVersion="14.31.32"
  also 15.1.32

bug fix: isosourface MOLECULAR and SASURFACE should never drop below 1.5/(probe radius)
bug fix: (second release) getProperty("isosurfaceData") broken

JmolVersion="14.31.31"
  also 15.1.31
  
bug fix: isosurface ... NCI ""  broken (in 14.5.2)
bug fix: plane definitions totally messed up in 14.31.26
  
JmolVersion="14.31.30"
  also 15.1.30
  
bug fix: load ? outside of function duplicates next commands
bug fix: (JS) Safari 14 not downloading files using DataURI

JmolVersion="14.31.29"
  also 15.1.29
  
bug fix: FileDropper does not recognize .txt file as possible script
  
JmolVersion="14.31.28"
  also 15.1.28
  

new feature: Jmol SMILES bond atropisomerism ^nm- and ^^nm-
 -- indicates atropisomerism (bond chirality in biaryl systems)
 -- ^ and ^^ for bonds similar to @ and and @@ for atoms
 -- n and m are single-digit bond selectors, generally one of 1, 2, or 3
 -- n = 1/2/3 means "reference atom is first/second/third connection
    to the atom on the left; m = 1/2/3 the same for the atom on the right. 
 -- ^- and ^^- same as ^22- and ^^22-, respectively
 -- example: 
   
   
   load $biphenol
   connect @2 @7 atropisomer
   print {*}.find("SMARTS","c1(O)cccc{c1^^-c2}ccccc2O")
   
   ({1 6})

  Here the "^^-" is short for "^^22- and refers to the two carbons with connected oxygen atoms: 
                                       
new feature:  mol1.find(mol2, "MAP" + flags, format)
 - creates a correlation map of atoms of mol1 to atoms of mol2
 - mol1 and mol2 are atom sets such as {1.1} and {1.2}
 - uses SMILES; Jmol SMILES directive flags such as "hydrogen" or "open" can be added
 - format indicates the format to use for the results
 	- can be "name", "index", "number" or any valid label, such as "%a %i"
 	- defaults to "number"
 - returns a map (associative array) containing keys:
    - smiles: the SMILES string used for the match
    - BS1 : atomset for mol1
    - BS2 : atomset for mol2
    - SMILEStoBS1 : array correlating SMILES atoms to BS1
    - SMILEStoBS2 : array correlating SMILES atoms to BS2
    - BS1toBS2  : array correlating BS1 to BS2 (indexes are for mol1; values are mol2)
	- MAP1to2 : array of [a,b] pairs, where a is format for mol1, b is format for mol2
    - key : format used in mapping
    
 - example:
 
	load files ":caffeine" "$caffeine"
	info =  {1.1}.find({2.1},"map", "name")
	print info.SMILES
	print info.key + ": " + info.MAP1to2.format("JSON")
	
	  O=C1c2c3N(C)C(=O)N1C.[n]2(C)c[n]3
	  
	  name: [ [ "O1","O14" ],[ "O2","O4" ],[ "N3","N5" ],[ "N4","N10" ],[ "N5","N1" ],
	  [ "N6","N8" ],[ "C7","C12" ],[ "C8","C7" ],[ "C9","C13" ],[ "C10","C3" ],
	  [ "C11","C9" ],[ "C12","C6" ],[ "C13","C11" ],[ "C14","C2" ] ]
	
	info =  {1.1}.find({2.1},"map hydrogen", "number")
	print info.SMILES
	print info.key + ": " + info.MAP1to2.format("JSON")
	
	/hydrogen/O=C1c2c3N4[C@@]([H])([H])[H].N51[C@@]([H])([H])[H].C54=O.[n]62[C@]([H])([H])[H].c6([H])[n]3
	
	number: [ [ 1,14 ],[ 2,4 ],[ 3,5 ],[ 4,10 ],[ 5,1 ],[ 6,8 ],[ 7,12 ],
	[ 8,7 ],[ 9,13 ],[ 10,3 ],[ 11,9 ],[ 12,6 ],[ 13,11 ],[ 14,2 ],[ 15,21 ],
	[ 16,18 ],[ 17,20 ],[ 18,19 ],[ 19,22 ],[ 20,23 ],[ 21,24 ],[ 22,15 ],[ 23,17 ],[ 24,16 ] ]	 

bug fix: x.label("%a %D") wrong value for %D

JmolVersion="14.31.27"
  also 15.1.27

bug fix: {*}.bonds.length not working

bug fix: array.find(n) should not do a string seach and return match.
 - return array of array indices, 1-based.
 - example: [11 3 1 2 1].find(1) == [3 5], not [1 3 5]
    
newly documented:

Polyhedra command allows for min and max radius
  -- polyhedra 2.8 3.0 @3 

setting DSSR on the fly:

   model 1 property dssr "1d66.dssr"   // file containing data
   model 1 property dssr @{load("1d66.dssr")} // actual data
   select iloops
   

4-order bond in MOL file using 14 for bond order
 -- Jmol extension for MOL file format to allow 4-bond
 -- example: [Re2Cl8](2-)
 -- see https://en.wikipedia.org/wiki/Quadruple_bond
 
5-order bond in MOL file using 15 for bond order
 -- Jmol extension for MOL file format to allow 5-bond
 -- example: [Mo2Cl8](4-)
 -- see https://en.wikipedia.org/wiki/Quintuple_bond 

6-order bond in MOL file using 16 for bond order
 -- Jmol extension for MOL file format to allow 6-bond
 -- example: Mo2
 -- see https://en.wikipedia.org/wiki/Sextuple_bond 


DRAW polygon @face @points 
 -- draws a filled polygon based on arrays of atom indices
 -- @face is an array of integers, not necessarily wound correctly
 -- @points is an atom bitset or an array of points (optional, defaults to {*}
 -- for example:

 	  load $p4
	  x = {*}.find("*1**1","map");
	  draw ID p4r polygon @{x[1]} color red
	  draw ID p4b polygon @{x[2]} color blue
	  draw ID p4y polygon @{x[3]} color yellow
	  draw ID p4g polygon @{x[4]} color green


DRAW polyhedron @faces @points
 -- draws sets of polygons based on arrays of atom indices
 -- @faces is an array of array of integers, not necessarily wound correctly
 -- @points is an atom bitset or an array of points (optional, defaults to {*}
 -- for example:

  	  load $caffeine
	  draw polyhedron @{{*}.find("*1****1||*1*****1","map")}

 	  load $p4
	  draw ID p polyhedron @{{*}.find("*1**1","map")} color red

POLYHEDRON ID xxx @faces @points
 -- @faces is an array of array of integers, not necessarily wound correctly
 -- @points is an atom bitset or an array of points (optional, defaults to {*}

  	  load $p4
	  polyhedra ID p4 @{{*}.find("*1**1","map")}
  
array.format(headings) Transform an array of arrays into an array of associative arrays based on "column" headings, and vice-versa. For example, if y = [[1,2],[3,4]], then <b>z = y.format(["a","b"])</b> will set z to [ {{ "a": 1,"b": 2 }},{{ "a": 3, "b": 4 }} ]. And, in reverse, <b>z.format(["a","b"])</b> will be back to [[1,2],[3,4]]
array.format("JSON") Formats a serial or associative array as JSON.
array.format("%5.3f\t%5s") Formats an array or array of arrays into a multiline string using sprintf format. 

arrayOfArrays.col(n) selects out the nth column from an array of arrays. 
                     For example, retrieving the third column from CSV data: 
                     col3 = load("data.csv").split("",true).col(3).
  
SHOW CHEMICAL  -- fully described NIH/CADD options

SHOW xxxx /yyyy  Adding "/xxxx" to the command, such as SHOW file/cell will filter 
                 the output only to lines containing the text after the slash character.

Jmol PolySMILES -- described

JmolSQL -- more description; adds WHEREIN; replaces older ** notation

load HISTORY "saved.his"  -- loads command history with script in saved.his
  
frame align [modelNo] [pt]  -- FIXED is assumed; used in state; shifts a model by a specific amount after removing any current frame alignment

x.dot(y) for point.dot(plane)

CIF 2.0 file reader added

set zshadePower 0  -- allows examination of depth buffer and writing to image for external processing
   
Windows BMP image reading -- reads 24-bit (full color) as well as 16-, 8-, 4-, 2-, and 1-bit color palette modes
                          -- 14-byte and 40-byte headers only; does not read compressed modes

Write and data({atomset},type) expanded to: CIF|CML|CFI|MOL|PDB|PQR|SDF|CD (ChemDoodle)|JSON|QCJSON|V2000|V3000|XYZ|XYZRN|XYZVIB

x.find("SMILES","top")  -- creates a topology SMILES, involving just * and connections; does not include stereochemistry;
                        -- allows comparison of connection patterns without respect to any other consideration.
                        -- can be used to check equivalences in inorganic crystal structures.
						-- example: load $caffeine;$ print {*}.find("SMILES","top") =>  *1(*)*(*)*2*3*(*)*1*.*2(*)**3

load "" fill UNITCELL PRIMITIVE     (for files that are conventional)
load "" fill UNITCELL CONVENTIONAL  (for VASP files, which are primitive cells)

polyhedra WIGNER      // Wigner-Seitz cell
polyhedra BRILLOUIN   // 1st Brillouin zone
polyhedra BRILLOUIN 1 // 1st Brillouin zone
polyhedra BRILLOUIN 2 // 2nd Brillouin zone
polyhedra BRILLOUIN -1 // Wigner-Seitz cell
polyhedra scale 3.0 BRILLOUIN 1  // scaled 1st Brillouin zone

POLYHEDRA edgesOnly    -- shows just edges; operates on ALL polyhedra, not just selected; complements edges, noEdges, frontEdges

select within(d, $p1) where $p1 is a polyhedron ID
  -- d = 0 is "on or within the polyhedron"
  -- d < 0 is "-d angstroms within polyhedron"
  -- d > 0 is "within d angstroms of polyhedron"

LOAD will read BZ2-compressed files

WRITE "SDF" implements atom value V  nnn ... information
 -- requires assigning the data property name "atom_values" in the model's molData property
 -- for example:
 
  $ load $2,3-dichlorobutane
  $ molData = {"atom_values":"chirality"}
  $ model properties "molData" molData
  $ write dcb.sdf

 -- note that if the model already has a molData property, then use the following to append to it:
 
  $ molData = (_M.molData ? _M.molData : {})
  $ molData.atom_values = "chirality"
  $ model properties "molData" molData

x = load("filename","JSON") -- loads JSON data into variable
 
{atom}.chirality -- uses Cahn-Ingold-Prelog rules to assign R or S to a carbon center
                 -- ignores sulfur and nitrogen chirality, generally

{atom}.cipRule   -- CIP sequence rule deciding this center; one of 1a, 1b, 2, 3, 4a, 4b, 4c, 5, or blank

load =chebi/nnnnnn -- chEBI 2D molecule load, with minimal 100-step minimization
  
set debugHigh   -- same as set loglevel 6 - debugging only

x.split(true) -- does a white-space token split of the string value of x

CALCULATE CHIRALITY {atom set}  -- optionally limited to the given atom set (or the currently selected atoms by default)

set jmolInJSpecView  -- allows Jmol window to NOT be embedded in JSpecView when JSpecView is opened in Jmol; default TRUE

WRITE ISOSURFACE "t.pmesh"; WRITE ISOSURFACE "t.pmb"
  -- creates ASCII (.pmesh) or binary (.pmb) file (a Jmol-specific file format)
  -- relatively compact format
  -- can speed up loading of meshes and contours
  -- for filled surfaces, use .jvxl instead
  -- read back into Jmol using ISOSURFACE "t.pmesh"/"t.pmb"
  -- note that binary files are NOT RECOMMENDED for JSmol because some platforms cannot read them locally
  -- example:
  
  load $methane
  isosurface plane {0 0 0 1} map vdw contours 20
  write ISOSURFACE contour.pmb
  isosurface contour.pmb
  
set labelfor {atomset} "value"
 -- allows setting of label without changing current selection
 -- uses same syntax as LABEL command after {atomset}
 -- for example:
 
   set labelfor @atoms @myLabel
   set labelfor {atomno <= 3} @{["a","b","c"]}
   set labelfor {_C && chirality != ""} "%[atomname] %[chirality]"

color NUCLEIC  -- for nucleic only (others will be grey) -- based on DSSR nucleic color scheme: G green, C yellow, A red, T blue, U cyan

set cartoonBlocks; set cartoonBlockHeight x.x -- for nucleic only -- uses DSSR data if present (using calculate structure DSSR or load =xxxx/dssr)
 -- displays a DSSR block for each base based on dssr.nts.frame -- x.x is height of box in Angstroms (default 0.5)

color property DSSR type
 -- where type is one of: 
	bulges
	coaxStacks
	hairpins
	hbonds
	helicies
	iloops
	isoCanonPairs
	junctions
	kissingLoops
	multiplets
	nonStack
	nts
	pairs
	ssSegments
	stacks
	stems
 -- color is based on index into the list of the given structures
 -- 0 (not of that structure), 1 (first entry), 2 (second entry), etc.
 -- for example:
    
		    load =4fe5/dssr
		    cartoons only;set cartoonSteps;
		    color property dssr junctions

x = {*}.find(smartsString,"map") -- returns an array of arrays of atom indices (0-based)
 -- indicates exact correlation between atoms in {*} and atoms of smartsString
 -- only unique sets of atoms are found, not every possibility
 -- for example:

	load $caffeine
	s = show("smiles") // N1(C)C(=O)c2c3N(C)C1=O.[n]2(C)c[n]3
	print {*}.find(s,"map").format("JSON")
	[ [ 0,1,12,13,11,6,4,5,2,3,9,10,8,7 ] ]
	
	load :caffeine
	print {*}.find(s,"map").format("JSON")
	[ [ 4,13,8,0,6,7,2,11,9,1,3,12,10,5 ] ]


MACRO bz; createWS("p1")    (still not documented)
  -- creates a Wigner-Seitz cell as polygon id "p1"
  -- requires current unit cell to be primitive to work correctly
  -- polyhedron can be shifted using POLYHEDRA OFFSET
  -- default ID "pbz1_1_" for just CREATEWS()


POLYHEDRA UNITCELL
 -- creates a polyhedron (12-gon in this case) around each of the
    currerntly selected atoms that has that bonding environment
 -- DOES NOT require atoms at these positions - can simply use the 
    unit cell and periodicity to find the relevant atom positions. 
 -- will check bonding as necessary using autobonding parameters 
 -- accepts all standard polyhedra options. For example:
 
    polyhedra 12,16 3.5 UNITCELL
    
array.getProperty("xxxx") -- same as getproperty(array, "xxxx")
  -- drills down into an array of associative arrays to get sublist
  -- can be used with [SELECT ... WHERE]
   
SELECT x  where x is an array of integers or array of array of integers

connect NBO <nbotype>
    - connect atoms in the currently visible model using a resonance structure configuration found in an NBO .46 or .nbo file
	- where <nbotype> is one of alpha|beta|46|46a|46b|nrtstr_n|nrtstra_n|rs_n|rsa_n|rsb_n

label %[nbo];
    - label an atom using a resonance structure configuration found in an NBO .46 or .nbo file
    - requires a previous connect NBO

set nboCharges (default true)
  - determines whether formal charges are also displayed with LABEL %[nbo]

CONNECT for quintuple and sextuple bonds.
  -- connect @1 @2 quintuple
  -- connect @1 @2 sextuple
  -- readily saved in state
  -- saving in MOL file as bond type 15 and 16 

set labelOffset [mode sx sy sz ax ay az]    
   set labelOffset [sx, sy, sz]
   set labelOffset [mode, sx, sy, sz, ax, ay, az]
   
 where
   
   sx,sy,sz are screen coord offsets 
    -- applied after view rotation
    -- sy > 0 LOWERS label
   ax,ay,az are xyz position (in Angstroms; applied before view rotation)
   mode == 0 indicates xyz position is absolute and sx sy sz are Angstroms
   mode == 1 indicates xyz position is relative to atom position and sx sy sz are Angstroms
   mode == 2 indicates xyz is absolute, and sx sy sz positions are screen pixels
   mode == 3 indicates xyz is relative, and sx sy sz positions are screen pixels
   defaults: mode == 1; ax = ay = az = 0

getProperty("cifInfo", "c:/temp/test.cif")
 -- reads CIF file data in structured format
 -- automatically uses CIF 1.0 or CIF 2.0, as needed.
 -- if file name is missing, uses current model file
 

load AUDIO audiofilename
 -- JavaScript can read WAV, MP3, and OGG files
 -- application can read WAV files
 
polyhedra AUTO ...
  -- sets polyhedron radius automatically, using "MAXIMUM GAP" rule
  -- see Zur Abgrenzung der KoordinationssphÃ¤re und Ermittlung der Koordinationszahl in Kristallstrukturen
         G. O. Brunner, D. Schwarzenbach, Zeitschrift fur Kristallographie - Crystalline Materials, 1971, vol 133, issues 1-6 127-133
         http://www.degruyter.com/view/j/zkri.1971.133.issue-1-6/zkri.1971.133.16.127/zkri.1971.133.16.127.xml?rskey=sfBNTx&result=1
 
polyhedron -x.x ....
 -- sets maximum radius for gap calculation to be x.x

print @1.label("%[unitid]")
  -- generates unit IDs for atoms or residues
  -- unit IDs are a proposed general standard for representing atoms and residues in biomolecules
  -- see http://rna.bgsu.edu/main/rna-3d-hub-help/unit-ids
  -- options follow "-":
  
  $ print {atomno=3}.label("%[unitid]")     // includes residue and atom
  |1|A|G|1|OP1|||
	
  $ print {atomno=3}.label("%[unitid-r]")   // residue only
  |1|A|G|1||||
	
  $ print {atomno=3}.label("%[unitid-mr]")  // adds model id
  1EHZ|1|A|G|1||||
	
  $ print {atomno=3}.label("%[unitid-mra]") // full unitID
  1EHZ|1|A|G|1|OP1|||

  $ print {atomno=3}.label("%[unitid-mrat]") // full unitID, right-trimmed
  1EHZ|1|A|G|1|OP1
 
  -- Note that the full 8-line unit ID is produced under all circumstances. 
     This is  important, because string-matching of unit ids will not work 
     without all fields completed. For example:
     
     |1|A|G|1
     
     would match
     
     |1|A|G|11
     
     without the closing "|". Likewise, 
     
     |1|A|G|11
     
     is not a match for the insertion residue
     
     |1|A|G|11|||3|
     
  -- [Editorial note: I agree that it was ill-advised to put the insertion
      code at the end. This makes it impossible to efficiently match 
      residues in full-atom unit IDs.]
      
  -- Note that in an actual atom label, one needs to add "\n" at the end
     and have the label in quotes in order to avoid having "|" mean "new line"
     
    label "%[unitid]\n"   
  
  not just
  
    label %[unitid]
  
  This is a consequence of having defined "|" as new line early on in Jmol
  development. 

select within("1ehz|1|A|G|45||||")
print within("1ehz|1|A|G|45||||")
  -- unit IDs
  -- see http://rna.bgsu.edu/main/rna-3d-hub-help/unit-ids
  -- used for annotations, validations, dssr, and rna-3d processing
  -- pdbid|model|chain|RESNAME|resno|ATOMNAME|altcode|inscode|symmetry
  -- can truncate trailing (but not leading) pipe symbols
    1ehz|1|A|G|15, |1|A|G|15|C2
  -- requires at minimum a model number, chain, and residue number
    |1|A||15
  -- ATOMNAME blank indicates full residue, with altcode indicating "this alt_id or no alt_id" (a configuration)
  -- ATOMNAME nonblank indicates one atom, with altcode indicating "exactly this alt_id" (a location)
  -- can be multiple, white space, comma, "]", "[", and double quote ignored
    1ehz|1|A|G|15||||,1ehz|1|A|U|59||||,1ehz|1|A|C|60|||
    
select shortcuts for nucleic acid structures
  -- for example: select junctions; select kissingloops
  -- activated after load =xxxx/dssr or calculate structure dssr
  -- includes:
    "@bulges within(dssr,'bulges')",
    "@coaxStacks within(dssr,'coaxStacks')",
    "@hairpins within(dssr,'hairpins')",
    "@hbonds within(dssr,'hbonds')",
    "@helices within(dssr,'helices')",
    "@iloops within(dssr,'iloops')",
    "@isoCanonPairs within(dssr,'isoCanonPairs')",
    "@junctions within(dssr,'junctions')",
    "@kissingLoops within(dssr,'kissingLoops')",
    "@multiplets within(dssr,'multiplets')",
    "@nonStack within(dssr,'nonStack')",
    "@nts within(dssr,'nts')",
    "@naChains within(dssr,'naChains')",
    "@pairs within(dssr,'pairs')",
    "@ssSegments within(dssr,'ssSegments')",
    "@stacks within(dssr,'stacks')",
    "@stems within(dssr,'stems')",

 
mapOfMaps.array(k)
 -- generates an array of maps from a map of maps by 
    storing all top-level map keys under key k in lower-level map
 -- reversed by another .array(k) 
 -- causes a script exception if mapOfMaps is not a map of maps

arrayOfMaps.array(k)
 -- generates a map of maps from an array of maps by 
    removing each map's key k and using that as the key for that map value 
 -- reversed by another .array(k) 
 -- causes a script exception if arrayOfMaps is not an array of maps or key k is not present in all maps

Jmol SMILES/SMARTS generic polySMILES polyhedron option @PHn
 -- does a SMILES search for the local coordination environment around a center.
 -- particularly valuable for inorganic compounds and metallic or intermetallic network crystal structures 

write CIF (only minimal)


@1.find("crystalClass", pt)
  -- generates a list of points based on a model's crystal class (point group)
  -- uses @1 just to find the unit cell and space group
  -- optional pt is used as a generator (defaults to @1)
  -- example:
   load =ams/calcite 1
   x = @3.find("crystalClass")
   print pointgroup(x).name
   draw points @x
   polyhedra ID p {0 0 0} to @x


pointgroup("spacegroup", @1)
 -- analyzes the point group (crystal class) of a crystal. 
 -- uses three irrational-coordinate points to generate all possible operators
 -- creates a map with keys (somewhat variable depending upon axes present):
 
	C2
	C3
	Ci
	Cs
	S6
	detail
	distanceTolerance
	linearTolerance
	nAtoms
	nC2
	nC3
	nCi
	nCn
	nCs
	nS6
	nSn
	nTotal
	name
	points
	principalAxis
    
    
      
x = pointgroup([array of points],center)
  -- center is optional, defaulting to average of the points
  -- returns a map:
    pts = [ {-1.0132 0.585 0.0012999999},{1.0132 0.585 0.0012999999},{0.0 -1.17 0.0012999999} ]  
    print pointgroup(pts,{0 0 0})
	{
	  "C2"  :
	  [
	    {0.8660127 -0.50001717 0.0022222984}
	    {-0.8660127 -0.50001717 0.0022222984}
	    {0.0 0.99999756 0.002222217}
	  ]
	  "C3"  :
	  [
	    {0.0019245904 -0.0011111083 -0.99999756}
	  ]
	  "Cs"  :
	  [
	    {0.0019245904 -0.0011111085 -0.99999756}
	    {-0.49998164 -0.866036 0.0}
	    {0.49998164 -0.866036 0.0}
	    {1.0 0.0 0.0}
	  ]
	  "S3"  :
	  [
	    {0.0019245904 -0.0011111083 -0.99999756}
	  ]
	  "center"  :  {0.0 0.0 0.0}
	  "detail"  :  "# 3 atoms;"
	  "distanceTolerance"  :  0.2
	  "linearTolerance"  :  8.0
	  "nAtoms"  :  3
	  "nC2"  :  3
	  "nC3"  :  1
	  "nCi"  :  0
	  "nCn"  :  4
	  "nCs"  :  4
	  "nS3"  :  1
	  "nSn"  :  1
	  "nTotal"  :  12
	  "name"  :  "D3h"
	  "principalAxis"  :  {0.0019245904 -0.0011111083 -0.99999756}
	  "principalPlane"  :  {0.0019245904 -0.0011111085 -0.99999756}
	} 


calculate symmetry  polyhedra {atomset}
  -- selectively calculates polyhedra.
  -- for example: calculate symmetry polyhedra {polyhedra(4)}
  
calculate symmetry  polyhedra id
  -- selectively calculates polyhedra for a given ID.
  -- for example: calculate symmetry polyhedra "poly1"
  

_hoverLabel  
   -- reports general hover label set by hover command
   
_hoverEnabled
  -- reports if hover is enabled or not
  
 /invertStereo/ flag for SMARTS search
  -- allows quick check for enantiomers
  -- example: select search("/invertStereo/C[C@H](Br)CC") will match (R)-2-bromobutane
              even though it is for (S)-2-bromobutane
                 
{*}.find("SMILES/open")
 -- generates OpenSMILES string for selected atoms
 -- applies OpenSMILES aromaticity rules for 5-, 6-, and 7-membered rings
 -- not chemical -- allows exocyclic c=C bonds and [nH] in 6-membered rings 
 -- also adds atom class if property_atomClass is nonzero
 -- for example:
 
	$ load $2-butanol
	$ @2.property_atomclass=2
	$ @3.property_atomclass=3
	$ @5.property_atomclass=5
	$ print {*}.find("smiles/open")
	
		C[C@H:2]([OH:5])[CH2:3]C

set window width height
set window [width height]
set window "xxx.png"

   
point(unitcell, {i, j, k})
  -- returns the Cartesian point corresponding to a specific coordinate in a unit cell system.
  -- unitcell is an array of the form [origin, va, vb, vc]
  -- {i j k} is a point in the unit cell
  -- for general use -- does not require actual setting of the model's unit cell

UNITCELL TRANSFORM @m4x4
  -- direct 4x4 matrix transformation of a unit cell

unitcell("a=...,b=...,c=...,alpha=...,beta=...,gamma=....")
 - array of center and three vectors
 - example:
 $ print unitcell("a=10,b=10,c=20,alpha=90,beta=90,gamma=129")
{0.0 0.0 0.0}
{10.0 0.0 0.0}
{-6.293203 7.7714605 0.0}
{-8.742278E-7 -1.8328565E-6 20.0}

load ... unitcell "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."

unitcell "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."
  -- only the numbers are read; everything else is ignored, so order is important here
  -- uses the format created by show unitcell/a

unitcell RECIPROCAL 2  
  -- as integer, multiples of pi
  
unitcell reciprocal x.x
  -- allows scaling of reciprocal cell, similar to unitcell("reciprocal", x.x)

expanded unitcell() function
 -- adds additional types: "A", "B", "C", "I", "F"
 -- default is the lattice type of the model's space group
 -- not just cubic; "BCC" is converted to "I"
 -- for example:
 
	 load =ams/silicon 15 packed   // Cmca
	 draw id "uc" diameter 0.1 unitcell mesh nofill color black
	 unitcell @{unitcell("primitive")}
	 color unitcell red
	 unitcell 0.1
	 axes unitcell
	 axes on


calculate hydrogens TRUE
 -- calculates hydrogens and multiple bonding
 -- same as 
 
    calculate hydrogens
    connect aromatic modify
    calculate aromatic
    
 -- similar to, but not identical to set pdbAddHydrogens
 -- allows reasonable addition of multiple bonds to proteins after loading

 


JmolVersion="14.31.26"
  also 15.1.26

new feature: $isosurface.getProperty("values"), $isosurface.getProperty("vertices") corrected for invalid vertices

bug fix: getProperty("isosurfaceData.vertices") returning too many vertices
 - retrieves only the vertices that are on the surface, not excluded vertices
 - retrieves only vertices for selected sets if using SET or SUBSET
 - works best with ISOSURFACE sasurface (much faster than SOLVENT or MOLECULAR)
 - can be used with ISOSURFACE solvent or ISOSURFACE molecular 
   with careful adjustment of solvent probe diameter (1.2 recommended, not 1.4)
   and RESOLUTION 
 - with 1.4, there is a tendency to get interior artifacts
 - note that this function will return "null" if there is no isosurface or if
   no single isosurface is selected (by issuing ISOSURFACE ID xxx ON, for instance)

new feature: getProperty("isosurfaceData.allVertices")
 - returns all vertices, even those excluded as interior artifacts or from unselected sets

load =6nef
isosurface sasurface
x=$isosurface1.getproperty("vertices")
{*}.property_d = {*}.distance.min(x)
color property_d
slab 50; slab on
draw points @x  // to visualize the surface points themselves

bug fix: Cif2Reader should accept UTF-8 signature "BOM" of three bytes 0xEF 0xBB 0xBF (not 0xFEFF)

JmolVersion="14.31.25"
  also 15.1.25

bug fix: isosurface set 1   showing 2nd largest, should show largest
bug fix: save state for isosurface with one set off by one
bug fix: getProperty("isosurfaceData") fails for pocket cavities 

JmolVersion="14.31.24"
  also 15.1.24

note: isosurface #sets is from print getProperty("shapeInfo.Isosurface[1].volume").length
bug fix: isosurface set 0   not working
bug fix: calculate surfacedistance fails -- wrong parameter in Java method call  
bug fix: MoldenReader requires [MO] to be last tag  
bug fix: MoldenReader should not report energy units (not always eV) 
bug fix: DnD script into script console should run that script. 
bug fix: AboutDialog using old splash image
  
JmolVersion="14.31.23"
  also 15.1.23
  
bug fix: STL and hermite display missing last two residues of trace

JmolVersion="14.31.22"
  also 15.1.22
  
new feature: isosurface subset [1 3 5] cavity vdw
 - allows more than one set to be displayed
 
new feature: isosurface cavity 1.2 50 vdw
 - increases maximum envelope radius from 10 to 50 
 - note that large envelope radii can produce artifacts for pocket cavities
 - for example:

  load =1wp1  filter "biomolecule 1"
  isosurface set 1 select {protein} only pocket cavity 3 20
  isosurface slab none slab plane x=0

JmolVersion="14.31.21"
  also 15.1.21

new feature: InChIKey generation:
       load $morphine; print {*}.find("inchi", "key");
   - can be combined with any other valid inchi flag:
       load $morphine;print {*}.find("inchi","srel key");
       
new feature: {*}.inchi(options) same as {*}.find("inchi",options);
	   load $morphine; print {*}.inchi("key");
	         
new feature: InChI or InChIKey from SMILES using .inchi():
   print "CCCC".inchi()  // uses load("$CCCC")
   print "CCCC".inchi("key")

new feature: InChI or InChIKey from NCI or PubChem shortcut using .inchi():
   print "$caffeine".inchi(); 
   print "$CCCC".inchi(); 
   print ":caffeine".inchi("key"); 
   print ":smiles:CCCC".inchi();

new feature: InChI or InChIKey from any MOL file data source using .inchi():
   print load("foo.mol").inchi("key"); 

new feature: InChIKey from InChI:

	$ x = ":morphine".inchi()
	$ print x
	InChI=1S/C17H19NO3/c1-18-7-6-17-10-3-5-13(20)16(17)21-15-12(19)4-2-9(14(15)17)8-11(10)18/h2-5,10-11,13,16,19-20H,6-8H2,1H3/t10-,11+,13-,16-,17-/m0/s1
	$ print x.inchi("key")
	BQJCRHHNABKAKU-KBQPJGBKSA-N


   
bug: "xxx".find("sequence") assumes xxx is a set of one-character residue IDs

new feature: adds "xxx".find("sequence",true)  
 - case-sensitive text search

new feature: adds "xxx".find("sequence",false)  
 - case-insensitive text search

 
JmolVersion="14.31.20"
  also 15.1.20
  
bug fix: GamessReader should read ENERGY, MP2, CSDD, and CSDD(T) energy types (Mark Perri)
 - adds _M.EnergyType
 
bug fix: VaspOutcarReader upgrade for Vasp6

new feature: initialize INCHI
   - for JavaScript specifically, loads the inchi-wasm module asynchronously. 
   - allows the very first call to {*}.find("inchi") to be active.
   - note that a very first call to Jmol.evaluateVar(applet,"{*}.find('inchi')") will still fail.
    
new feature: {*}.find("inchi")
new feature: {*}.find("inchi",flags)
   - generates InChIs from modelset atoms
   - integrates jni-inchi-0.7-jar-with-dependencies.jar
   - uses inchi-wasm for JavaScript (R.Apodaca https://github.com/rapodaca/inchi-wasm)
   - flags include (https://www.inchi-trust.org/technical-faq-2):
        perception flags: DoNotAddH SNon NEWPSOFF
        stereo flags: SRel SRac SUCF
        more flags: NEWPSOFF SUU SLUUD RecMet FixedH KET 15T
        java-only flags: key outputsdf (Java only; still no InChIKey for JavaScript)
   - JavaScript is InChI 1.05; Java is still 1.03
   - note: JavaScript-only directories _WASM and _ES6 should not be processed by Google Closure Compiler   
 
JmolVersion="14.31.19"
  -- was released as an overwrite of 14.31.18 :(
    
JmolVersion="14.31.18"
 also 15.1.18
 
  bug fix: MacSpartan Release 1.0.3 (ancient!) skips orientation and orbitals
  bug fix: SHOW SPACEGROUP fails for nonstandard space group (=ams/quartz)

  
  new feature: Topology CIF (TopoCifParser.java) reading of _topol_xxx records
          topoCIF filter "topos_type=x" where x is v, vw, hb, or some concatentation of those using "+"
          topoCIF filter "topos_ignore" skips reading of _topol records, reading as standard CIF

  undocumented: set hiddenLinesDashed (14.8.0)   
  

JmolVersion="14.31.17"
  also 15.1.17

  bug fix: print 2 > 1.0 gives false. typo introduced 2020.10.02 causes int[>,<,>=,<=] float to fail 
  bug fix: minimizer step reports should be in user units, not native
  bug fix: minimizer initial/final reports should state "/mol" for units

JmolVersion="14.31.16"
  also 15.1.16

  new feature: (undocumented) now("message")   
  new feature: now("message","format")

  bug fix: print load("t.tar") should act as load("t.tar|.") to give directory  
  bug fix: MO linear combination should not show type in info
  bug fix: MO squared should show ^2 in info
  
// there is no 14.31.15

JmolVersion="14.31.14"
  also 15.1.15
  
new feature: TAR file reader with zip-like entry loading
  load "t.tar|guest/77317/output.log"
  
new feature: GenNBOReader supports older NBO 3.0 output.properties rather than missing .46 labels file
new feature: NBO command expanded to allow named orbitals
   NBO "C1-C2"
   NBO TYPE PNBO "C1-C2"
   
JmolVersion="14.31.13"
  also 15.1.14
  
bug fix: MoldenReader fails to read [5F] if that record is after the [MO] block.  
bug fix: GenNBOReader does not accept spherical s, p designations: 151 152 153 (wh6-a.31)

JmolVersion="14.31.12"
 also 15.1.14

bug fix: minimization constraint broken in 14.29.45

JmolVersion="14.31.11"
 also 15.1.13
 
bug fix: adds fix in script compiler for nonbreaking 
         space nbsp; \u00a0 from clipping browser text

JmolVersion="14.31.10"
  also 15.1.12

bug fix: dots -1.0 does not imply ONLY

JmolVersion="14.31.9"
  also 15.1.11

bug fix: set pdbaddhydrogens does not work with PDB files that have some H atoms (but no multiple bonds)
bug fix: MOVETO quaternion   jumps (seconds=0) if crude check for change fails

JmolVersion="14.31.8"
  also 15.1.10

new feature: point(["{1,2,3}","{2,3,4}",....])
bug fix: large integer number != operator failure
bug fix: fuxyz vs. fxyz and uxyz
distribution: JSpecview not built in 14.31.5

JmolVersion="14.31.7"
  also 15.1.9
  
bug fix: PSE file saved to PNGJ may not fully reload (missing surface, for example)
bug fix: atom.occupancy of 0.01 saved as 0.0

JmolVersion="14.31.6"
  also 15.1.8
bug fix: msCIF reader not reading ICDD Fourier modulated file.
  
JmolVersion="14.31.5"

bug fix: https for NMRDB
bug fix: JSpecview applies ##SHIFTREFERENCE as HZ for data in PPM
bug fix: JSpecview must ignore ##SHIFTREFERENCE for JEOL, at least for $$ JEOL NMR v1.10

JmolVersion="14.31.4"

bug fix: print format("%0.-3s", "testing")   "-" does nothing

new feature: isosurface S1 VAL [points or atoms] SELECT....
  - calculates isosurface values for a set of points or atoms
  - values are created during surface constructions, not after
  - for solvent and molecular surfaces, negative value is "inside"; positive is "outside"
  - surfaces that are not calculated will give 0 for all values

new feature: $s1.getProperty("values");
  - retrieves the array of values produced by isosurface s1 VAL 
  - example:
  
		  load $caffeine
		  isosurface s1 value {*} select {!_H} only vdw 50% translucent
		  {*}.property_d  = $s1.getproperty("value")
		  color property_d

bug fix: NWChem reader does not ignore file-save data block properly
bug fix: get property fileInfo initially or after ZAP throws exception
bug fix: isosurface map colorscheme "rwb" fails, whereas color isosurface "rwb" works 

JmolVersion="14.31.3"

bug fix: Jmol app does not allow width smaller than about 350 pixels

JmolVersion="14.31.2"

bug fix: draw pointgroup C2 3   draws all C2 axes, not just the third

JmolVersion="14.31.1"

bug fix: SYNC/sockets should not automatically subscribe to CLICK (which includes drag events)
bug fix: "WRITE IMAGE width height" (with no file name) causes array out of bounds exception
bug fix: SYNC command sending not working with raw JSON or Jmol associative arrays

JmolVersion="14.31.0"

new feature: Switch to Java 7, allowing for string-based switch and Files.readAllBytes().

bug fix: ellipsoids "csa" scale 0.5 on   does not scale
bug fix: implicit refresh required after translateSelected

new feature: Gaussian reader reads NMR shielding tensors as "csa" 
for example:

	load EtOH-nmr.out
	frame 2;
	wireframe only
	ellipsoids set "csa" scale 0.5
	ellipsoids on

new feature: Gaussian reader reads NMR_J_coupling data
new feature: atom properties can be float[][] arrays 
 -- for atom-atom values
new feature: MEASUREMENT property_xxx   
 -- for 2D float[][] properties
new feature: MEASUREMENT VALUE x.x      
 -- sets a fixed value for a standard measurement 
new feature: measurement unit "+xxx" means abs(value)
 -- specifically, "+hz" useful for calculation data
new feature: measurement "+hz" units automatically use property_J values
new feature: MEASUREMENT "<unit>" where <unit> is valid measurement unit
new feature: measure() allows "property_xxx"
new feature: measure() allows "<unit>"
for example:

load EtOH-nmr.out
frame 2;
print @@3.property_J.format("JSON")

 >> [ [ 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-5.8511596,132.96,0.0,-2.16701,3.6352599,1.4761999,1.5346,-0.042426,-11.6895 ] ]
 
print measure(@@2, {model=2}, "property_J", "").format("JSON")

 >> [ 124.307,0.0,132.96,119.271,9.69322,0.75008297,4.29308,-6.40836,115.875 ]


measure @@2 @@3 "+hz"  // "+hz" for absolute value and indicates we want to use this property

measure @@2 @@3 property_J "hz"

print measure(@@2, @@3, "property_J", "hz")

 >> property_J 	133.0 	"133.0 hz" 	C2/2 #2 	H3/2 #3

print measure(@@2, @@8, "property_J", "+hz")

 >> property_J 	6.4 	"6.4 hz" 	C2/2 #2 	O8/2 #8
 

new feature: SYNC sockets completely rewritten, allowing for substantially more 
             feedback and simpler JSON-based interface. Many features of the
             Molecular Playground now implemented in Jmol itself. Features include:
              - simplification of sockets, allowing for just one that is use for
                input and outoput
              - default short-message callbacks for all significant callbacks
              - added set XxxxCallback SYNC:ON and SYNC:OFF for subscribing to 
                full callback Object[] data information. 
              - better JSON creation/parsing
              - simpler class structure
              - allows Molecular Playground-like gestures to be socket-defined.
             
             This from org.openscience.jmol.appl.jsonkiosk.JsonNioService:
             
/**
 * A class for interacting with Jmol over local sockets.
 * 
 * See also org.molecularplayground.MPJmolApp.java for how this works.
 * Note that this service does not require MPJmolApp -- it is a package
 * in the standard Jmol app. 
 * 
 * Listens over a port on the local host for instructions on what to display.
 * Instructions come in over the port as JSON strings.
 * 
 * This class uses the Naga asynchronous socket network I/O package (NIO), the
 * JSON.org JSON package and Jmol.
 * 
 * http://code.google.com/p/naga/
 * 
 * Initial versions of this code, including the JSON-base protocol were created
 * by Adam Williams, U-Mass Amherst see http://MolecularPlayground.org and
 * org.openscience.jmol.molecularplayground.MPJmolApp.java
 * 
 * <code>
 * 
 * Sequence of events:
 * 
 * 1) Jmol initiates server listening on a port using the JmolScript 
 *    command with an arbitrary negative port number.
 *    (-30000 used here just for an example):
 * 
 *    sync -30000
 * 
 * This can be done also through the command line using
 * 
 *    jmol -P -30000
 * 
 * or 
 * 
 *    jmol --port -30000
 * 
 * Jmol will respond to System.out:
 * 
 *    JsonNioServerThread-JmolNioServer JsonNioServerSocket on 30000
 *    
 * 
 * 2) Client sends handshake to port 30000. As with all communications to this service, 
 *    there must be no new-line characters (\n) ANYWHERE in the JSON being sent EXCEPT 
 *    for a single message terminator:
 * 
 * 
 *   {"magic": "JmolApp", "role": "out"}\n
 * 
 * where "out" here indicates that this socket is for Jmol (reply) output.
 *   
 * Jmol will reply with the 30-byte response: 
 *   
 *   {"type":"reply","reply":"OK"}\n
 *   
 * (The client may see only 29 bytes, as it may or may not strip the final \n.)
 *
 * Optionally, the client may also indicate a specified port for Jmol input. 
 * But typically this is just the currently active port. 
 *   
 *   {"magic": "JmolApp", "role": "in"}\n 
 *   
 *   Jmol will reply with 
 *   
 *   {"type": "reply", "reply": "OK"}\n;
 *
 *  
 * 3) Client sequentially sends Jmol script commands over the "in" socket:
 * 
 *   {"type": "command", "command": command}
 * 
 * where required command is some JSON-escaped string such as "rotate x 30" or "load $caffeine". 
 * For example:
 * 
 *   {"type": "command", "command": "var atoms = {_C or _H};select atoms"}\n
 *  
 * 
 * For the rest of this discussion, we will use the Jmol command that communicates with another Jmol instance
 * rather than this JSON context:
 * 
 *   SYNC 30000 "var atoms = {_C or _H};select atoms"
 *   
 * in this case.
 * 
 * 
 * 4) Jmol throughout this process is sending replies that come 
 *    from the Jmol Statuslistener class. For example:
 *    
 *  {"type":"reply","reply":"SCRIPT:script 8 started"}
 *  {"type":"reply","reply":"SCRIPT:Script completed"}
 *  {"type":"reply","reply":"SCRIPT:Jmol script terminated"}
 * 
 * Note that your client will be subscribed to many of the Jmol status callbacks 
 * (see org.openscience.jmol.app.jmolpanel.StatusListener), including:
 * 
 *    LOADSTRUCT
 *    ANIMFRAME
 *    SCRIPT
 *    ECHO
 *    PICK
 *    CLICK
 *    RESIZE
 *    ERROR
 *    MINIMIZATION
 *    STRUCTUREMODIFIED
 * 
 * All scripts and callback messages run in order but asynchronously in Jmol. You do not need
 * to wait for one script to be finished before issuing another; there is a queue that handles that.
 * If you want to be sure that a particular script has been run, simply add a MESSAGE command 
 * as its last part:
 *    
 *    sync 30000 "background blue;message The background is blue now"
 *  
 *  and it will appear as a SCRIPT callback:
 *  
 *     {"type":"reply","reply":"SCRIPT:The background is blue now"}
 *  
 *  after which you can handle that event appropriately.
 *  
 *  The SCRIPT callback can be particularly useful to monitor:
 *
 *   sync 30000 "backgrund blue"
 *   
 *  {"type":"reply","reply":"SCRIPT:script compiler ERROR: command expected\n----\n          >>>> backgrund blue <<<<"}
 *
 *  Note that the ERROR callback does not fire for compile errors, 
 *  only for errors found while running a parsed script:
 *  
 *  {"type":"reply","reply":"ERROR:ScriptException"}
 *   
 *  Note that all of these messages are "thumbnails" in the sense that they are just a message string. 
 *  You can subscribe to a full report for any of these callbacks using 'SYNC:ON' for the 
 *  callback function:
 *  
 *     set XxxxxCallback SYNC:ON
 *     
 *  For example, issuing
 *  
 *     sync 30000 "load $caffeine"
 *     
 *  gives the simple reply:
 *  
 *     {"type":"reply","reply":"LOADSTRUCT:https://cactus.nci.nih.gov/chemical/structure/caffeine/file?format=sdf&get3d=true"}
 *
 *  but after
 *  
 *     sync 30000 "set LoadStructCallback 'SYNC:ON'
 *  
 *  we get additional details, an array of data with nine elements:
 *  
 *  {"type":"reply","reply":["LOADSTRUCT",
 *                           "https://cactus.nci.nih.gov/chemical/structure/caffeine/file?format=sdf&get3d=true",
 *                           "file?format=sdf&get3d=true",
 *                           "C8H10N4O2", null, 3, "1.1", "1.1", null]}
 *  
 *  Exact specifications for these callbacks are not well documented. 
 *  See org.jmol.viewer.StatusManager code for details.
 *  
 *  Remove the callback listener using
 *  
 *     set XxxxxCallback SYNC:OFF
 *  
 *  Note that unlike Java, you get only one SYNC callback; this is not an array of listeners.
 *  
 *  
 * 5) Shutdown can be requested by sending
 *   
 *   {"type": "quit"}\n
 *  
 *  or by issuing the command
 *  
 *    sync 30000 "exitjmol"
 *    
 *   
 * Note that the Molecular Playground implemented an extensive set of gesture-handling methods 
 * that are also available via this interface. Many of these methods utilize the JmolViewer.syncScript() 
 * method, which directly manipulates the display as though someone were using a mouse.
 *   
 *   {"type" : "move", "style" : "rotate", "x" : deltaX, "y", deltaY }
 *   {"type" : "move", "style" : "translate", "x" : deltaX, "y", deltaY }
 *   {"type" : "move", "style" : "zoom", "scale" : scale }  (1.0 = 100%)
 *   {"type" : "sync", "sync" : syncText }
 *   {"type" : "touch", 
 *        "eventType" : eventType,
 *        "touchID"   : touchID,
 *        "iData"     : idata,
 *        "time"      : time, "x" : x, "y" : y, "z" : z }
 *    
 *   For details on the "touch" type, see org.jmol.viewer.ActionManagerMT::processEvent
 *   
 *   Note that all of the move and sync commands utilize the Jmol sync functionality originally 
 *   intended for applets. So any valid sync command may be used with the "sync" style. These include 
 *   essentially all the actions that a user can make with a mouse, including the
 *   following, where the notation <....> represents a number of a given type. These
 *   events interrupt any currently running script, just as with typical mouse actions.
 *   
 *   "centerAt <int:x> <int:y> <float:ptx> <float:pty> <float:ptz>"
 *      -- set {ptx,pty,ptz} at screen (x,y)
 *   "rotateMolecule <float:deltaX> <float:deltaY>"
 *   "rotateXYBy <float:deltaX> <float:deltaY>"
 *   "rotateZBy <int:degrees>"
 *   "rotateZBy <int:degrees> <int:x> <int:y>" (with center reset)
 *   "rotateArcBall <int:x> <int:y> <float:factor>"
 *   "spinXYBy <int:x> <int:y> <float:speed>"
 *      -- a "flick" gesture
 *   "translateXYBy <float:deltaX, float:deltaY>"
 *   "zoomBy <int:pixels>"
 *   "zoomByFactor <float:factor>"
 *   "zoomByFactor <float:factor> <int:x> <int:y>" (with center reset)
 * 
 * 
 * </code>
 */

JmolVersion="14.30.3" 

new feature: FAHReader  FAH:: reads FoldingAtHome Top.json and FrameNNN.json files
 -- FAH:: is required for Frame files but not the Top file.
 -- automatic calculation of structure using DSSP
 -- Both files are required; three load options:
    
    LOAD FILES "ViewerTop.json" + "ViewerFrame22.json" // explicit joining to two files
    
    LOAD ViewerTop.json; 
    LOAD XYZ FAH::ViewerFrame22.json   // first the atoms, then the coordinates
    
    LOAD FAH::ViewerFrame22.json        // just the coordinates with associated ViewerTop.json assumed present
    
 -- Subsequent calls to LOAD XYZ will replace coordinates and recalculate DSSP only.
 

JmolVersion="14.30.2"

bug fix: CrystalReader fails to read models in CRYSTAL17 double-walled nanotube file tn0.out

JmolVersion="14.30.1"

new feature: (undocumented) set picking dragMolecule
 -- acts like set picking dragSelected
 -- LEFT-drag to translate; ALT-LEFT-drag to rotate
 -- useful for two more molecules (covalently bonded units)

new feature: set picking dragModel
 -- acts like set picking dragMolecule or dragSelected
 -- LEFT-drag to translate; ALT-LEFT-drag to rotate
 -- useful for two more models not loaded using set appendNew FALSE


JmolVersion="14.30.0"


bug fix: CrystalReader for slab nanotubes.
 - note that we are not processing the nonstandard helical symmetry operations

Note - The move to a new minor version (14.30) is due to changes in the 
 ------ Jmol Java/SwingJS application, not the JavaScript version. In particular,
 ------ changes in the way the org.openscience.jmol.app classes are
 ------ organized required taking this step.

new feature: set minimizationMaxAtoms
  - maximum number of atoms allowed for MMFF minimization
  - defaults to 200

new feature: MEASURE SEARCH "{[H]}CC{[H]}"
  - uses SMARTS searching, selecting only the specified atoms 
    (in this case, all vicinal hydrogen atoms attached to carbon)
  - actually available but undocumented since 2013
  
new feature: SET MEASUREMENTUNITS HZ
  - for example, set measurementUnits HZ; MEASURE SEARCH "{[H]}CC{[H]}"  will display all 1H-1H coupling constants for a model
  - display calculated three-bond (standard vicinal) H-H J coupling constants (SMARTS {[H]}CC{[H]}) calculated
    using Haasnoot-Altona-Karplus substituent electronegativity-adjusted algorithm instead of distances 
  - If there are fewer than three substituents on each central atom, or if
    either central atom is not carbon, defaults to general Karplus equation.
  - see org.jmol.quantum.NMRCalculation.java for algorithm and bibliographic details 
  - expanded from use in solid-state NMR to any model EXCEPT magres files, 
    which instead use HZ in association with solid-state tensors    

new feature: SET MEASUREMENTUNITS NOE_HZ
  - adds NOE calculation for H atoms that are more then three bonds apart
    along with vicinal and geminal
  - not validated; from Janocchio 1.1 (https://sourceforge.net/projects/janocchio/)

new feature: Janocchio application included as a plugin (preliminary)
  - Java only; totally experimental; VERY preliminary
  - org.openscience.jmol.app.janocchio
  - required some refactoring of Jmol app classes
  - commit number 22001!

new feature: LOAD ... CENTROID
  - for molecular crystal structures
  - loads one or more unit cells (as specified by {nx ny nz})
    exploring covalent bonding so that molecules that have their centroid
    (center of geometry) within the specified block of cells are built.
  - available but undocumented since 2011
  - example: load =cod/1001253 {1 1 1} centroid
    note that {1 1 1} here is unnecessary, as it is the default
        
bug fix: "DOMReader" not "DOMReadaer" in File Manager
      
JmolVersion="14.29.55"

bug fix: show chemical image has no image
bug fix: dotted lines with antialiasing are too thin and half the spacing

JmolVersion="14.29.54"

new feature: ELLIPSOID ID xx axes [...] [...] [...]
new feature: ELLIPSOID ID xx axes [ [...][...][...] ]
new feature: ELLIPSOID ID xx axes [ pt pt pt ]
new feature: ELLIPSOID ID xx axes matrix3f
new feature: ELLIPSOID ID xx scale [ a b c ]
new feature: ELLIPSOID ID xx scale pt

new feature: set macroDirectory [default: https://chemapps.stolaf.edu/jmol/macros]
 - holds macros.json, which points to macro files
 - no longer hard-coded into Jmol
 
new feature: adds MACRO topond
new feature: adds MACRO crystal
new feature: adds MACRO topology	
new feature: adds filter "topos" to load command to allow for hypothetical unit cells with dimension a=1.

bug fix: symop(@1,@2,"matrix") should give an array of matricies, one for each relevant operation
bug fix: print (-0.0001).format("%3.2f") should print 0.00, not -0.00
bug fix: CRYSTAL reader fixes for TOPOND output 
bug fix: MOLDEN fix for allowing beta set to start with (nCoef + 1)

JmolVersion="14.29.53" 

bug fix: PyMOL PSE reader broken for broken PyMOL 2.3.0

JmolVersion="14.29.52" 

bug fix: CASTEP reader broken by Siesta %block check in Resolver


JmolVersion="14.29.51" 

bug fix: (undocumented) measure ID "xx" ... buggy

	-fixes measure vertical center when using ID
    -adds id, hidden, visible to getproperty measurementInfo

JmolVersion="14.29.50" 

bug fix: SiestaReader upgrade
bug fix: load =3dna/val   validation loading does not work

JmolVersion="14.29.49" 

bug fix: isosurface cutoff +0.3   does not work to indicate positive only for difference electron density maps
bug fix: load =3dna/val   validation loading does not work (same reason as 14.29.28)

JmolVersion="14.29.48" 

bug fix: LOAD xxxx:: broken in 14.29.25

JmolVersion="14.29.47" 

bug fix: standard PDB files (no hydrogens and no multiple bonds) should not require /aromaticPlanar/
         in search() selection. 

JmolVersion="14.29.46" 

bug fix: ModelKit menu broken in 14.29.45

JmolVersion="14.29.45" 

bug fix: Java applet fails with class not found / static reference error
bug fix: Spartan reader files missing from applet JAR collection
bug fix: SDF writing should preserve order of user data 

bug fix: symop(@3, @4, "array") should return the full set of all the operators that map atom 3 to atom 4

new feature  intersection(ptLine, vLine, ptCenter, radius)
  -- intersection of a line with a sphere -- return list of 0, 1, or 2 points

new feature: (array-of-hash).pivot(key)
 -- turns an array of hashes into a hash of arrays of hashes
 -- like a pivot table for an array, but based on the value of a hash 
    key within each hash element of the array, not the element itself 
 -- returns a (hash-of-arrays-of-hashes) of the array elements grouped 
    by the stringified values of the specified key.
 -- for example:
 
 	a = [
 	 {label:"C3", id:1},
 	 {label:"C3", id:2}, 
 	 {label:"C2", id:3}
 	 	]
 	 	
 	a.pivot("label") = {
 		"C3":[{label:"C3", id:1}, {label:"C3", id:2}],
 		"C2":[{label:"C2", id:3}]
 	 	}
 	
new feature: (array-of-hash).pivot(key1, key2, ...,sep)
 -- returns a (hash-of-array-of-hash) of the array elements grouped by the values of these keys, 
        combined as a string using the separator given as the last parameter
 -- for example:
 
 $ load =ams/halite 1 packed
 $ invariants = symop(@3,@3,"array")
 $ uniqueOps = invariants.pivot("label", "axispoint", "axisVector", "+")

 This code is cataloging all of operators of space group #255 (F m 3 m) that 
 leave atom 3 unchanged -- invariant. There are 48 such operations, but some of 
 them are about the same axis. The two rotations for a given C3 or C4 are now combined 
 into one element of uniqueOps, since they both have the same label, axispoint, and axisVector, 
 just different rotations.  
  
new feature: SHOW xxxx/!whatever
 -- show lines without whatever using /!

new feature ModelKit command
 -- particularly designed for crystallographic work
 -- turning the ModelKit on/off - same as SET modelKitMode:
 
   ModelKit (ON)
   ModelKit OFF
   
 -- configuration options include the following, where (xxx) is optional, CAPS is default:
  
 ModelKit  addHydrogens [TRUE|false]
 ModelKit  clickToSetElement [TRUE|false]
 ModelKit  showSymopInfo [TRUE|false]
      
 ModelKit  (mode) MOLECULAR
 ModelKit  (mode) view
 ModelKit  (mode)  edit
 ModelKit  
 ModelKit  (unitcell) EXTEND
 ModelKit  (unitcell) packed

 ModelKit  (edit) APPLYFULL
 ModelKit  (edit) applyLocal
 ModelKit  (edit) retainLocal
 ModelKit   ModelKit  
 ModelKit  (view) symop [n]
 ModelKit  (view) symop "x,-y,z"
 ModelKit  (view) symop [[4x4 matrix]]
   
 ModelKit  (view) offset {i j k}
   
 ModelKit  center @n
 ModelKit  center {point} (can be fractional by adding "/1" to at least one coord)
 ModelKit  center {atoms}

 ModelKit  (set) element [name or symbol]
      
   
 -- configuration options can be given sequentially within one ModelKit command or in individual commands
 
 
 -- examples:
 
  ModelKit mode view symop 5 center @3 
  ModelKit mode view symop 5 center @3 offset {0 0 0}   // unitized [0,1)

 -- action options include alternatives the commands in bold (ASSIGN is undocumented):
 
  ModelKit ROTATE ...  (for example, ROTATE BOND @1 @2 degrees)
  ModelKit ROTATESELECTED ...
  ModelKit ASSIGN ATOM @1 [symbol|pl|mi]
  ModelKit ASSIGN BOND @1 [0,1,2,3,4,5,p,m]
  ModelKit ASSIGN CONNECT @1 @2

new feature DRAW SYMOP @2 OFFSET {1 0 0}

 -- allows lattice OFFSET, where {0 0 0} is always into the unitcell [0, 1) 


bug fix: MINIMIZE CONSTRAINT for dihedral does not work.
new feature set mkAddHydrogens    default true; set false to not add H atoms when working with modelKitMode

JmolVersion="14.29.44" 

bug fix: 0 + {3.4, 0, 0} should give 3, not 0
bug fix: 

JmolVersion="14.29.43" 

bug fix: navigate TRACE does not work in JavaScript
bug fix: navigate TRACE followed by "quit" in console will not restart

JmolVersion="14.29.42" 

bug fix: MolReader not assigning _M.dimension to "2D" or "3D", just the overall auxiliaryInfo.dimension

JmolVersion="14.29.41" 

bug fix: CrystalReader does not skip over INFORMATION or WARNING line in CRYSTAL output files

bug fix: symop("x,y,z",{0 0 1}) does not return correct value for unit cells oriented by a b c axes

bug fix: OutputManager and FileManager fix for WRITE PDB "https://..." sending information to a server 

bug fix: JSmolJME.js miscodings cause error message in JSME

bug fix: nmr_predict_HC.htm not correlating signals to structure correctly

bug fix: JSpecView peak tabs for simulation or correlation in JmolJDX not proper width

JmolVersion="14.29.40" 

bug fix: centerAt AVERAGE fix

JmolVersion="14.29.39" 

new feature: capture SCRIPT "some script"
  - captures the given script
new feature: DELAY 1 while capturing inserts a one-second delay into the GIF animation
  - thus, the following is a +/-20-degree looping rock 
    around the Y axis with a 2-second wait at each end:
    
    CAPTURE "t.gif" LOOP SCRIPT "rotate y 20 20;delay 2;rotate y -40 -40;delay 2;rotate y 20 20;"
  
bug fix: JSpecView inline loading fails due to null file name assignment - now "[inline]"
bug fix: JSpecView inline loading does not save data needed for export SOURCE


JmolVersion="14.29.38" 

bug fix: ModelKit needs more slop for touch drag release and clicking

new feature: CRYSTAL TOPOND TRHO and TLAT reader
  -- reads critical point information in Bader analysis

JmolVersion="14.29.37" 

new feature: MO titleformat "...%3.1E"..." allows rounding of energy value
bug fix: (Java only) Jmol console does not accept paste with first character = '\n' 

JmolVersion="14.29.36" 

bug fix: getProperty("filecontents",filename) does not work.

JmolVersion="14.29.35" 

bug fix: Jmol.jar does not contain JSpecView class files

JmolVersion="14.29.34" 

bug fix: processing of MagneticCIF _space_group_magn.transform_BNS_Pp_abc  '-a+b,c,a+b;1/2,1,1/2'
         fails

JmolVersion="14.29.33" 

bug fix: (JavaScript only) in state creation for wireframe and measure 
          for integer Angstrom size, for example WIREFRAME 1.0

JmolVersion="14.29.32" 

bug fix: (JavaScript only) script with raw {...} expression fails to compile

JmolVersion="14.29.31" 

bug fix: (JavaScript only) ModelKit checkboxes broken in atom submenu. (JSmol jsmoljs/JmolMenu.js)

JmolVersion="14.29.30" 

RELEASE NOTE: JmolApplet*.jar Java files are no longer distributed in JSmol.zip. 
              See the main release zip file for these. 

bug fix: H--Y hydrogen bonds miscalculated due to length maximum miscoded in 14.29.27
    // JmolVersion="14.29.30" 01/27/2019 -- fixes bug of 10/29/2018

JmolVersion="14.29.29" 

new feature: print intersection(point vLine center radius) // 11/28/18
 - returns a list of 0 to 2 points representing the intersection of 
 - a line through point with vector vLine and a sphere of radius about center
 - allows for 3D building with constraints of a screen coordinate and a 
   distance from an atom
   
doc fix: intersection(point1 point2 point3) should be intersection(point1 vector1 point2)
 - closest point to point2 on a line through point1 in the direction vector1

bug fix: intersection() function changes value of point2   

bug fix: CrystalReader not reading vibration data for fragment calculation

JmolVersion="14.29.28"

bug fix: ModelKit appending broken in 14.29.25 10/10/18

new feature: assign atom "C" {2 2 2} 
 - adds an unbonded atom at the given position

JmolVersion="14.29.27"

new feature: CrystalReader auxiliary info:
 * 
 *  primitiveToCrystal  M3 transforming primitive lattice to conventional lattice
 *  
 *  mat4PrimitiveToCrystal  M4 for use in transforming symmetry operations
 *  
 *  mat4CrystalToPrimitive  M4 convenience inverse of mat4PrimitiveToCrystal
 *  
 *  fileSymmetryOperations  List<String> symmetry operators (primitive)
 *  
 *  Drawing primitive unitcell operations:
 *  
 *  ops = _M.fileSystemOperations
 *  
 *    DRAW SYMOP @{ops[2]}
 *  
 *  If using the conventional cell, you can use its operators, or you can
 *  limit yourself this primitive subset using:
 *  
 *    mp2c = _M.mat4PrimitiveToCrystal
 *  
 *    mc2p = _M.mat4CrystalToPrimitive
 *  
 *    DRAW SYMOP @{mc2p * ops[2] * mp2c}
 *
bug fix: CrystalReader not showing proper primitive cell with UNITCELL PRIMITIVE
bug fix: missing == for matrix3f and matrix4f
bug fix: draw symop with offset unitcell misses planes
bug fix: calculate hbond too generous for H--Y bond length -- max set at 2.2 Angstroms
bug fix: Jmol application "first frame" toolbar button broken
bug fix: script "inline" broken

JmolVersion="14.29.26"

bug fix: unitcell command with fractional translation fails
bug fix: CRYSTAL slab file can end up with emtpy-atom model

JmolVersion="14.29.25"

bug fix: MCIF (magnetic cif) reader does not handle symmetry operations with n/16.

JmolVersion="14.29.24"

bug fix: set language broken for Jmol application
bug fix: CRYSTAL reader can read one last 0-atom model
bug fix: 3-membered aziridine with non-H substituent should be chiral.
bug fix: isosurface "?" fails in JavaScript

JmolVersion="14.29.23"

bug fix: draw HKL {1 2 2} (undocumented) not working
bug fix: draw PLANE @pickedList  not working
bug fix: draw intercept unitcell PLANE @pickedList not working

JmolVersion="14.29.22"

bug fix: (JSmol only) menu items that are checkboxes do not work
    
https://sourceforge.net/p/jsmol/code/HEAD/tree/trunk/dist/tmp/coremenu.z.js?format=raw
https://sourceforge.net/p/jsmol/code/HEAD/tree/trunk/dist/tmp/corejsvmenu.z.js?format=raw

can be placed in j2s/core as a quick fix    

JmolVersion="14.29.21"

bug fix: set measurement 5 (integer; pixels) produces no line.
bug fix: polyhedra flat restored

JmolVersion="14.29.20"

feature change: removes (older, nonfunctional) NBO plug-in. (See GitHub Jmol-SwingJS)
new feature: allows plugin.properties to contain ";disabled", removing it from the Plug-In menu
new feature: adds ISOSURFACE [f1, filename1, f2, filename2, ...]
 - allows linear combination of isosurfaces
 - all grids must be identical (not checked internally - no error if this is not the case)
 - example is comparing crystal surface struture with and without binding of a surface molecule
 - e.g.   ISOSURFACE [1, "PtO.cube", -1, "Pt.cube", -1, "O.cube"]
 - can map a plane
 - e.g.   ISOSURFACE PLANE x=0.1 map [1, "PtO.cube", -1, "Pt.cube", -1, "O.cube"]
 - recommend using ISOSURFACE CACHE to convert to JVXL before saving as PNGJ
 
 
JmolVersion="14.29.19" // 2018.08.31

bug fix: LOAD <old CRYSTAL output file> may not work (CrystalReader.java)
bug fix: LOAD ... supercell fails with multiple models (XtalSymmetry.java)
bug fix: state creation Spacefill output "2" not "2.0" (missing PT.escF(f) call in StateCreator.java)

JmolVersion="14.29.18" // 2018.06.16

bug fix: (JavaScript) modulation vector state in PNGJ or state not read back correctly from data
			 ("1.4E-45" read as 1.399999...e-45) 
bug fix: SHOW SPACEGROUP with group 167 will show too many n-glides; three are g-glides

JmolVersion="14.29.17" // 2018.06.15

bug fix: magnetic modulations not factoring in static moment correctly 
bug fix: symop(@1, @2, "id") does not return 1-N id of operation
bug fix: show spacegroup fails to show detailed operation list (broken in 14.20.5 8/30/17)
bug fix: getproperty spacegroupinfo broken for incommensurate cases
bug fix: unitcell "-a,-b,c;0,0,0.50482" not working
bug fix: unitcell("-a,-b,c;0,0,0.5") not working
bug fix: cif reader does not recognize PRIMITIVE keyword
bug fix: Guassian reader can fail if no lines are present after vibration section

JmolVersion="14.29.16" // 2018.06.06

bug fix: unitcell("a=10 b=10,c=20,alpha=90,beta=90,gamma=129") crashes Jmol
bug fix: pointgroup(x) crashes Jmol when x is a set of points 
bug fix: UNITCELL parent not working
bug fix: Brillouin Zone id set to "" for unknown reason
bug fix: SMILES allene R/S chirality broken for some connections
 - print "C1.CC=[C@@]=[CH]1".find("smiles","chirality").join("") should be PP, not MM

bug fix: undocumented unitcell {1500500500 1500500501 1} not working 
 - notation for expanding cell=555 to 1000 cells (1000jjjkkk-1999jjjkkk)
 - due to large integer not being stored in float properly in Java
 - related to 1505050 1505051, which does work (expands capability to 100 cells, 100jjkk-199jjkk)

bug fix: load xxxx FILL UNITCELL broken (should not need "conventional" or "primitive")

bug fix: MSCIFReader not recognizing atom_site_Fourier_wave_vector_q1_coef

bug fix: Magnetic incommensurate files crashing unnecessarily

new feature: getproperty spaceGroupInfo


JmolVersion="14.29.15"

new feature: print {xxx}.find("SMILES/molecule","CC...")
new feature: print {xxx}.find("SMARTS/molecule","CC...")
 - molecule-based SMILES or SMARTS
 - returns an array of matching molecules in {xxx}
 - array.count gives number of matching molecules

bug fix: [array].distance.min([array]) does not work
 
bug fix: Bilbao reader does not allow for a blank line that is " "

bug fix: CrystalReader not reading vibrations properly for filter "CONV" 

bug fix: SMILES should allow [C@+1]

JmolVersion="14.29.14"

bug fix: MO calculation can truncate MO if moleule is shifted too far prior to creation of MO

bug fix: MOL reader user data column-81 continuation '+' fix

bug fix: LOAD OFFSET option can skip first atom

bug fix: CIPChirality -- Rule 6 adds set ciprule6full option for rr bicyclo[2.2.2]octane in/out business
bug fix: CIPChirality -- Rule 5 adds needed S-ref
bug fix: CIPChirality -- Rule 4b/Rule 5 ordering correction
bug fix: CIPChirality -- should indicate M/P for allene-centered spiro case BH64_084
bug fix: CIPChirality -- should indicate "e/z" instead of E/Z" for special cases of a single enantiomorphic pair
bug fix: CIPChirality -- duplicates and mass Rule 2 fix JL_008

JmolVersion="14.29.13"

new feature: running CALCULATE CHIRALITY will generate
             a CIPInfo entry in the model's auxiliary info 
             array indicating the decision
             points in the stereochemical analysis:
             
    $ load $inositol
	$ select @14
	$ calculate chirality
	R
	$ print _M.CIPInfo.C14
		O8	--------------			
		   1a
		C13	--------------
				(R)lll
		   4b
				(R)ll
		C16	--------------
		   1a
		H20	--------------       
	
	
	- building of this structure disabled using SET TESTFLAG2
	
             
new feature: "<smiles string>".find("smiles","chirality")
 - creates an array indicating the stereochemical designator (R,S,r,s,M,P,m,p,E,Z) at each atom in the SMILES string
 - no structure is necessary
 - for example:
 
 $ load $1,4-dihydroxycyclohexane
 $ calculate chirality
 rr
 $ show smiles
 "O[C@@H]1CC[C@@H](O)CC1"
 zap
 $ print "O[C@@H]1CC[C@@H](O)CC1".find("smiles","chirality").format("JSON")
 [ "","r","","","r","","","" ]
 
 $ print "[C@@H]1(C)CC[C@H]2C(C)C.C1[C@@H]2O".find("smiles","chirality").format("JSON")
 [ "R","","","","S","","","","","S","" ]

bug fix: CIP chirality did not recognize large conjugated rings as "mancude-like"
bug fix: ModelKit should not change selection when inverting a stereocenter

bug fix: WRITE xxx.PDB not writing CONECT records

JmolVersion="14.29.12"

bug fix: jsmol.php security fix for sites implementing their own Info.serverURL

bug fix: CrystalReader filer "conv" fix

bug fix: MSCIFReader not recognizing atom_site_Fourier_wave_vector_q_coef
bug fix: MSCIFReader not recognizing atom_site_Fourier_wave_vector_q<n>_coef and _x,_y,_z in same block
 
bug fix: GaussianReader broken for high-precision frequency data (broken in 14.29.10)

new feature: GaussianReader orientation filters (default is ALL)
   -- filter 'orientation:input' (includes Z-Matrix)
   -- filter 'orientation:standard'
   -- filter 'orientation:all'
   -- note that vibrations are only returned if orientation is ALL or STANDARD 
   
new feature: CrystalReader returns atom property_irreducible:
   -- select property_irreducible > 0
   -- display property_irreducible > 0

new feature: CrystalReader adds ellipsoid set "raman"

    
JmolVersion="14.29.11"

bug fix: CrystalReader not handling symmetry for filter "conv"
bug fix: CrystalReader not properly generating vibrational modes

code: refactored for SwingJS
code: refactored CrystalReader

JmolVersion="14.29.10"

bug fix: GaussianReader for fixed atoms in freq calculation

JmolVersion="14.29.9v"

bug fix: NBO 	

JmolVersion="14.29.9"

bug fix: NBO -- normalizations validated using allyl.nn for all types

code: total switch to javajs.util.BS from javajs.util.BS

JmolVersion="14.29.8"

bug fix: NBO

JmolVersion="14.29.7"

bug fix: NBO


JmolVersion="14.29.6"

bug fix: Matrix4f, Matrix3f should be output in format consistent with an matrix, not an array
 -- should not have space between opening and closing brackets
 -- should not use commas (not a critical distinction)
 
 [[0.8362213	-0.5062382	0.21084802	52.988747]
  [0.5394281	0.8285579	-0.15003058	20.076633]
  [-0.09874859	0.23919612	0.96593684	46.393887]
  [0.0	0.0	0.0	1.0]]
  
bug fix: genNBO reader failing for G orbitals (even though we cannot process them, the reader at least load them

new feature: set infoFontSize   
  -- for MO and NBO command
  -- default 20

bug fix: red file load error message is too small to read
  -- font size increased to 20
  
code: modular loading of F,G,H,I MO calculations only when needed

JmolVersion="14.29.5" // released 2018.02.08

bug fix:  (Java application only) Incorrect class file in Jmol.jar causes BOUNDBOX ON to fail

JmolVersion="14.29.4" // released 2018.02.07

bug fix: set hbondsrasmol false fails with O atom-only HOH group
bug fix: calculate pointgroup does not change with new atom positions

JmolVersion="14.29.3" // released 2018.02.03

bug fix: mac cut/paste enabled for Macs
bug fix: set autobond corrected
bug fix: changing an atom's element should delete all partial charges 
bug fix: load AUDIO "xxx.wav"  broken in Java
bug fix: load AUDIO "xxx.wav"  broken in JavaScript
bug fix: loading of pdb file does not report HET = .... to console
bug fix: CONTACT leading to no contacts crashes Jmol.
bug fix: load FILES with filter does not work
bug fix: load =xxxx/val with filter does not save in state
   solution was to change "+" to "-" to indicate special two-file loading in this case

new feature: set label picking icon in application
new feature: set label picking does not require shift for drag
new feature: set label picking allows double-click to set the label

new feature: drag-drop of PNGJ into script opens editor (for movie.spt; use not implemented)

new feature: set allowAudio (default TRUE)

new feature: AUDIOcallback 
 - used to continue after completion of an audio clip
 - parameter is a hashtable with information about the audio clip

new feature: load AUDIO "xxx.wav" FILTER "...options..."
 - filter options include:
 -  id='....'  an identifier for this audio clip
 -  loop       loop until told to stop
 -  start='...', play='...', stop='...', ended='...' callback scripts allowed
 -  single word arguments allowed - for example, id=a2 ended=audioDone()

note: These features will be included in a future AUDIO command
  
JmolVersion="14.29.1" // released 2018.01.25

new feature: select peptide, defined as:
				 protein && within(chain,monomer>1)&!within(chain,monomer>12)

bug fix: isosurface EDS not working for mmCIF files.

JmolVersion="14.28.4" // released 2018.01.25

bug fix: script "minimize; calculate partialcharge" can cause exception

bug fix: partial charges not reset to 0 after atom type change as with
          {_N}[2].element = "O"
          
bug fix: isosurface CACHE should store isosurface as byte[] not String
         otherwise it is not saved in a subsequent WRITE xxx.PNG AS PNGJ


JmolVersion="14.28.3" // released 2018.01.19

bug fix: mmtf broken - needs "/v1.0/"
bug fix: BCIF/CIF volume reader not properly assigning axes in some cases
bug fix: GAMESS reader does not work with symmetry indicated in input deck

JmolVersion="14.28.2" // released 2018.01.17

new feature: isosurface eds
 - generates electron density surface 2fo-fc for current PDB model
 - trimmed to structure
 - note that isosurface eds AS "t.bcif" will save the full data block to a BCIF file
 
new feature: isosurface within 3 {e20:A} eds
 - generates electron density surface 2fo-fc for current PDB model
 - localized to WITHIN 	specification
 - note that adding AS "t.bcif" will save only the retrieved localized block to a BCIF file
 
new feature: isosurface edsdiff
 - generates electron density surface fo-fc for current PDB model
 - trimmed to structure
 
new feature: isosurface "=1eve/full"
 - generates electron density surface 2fo-fc for 1eve
 - reads and shows full data set, not trimmed to structure

new feature: isosurface "=1eve/diff"
 - generates electron density surface fo-fc for 1eve
 
new feature: isosurface "=1eve/diff/full"
 - generates electron density surface fo-fc for 1eve
 - reads and shows full data set, not trimmed to structure

bug fix: for BCIF/CIF EBI density server data, switch to sigma_sampled from sigma_source  

JmolVersion="14.28.1" // released 2018.01.14

new feature: WRITE CONTACT xxx.jvxl
 - saves a JVXL file for a contact
 - reload using ISOSURFACE xxx.jvxl, not CONTACT
 
new feature: write contact "cache://t.jvxl"
 - saves a contact as a jvxl file in the cache

new feature: isosurface "cache://t.jvxl"
 - loads an isosurface from a cached JVXL file

new feature: generalized use of cache://
 - cache:// saves or retrieves files from the FileManager cache
 - cleared upon ZAP
 - for example, the following transfers a contact to an isosurface for saving to a PNGJ file
    
    load =1eve
	zoom {e20:a} 0
	contact {e20:A} hbond
	write contact cache://t.jvxl
	isosurface cache://t.jvxl
	contact delete
	write t3.png as PNGJ
	

new feature: isosurface reads EBI density server files (BinaryCIF and CIF)
 -- for example:
   isosurface "https://www.ebi.ac.uk/pdbe/densities/x-ray/1eve/box/-3.434,55.646996,59.195/7.479,70.943,74.928?space=cartesian&encoding=bcif"
   isosurface "https://www.ebi.ac.uk/pdbe/densities/x-ray/1eve/box/-3.434,55.646996,59.195/7.479,70.943,74.928?space=cartesian&encoding=cif"
  
new feature: Jmol automatically uses EBI density server BinaryCIF files when "within" keyword is used.
 -- for example:
 
   load =1eve
   display e20
   zoom {displayed} 0
   isosurface within 4 {e20:A} "=1eve"

 -- allows testing of non-binary CIF electron density files using .cif:
  
   isosurface within 4 {e20:A} "=1eve.cif"
   
bug fix: loading, modifying, and resaving a PNGJ file fails in Java
bug fix: JavaScript JSmol improperly saves a PNGJ file within a PNGJ file

JmolVersion="14.27.2"

new feature: frame MO 
 - goes to first frame with a molecular orbital
 
bug fix: [UNK] missing in atom identities, even when part of actual structures such as 3A0B
 
bug fix: polyhedra ID p1 @11 to {connected(@11)} not working
  -- allows for $p1.getProperty(....)

bug fix: load(filename, "JSON") should allow for files that start with "[" rather than "{"

bug fix: JSJSON parser fails for leading whitespace in map values

code: additions to QCJSONWriter and QCJSONReader 
  - working with Jmol-datafiles/qcjson/preliminary
  - "QCJSON 0-0-0.Jmol_14.27.2__2017-12-11_09:38",
  
JmolVersion="14.27.1" released 2017.12.11

new feature: functions write("zip") and write("jmol")
 - allows creating a binary variable containing zip data
 - does not include preview.png (unlike write xxx.zip or xxx.jmol)
 - includes any local files (as for WRITE command)
 - "zip"  does not include remote-access files
 - "jmol" DOES include remote-access files
 - allows use of .pop() and .push() to remove, modify, or add files
 - same as write xxx.zip; x = load("xxx.zip",true) -- except includes no preview.png
 
 - for example:
 
   load $caffeine
   x = write("jmol")
   x.push("mydata","testing")
   write var x "test.zip"
   y = load("test.zip", true)
   print y.keys 
      ...
   print y.mydata
   
     testing
     
   load test.zip
      ...
     
   load $caffeine
   x = write("jmol")
   zap
   load var x
   
   
bug fix: CIPChirality adds "mancude system" averaging of atomic numbers in Rule 1a

JmolVersion="14.26.1"

new feature: experimental qcjson write format - ALPHA only 

bug fix: decimal formatter failing for 9.9999999 to 5 digits
bug fix: Jaguar reader not reading MOs; (working, but still does not read STO-3G)

bug fix: direct call to sun.audio on some systems fails; 
 -- moved to class openscience.jmol.jmolPanel.JmolAudio
 -- accessed by reflection, so not loaded unless needed.
 
code - synchronized with NBOServe project. (2017.11.10)

JmolVersion="14.25.2"

bug fix: DCD (trajectory) reader failing when periodic lattice info is present

JmolVersion="14.25.1"

new feature: polyhedra WIGNER      // Wigner-Seitz cell
new feature: polyhedra BRILLOUIN   // 1st Brillouin zone
new feature: polyhedra BRILLOUIN 1 // 1st Brillouin zone
new feature: polyhedra BRILLOUIN 2 // 2nd Brillouin zone
new feature: polyhedra BRILLOUIN -1 // Wigner-Seitz cell
new feature: polyhedra scale 3.0 BRILLOUIN 1  // scaled 1st Brillouin zone

bug fix: MOL file reader should not autobond if number of bonds is 0.

JmolVersion="14.24.2" // 2017.11.08

bug fix: invertSelected was not clearing chirality
bug fix: JmolAppletSigned0.jar fails -- missing org/apache/tools
bug fix: SHOW SMILES sometimes missing allene chirality
bug fix: hbondsDistanceMaximum should not be limited by 2.5 max; increased maximum to 3.5
bug fix: hbondsDistanceMaximum and hbondsAngleMinimum should not be in state

code: moved scriptEval.cmdInvertSelected to scriptext.cmdExt

JmolVersion="14.24.1" // 2017.11.05

new feature: MACRO bz; createWS("p1")    
  -- creates a Wigner-Seitz cell as polygon id "p1"
  -- requires current unit cell to be primitive to work correctly
  -- polyhedron can be shifted using POLYHEDRA OFFSET
  -- default ID "pbz1_1_" for just CREATEWS()

  
new feature POLYHEDRA edgesOnly  
  -- shows just edges
  -- operates on ALL polyhedra
  -- complements edges, noEdges, frontEdges

new feature: select within(d, $p1) where $p1 is a polyhedron ID
  -- d = 0 is "on or within the polyhedron"
  -- d < 0 is "-d angstroms within polyhedron"
  -- d > 0 is "within d angstroms of polyhedron"
  
bug fix: POLYHEDRA edges should inherit color, not use black as default

bug fix: calculate CHIRALITY may fail to show Z for some seqCis systems

new macros: 

    "aflow", "http://aflowlib.mems.duke.edu/users/jmolers/jmol/spt/AFLOW.spt", "AFLOW macros",
    "bz", "http://aflowlib.mems.duke.edu/users/jmolers/jmol/spt/bz.spt", "Brillouin Zone/Wigner-Seitz macros"


code: biomodel classes are being loaded prematurely due to @cystine definition involving cys.sg instead of cys and atomname=sg 

JmolVersion="14.23.1" // 2017.11.02

new feature: load "" fill UNITCELL PRIMITIVE     (for files that are conventional)
new feature: load "" fill UNITCELL CONVENTIONAL  (for VASP files, which are primitive cells)

bug fix: primitive unit cell incorrect for rhombohedral lattice space groups
         (trigonal R...; 146, 148, 155, 160, 161, 166, 167)
bug fix: (AFLOW specific) CIF for trigonal and hexagonal cells (itn 143-194) should orient rotated 60 deg cw 
bug fix: LOAD ... SUPERCELL {2 2 2} broken

JmolVersion="14.22.2"

bug fix: PubChem partial charges are only to 0.01 precision, so a test in dipole creation of 
         balanced charges must allow for more than that -- changed to 0.015. Case in point: :PF3. 	

JmolVersion="14.22.1" // 2017.10.28

new feature: draw BOUNDBOX BEST  
 -- draws the best box around currently selected atoms
 
bug fix: a.distance.min(b).min should not report 0 if a == b. (testing atom against itself should be skipped) 
bug fix: SHOW BEST ROTATION just shows the current rotation, not the best rotation to use to get to the best view
bug fix: rotate BEST can fail with flat structures
bug fix: LOAD "" FILE BOUNDBOX does not include all atoms

JmolVersion="14.21.1" // 2017.10.22

new feature: set noDelay true sets all time delays to 0 and forces all file operations to be synchronous

bug fix: CIP adds S4 symmetry check in Rule 6
bug fix: chirality broken for JavaScript in MSIE 11 due to range error 
bug fix: Should be able to save PNGJ from menu even if zapped (because there might be a surface)

JmolVersion="14.20.9"

bug fix: JavaScript does not handle saving PNGJ from modified PNGJ 
bug fix: JavaScript command SHOW NMR broken
 
JmolVersion="14.20.8" // 2017.10.07

bug fix: STEREO DTI never implemented for Java, only JavaScript
bug fix: color property_xxxx broken
bug fix: platformSpeed not actuated for wheel zoom. 

JmolVersion="14.20.7"

bug fix: calculate chirality broken for JSmol (missing Integer.compare) 

JmolVersion="14.20.6"

bug fix: MO HOMO + n delivers HOMO + 2*n
code: more efficient CIPChirality using breadth-first scanning for chirality descriptors 

JmolVersion="14.20.5" // 2017.08.29

bug fix: isosurface intersect unitcell broken
bug fix: show spacegroup does not report H-M name

JmolVersion="14.20.4" // 2017.08.09

bug fix: SpartanSMOL reader for iSpartan files does not read charges or vibrational mode data
bug fix: CIPChirality fix for BH64_075; adding Rule 3b. 
bug fix: CIPChirality new Rule 6 covers all special spiro cases and C3-symmetry
bug fix: SMILES generator fails for [2H]/C=C/[1H]
bug fix: write SDF fails for 1H. (Must use M  ISO.)

JmolVersion="14.20.3" // 2017.07.20

bug fix: ROTATE should not stop spin if it does not initiate a spin
bug fix: CIPChirality tests for CIP1966#31,#32 douple spirans and C3 compounds
bug fix: CIPChirality for Rule 2 using atomic masses and not for duplicate atoms
bug fix: MOL file reading where isotope is indicated in atom line and V item
bug fix: MOL reader fails for H1, D, T isotopes indicated as symbols along with isotope difference


JmolVersion="14.20.2" // 2017.07.09

bug fix: CIPChirality adding presort for Rules 4a and 4c (test12.mol; 828 lines) 
bug fix: write SDF and write MOL do not set atom parity field
bug fix: JavaScript JSmol broken for chirality due to bug in Clazz.clone(obj)

bug fix: Upgrade of natural abundance average masses (no significant changes here):

  // all numbers except radionuclides from:
  // Atomic weights of the elements 2013 (IUPAC Technical Report)
  // Juris Meija, Tyler B. Coplen, Michael Berglund, Willi A. Brand, Paul De Bièvre, 
  // Manfred Gröning, Norman E. Holden, Johanna Irrgeher, Robert D. Loss, Thomas Walczyk, 
  // Thomas Prohaska  Published Online: 2016-02-24 | DOI: https://doi.org/10.1515/pac-2015-0305
  // https://www.degruyter.com/view/j/pac.2016.88.issue-3/pac-2015-0305/pac-2015-0305.xml

    /* 1 H */ 1.008f, 4.002f, 
    /* 2 Li */ 6.9675f, 9.012f,      10.8135f, 12.0106f, 14.006f, 15.999f, 18.998f, 20.1797f, 
    /* 3 Na */ 22.989f, 24.307f,     26.981f, 28.084f, 30.973f, 32.059f, 35.4515f, 39.948f, 
    /* 4 K */ 39.0983f, 40.078f, 44.955f, 47.867f, 50.9415f, 51.9961f, 54.938f, 55.845f, 58.933f, 58.6934f, 63.546f, 65.38f, 69.723f, 72.63f, 74.921f, 78.971f, 79.904f, 83.798f, 
    /* 5 Rb */ 85.4678f, 87.62f, 88.905f, 91.224f, 92.906f, 95.95f, 98.91f, 101.07f, 102.905f, 106.42f, 107.8682f, 112.414f, 114.818f, 118.71f, 121.76f, 127.6f, 126.904f, 131.293f, 
    /* 6 Cs, Ba, actinides */132.905f, 137.327f, 138.905f, 140.116f, 140.907f, 144.242f, 144.9f,  150.36f, 151.964f, 157.25f, 158.925f, 162.5f, 164.93f, 167.259f, 168.934f, 173.054f, 174.9668f,
    /* 6 Hf */  178.49f,180.947f,183.84f,186.207f,190.23f,192.217f,195.084f,196.966f,200.592f,204.3835f,207.2f,208.98f,210f, 210f, 222f,    
    /* 7 Fr, Ra, lanthanides */ 223f, 226.03f, 227.03f, 232.0377f, 231.035f, 238.028f, 237.05f, 239.1f, 243.1f, 247.1f, 247.1f, 252.1f, 252.1f, 257.1f, 256.1f, 259.1f, 260.1f, 
    /* 7 Rf - Mt */ 261f, 262f, 263f, 262f, 265f, 268f


JmolVersion="14.20.1" // 2017.07.06

new feature: BZ2 compressed file reader
  -- uses org.apache.tools.bzip2.CBZip2InputStream v. 1.9.6
  -- Apache license

bug fix: ADF reader not accepting Xx.name atom ids
  
bug fix: SMILES generator can show wrong @/@@ or stereochemical type for some allenes and cumulenes 
bug fix: CIPChirality additional Rules 1b, 4b, and 4c fixes (substituted cubanes; multiple branched branches; 841 lines)

JmolVersion="14.19.1"  // 2017.06.25

new feature: WRITE "SDF" implements atom value V  nnn ... information
 -- requires assigning the data property name "atom_values" in the model's molData property
 -- for example:
 
  $ load $2,3-dichlorobutane
  $ molData = {"atom_values":"chirality"}
  $ model properties "molData" molData
  $ write dcb.sdf

 -- note that if the model already has a molData property, then use the following to append to it:
 
  $ molData = (_M.molData ? _M.molData : {})
  $ molData.atom_values = "chirality"
  $ model properties "molData" molData
   
new feature: x = load("filename","JSON")
 -- loads JSON data into variable
 
bug fix: CIPChirality: minor fixes for Rule 4b and 5 for BH64_012-015; better atropisomer check
bug fix; SPIN QUATERNION 
bug fix: CENTERAT ABSOLUTE broken (since forever?)
bug fix: SPIN QUATERNION {0 0 -1 0} still does a positive, not negative, rotation
 (solution is to apply a miniscule rotation of 1e-10 degrees)
 
bug fix: script array context [3 -0] becomes [3], as in [3 - 0]

bug fix: SET ANTIALIASDISPLAY requires click [via resizeImage()]
bug fix: CIP gives wrong alkene root distance for cyclopropene
bug fix: WRITE of structure file does not report number of atoms and warn if selected is different from this molecule
bug fix: WRITE MOL using format 10f.5 instead of 10f.4 for x, y, z coordinates
bug fix: MOL/SDF files should truncate lines at 80 characters.

JmolVersion="14.18.1"  // 2017.06.06

bug fix: CIP misses Rule 4b cases where a branching atom has R or S chirality. 
 -- see test_bt_P4.mol and test_bt_O3.mol (BH64.65 and BH64.66)
 -- see AY236.179 (3D structure was diasteriomer, so I missed that)
 
bug fix: WRITE MOL should not generate > <JMOL_PARTIAL_CHARGES> because it is  not SDF format
bug fix: WRITE SDF should generate > <JMOL_PARTIAL_CHARGES> with a trailing space

bug fix: (SMILES) targetString.find("SMILES",patternString) will fail for .[C@H]2 (new group and attached to a connection number)
bug fix: SHOW CHEMICAL SMILES fails when logLevel is set > 4

new feature: WRITE SDF writes > <.... user data 
 -- can be set using   MODEL PROPERTY "molData" x  where x is an associative array
 -- can be read using _M.molData

new feature: associativeArray.pop() -- clears associativeArray
new feature: assArray1.push(assArray2) -- adds all key/value entries in assArray2 to assArray1.
new feature: assArray1 + assArray2  -- adds all key/value entries into a new associative array. (Complements a1 - a2)


JmolVersion="14.17.2" // 2017.06.03

bug fix: WRITE FILE not working when file has been cached.
bug fix: array.find("regex...","") does not reset RegExp each time it runs RegExp.exec() so does not find all possibilities

code: CIPChirality.java fully interfaced using SimpleNode and SimpleEdge

JmolVersion="14.17.1"  // 2017.05.27

new feature: atom property x.cipRule 
 -- CIP sequence rule deciding this center  
 -- one of 1a, 1b, 2, 3, 4a, 4b, 4c, 5, or blank

bug fix: polyhedra broken in Jmol 14.10.0

bug fix: finalizing CIP algorithm
 -- adding spiro chirality from P-93.5.3
 -- completing root path for auxiliary descriptors 

bug fix: JSmol: JSME/JSmol 2D->3D fails when one H of a CH2 is explicitly wedge and the other H is implicit (not shown at all). (JSmolJME.js)

code:

/**
 * A full validated relatively efficient implementation of Cahn-Ingold-Prelog
 * rules for assigning R/S, M/P, and E/Z stereochemical descriptors. Based on
 * IUPAC Blue Book rules of 2013.
 * https://iupac.org/projects/project-details/?project_nr=2001-043-1-800
 * 
 * Features include:
 * 
 *  - deeply validated 
 *  
 *  - implemented in Java (Jmol) and JavaScript (JSmol)
 *  
 *  - only two Java classes; roughly 1000 lines
 *  
 *  - efficient, one-pass process for each center using a single finite digraph for all auxiliary descriptors
 *  
 *  - exhaustive processing of all 8 sequence rules (1a, 1b, 2, 3, 4a, 4b, 4c, 5)
 *  
 *  - includes R/S, r/s, M/P (axial, not planar), E/Z
 *  
 *  - covers any-length odd and even cumulenes
 *  
 *  - uses Jmol conformational SMARTS to detect atropisomers and helicenes 
 *  
 *  - covers chiral phosphorus and sulfur, including trigonal pyramidal and tetrahedral
 *  
 *  - properly treats complex combinations of R/S, M/P, and seqCis/seqTrans centers (Rule 4b)
 * 
 *  - properly treats neutral-species resonance structures using fractional atomic mass and a modified Rule 1b
 *  
 *  - implements CIP spiro rule (BB P-93.5.3.1)
 *  
 *  - detects small rings (fewer than 8 members) and removes E/Z specifications for such
 * 
 *  - detects chiral bridgehead nitrogens
 *  
 *  - reports atom descriptor along with the rule that ultimately decided it
 * 
 * Primary 236-compound Chapter-9 validation set (AY-236) provided by Andres
 * Yerin, ACD/Labs (Moscow).
 * 
 * Mikko Vainio also supplied a 64-compound testing suite (MV-64), which is
 * available on SourceForge in the Jmol-datafiles directory.
 * (https://sourceforge.net/p/jmol/code/HEAD/tree/trunk/Jmol-datafiles/cip).
 * 
 * Additional test structures provided by John Mayfield.
 * 
 * Additional thanks to the IUPAC Blue Book Revision project, specifically
 * Karl-Heinz Hellwich for alerting me to the errata page for the 2013 IUPAC
 * specs (http://www.chem.qmul.ac.uk/iupac/bibliog/BBerrors.html), Gerry Moss
 * for discussions, Andres Yerin for discussion and digraph checking.
 * 
 * Many thanks to the members of the BlueObelisk-Discuss group, particularly
 * Mikko Vainio, John Mayfield (aka John May), Wolf Ihlenfeldt, and Egon Willighagen, for
 * encouragement, examples, serious skepticism, and extremely helpful advice.
 * 


JmolVersion="14.16.1" // 2017.05.19

new feature: load =chebi/nnnnnn   
  -- chEBI 2D molecule load, with minimal 100-step minimization
  -- 

bug fix: CML reader does not read 2D wedge/hash information

bug fix: CIP fix for missing branch descriptors; 984 lines 

bug fix: CIP adds helicene M/P chirality  
  - validated using CCDC structures HEXHEL02 HEXHEL03 HEXHEL04 ODAGOS ODAHAF
  - http://pubs.rsc.org/en/content/articlehtml/2017/CP/C6CP07552E
  
code: CIP: additional simplification;   
code: CIP status: implementation complete, including:
         All subrules implemented fully: 1a, 1b, 2, 3, 4a, 4b, 4c, 5
         R/S, E/Z, M/P (odd-cumulene and helicene), r/s, seqCis/seqTrans (as Z/E)
         fused benzenoid aromatic Mancude ring "Kekule weighted" atom number adjustments

 * Added logic to Rule 1b: The root distance for a Kekule-ambiguous duplicate
 * atom is its own sphere, not the sphere of its duplicated atom.
 * 
 * Stated more precisely:
 * 
 * Proposed amended Sequence Rule 1:
 * 
 * (1a) higher atomic number precedes lower;
 * 
 * (1b) in comparing two duplicate nodes, lower root distance precedes higher
 * root distance, where "root distance" is defined:
 * 
 * (i) in the case of a duplicate atom for which the atomic number is averaged
 * over two or more atoms in applying Rule 1a, the distance from the duplicate
 * node itself to the root node; and
 * 
 * (ii) in all other cases, the distance of its corresponding nonduplicated atom
 * node to the root node.
 * 

JmolVersion="14.15.4" // 2017-05-13

bug fix: INVERTSELECTED ATOM not documented; functionality of INVERTSTEREO SELECTED folded into it, and INVERTSELECTED STEREO deprecated
 -- inverts ring or chain stereochemistry
 -- adds that keyword ATOM is optional, so INVERTSELECTED @2  works
 
bug fix: @n for "atom n" not working in several script-checking contexts where {atoms} works.

bug fix: CIP full implementation; simplified algorithm - 984 lines
bug fix: CIP Rule 1b modification to ensure aromatic rings do not result in false positive for R/S (binap2)
  -- specifically that the duplicate atom is given a root distance equal to its sphere, not that of its duplicated atom
bug fix: CIP chiral bridgehead N designations missing
bug fix: CIP Assignment of auxiliary r/s not functional (AY-236.201,202)
bug fix: CIP basic "mancude" atom number adjustment for heteroatoms
 -- implemented for benzenoids (benzene, pyridine, pyrazine) and fused benzenoids only 

new feature: set debugHigh 
  -- same as set loglevel 6 - debugging only
  -- debugging only; not considered significant enough to increment minor version
  
JmolVersion="14.15.3" // 2017-05-08

bug fix: SMARTS search for atropisomeric bond that is in an alicyclic ring fails (Fred Ziegler)
  - used for M/P chirality check
  - for example: 
           load $c1cc2c3-c4c5CC2.c5ccc4C.c3(C)c1
           select on smarts("a-a")
           calculate chirality
           print {*}.chirality.join("")
           
            MM
            
bug fix: use of the less preferred name of Jmol token that has two optional 
         forms ("fix" vs "fixed") as a VAR does not assign that variable name 
bug fix: set cartoonRibose misses the C1'-O4' and O3'-P(+1) edges
bug fix: JVXL reader not reading Gaussian files with "1" in the third line, 5th field
bug fix: CIP M/P chirality
  test: load "$2,2'-dibromobiphenyl"; calculate chirality; print {*}.chirality.join("")
bug fix: CIP chirality nearly fully validated on ACD/Labs AY-236 set, with some unimplemented aspects:

var skip = ({27 229}) || // E/Z only; missing chirality
           ({95 96 98 99 100 101 102 103 104 108 109 110 111 112 200}) || // trigonal planar, square planar, or hypervalent
           ({32 33})  || // helicene // added in Jmol 14.15.5
           ({201 202})|| // spirocyclic central (redundant) atom designation missing (axial designation option)
           ({212 213})|| // chiral conformation 1,4-benzene in a ring
           ({38 84})  || // ignore -- 38: Mancude for cyclopentadienyl; 84: unknown error with P compound
           ({203})    || // // chiral bridgehead amine  // fixed in Jmol 14.15.5

Issue: Full implementation of the rules requires a slight modification of Rule 1b. 
Specifically, aromatic duplicate atoms must reference the sphere of their own parent, not their
duplicated atom. 
  
 Three structures appear to be in error in the IUPAC Blue Book 2013. 
 
,"147":"r,,,R,,,,r,,,S" // r,,,R,,,,r,,,R chiral phosphine -- I think Jmol is right; disagrees with BB P-93.5.1.1.2 for S vs R
,"227":"SrSEErS" // S,,,,,,,r,S,,,,,,,E,,r,r  //  -- I think Jmol is right; disagrees with BB P-93.5.7.2 for S vs. r
,"230":"@2D RrRsR" // r,,,R,,,,s,,,R // p 1282   -- I believe Jmol is correct, disagrees with BB P-93.6
 
 One structure awaiting full implementation of Rule 4b across all chirality types, R/S, M/P, and seqCis/seqTrans
 
 ,"170":"Spp" // Jmol is missing the S -- mix of R/S and M/P for Rule 4b

 - 939 lines
    
JmolVersion="14.15.2" // 4/29/17

bug fix: CIP chirality adds axial chirality (M/P[Ra/Sa], m/p[ra/sa]) for cumulenes
bug fix: CIP chirality adds atropisomer chirality (M/P[Ra/Sa], m/p[ra/sa]) for biaryls
bug fix: CIP chirality adds cumulene E/Z chirality
 -- 816 lines
 -- validation data are at https://sourceforge.net/p/jmol/code/HEAD/tree/trunk/Jmol-datafiles/cip/
 -- validates for 160 structures (some duplicates; both cip_examples.zip and stereo_test_cases.sdf)
 -- validates for all cases considered:
   -- simple R/S and E/Z
   -- small-ring removal of E/Z
   -- parallel-strand Rule 4b and Rule 5 (Mata)
   -- pseudochiral r/s and m/p
   -- odd and even cumulenes
   -- atropisomers
   -- P, S, As, Se, Sb, Te, Bi, Po trigonal pyramidal and tetrahedral
   -- imine and diazine E/Z chirality

JmolVersion="14.15.1" // 4/28/17

new feature: x.split(true)
 -- does a white-space token split of the string value of x

new feature: MOL/SDF reader reads M  ISO  lines for isotopes

bug fix: CIP chirality adds P, S, As, Se, Sb, Te, Bi, Po trigonal pyramidal and tetrahedral
bug fix: CIP chirality adds imine and diazine E/Z chirality
bug fix: CIP chirality broken for carbonyl groups
bug fix: CIP chirality E/Z should not be indicated for rings of size < 8

bug fix: values not saved in state for cartoonBlockHeight, cartoonBlocks, and cartoonSteps
bug fix: write MO broken
bug fix: set cartoonBlockHeight (for DSSR nucleic acid rendering) fails

code: CIPChirality.java 779 lines Rules 1-5 validated on 145 compounds 
  - see https://sourceforge.net/p/jmol/code/HEAD/tree/trunk/Jmol-datafiles/cip/
code: CIP optimizations

JmolVersion="14.14.1" // 4/19/17

new feature: CALCULATE CHIRALITY {atom set}
  -- starts with basic CIP Rule 1-2 determination of R/S and E/Z.
  -- continues with Rules 3-5, which require full-molecule analysis.
  -- work in progress:
     -- Rules 1 and 2 complete
     -- Rule 3 (E/Z) implemented
     -- Rule 4 partially implemented 
        -- simple linear sequences of R/S ok
     -- Rule 5 implemented
  -- caveates
     -- no pseudochirality
     -- not cyclitols
     -- does not distinguish rings, so inserts "Z" into ring bonds
     -- only validated on 
     
  -- optionally limited to the given atom set (or the currently selected atoms by default)
    
new feature: set jmolInJSpecView  
  -- allows Jmol window to NOT be embedded in JSpecView when JSpecView is opened in Jmol
  -- default TRUE
  
new feature: WRITE ISOSURFACE "t.pmesh"; WRITE ISOSURFACE "t.pmb"
  -- creates ASCII (.pmesh) or binary (.pmb) file (a Jmol-specific file format)
  -- relatively compact format
  -- can speed up loading of meshes and contours
  -- for filled surfaces, use .jvxl instead
  -- read back into Jmol using ISOSURFACE "t.pmesh"/"t.pmb"
  -- note that binary files are NOT RECOMMENDED for JSmol because some platforms cannot read them locally
  -- example:
  
  load $methane
  isosurface plane {0 0 0 1} map vdw contours 20
  write ISOSURFACE contour.pmb
  isosurface contour.pmb
  

bug fix: mesh capper producing gaps
bug fix: CIP chirality fixed for rule ordering; validated for IUPAC Rules 1, 2, and 3 (though still some questions about Rule 3)
bug fix: print getProperty("cifinfo") without file name fails
 
 
JmolVersion="14.13.1" // 2017.04.09

new feature: MOL V2000 reader loads > <dataname> blocks into _M.molData

new feature: set labelfor {atomset} "value"
 -- allows setting of label without changing current selection
 -- uses same syntax as LABEL command after {atomset}
 -- for example:
 
   set labelfor @atoms @myLabel
   set labelfor {atomno <= 3} @{["a","b","c"]}
   set labelfor {_C && chirality != ""} "%[atomname] %[chirality]"

bug fix: {*}.chirality with triple bonds fails
bug fix: {*}.chirality fix for duplicate atoms check

bug fix: dotted line has extra dot: measure ID m @1 @4 radius 0.1
bug fix: NBO H-BOND and MODEL focus issues 


JmolVersion="14.12.1"

bug fix: NBO update
bug fix: JavaScript bug - missing  Math.signum(f) - causes {atom}.chirality to not work in JSmol

JmolVersion="14.12.0" // 2017-04-06

new feature: {atom}.chirality
  -- uses Cahn-Ingold-Prelog rules to assign R or S to a carbon center
  -- ignores sulfur chirality
  -- may not fully implement high symmetry cases
  -- not fully tested
  -- Checked using:
  
function checkchiral(m) {
  if (m)  load @m
  background label yellow
  color labels black
  select _C
  label %[atomname]
  refresh
  var b = {_C}
  for (var a in b) {
    var c = a.chirality;
    print _smilesString + " " + a + c
    if (c) {
       select a
       c = a.atomname + " " + c
       label @c
    }
  }
  select *
}

checkchiral("$(R)-glycidol")
delay 1
checkchiral("$glucose")
delay 1
checkchiral("$(2S,3R)-2,3-oxiranediol")
delay 1
checkchiral("$(S)-2-butanol")
delay 1
checkchiral("$(R)-2-butanol")
delay 1
checkchiral("$(2S,3R)-2,3-butanediol")
delay 1
checkchiral("$(2S,3S)-2,3-butanediol")
delay 1
checkchiral("$(2R,3R)-2,3-butanediol")
delay 1
checkchiral("$(2R,3S)-2,3-butanediol")
delay 1
checkchiral("$1,4-dimethylcyclohexane")
delay 1
checkchiral("$cholesterol") // (3S,8S,9S,10R,13R,14S,17R) and sidechain R


JmolVersion="14.11.3" // 2017-04-06

bug fix: partial bond order for orders > 3 not working
 -- for example: connect {_C} {_C} partial 5.3
bug fix: NBO MODEL loading with no file name goes to wrong directory
bug fix: NBO job names need to be cleaned and set if necessary
bug fix: some sort of bad build for DSSR 

JmolVersion="14.11.2" // 2017-04-04 

bug fix: NBO fixes
bug fix: backboneSteps moved to cartoonSteps
    // order of checking for TRUE is:
    // cartoonBlocks, cartoonBaseEdges, cartoonSteps, cartoonLadders, cartoonRibose

JmolVersion="14.11.1" // 2017-04-03 

bug fix: set cartoonBlocks; set cartoonBlockHeight x.x
 -- needs to be cartoon, not backbone (needs to be single-monomer based)
 -- replaces set backboneBlocks; set backboneBlockHeight x.x from 14.11.0
 -- for nucleic only
 -- overrides set cartoonSteps and cartoonBaseEdges
 -- uses DSSR data if present (using calculate structure DSSR or load =xxxx/dssr)
 -- displays a DSSR block for each base based on dssr.nts.frame
 -- x.x is height of box in Angstroms (default 0.5)
  
bug fix: NBO communications upgrade - still has bug in NPA atom charge query

JmolVersion="14.11.0" // released 4/1/2017

new feature: color NUCLEIC
 -- for nucleic only (others will be grey)
 -- based on DSSR nucleic color scheme:
      G green, C yellow, A red, T blue, U cyan
      
new feature: set backboneBlocks; set backboneBlockHeight x.x
 -- but see bug fix above
 -- for nucleic only
 -- overrides set backboneSteps
 -- uses DSSR data if present (using calculate structure DSSR or load =xxxx/dssr)
 -- displays a DSSR block for each base based on dssr.nts.frame
 -- x.x is height of box in Angstroms (default 0.5)
  
new feature: color property DSSR type
 -- where type is one of: 
	bulges
	coaxStacks
	hairpins
	hbonds
	helicies
	iloops
	isoCanonPairs
	junctions
	kissingLoops
	multiplets
	nonStack
	nts
	pairs
	ssSegments
	stacks
	stems
 -- color is based on index into the list of the given structures
 -- 0 (not of that structure), 1 (first entry), 2 (second entry), etc.
 -- for example:
    
		    load =4fe5/dssr
		    backbone -0.5;set backboneSteps;
		    color property dssr junctions
            color {color=red} grey   // just making "not this type" grey instead of red
    
    [ most bases are grey, but one region is green and one region is blue ]


bug fix: drag-drop of PDB file with isolated nucleic acids gives odd unbonded look
bug fix: set drawPicking TRUE does not report pending measurement
bug fix: DSSR calculation should reset after atom coordinate changes
bug fix: using Jmol.scriptWait() within a callback will not work, as it will overwrite the currently running eval object
 

JmolVersion="14.10.0" // released 3/25/2017

new feature: x = {*}.find(smartsString,"map")
 -- returns an array of arrays of atom indices (0-based)
 -- indicates exact correlation between atoms in {*} and atoms of smartsString
 -- only unique sets of atoms are found, not every possibility
 -- for example:
 
      load $caffeine
      print {*}.find("*1*****1", "map").format("JSON")

        [ [ 0,2,4,6,11,12 ] ]

new feature: SELECT @x  where x is an array of integers or array of array of integers
 -- selects atoms from array rather than from a bitset
 -- note that variable must be used, as SELECT [1,2,3] would look for PDB group "1,2,3"
 -- for example:

      load $caffeine
      x = {*}.find("*1*****1", "map")[0]
      select @x
      
        6 atoms selected

new feature: DRAW polygon @face @points 
 -- draws a filled polygon based on arrays of atom indices
 -- @face is an array of integers, not necessarily wound correctly
 -- @points is an atom bitset or an array of points (optional, defaults to {*}
 -- for example:

 	  load $p4
	  x = {*}.find("*1**1","map");
	  draw ID p4r polygon @{x[1]} color red
	  draw ID p4b polygon @{x[2]} color blue
	  draw ID p4y polygon @{x[3]} color yellow
	  draw ID p4g polygon @{x[4]} color green


new feature: DRAW polyhedron @faces @points 
 -- draws sets of polygons based on arrays of atom indices
 -- @faces is an array of array of integers, not necessarily wound correctly
 -- @points is an atom bitset or an array of points (optional, defaults to {*}
 -- for example:

  	  load $caffeine
	  draw polyhedron @{{*}.find("*1****1||*1*****1","map")}

 	  load $p4
	  draw ID p polyhedron @{{*}.find("*1**1","map")} color red

new feature: POLYHEDRON ID xxx @faces @points
 -- @faces is an array of array of integers, not necessarily wound correctly
 -- @points is an atom bitset or an array of points (optional, defaults to {*}

  	  load $p4
	  polyhedra ID p4 @{{*}.find("*1**1","map")}
        
new feature: 4-order bond in MOL file using 14 for bond order
 -- Jmol extension for MOL file format to allow 4-bond
 -- example: [Re2Cl8](2-)
 -- see https://en.wikipedia.org/wiki/Quadruple_bond
 
new feature: 5-order bond in MOL file using 15 for bond order
 -- Jmol extension for MOL file format to allow 5-bond
 -- example: [Mo2Cl8](4-)
 -- see https://en.wikipedia.org/wiki/Quintuple_bond 

new feature: 6-order bond in MOL file using 16 for bond order
 -- Jmol extension for MOL file format to allow 6-bond
 -- example: Mo2
 -- see https://en.wikipedia.org/wiki/Sextuple_bond 

new feature: load "=xxxx/dssr--xxx=yyy"
 -- allows adding specialized options to dssr
 -- --xxx=yyy added on to &opt= search item
 
bug fix: DSSR fix for multi-model PDB file
bug fix: DSSR - 4fe5 HPA ligand causes set backboneSteps true to fail
bug fix: EXIT command with -n command line flag does not exit Jmol
bug fix: echo renderer may not show correct font size
bug fix: POLYHEDRA ID id OFFSET {x y z} broken
bug fix: ScriptManager debug output being sent even if -i (silent) command line option set.

JmolVersion="14.9.1"  released 2/19/2017


bug fix: bad release file for 14.9.0

JmolVersion="14.9.0"

new feature: connect NBO <nbotype>
    - connect atoms in the currently visible model using a resonance structure configuration found in an NBO .46 or .nbo file
	- where <nbotype> is one of alpha|beta|46|46a|46b|nrtstr_n|nrtstra_n|rs_n|rsa_n|rsb_n
	 
new feature: label %[nbo];
    - label an atom using a resonance structure configuration found in an NBO .46 or .nbo file
    - requires a previous connect NBO

new feature: set nboCharges (default true)
  - determines whether formal charges are also displayed with LABEL %[nbo]
  
new feature: quintuple and sextuple bonds.
  -- connect @1 @2 quintuple
  -- connect @1 @2 sextuple
  -- readily saved in state
  -- adding MOL file bond type 15 and 16 for these -- a bit of a hack, of course.

new feature: Viewer.runScriptCautiously(String) replacement name for older Viewer.runScript(String)
 
new feature: plugin main menu item.
 - allows integrated additions to Jmol 
 - Just has NBO at this time; could have more, as it is a simple interface.
 - created automatically from reading org/openscience/jmol/app/plugins/plugin.properties,
   which just contains a list of name=class  pairs:
   
     # plugin.properties

     NBO=org.gennbo.NBOPlugin
   
new feature: startup options -U nbo  or --plugin nbo
 - starts Jmol in NBO mode, as if the Plugins...NBO menu item had been clicked
 - could be generalized, but do not that more than just nbo in place at this time
 - case insensitive
 
new feature: NBO n BETA  - for GenNBOReader nth beta orbital; could be expanded 
 
bug fix: SHOW CHEMICAL JME (from NCI CIR) does not properly return formal charges

bug fix: JSpecView, when open in application, does not allow ZAP

bug fix: draw POINTGROUP crashes Jmol if model is not first model

bug fix: DRAW circle rendering broken (load $2-butene ; draw pointGroup)

bug fix: NBO/ISOSURFACE command - Displaying BETA orbitals for NBO types (NHO, PNBO, etc.) that
         are from a file other than the current file causes read failure and no orbital display.   

bug fix: Viewer.runScript(String) now uses evaluateExpression(T[])

Lesson learned: Never mix viewer.runScript() and viewer.runScriptQueued() calls. 
                What will happen is that the unqueued calls will corrupt the 
                queued calls. However, if you use viewer.evaluateExpression("script('....')"), 
                that is also synchronous, and it uses a new ScriptEval() to isolate it from
                the script being queued. You still have the problem that the scripts could 
                mess up each other, but at least it will not cause catastrophic failure.
                

bug fix: *.CA should pick up calcium in a PDB file

bug fix: cfi format (for NBOPro) writing broken
  - from using the command
  
      x = data({*}, 'cfi')
   
bug fix: La and Ac should be in transitionmetal

bug fix: GenNBO reader not recognizing FILTER "BETA"

code: NBO options extended using the NBO VIEW or NBO OPTIONS "..." command options 

  protected boolean jmolOptionNOZAP = false; // do no zap between modules
  protected boolean jmolOptionNOSET = false; // do not use NBO settings by default
  protected boolean jmolOptionVIEW = false;  // present only the VIEW option
  protected boolean jmolOptionNONBO = false; // do not try to contact NBOServe

noting previously undocumented:

 set fontscaling true; font label 10 arial plain 0.020
 
  - last number is a fontscaling factor that allows one to set a font size for
  - labels in angstroms. Roughly, this pointSize * factor is in Angstroms.
  - if label is changed, one must use set fontscaling FALSE; label .... ; fontScaling TRUE;
   

JmolVersion="14.8.1"

bug fix: isosurface color "user" as an equivalent to isosurface colorscheme "user" broken
bug fix: color isosurface range 1 122  ignores preset isosurface color scheme and just uses the default color scheme


JmolVersion="14.8.0"

JmolVersion="14.8.0-beta-2016-12-17"

Release Note: switching to semantic versioning (http://semver.org/)
Release Note: When releasing beta version, append "-beta-YYYYMMDD"

Release Note: new features listed are since first release of 14.5.4 (2016.04.30)

new feature: set echo OFFSET {sx sy sz}
 -- sets the echo offset to a specific screen Angstrom offset

new feature: set echo OFFSET [mode sx sy sz ax ay az] never implemented
 -- see set labelOffset
 
new feature: set labelOffset [mode sx sy sz ax ay az] (3.1.15, never documented)
   
   set labelOffset [sx, sy, sz]
   set labelOffset [mode, sx, sy, sz, ax, ay, az]
   
 where
   
   sx,sy,sz are screen coord offsets 
    -- applied after view rotation
    -- sy > 0 LOWERS label
   ax,ay,az are xyz position (in Angstroms; applied before view rotation)
   mode == 0 indicates xyz position is absolute and sx sy sz are Angstroms
   mode == 1 indicates xyz position is relative to atom position and sx sy sz are Angstroms
   mode == 2 indicates xyz is absolute, and sx sy sz positions are screen pixels
   mode == 3 indicates xyz is relative, and sx sy sz positions are screen pixels
   defaults: mode == 1; ax = ay = az = 0
   
new feature: fully implemented CIF 2.0 reader

new feature: MagCIF reader upgraded to new IUCr standard 
 -- first CIF 2.0 format implemented by IUCr
 -- see http://comcifs.github.io/magCIF.dic.html

new feature: x = getProperty("cifInfo", "c:/temp/test.cif")
 -- reads CIF file data in structured format
 -- automatically uses CIF 1.0 or CIF 2.0, as needed.
 -- if file name is missing, uses current model file
 
new feature: autocalculation of MMFF94 partial charges
 -- isosurface ... map MEP
 -- DIPOLE MOLECULAR 
 -- no need to preface these with CALCULATE PARTIALCHARGE

new feature: 3DPrinter-compatible VRML and STL writing.
  -- mesh only; does not use high-level objects Cone, Cylinder, Sphere
  -- extensive use of dEF and USE for small-footprint VMRL files
  -- STL is binary generally, but will be ASCII using SET DEBUG TRUE
  -- write t.wrl
  -- write t.stl

new feature: measure ID "test" radius 0.0 font 15.0 SansSerif Plain align CENTER @1 @2 "test"
 -- radius 0.0 turns off line (optional)
 -- font... sets font (optional)
 -- align [left|right|center|none] sets text alignment (optional) 
 -- requires ID 

new feature: allowance for external app loading of binary (mmtf) files
  or any other file using a simple interface:
  Viewer.openReader(fullPathName, reader)
 
new feature: Jmol reads PyMOL 1.8 PSE files with "set dump_binary, 1"

new feature: load AUDIO audiofilename
 -- Java and JavaScript applet can read WAV, MP3, and OGG files
 -- application can read WAV files]
 
new feature: settable chain string using {atomset}.chain = "xxx"

new feature: set hiddenLinesDashed
 -- when set TRUE, hidden lines in unit cells and boundbox are rendered as dashed lines.
 -- default is FALSE
 
new feature: polyhedron -x.x ....
 -- sets maximum radius for gap calculation to be x.x
  
new feature: $pbz1_1_.getProperty(x) where x is "info", 
              "faces", "faceTriangles", "faceCount",
              "face_areas", "face_types", "face_points",
              "vertices", ...more... 
  -- polyhedra informationoru

new feature: unitcell("a=...,b=...,c=...,alpha=...,beta=...,gamma=....")
 - array of center and three vectors
 - example:
 $ print unitcell("a=10,b=10,c=20,alpha=90,beta=90,gamma=129")
{0.0 0.0 0.0}
{10.0 0.0 0.0}
{-6.293203 7.7714605 0.0}
{-8.742278E-7 -1.8328565E-6 20.0}

new feature: load ... unitcell "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."

new feature: unitcell "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."
  -- only the numbers are read; everything else is ignored, so order is important here
  -- uses the format created by show unitcell/a

new feature: unitcell RECIPROCAL 2  
  -- as integer, multiples of pi
  

new feature: polyhedra AUTO ...
  -- sets polyhedron radius automatically, using "MAXIMUM GAP" rule
  -- see Zur Abgrenzung der Koordinationssphäre und Ermittlung der Koordinationszahl in Kristallstrukturen
         G. O. Brunner, D. Schwarzenbach, Zeitschrift für Kristallographie - Crystalline Materials, 1971, vol 133, issues 1-6 127-133
         http://www.degruyter.com/view/j/zkri.1971.133.issue-1-6/zkri.1971.133.16.127/zkri.1971.133.16.127.xml?rskey=sfBNTx&result=1

new feature: unitcell reciprocal x.x
  -- allows scaling of reciprocal cell, similar to unitcell("reciprocal", x.x)

new feature: write CIF
  -- just a very simple CIF file, P1 format
  -- allows writing a simple CIF file with changed coordinates after a UNITCELL command
    
new feature: full implementation of OpenSMILES and OpenSMARTS in Jmol
  see http://opensmiles.org and http://www.moldb.net/opensmarts

new feature: C13 NMR prediction from http://www.nmrdb.org/service/jsmol13c?smiles=CCCC
 -- although we send MOL file, not SMILES here.
 -- actuated with
 
   SHOW NMR H1   // H1 1H H or just SHOW NMR all default to this
   SHOW NMR C13  // or C or 13C
   SHOW NMR none // close JSpecView

new feature: Jmol now implements a way of indicating atropisomer chirality. 
 -- measured dihedral angle is clockwise-positive front-to-back, as for Jmol dihedrals
 -- matching with {*}.find("SMILES","...a^nm-a...") where n and m are 1, 2, or 3  
    indicate first, second, or third, respectively, and indicate which bonds of 
    the biaryl bond, as written, are to the reference atoms.
 -- for example:
 
   $ load $biphenol
   $ connect @{@7|@8} @{@1|@2} atropisomer
   $ print {*}.find("SMARTS","c1(O)ccccc1^23-c2c(O)cccc2")
 
  ({0:13})
  
  Explained below.
    
new feature: CONNECT {pair1} {pair2} ATROPISOMER
 -- creates a new bond of type atropisomer (bond chirality in biaryl systems)
 -- each pair must include the bonded atom and its reference connected atom
 -- example:
 
   $ load $biphenol
   $ connect @{@7|@8} @{@1|@2} atropisomer
   $ getProperty bondinfo[7].type
   
   bondinfo[7].type	"atropisomer_23"
  
new feature: BONDORDER ATROPISOMER_nm
  -- not for general use; will be found in state file
  -- for example:
  
    select BONDS ({6});
    bondOrder atropisomer_23;

new feature: Jmol SMILES bond atropisomerism ^nm- and ^^nm-
 -- indicates atropisomerism (bond chirality in biaryl systems)
 -- ^ and ^^ for bonds similar to @ and and @@ for atoms
 -- n and m are single-digit bond selectors, generally one of 1, 2, or 3
 -- n = 1/2/3 means "reference atom is first/second/third bonded 
 -- ^- and ^^- same as ^22- and ^^22-, respectively
 -- example: 
   
   $ load $biphenol
   $ connect @{@7|@8} @{@1|@2} atropisomer
   $ print {*}.find("SMARTS","c1(O)cccc{c1^23-c2}c(O)cccc2")
   
   ({1 6})

  Here the "^23-" refers to the two carbons with connected oxygen atoms, because the second
  bond listed for the carbon on the left is to the c1(O) atom, and the third bond listed for
  the carbon on the right is to the other c(O) atom. Note that bond numbering includes the 
  implicit bond to the atom coming from the atom on its left, which for the second carbon, 
  starts with the atropisomeric bond itself, at least in this case. 

             1*23  1*23
     c1(O)ccccc1^23-c2c(O)cccc2
                                      

JmolVersion="14.7.5_2016.12.17"

bug fix: incorrect referencing of pt.fxyz and pt.xyz when unit cells have offsets 

JmolVersion="14.7.5_2016.12.06"

bug fix: DSSR final touches

 -- see https://chemapps.stolaf.edu/jmol/docs/misc/JmolSQLforDSSR.pdf
 
    After loading a file from the PDB with the /dssr attribute:

    LOAD  =1ehz/dssr

	The associative array _M.dssr holds the DSSR information. This array has the following main keys and subkeys of interest to this discussion:
		
	bulges
	coaxStacks
	coaxStacks.stems
	hairpins
	hbonds
	helicies
	helicies.pairs
	iloops
	isoCanonPairs
	junctions
	kissingLoops
	kissingLoops.hairpins
	multiplets
	nonStack
	nts
	pairs
	ssSegments
	stacks
	stems
	stems.pairs
	
	Each key or subkey is itself an array of associative arrays. For example, 
	
	LOAD =1ehz/dssr
	PRINT _M.dssr.stems.length
	PRINT _M.dssr.stems[1].pairs.length
	PRINT _M.dssr.stems[1].pairs[1]
	PRINT _M.dssr.pairs.select("where name='Imino'")
	PRINT _M.dssr.pairs.select("where name != 'WC'").count
	PRINT _M.dssr.coaxStacks[1].stems.select("where strand1='GACAC' or strand2='GACAC'")[1].pairs.count
	x = "GACAC"
	PRINT _M.dssr.coaxStacks[1].stems.select("where strand1=x or  strand2=x")[1].pairs.count
	SELECT  "|1|A|A|44||||"
	SELECT  @{_M.dssr.pairs.select("where name != 'WC'")}
	SELECT ON within(dssr, "nts")
	SELECT ON within(dssr, "nts[WHERE v0>17 and v1 <-39]")
	SELECT ON within(dssr, "nts.2")
	SELECT ON within(dssr, "nts[WHERE v0>1 and v1 <0].2")

JmolVersion="14.7.5_2016.12.02"

new feature: fully implemented CIF 2.0 reader

new feature: x = getProperty("cifInfo", "c:/temp/test.cif")
 -- reads CIF file data in structured format
 -- automatically uses CIF 1.0 or CIF 2.0, as needed.
 -- if file name is missing, uses current model file
 
JmolVersion="14.7.4_2016.11.28"

new feature: MagCIF reader upgraded to new IUCR standard 
 -- see http://comcifs.github.io/magCIF.dic.html
 -- only required these two key changes:

    // old: _magnetic_space_group.transform_from_parent_Pp_abc
    // new: _parent_space_group.child_transform_Pp_abc

    // old: _magnetic_space_group.transform_to_standard_Pp_abc
    // new: _space_group_magn.transform_BNS_Pp_abc
      
JmolVersion="14.7.4_2016.11.22"

new feature: adds MagCIF reader based on http://comcifs.github.io/magCIF.dic.html
new feature: adds CIF array [...] reading (as a string only; reader needs to parse this) 

JmolVersion="14.7.4_2016.11.05"

bug fix: miscalculates vector scale and direction for incommensurate modulation of magnetic spin  
bug fix: MoleculeInfo.nElements incremented by number of elements on each subsequent call rather
    rather than being properly reset to zero before recalculating.
    
JmolVersion="14.7.4_2016.11.02"

bug fix: load x.cif {1 1 1} (where that file has no unitcell) throws a loading error

JmolVersion="14.7.4_2016.10.26"

bug fix: POV-Ray output spheres too large -- somehow broken in 14.6.4_2016.10.15 

JmolVersion="14.7.4_2016.10.23"

code: netscape.jar references isolated to org.jmol.applet.Jmol

JmolVersion="14.7.4_2016.10.21"

bug fix: menu item for X3D export delivers STL; item for STL not functional 
bug fix: X3D export includes extraneous VRML text
bug fix: load "@x" not saved in state properly
bug fix: IDTF exporter broken in Jmol 14.7.4_2016.10.02

JmolVersion="14.7.4_2016.10.15"

bug fix: (JSmolJavaExt.js) JSmol/HTML5  WRITE xxx.stl not working.
bug fix: STL export can place two endcaps in the same location

JmolVersion="14.7.4_2016.10.09"

new feature: autocalculation of MMFF94 partial charges
 -- isosurface ... map MEP
 -- DIPOLE MOLECULAR 
 -- no need to preface these with CALCULATE PARTIALCHARGE

bug fix: MOL and V3000 readers should add implicit partial charges of 0 when only some partial charges are given  

bug fix: fine lines or dots rendered around boxes in ROCKETS 

bug fix: SET MEASUREMENTS x.x  is 10x too wide

bug fix: MO command does not allow SQUARED with PLANE
bug fix: MO command SQUARED does not reset cutoff to its square
bug fix: MO command does not preserve SQUARED after PLANE command

bug fix: MOLDEN reader does not accept [MOLDEN FORMAT]

bug fix: WRL/X3D/STL surface closure for rockets, cartoons, polyhedra, ellipsoids, geosurface, draw
bug fix: triangle renderer miscalculates z-index, causing some hidden triangle bits to show

code: refactoring of line rastering improves efficiency

JmolVersion="14.7.4_2016.10.02"

new feature: 3DPrinter-compatible VRML and STL writing.
  -- mesh only; does not use high-level objects Cone, Cylinder, Sphere
  -- extensive use of dEF and USE for small-footprint VMRL files
  -- STL is binary generally, but will be ASCII using SET DEBUG TRUE
  -- write t.wrl
  -- write t.stl

JmolVersion="14.7.3_2016.09.29"

bug fix: COD CIF files have mixed-lower case atom labels (H5a) in bonds def, causing Jmol to miss bonds.
bug fix: rogue System.out.println for text rendering.

JmolVersion="14.7.3_2016.09.21"

bug fix: print compare({1.1}, {2.1}, "MAP", "H") broken in 14.6.0_2016.06.14

JmolVersion="14.7.3_2016.09.18" released

new feature: show chemical formula reads formula from CIF

bug fix: write MENU broken for non-English language (UTF-8 strings not correctly encoded using base64)
bug fix: write PNGJ should not store "#_DOCACHE_" in PNGJ file
bug fix: JSmol echo image loading from PNGJ can fail
bug fix: load "" after pasting in structure to load fails

JmolVersion="14.7.2_2016.09.12"

new feature: measure ID "test" radius 0.0 font 15.0 SansSerif Plain align CENTER @1 @2 "test"
 -- radius 0.0 turns off line (optional)
 -- font... sets font (optional)
 -- align [left|right|center|none] sets text alignment (optional) 
 -- requires ID 

JmolVersion="14.7.2_2016.09.01"

bug fix: show vdw USER broken
bug fix: COMPARE {1.1} {2.1} SMILES  should be ignoring stereochemistry
bug fix: CIF subsystem reader broken

JmolVersion="14.7.2_2016.08.30"

bug fix: SMILES comparison of two strings will report incorrect stereochemistry

JmolVersion="14.7.2_2016.08.29"

bug fix: load FILES does not deliver _modelFileName for individual models
bug fix: NCI/CADD reader not escaping "\" in SMILES (javajs.util.PT.escapeUrl)

JmolVersion="14.6.2_2016.08.28"
syncronized and released as 14.6.2_2016.08.28

new feature: allowance for external app loading of binary (mmtf) files
  or any other file using a simple interface:
  Viewer.openReader(fullPathName, reader)
 
bug fix: RCSB -> https  "https://files.rcsb.org/download/%FILE.pdb"

bug fix: EBI sites to https
bug fix: Spartan 16 reader may have empty first model
bug fix: 2D model show SMILES uses @SP -- should be /nostereo/ based on _.dimension == "2D"
bug fix: NCI/CADD now requires "get3d=true" not "get3d=True"

code: Unit test includes binary types PyMOL and MMTF

JmolVersion="14.7.1_2016.08.20"

feature change: updated links to EBI electron density maps (formerly Uppsala; for isosurface "*xxxx")

    "pdbemap", "http://www.ebi.ac.uk/pdbe/coordinates/files/%file.ccp4",
    "pdbemapdiff", "http://www.ebi.ac.uk/pdbe/coordinates/files/%file_diff.ccp4"

code: recoding in javajs.util.Measure.calculateQuaternionRotation (Andrew Hanson) 

JmolVersion="14.7.1_2016.08.11"

bug fix: PyMOL dump_binary file reading fixes

JmolVersion="14.7.1_2016.08.09"
sycnronized with Jmol 14.6.1
bug fix: upgrade of RCSB mmtf format reading to version 0.2 specs

  	       load =2tbv.mmtf {1 1 1} filter "biomolecule 1;*.ca"


JmolVersion="14.7.1_2016.08.08"

new feature: Jmol reads PyMOL 1.8 PSE files with "set dump_binary, 1"

JmolVersion="14.7.1_2016.07.29"

bug fix: COMPARE command can fail if an atom has no bonds

JmolVersion="14.7.1_2016.07.24"

bug fix: write x.pdb for multimodel file does not work.

JmolVersion="14.7.1_2016.07.11"

sychronized with Jmol 14.6

bug fix: Jmol SMILES not allowing for insertion-code search
 -- adds "^" for insertion code: [G#129^A.*]
  

JmolVersion="14.7.0_2016.07.06"

bug fix: Jmol can crash on point group calculation for small polyhedra

JmolVersion="14.7.0_2016.06.30"

bug fix: cartoon rendering broken in 2016.06.28

JmolVersion="14.7.0_2016.06.28"

bug fix: using an exporter (write VRML, eg) with cartoonsFancy will break rendering after that
bug fix: after loading PNGJ data, using write FILE crashes Jmol

JmolVersion="14.7.0_2016.06.27"

new feature: load AUDIO audiofilename
 -- Java and JavaScript applet can read WAV, MP3, and OGG files
 -- application can read WAV files]
 

JmolVersion="14.7.0_2016.06.23"

bug fix: nn.? and nn.* are not processed properly as float nn.
         For example: print (35 == 35.? "yes" : "no") cause script exception
         
JmolVersion="14.7.0_2016.06.22"

new feature: settable chain string using {atomset}.chain = "xxx"

bug fix: compare(a,b,"isomer") does not detect ENANTIOMER (broken in 14.5.5)
bug fix: missing error trap for unsettable property setting
bug fix: load models {0 0 1} ... fails in script compiler

JmolVersion="14.7.0_2016.06.21"

bug fix: x3d export shows partial bond as standard bond

JmolVersion="14.7.0_2016.06.14"

bug fix: reading of protein structure for a group that is not in a polymer causes null pointer exception

new feature: set hiddenLinesDashed
 -- when set TRUE, hidden lines in unit cells and boundbox are rendered as dashed lines.
 -- default is FALSE
 
JmolVersion="14.7.0_2016.05.27"

new feature: polyhedron -x.x ....
 -- sets maximum radius for gap calculation to be x.x
  
JmolVersion="14.7.0_2016.05.26"

bug fix: set hermiteLevel -4 allows hermite during mouse move but not spinning
bug fix: QchemReader not 

JmolVersion="14.7.0_2016.05.25"

bug fix: polyhedron faces not generated correctly when postions are very close together (still)
bug fix: polyhedron face areas not calculated correctly

new feature: $pbz1_1_.getProperty(x) where x is "info", 
              "faces", "faceTriangles", "faceCount",
              "face_areas", "face_types", "face_points",
              "vertices", ...more... 
  -- polyhedra information

new feature: print unitcell("a=...,b=...,c=...,alpha=...,beta=...,gamma=....")
new feature: load ... unitcell "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."
new feature: unitcell "a=...,b=...,c=...,alpha=...,beta=...,gamma=...."
  -- only the numbers are read; everything else is ignored, so order is important here
  -- uses the format created by show unitcell/a

new feature: unitcell RECIPROCAL 2  
  -- as integer, multiples of pi
  
JmolVersion="14.7.0_2016.05.24"

bug fix: localization broken due to too-old GNU msgfmt version.
bug fix: splash image not appearing in Jmol application  Help...about Jmol
bug fix: Jmol application Help may not appear at all
bug fix: switching out of hermite "fancy" cartoons doesn't actually do that.
         

code: removing unnecessary	J/api/JmolBioMeshRenderer.js
   -- when I started working with Java2Script, I thought that 
      all references to a class had to be removed and an interface used instead
      if modularization was to work in JavaScript. But it turns out only "new Xxx()"
      will trigger that request. This might be something I changed in j2sjmol.js early 
      on; I cannot remember.  

new feature: polyhedra AUTO ...
  -- sets polyhedron radius automatically, using "MAXIMUM GAP" rule
  -- see Zur Abgrenzung der Koordinationssphäre und Ermittlung der Koordinationszahl in Kristallstrukturen
         G. O. Brunner, D. Schwarzenbach, Zeitschrift für Kristallographie - Crystalline Materials, 1971, vol 133, issues 1-6 127-133
         http://www.degruyter.com/view/j/zkri.1971.133.issue-1-6/zkri.1971.133.16.127/zkri.1971.133.16.127.xml?rskey=sfBNTx&result=1

JmolVersion="14.7.0_2016.05.23"

new feature: unitcell reciprocal x.x
  -- allows scaling of reciprocal cell, similar to unitcell("reciprocal", x.x)

new feature: write CIF
  -- just a very simple CIF file, P1 format
  -- allows writing a simple CIF file with changed coordinates after a UNITCELL command
    
bug fix: calculate pointgroup polyhedra "xxx" does not work
bug fix: draw pointgroup $xxx does not work for named polyhedra
bug fix: named polyhedra set visibility broken
bug fix: colors light(and dark)grey and light(and dark)gray should be synonymous
bug fix: isosurface SILENT should pass that to readers

popup menu: reorganization of color... submenu

JmolVersion="14.7.0_2016.05.17"

new feature: full implementation of OpenSMILES and OpenSMARTS in Jmol
  see http://opensmiles.org and http://www.moldb.net/opensmarts

code: unnecessary org.jmol.util.BNode removed; methods now part of org.jmol.util.Node

new feature: C13 NMR prediction from http://www.nmrdb.org/service/jsmol13c?smiles=CCCC
 -- although we send MOL file, not SMILES here.
 -- actuated with
 
   SHOW NMR H1   // H1 1H H or just SHOW NMR all default to this
   SHOW NMR C13  // or C or 13C
   SHOW NMR none // close JSpecView

new feature: Jmol now implements a way of indicating atropisomer chirality. 
 -- measured dihedral angle is clockwise-positive front-to-back, as for Jmol dihedrals
 -- matching with {*}.find("SMILES","...a^nm-a...") where n and m are 1, 2, or 3  
    indicate first, second, or third, respectively, and indicate which bonds of 
    the biaryl bond, as written, are to the reference atoms.
 -- for example:
 
   $ load $biphenol
   $ connect @{@7|@8} @{@1|@2} atropisomer
   $ print {*}.find("SMARTS","c1(O)ccccc1^23-c2c(O)cccc2")
 
  ({0:13})
  
  Explained below.
    
new feature: CONNECT {pair1} {pair2} ATROPISOMER
 -- creates a new bond of type atropisomer (bond chirality in biaryl systems)
 -- each pair must include the bonded atom and its reference connected atom
 -- example:
 
   $ load $biphenol
   $ connect @{@7|@8} @{@1|@2} atropisomer
   $ getProperty bondinfo[7].type
   
   bondinfo[7].type	"atropisomer_23"
  
new feature: BONDORDER ATROPISOMER_nm
  -- not for general use; will be found in state file
  -- for example:
  
    select BONDS ({6});
    bondOrder atropisomer_23;

new feature: Jmol SMILES bond atropisomerism ^nm- and ^^nm-
 -- indicates atropisomerism (bond chirality in biaryl systems)
 -- ^ and ^^ for bonds similar to @ and and @@ for atoms
 -- n and m are single-digit bond selectors, generally one of 1, 2, or 3
 -- n = 1/2/3 means "reference atom is first/second/third bonded 
 -- ^- and ^^- same as ^22- and ^^22-, respectively
 -- example: 
   
   $ load $biphenol
   $ connect @{@7|@8} @{@1|@2} atropisomer
   $ print {*}.find("SMARTS","c1(O)cccc{c1^23-c2}c(O)cccc2")
   
   ({1 6})

  Here the "^23-" refers to the two carbons with connected oxygen atoms, because the second
  bond listed for the carbon on the left is to the c1(O) atom, and the third bond listed for
  the carbon on the right is to the other c(O) atom. Note that bond numbering includes the 
  implicit bond to the atom coming from the atom on its left, which for the second carbon, 
  starts with the atropisomeric bond itself, at least in this case. 

             1*23  1*23
     c1(O)ccccc1^23-c2c(O)cccc2
                                      
bug fix: MolPRO reader broken

bug fix: Jmol SMILES directive /noaromatic/ should ignore ":" bond type 
bug fix: Jmol SMILES directive /aromaticDouble/ not implemented for SMILES
buf fix; Jmol SMARTS measurements should be required to come after branches
bug fix: Jmol SMILES parser should require connection numbers to be placed prior to branches
bug fix: Jmol SMILES should not allow (.t!50,60,70,80)
bug fix: Jmol SMILES should treat  search("[THR.*][THR.*]") should select all atoms in each group 
bug fix: Jmol SMILES should return ({}) not ERROR if no atoms are involved

code: StateCreator and Shape getStateInfo methods simplified and condensed

JmolVersion="14.5.4_2016.04.30"

new feature: 13C Simulated spectra (but without correlation yet)

bug fix: bondorder command broken in 14.1.8_2014.02.17
bug fix: polyhedra COLLAPSED option in conjunction with UNITCELL breaks rendering
bug fix: "axis" keyword dropped from vocabulary, disabling MOVETO AXIS...

JmolVersion="14.5.4_2016.04.25"

new feature: (JavaScript) Jmol.loadFileFromDialog(jmolApplet0)
 -- asynchronous file loading on demand
 -- can be model file, but can also be script, dssr data - anything
 -- can be a local file or a URL
 -- see dssr.htm
 -- for example: 
   
      Jmol.jmolButton("jmolApplet0", [function(){Jmol.loadFileFromDialog(jmolApplet0)}],"Open File")
 
new feature: setting DSSR on the fly:

   model 1 property dssr "1d66.dssr"   // file containing data
   model 1 property dssr @{load("1d66.dssr")} // actual data
   select iloops
 
bug fix: show spaceGroup can crash after load ... filter "biomolecule 1"

bug fix: load =1auy.cif {1 1 1} does not complete atoms in unit cell 
         for files with noncrystallographic symmetry operations (_struct_ncs...) such as viral capsids

bug fix: load =1auy.cif {1 1 1} filter "BIOMOLECULE 1;*.ca" does not work

code: =xxxx/DSSR path changed to http://dssr-jmol.x3dna.org from http://x3dna.bio.columbia.edu/dssr


JmolVersion="14.5.4_2016.04.24"

new feature: show chemical xxx  where xxx is one of the file types:

     alc cdxml cerius charmm cif cml ctx gjf gromacs hyperchem jme 
     maestro mol mol2 sybyl2 mrv pdb sdf sdf3000 sln smiles xyz     
     
   retrieves this information for the currently selected set of atoms
   from the the NCI CACTVS Resolver. 
   
   Note that the PDB writer is nonstandard, and "SDF" no longer returns
   the 2D mol file, only the 3D mol file.    
   
   Can be used as the show() function: x = show("chemical jme")


new feature: print {*}.find("SMILES/hydrogen/") adds hydrogen atoms

feature note: JSME upgraded to JSME_2015-12-06-2

bug fix: NCI switch to using /sdf for 3D rather than 2D, breaks jsv_predict2.html
  -- requires converting mrv format to jme:
  
		function getJMEHs() {
			var x= show("chemical mrv")
			var x2 = x.split('x2="')[2].split('"')[1].split(' ')
			var y2 = x.split('y2="')[2].split('"')[1].split(' ')
			var el = x.split('elementType="')[2].split('"')[1].split(' ')
			var s =  '' + {*}.size + ' ' + {*}.bonds.size + ' ' + el.join(x2).join(y2).join(' ').replace('\n',' ')
			var b = x.split("<bond ")
			for (var i = 2; i <= b.length; i++) {
				 var bi = b[i]
				 var at = bi.split('atomRefs2="')[2].split('"')[1].replace('a','')
				 var n = (bi.find('>W<') ? -1 : bi.find('>H<') ? -2 : bi.split('order="')[2].split('"')[1])  
				 s += ' ' +  at + ' ' + n
			}
			return s
		}
        load $morphine		
		x = getJMEHs()
		print x
   

bug fix: show VARIABLES broken
bug fix: after load =xxxx/dssr, selection "naChains" is defined, but it is not an atom list
bug fix: hyperchem reader may not interpret aromatic correctly
bug fix: show chemical ... will not use the correct structure if it came from NCI and has been changed via modelKitMode.

code: JmolBioModelSet and BioModel untangled
code: JmolBioModelSet moved to org.jmol.modelsetbio.BioModelSet
code: JmolBioModelSet changed from interface to class
code: unnecessary JmolBioResolver interface removed
  
JmolVersion="14.5.4_2016.04.23"

FEATURE CHANGE: Jmol 14.5.4_2016.04.23 by default will implement DSSP 2.0 as described in
                Int. J. Mol. Sci. 2014, 15, 7841-7864; doi:10.3390/ijms15057841
                and implemented at http://www.cmbi.ru.nl/dssp.html.  
	            This change only affects helices that have bulges, indicating them
	            more appropriately as pi helices rather than alpha helices.  
	            
	            The original version of DSSP, "DSSP 1.0" will be available using 
	            
	            calculate structure DSSP 1.0
	            show DSSP 1.0
	            load ... filter "DSSP1"
	            
	            This change is for 14.5 only, not 14.4, which remains DSSP 1.0

code: unnecessary org.jmol.modelset.JmolBioModel interface removed
code: unnecessary org.jmol.api.DSSPInterface removed
code: DSSP 1.0/2.0 switch in ModelLoader only necessary while 14.4 and 14.5 are being compiled in parallel

JmolVersion="14.5.4_2016.04.22"

bug fix: on loading, crystallographic file reading fails when applying symmetry
bug fix: on loading, user-defined space groups using Hall symbol fails
bug fix: SHELX reader broken


JmolVersion="14.5.4_2016.04.21"

bug fix: CIF files with missing tags that Jmol needs fail to load at all. 
         (Not necessarily a bad thing, but it is not supposed to fail so dramatically.)
bug fix: mmCIF/mmTF reader does not complete symmetry for biomolecules when there is a lattice.
         for example: 
	     
  	       load =2tbv.mmtf {1 1 1} filter "biomolecule 1;*.ca"
  	       backbone off; spacefill 200%
  	       color property symop

bug fix: mmCIF, PDB, and mmTF readers with lattice indicated does not show unit cell

JmolVersion="14.5.4_2016.04.19"

new feature: preliminary MMTF reader 
  -- MacroMolecular Transmission Format (MMTF, from RTSB)
  -- see https://github.com/rcsb/mmtf/blob/master/spec.md#overview
  -- binary format for file transfer and molecule construction
  -- uses MessagePack binary JSON format
  -- entirely experimental; not for general consumption
  -- biomolecule processing works
  -- DSSP secondary structure is read
  
 *
 * JmolData RCSB MMTF (macromolecular transmission format) file reader
 * 
 * see https://github.com/rcsb/mmtf/blob/master/spec.md
 * 
 * /full/ specification as of 2016.4.18 is implemented,including:
 * 
 * reading atoms, bonds, and DSSR secondary structure
 * 
 *   load =1f88.mmtf 
 *   
 * 
 * reading space groups and unit cells, and using those as per other readers
 * 
 *   load =1crn.mmtf {1 1 1} 
 * 
 * reading bioassemblies (biomolecules) and applying those transformations
 * 
 *   load =1auy.mmtf FILTER "biomolecule 1;*.CA,*.P"
 * 
 * reading biomolecules and lattices, and loading course-grained
 * 
 *   load =1auy.mmtf {2 2 1} filter "biomolecule 1;bychain";spacefill 30.0; color property symop
 * 
 *

bug fix: certain viral capsid CIF files will fail to load due to this line: XAU '(X0)(1-10,21-25)' A,B,C 
bug fix: DSSR selection includes too many atoms
bug fix: PSE reader broken in JmolData.jar; no issue with Jmol.jar or JSmol 
bug fix: PSE reader for Pymol 1.7.5 files may not set some models visible
bug fix: PSE reader not processing (sele) and related selections

new feature: set window width height
new feature: set window [width height]
new feature: set window "xxx.png"
 
new feature: getProperty("shapeInfo.echo") 
 -- a 1-length array (because all shapeInfo results are arrays
 -- shapeInfo.echo[0] contains an associative array based on echo names
 -- currently only include keys name, imageWidth, imageHeight, and imageFile
 
	$ set echo myecho image 'http://noys3.weizmann.ac.il/a2jb/browse?sn=testSet/dna-a/pymol.png'
	$ print getProperty("shapeInfo.echo[0]")
	{
	  "myecho"  :
	  {
	    "imageFile"  :  "http://noys3.weizmann.ac.il/a2jb/browse?sn=testSet/dna-a/pymol.png"
	    "imageHeight"  :  500
	    "imageWidth"  :  500
	    "name"  :  "myecho"
	   }
	 }
 
 -- idea is to allow access to image dimensions for any file image
 -- for example, for a MacPyMOL session file, because those do not contain width and height information,
    we don't have the width and height we need to recreate the model window and associated Jmol image,
    but we can also read the associated PyMOL-generated PNG file and get the dimensions that way 

	    load 'xxxx.pse' filter 'DORESIZE;DOCACHE'
	    set echo myecho image 'xxxx.png'
	    var a = getProperty('shapeInfo.echo[0].myecho')
	    set echo myecho off
	    write PNGJ @{a.imageWidth} @{a.imageHeight} 'xxxx-jmol.png'
    
    thus temporarily loading the PyMOL image just long enough to get its dimensions; not actually viewing it

bug fix: SET nihResolverFormat   does not work; using "=" does work.
		 (There should be no reason to set this; Jmol is automatically changing those to "https".)

JmolVersion="14.5.4_2016.04.14"

bug fix: Jmol 14.5.4_2016.04.13 will fail to read PDB files from scripts referencing http://www.rcsb.org/pdb/
 -- does not affect http://www.rcsb.org/pdb/ligand 
 -- does not affect load =xxxx or load ==xxx
 -- does not affect PNGJ files
 -- only affects scripts that specifically reference that site (e.g. state scripts created prior to 4/13/2016)

bug fix: selection of dssr elements using select within(dssr,"pairs[where...]") is not working
 -- example after fix:
    $ load =1d66/dssr
	$ print _M.dssr.pairs.select("where bp='G-C'")[1]
	{
	  "DSSR"  :  "cW-W"
	  "LW"  :  "cWW"
	  "Saenger"  :  "19-XIX"
	  "bp"  :  "G-C"
	  "index"  :  3
	  "name"  :  "WC"
	  "nt1"  :  "|1|D|DG|3||||"
	  "nt2"  :  "|1|E|DC|36||||"
	 }
   $ select within(dssr,"pairs")
   773 atoms selected
   $ select within(dssr,"pairs[where bp='G-C']")
   243 atoms selected
   $ select within(dssr,"pairs[where name='WC']")
   691 atoms selected
   
 -- Note that this works because SELECT can find unit ids ("|1|E|DC|36||||") in any string. 
    For example:
    
    $ select "|1|E|DC|36||||"
    19 atoms selected
    


JmolVersion="14.5.4_2016.04.13"

bug fix: JSmol cannot load RCSB ligand files
bug fix: "axis" unintentionally made reserved word in "14.4.4_2016.03.19"
bug fix: symop(@1 @2) broken
bug fix: symop() taking default unitcell from "current" -- should be that it
         REQUIRES a prefix "{xxx}." if @1 or @2 are not indicated and there are 
         multiple models (because it is a general function, not a script command).
         
bug fix: models from PyMOL reader do not save atom colors in state when balls are colored

new feature: "$isosurface1".getProperty("atoms") 
 -- returns atoms associated with this surface
 -- for example, the atoms used to make a molecular surface
 
 
 
new feature: show xxx /yyy 
  -- filters any SHOW command for lines containing "yyy" (case insensitive)
  -- examples:
  
  	$ show symop/glide
  	$ show set/zoom
  	$ show state/draw
  	$ show file "test.xyz" /H
  	$ show file "/remark 900"
  	$ show variables/sym
 
new feature: symop(3,@3,"atom")
  -- returns target atom or atoms 

new feature: show symop 3 @3 "atom"
  -- shows target atom or atoms 

JmolVersion="14.5.4_2016.04.11"

new feature: symop() options:
  symop(op)
    -- returns the 4x4 matrix representation of this operator
  symop(op, atom) 
    -- returns the point generated by operator op on atom
    -- op may be a positive or negative integer indictating the operation (or its reverse)
       to apply from the loaded space group -- for example, symop(3, @1) or symop(-4, {atomindex=16})
    -- op may be a string such as "x+1/2,1/2-y,z" representing a specific generic operation
  symop(atom1, atom2)
    -- returns the description of the first of possibly several operations that take atom1 to atom2, for example:
       "2-fold screw axis|translation: 1/2 0 0" 
  symop(atom1, atom2, n)
    -- returns the description of the nth operation that takes atom1 to atom2
  symop(...point...)
    -- any place an atom can be used in symop(), one can substitute an xyz coordinate. 
    -- for example, symop(@1, {1/2 1/2 1/2})
  {atomset}.symop(...)
    -- when more than one model is loaded, prepending any symop function with an atom set specifies which 
       atoms, space group, and unit cell are being referenced. For example, {2.1}.symop(5) operates only on 
       atoms in the first model of the second loaded file, using the appropriate space group and unit cell. 
       In this way, "@1" will designate one atom only, provided only one model is showing (using the FRAME/MODEL command).
       If only one model has been loaded, there is no need to use this syntax; symop(...) will do the same.  
  symop(..., outputType)
   -- All uses of symop() and {atomset}.symop() can be extended using a final parameter that
     changes the default output described above to be something else. Options for outputType include:

     "draw"    Returns the Jmol script illustrating this operation with DRAW commands. 
     
       $ print symop(3,"draw")
        draw ID draw_* delete
        draw ID draw_frame1X diameter 0.15{5.5172 1.9683 2.7802}{6.5172 1.9683 2.7802} color red
        ...
        
     "full"    Returns the tab-separated Jones-Faithful string and descriptor for this operation.
     
       $ print symop(3,"full")
        -x,-y,-z(mx,my,mz)  	Ci: 0 0 0

     "lattice" Returns the lattice type associated with the space group involving this operation.
     
     "list"    Specifically when two atoms or points are specified, returns a string list of all operations
               taking the first to the second.
               
       $ print symop(@3,@21,"list")
			5	x+1/2,-y+1/2,-z+1/2(-mx,my,mz)	2-fold screw axis|translation: 1/2 0 0|time-reversed
			7	-x+1/2,y+1/2,z+1/2(-mx,my,mz)	n-glide plane|translation: 0 1/2 1/2|time-reversed

               Note that this string can be turned into a standard array using .lines.split("\t",true):

       $ print symop(@3,@21,"list").lines.split("\t",true)
		  [
		    5
		    x+1/2,-y+1/2,-z+1/2(-mx,my,mz)
		    2-fold screw axis|translation: 1/2 0 0|time-reversed
		  ]
		  [
		    7
		    -x+1/2,y+1/2,z+1/2(-mx,my,mz)
		    n-glide plane|translation: 0 1/2 1/2|time-reversed
		  ]

     "array"   Returns an associative array that contains critical information relating to this operation.
     
       $ load =magndata/0.34 
       $ print symop(3,"array")
		{
		  "inversionCenter"  :  {0.0 0.0 0.0}
		  "label"  :  "Ci: 0 0 0"
		  "matrix"  :
		  [
		  [-1.0,	0.0,	0.0,	0.0]
		  [0.0,	-1.0,	0.0,	0.0]
		  [0.0,	0.0,	-1.0,	0.0]
		  [0.0,	0.0,	0.0,	1.0] ]
		  "timeReversal"  :  1
		  "xyz"  :  "-x,-y,-z(mx,my,mz)"
		  "xyzOriginal"  :  "-x,-y,-z,m"
		 }
	 
new feature: show spacegroup/xxxxx

 -- selects lines from a space group report similar to the way show state/xxxx works
 -- example:
 
  load =ams/quartz 1
  show spacegroup/Class
  
new feature: show/draw symop @1 @2
 -- gives full list of matching symmetry operations
 -- example:
 
	$ load =magndata/1.23 {444 555 1} packed
	$ show symop  @153 @299

    1	x+2,y,z2(mx,my,mz)	translation: 2 0 -2
    5	-x,-y,-z(mx,my,mz)	Ci: 0 0 0
    11	x+2,-y,-z(-mx,my,mz)	2-fold screw axis|translation: 2 0 0|time-reversed
    15	-x,y,z2(-mx,my,mz)	c-glide plane|translation: 0 0 -2|time-reversed
		  
new feature: show/draw symop @1 @2 n
 -- shows or draws the nth symmetry operation relating atom 1 to atom 2
 -- example:
 
	$ load =magndata/1.23 {444 555 1} packed
	$ show symop  @153 @299 3

    11	x+2,-y,-z(-mx,my,mz)	2-fold screw axis|translation: 2 0 0|time-reversed
  
new feature: print pointgroup("spacegroup", @1)
 -- analyzes the point group (crystal class) of a crystal. 
 -- uses three irrational-coordinate points to generate all possible operators
 -- creates a map with keys (somewhat variable depending upon axes present):
 
	C2
	C3
	Ci
	Cs
	S6
	detail
	distanceTolerance
	linearTolerance
	nAtoms
	nC2
	nC3
	nCi
	nCn
	nCs
	nS6
	nSn
	nTotal
	name
	points
	principalAxis
    
new feature: draw SPACEGROUP
 -- draws all operations in space group
 
new feature: draw POINTGROUP SPACEGROUP
 -- draws crystal class symmetry operations for a space group
 -- uses point group style, with circular planes 

new feature: @1.find("crystalClass", pt)
  -- generates a list of points based on a model's crystal class (point group)
  -- uses @1 just to find the unit cell and space group
  -- optional pt is used as a generator (defaults to @1)
  -- example:
   load =ams/calcite 1
   x = @3.find("crystalClass")
   print pointgroup(x).name
   draw points @x
   polyhedra ID p {0 0 0} to @x

bug fix: qchem reader fails to switch to spherical D/F basis for second structure
bug fix: pointGroup secondary axis in yellow is too hard to see -- using "orange" instead

JmolVersion="14.5.4_2016.04.05b"

bug fix: unitcell primitive for A,B,C-centered lattices rotated 90 degrees from 
         NRL standard (Michael Mehl, U.S. Naval Research Laboratory)
bug fix: polyhedra COLLAPSED do not have correct normal vectors
bug fix: assocArray.bin() should allow "TRUE" option
bug fix: =mp/24972 not working after switch to https

new feature: adds SHOW SMILES/bio  and {*}.find("SMILES/bio") options:
    /bio              Jmol bioSMILES with header and chain comments
	/bionocomments    no chain comments (but still one header with comments)
	/bioatomcomments  full atom comments
	/biocovalent      indicates covalent S-S crosslinking using ":" notation
	/biohbond         indicates hydrogen bonds using ":" notation
	/biounmatched     allows unmatched rings

new feature: SMILES/nonaromatic same as SMILES/noaromatic
	
JmolVersion="14.5.4_2016.04.03"

bug fix: draw SCALE x.x symop has no effect; good to be able to scale down the arrow
bug fix: draw symop can fail for second call

JmolVersion="14.5.4_2016.03.31"

bug fix: load $xxxx broken; http://cactus --> https://cactus 
bug fix: _geom_bond_distance starting with "." halts CIF file reading

JmolVersion="14.5.4_2016.03.29"

code: ru.po updated (Angel Herraez)

bug fix: SMILES generator still broken in 14.4.4_2016.03.25
bug fix: smiles1.find("SMILES",smiles2) broken in 14.4.3_2016.03.06  

new feature: Polyhedra command allows for min and max radius
  -- polyhedra 2.8 3.0 @3 

bug fix: unitcell PRIMITIVE for rhombohedral groups not implemented
bug fix: unitcell("primitive","R")  not implemented
 
bug fix: WRITE IMAGE with negative width or height should throw a Jmol ScriptException
bug fix: draw ... [x y] does not position properly with antialias true
bug fix: allow AXES TYPE "" or non-recognized to be same as "abc"
bug fix: AXES TYPE "ab" should also be allowed when offset or center is set
bug fix: labels should not change size when creating images of 
         different size than screen when angstromsPerInch != 0.
bug fix: if...BREAK|CONTINUE in unbracketed context does not properly 
         place implicit END IF when TRUE clause is on next line
         AND next statement after that is another IF command:  
            if (xxxx)
              break;
            if (yyyy)
              zzzz;
          becomes
            if (xxxx) {
              break;
              if (yyyy) {
                zzzz;
              }
            }
          instead of
            if (xxxx) {
              break;
            }
            if (yyyy) {
              zzzz;
            }
               

JmolVersion="14.5.4_2016.03.25"

new feature: moveto AXIS <a|b|c|-a|-b|-c> coupled with <1|2|3|4>
 -- indicates direction of axis ("-a" indicates "a pointing away")
 -- and clockwise position 1(top left), 2(top right), 3(bottom right), and 4(bottom left)
 -- defaults a == a1, b == -b1, c == c4 
 -- slight modification of what was released in 03.21

bug fix: JavaScript Jmol.evaluateVar() does not properly escape JSON strings
bug fix: SMILES generator broken in 03.23

JmolVersion="14.5.4_2016.03.24b"


bug fix: axes/unitcell/boundbox appear 10x too thick after recalling from state
 -- broken in JmolVersion="14.5.4_2016.03.21"
 
bug fix: polyhedra fix for overlapping face triangles
bug fix: magnetic spin vector trail disappears when not vibrating
bug fix: magnetic spin vector trail does not reset if set vectorscale <n> where <n> is less than current

JmolVersion="14.5.4_2016.03.24"

bug fix: NCI requires stereochemistry to rings to be prior to a branch:
         C\1(/C)=C\C=C.C/1=C not C(/C)\1=C\C=C.C/1=C
         
new feature: x.bin() method allows return of an array listing both the bound and the count
 -- example:
 
 		$ print {*}.bonds.length.all.bin(1,2,0.1,TRUE).format("json")
		[ [ 1.0,10.0 ],[ 1.1,0.0 ],[ 1.2,0.0 ],[ 1.3,3.0 ],[ 1.4,2.0 ],[ 1.5,1.0 ],[ 1.6,0.0 ],[ 1.7,0.0 ],[ 1.8,0.0 ],[ 1.9000001,0.0 ] ]


new feature: load =magndata/1.1.37
 -- links to the MAGNDATA database at http://webbdcrista1.ehu.es/magndata
 --     "magndata", "http://webbdcrista1.ehu.es/magndata/mcif/%FILE.mcif",
          
new feature: set vectorTrail n
 -- adds a trail onto a modulating vector (as for an incommensurate magnetic spin)
 -- n trails are made, typically in a fan-like pattern that trails the spinning vector
      load =magndata/1.1.37
      set vectortrace 20
      set vibrationperiod 2
      vibration on
      
bug fix: saving a state after using LOAD "" (empty quotes) 
         after pasting data directly into the application creates an unreadable state
 
new feature: unitcell ON  adds #nnn (international table number) to cell description if found 

bug fix: {*}.find("CHEMICAL","NAMES") only reports one name.

code: more efficient identifying space group

JmolVersion="14.5.4_2016.03.22"

bug fix: select picking invertstereo  broken

bug fix: unitcell PRIMITIVE does not work as reported 3/21
bug fix: unitcell("conventional","F") does not work
bug fix: crystal systems with translational symmetry may have duplication of symmetry operators


JmolVersion="14.5.4_2016.03.21"

new feature: axes OFFSET x.x
 -- applies offset of x.x in fractional coordinates in each axis direction
 -- AXES OFFSET -0.1   same as   AXES CENTER {-0.1 -0.1 -0.1/1}
 
new feature: expanded unitcell() function
 -- adds additional types: "A", "B", "C", "I", "F"
 -- default is the lattice type of the model's space group
 -- not just cubic; "BCC" is converted to "I"
 -- for example:
 
	 load =ams/silicon 15 packed   // Cmca
	 draw id "uc" diameter 0.1 unitcell mesh nofill color black
	 unitcell @{unitcell("primitive")}
	 color unitcell red
	 unitcell 0.1
	 axes unitcell
	 axes on

new feature: expanded UNITCELL command to include PRIMITIVE option for any space group

bug fix: SMILES matcher not allowing azulene to be aromatic

bug fix: OpenSMILES matcher not allowing non-chemist Hueckel 4+2 interpretation

bug fix: SMILES generator not adding "-" for biphenyl Ar-Ar bond

bug fix: set picking invertSTEREO  does not work on open-ring systems

bug fix: SMARTS [R] matching all atoms
  
bug fix: dashed lines not visible in measurements, unit cells, and axes 

bug fix: axes 0.01  produces thick 20-pixel-wide lines
 -- solution was to drop that to 0.001 for this effect
 
JmolVersion="14.5.4_2016.03.14"

bug fix: Polyhedra with verticies that are also centers of polyhedra for atoms that were visible
         but are no longer visible do not update screen positions properly

JmolVersion="14.5.4_2016.03.13"

new feature: polyhedra POINTS x.y
  -- adds variable size spherical points at corners of polyhedra
  -- color is that of element, or black
  
new feature: show SMILES/xxxx
 -- xxxx = open, strict, openstrict, mmff94
 
new feature: show chemical NAME
 -- singular "name" gives just the first name; "names" gives full list
 
new feature: full implementation of OpenSMILES aromatic model

new feature: {*}.find("SMILES/open")
 -- generates OpenSMILES string for selected atoms
 -- applies OpenSMILES aromaticity rules for 5-, 6-, and 7-membered rings
 -- not chemical -- allows exocyclic c=C bonds and [nH] in 6-membered rings 
 -- also adds atom class if property_atomClass is nonzero
 -- for example:
 
	$ load $2-butanol
	$ @2.property_atomclass=2
	$ @3.property_atomclass=3
	$ @5.property_atomclass=5
	$ print {*}.find("smiles/open")
	
		C[C@H:2]([OH:5])[CH2:3]C

new feature: /open option for smiles.find("SMILES", pattern)
 -- applies OpenSMILES model of aromaticity
 -- finds aromaticity-normalized pattern "in" aromaticity-normalized smiles
 -- can be after SMILES or as beginning of pattern
	$ print "OC1=CC(N)=CC=C1".find("SMILES","NC1=CC(O)=CC=C1")
	0
	$ print "OC1=CC(N)=CC=C1".find("SMILES/open","NC1=CC(O)=CC=C1")
	8
	$ print "OC1=CC(N)=CC=C1".find("SMILES","/open/NC1=CC(O)=CC=C1")
	8

new feature: compare("smile1","/open/smiles2")
 -- applies OpenSMILES model of aromaticity
 -- checks for match of atom class if present (default value 0 matches "not present")
 -- does aromaticity normalization on both strings
	$ print compare("OC1=CC(N)=CC=C1", "NC1=CC(O)=CC=C1", "isomer")
	CONSTITUTIONAL ISOMERS
	$ print compare("OC1=CC(N)=CC=C1", "/open/NC1=CC(O)=CC=C1", "isomer")
	IDENTICAL

new feature: {*}.find("SMILES/strict")
 -- generates OpenSMILES string for selected atoms
 -- applies standard Hueckel aromaticity rules for 5-, 6-, and 7-membered rings
 -- does not allow exocyclic c=C bonds or [nH] in 6-membered rings 
 -- does not create atom classes
 -- also for compare() and search()
		
new feature: {*}.find("SMILES/open strict")
 -- same as just /strict, but also generates atom classes if present as property_atomClass
 -- also for compare() and search()

new feature: {*}.find("SMILES/mmff94")
 -- applies a very STRICT, chemically meaningful Hueckel 4+2 Rule
 -- adds allowance for only a 1-electron contribution to 6-membered rings (three double bonds)
 -- also for compare() and search()

new feature: optional processing of OpenSMILES [CH2:002] ":<n>" atom class.
 -- positive integer value only
 -- checks the atom property property_atomclass
 -- for SMARTS, [:0] means "without an atomclass"
 -- for SMARTS, [!:0] means "any non-zero atomclass"
 -- for SMARTS, same as [$(select property_atomclass=n)]
 -- only enabled with Jmol SMILES directive "/open/"; otherwise ignored
 -- for example:

	$ load $2-butanol
	$ show smiles

  		C[C@H](O)CC
	
	$ @2.property_atomclass=2
	$ @3.property_atomclass=3
	$ @5.property_atomclass=5

	$ select *
		15 atoms selected
	$ select on search("/open/[:3]")
		1 atoms selected
	$ select on search("/open/[!:3]")
		14 atoms selected
	$ select on search("/open/[:0]")
		12 atoms selected
	$ select on search("/open/[!:0]")
		3 atoms selected
	$ select on search("/open/[!:3 & !:0]")
		2 atoms selected

new feature: UNITCELL TRANSFORM @m4x4
  -- direct 4x4 matrix transformation of a unit cell

new feature: calculate symmetry  polyhedra {atomset}
  -- selectively calculates polyhedra.
  -- for example: calculate symmetry polyhedra {polyhedra(4)}
  
new feature: calculate symmetry  polyhedra id
  -- selectively calculates polyhedra for a given ID.
  -- for example: calculate symmetry polyhedra "poly1"
  

new feature: atom set can be specified in polyhedra() function:
  -- print {2.1}.polyhedra(3)
  -- print {2.1}.polyhedra("....polySMILES string...")
   
new feature: WRITE MOL67 xxx.mol
 -- writes MOL format with bonds of type 6 or 7 (aromatic single/double; rarely significant)


bug fix: SMILES should not be returned with comments for internal processing or sending to PubChem or others
  
bug fix: SHOW chemical SMILES can be off because it was using the name, not the SMILES string
 -- sometimes - e.g. "menthol" - the name has no chirality, but the structure does (of course). 

bug fix: Jmol 14.3.16_2015.09.15 broke first-match-only flag in SMILES mapping
 
bug fix: POLYHEDRA when selection halos are on, all have edges

bug fix: moving of polyhedron will fail if corner of polyhedron is an atom

bug fix: macro functions cannot be used later in same script as a MACRO command
 -- presence of MACRO command now removes check for unknown command name exception

bug fix: Tripos MOL2 reader does not read element symbols properly

bug fix: default write MOL file should not indicate aromatic bond types 6 and 7
 -- corrects the fact that these bonds are reserved for queries
 -- only affects cases where that bond type has been set (after calculate aromatic or loading of ligand CIF files
 

JmolVersion="14.5.4_2016.03.08"

bug fix: OpenSMILES even-atom cumulene stereochemistry not implemented 
 -- examples (reporting "DIASTEREOMERS")
   print compare("F/C=C=C=C/F","F/C=C=C=C\\F","isomer")   
   load $F-C=C=C=C-F;print compare("F/C=C=C=C\\F",{1.1},"isomer")

bug fix: SMILES generator unnecessarily over-expressing double-bond / and \. 
   
new feature: (JSmol) standard InChI generator (see inchi.htm, inchi/*) 
 -- JavaScript library for generation of InChIs
 -- runs completely in JavaScript
 -- equivalent to SHOW CHEMICAL stdinchi
 -- about 900 KB
 

JmolVersion="14.5.3_2016.03.06"

bug fix: Inconsistent use of "DIASTEREOMERS" (preferred) and "DIASTERIOMERS" (incorrect)

JmolVersion="14.5.3_2016.03.05"

bug fix: SMILES TB trigonal bipyramidal stereochemistry not functional
bug fix: SMILES [@TBn] not recognizing n > 2

bug fix: SMILES OH octahedral stereochemistry error
bug fix: SMILES [@OHn] not recognizing n > 2

bug fix: SMILES SP square planar stereochemistry will report ENANTIOMERS rather than DIASTEREOMERS

JmolVersion="14.5.3_2016.03.03b"

bug fix: CIF reader _atom_site_cartn_x incompatible with _geom_bond
 -- this fix now allows Jmol to read very simple CIF files that are equivalent to unlimited-atom MOL files
 -- _ccdc_geom_bond_type is not required, defaulting to S
 -- _ccdc_geom_bond_types include S, D, T, Q (quadruple), and A (aromatic) 
	 
	data_icosahedron
	loop_
	_atom_site_label
	_atom_site_Cartn_x
	_atom_site_Cartn_y
	_atom_site_Cartn_z
	C01  0.0000000000  0.0000000000  9.5105651630
	C02  8.5065080835  0.0000000000  4.2532540418
	C03  2.6286555606  8.0901699437  4.2532540418
	C04 -6.8819096024  5.0000000000  4.2532540418
	C05 -6.8819096024 -5.0000000000  4.2532540418
	C06  2.6286555606 -8.0901699437  4.2532540418
	C07  6.8819096024  5.0000000000 -4.2532540418
	C08 -2.6286555606  8.0901699437 -4.2532540418
	C09 -8.5065080835  0.0000000000 -4.2532540418
	C10 -2.6286555606 -8.0901699437 -4.2532540418
	C11  6.8819096024 -5.0000000000 -4.2532540418
	C12  0.0000000000  0.0000000000 -9.5105651630
	loop_
	_geom_bond_atom_site_label_1
	_geom_bond_atom_site_label_2
	_ccdc_geom_bond_type
	C01 C02 S
	C01 C03 S
	C01 C04 S
	C01 C05 S
	C01 C06 S
	C02 C03 S
	C03 C04 S
	C04 C05 S
	C05 C06 S
	...etc... 


JmolVersion="14.5.3_2016.03.03"

bug fix: after SET echo ALL, background echo ... changes text color, not background color  

JmolVersion="14.5.3_2016.03.02"

bug fix: JavaScript reference to j2s for working gif does not recognize Info.j2sPath

JmolVersion="14.5.3_2016.02.28"

bug fix: cyclic peptides do not complete loop for cartoons, backbone, etc. (1SFI)

JmolVersion="14.5.3_2016.02.27"

bug fix: [function:"yyy",Function:"zzz"] fails to retain key capitalization after first entry for special names
bug fix: (JavaScript only) polyhedra not saved in state
bug fix: (Applet) broken image in coverImage
bug fix: polyhedra DELETE can crash Jmol if polyhedra are not colored 

JmolVersion="14.5.3_2016.02.17"

bug fix: slab/depth SET do not behave properly
bug fix: select VISIBLE is not properly set based on slab/depth SET 

bug fix: _GEOM_BOND reading in CIF files nonfunctional.
 -- broken in 13.3.4_dev_2013.08.21
 -- result is that between 8/21/2013 and 2/15/2016 the CIF reader
    would not recognize _GEOM_BOND and so also not create whole molecules 
    as it was designed to do when those are present.
 -- no impact on states created within this version range 
 -- no impact on mmCIF reader
 -- only impact is upon Materials Studio-generated files such as
    http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt
    (supplemental mat. for http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h)
    See Jmol list discussion: https://sourceforge.net/p/jmol/mailman/message/31308577/
  

JmolVersion="14.5.2_2016.02.14"

FEATURE CHANGE: JSmol default for Info._disableInitialConsole changed to true
 -- no longer necessary with JSmol_spinner.gif 

new feature: j2s/img/JSmol_spinner.gif implemented (Angel Herraez)
 -- as default for Info._appletLoadingImage
 -- use Info._appletLoadingImage = "none" to disable

new feature: j2s/img/cursor_wait.gif animation implemented

bug fix: STRUCTURE statement (utilized in RESTORE STRUCTURE) broken
 -- broken in Jmol 14.4.0_2015.10.30
 
bug fix: EBI assembly CIF files that are multi-model files will be by chain, not by model.
  -- result was that each chain became a new model
  -- for example: see http://www.ebi.ac.uk/pdbe/static/entry/download/2lev-assembly-1.cif.gz

bug fix: XmlMolProReader does not recognize FILTER "NOMO"

bug fix: JSmol has never shown cursors

JmolVersion="14.5.2_2016.02.09"

new feature: invertselected ATOMS {ring atoms to invert}
 -- inverts ring stereochemistry
 -- requires prior selection of all atoms to be involved in the inversion
 
bug fix: SMARTS pattern [ALA.*] not working without biological polymer type indication
bug fix: SMARTS pattern [r500] not working outside of MINIMIZE


JmolVersion="14.5.2_2016.02.06"

new feature: isosurface BACKSHELL
  -- displays just the back side of an isosurface
  -- works by reversing the normals, then showing front only
  -- similar to isosurface slab 50, but better if object is far from spherical
  -- works with PMESH, MO, CONTACT as well
  -- reverted using isosurface NOBACKSHELL

new feature: isosurface "*xxxx" 
  -- accesses EBI test site for ED maps at http://wwwdev.ebi.ac.uk/pdbe/coordinates/files/%file.ccp4
  -- uses default sigma 1.0
  
new feature: isosurface "**xxxx" 
  -- accesses EBI test site for ED difference maps at http://wwwdev.ebi.ac.uk/pdbe/coordinates/files/%file_diff.ccp4  
  -- uses default sigma 3.0

bug fix: JSmol not identifying .ccp4 file extension as binary
bug fix: isosurface "==xxxx" not setting default omap cutoff and sigma 3.0
bug fix: small MRC map files mistaken for DELPHI files.
bug fix: MRC/CCP4 surface/map files still sometimes inside out. 

JmolVersion="14.5.2_2016.02.05"


bug fix: MRC/CCP4 surface/map files sometimes inside out. 

bug fix: LOAD $benzene; SHOW smiles should give c1ccccc1 not c1=cc=cc=c1

JmolVersion="14.5.2_2016.02.04"

bug fix: JVXL files saved from models that involve full model rotate/translateSelected
         do not get restored properly.

bug fix: molecular orbitals do not move with atoms 
         when full molecule is moved using rotateSelected or translateSelected
         
code: better loading of surfaces -- no longer requires javajs.util.XmlUtil
code: removal of unnecessary api interfaces MinimizerInterface, VolumeDataInterface, QuantumPlaneCalculationInterface, MOCalculationInterface, MepCalculationInterface

JmolVersion="14.5.2_2016.02.03"

bug fix: IboView/Molpro XML reader validated for multi-molecule XML files
 -- to concatenate Molpro XML files, you must supply a new root tag as well as
    remove all <?...?> directives.
 -- DOS CMD file example:

      catxml.bat ibo*.xml test.xml

    where catxml.bat is:
      
		copy /b %1 _temp
		echo ^<OUTER^> > %2
		type _temp | find /V "<?" >> %2
		echo ^</OUTER^> >> %2



JmolVersion="14.5.1_2016.02.01"

bug fix: IboView/Molpro XML Reader validated for reading orbitals

code: new abstract reader XmlMOReader


JmolVersion="14.5.1_2016.01.28"

bug fix: MOs need to move with atoms and be restored from state properly 
  after use of ROTATESELECTED. 
  -- note that fix for 14.4 does not include state saving, as that would break previous subversions
       
code: JmolZipUtilities interface removed
code: JmolBinary reduced to just all Spartan-related methods

JmolVersion="14.5.1_2016.01.25"

bug fix: Spartan file reader not working properly after MacSpartan -> Spartan14 upgrade

JmolVersion="14.5.1_2016.01.16"

bug fix: mol, xyz readers not reporting model name like other readers

new feature: variable _versionDate
  $ show _versionDate
  _versionDate = "14.4.1_2016.01.16  2016-01-15 17:25"
  
  
new feature: x = pointgroup([array of points],center)
  -- center is optional, defaulting to average of the points
  -- returns a map:
    pts = [ {-1.0132 0.585 0.0012999999},{1.0132 0.585 0.0012999999},{0.0 -1.17 0.0012999999} ]  
    print pointgroup(pts,{0 0 0})
	{
	  "C2"  :
	  [
	    {0.8660127 -0.50001717 0.0022222984}
	    {-0.8660127 -0.50001717 0.0022222984}
	    {0.0 0.99999756 0.002222217}
	  ]
	  "C3"  :
	  [
	    {0.0019245904 -0.0011111083 -0.99999756}
	  ]
	  "Cs"  :
	  [
	    {0.0019245904 -0.0011111085 -0.99999756}
	    {-0.49998164 -0.866036 0.0}
	    {0.49998164 -0.866036 0.0}
	    {1.0 0.0 0.0}
	  ]
	  "S3"  :
	  [
	    {0.0019245904 -0.0011111083 -0.99999756}
	  ]
	  "center"  :  {0.0 0.0 0.0}
	  "detail"  :  "# 3 atoms;"
	  "distanceTolerance"  :  0.2
	  "linearTolerance"  :  8.0
	  "nAtoms"  :  3
	  "nC2"  :  3
	  "nC3"  :  1
	  "nCi"  :  0
	  "nCn"  :  4
	  "nCs"  :  4
	  "nS3"  :  1
	  "nSn"  :  1
	  "nTotal"  :  12
	  "name"  :  "D3h"
	  "principalAxis"  :  {0.0019245904 -0.0011111083 -0.99999756}
	  "principalPlane"  :  {0.0019245904 -0.0011111085 -0.99999756}
	} 

code: polyhedra, pointgroup, load =ams/, load "xxxx#_DOCACHE_" features from 14.5 added to 14.4

JmolVersion="14.5.1_2016.01.15"

bug fix: d = [start:1,end:10] fails due to reserved word "end" (also "select", "case", "default", "if", "for", etc.)
bug fix: color "chain" (with quotes) should work, allowing for x="chain"; color @x
bug fix: inappropriate use of REGEX in ["a","b"].find("x") 
bug fix: ".xxx" should be allowed as a math continuation:

   print script("show spacegroup all")
   			.split()
			.find("Hall symbol:")
			
JmolVersion="14.5.1_2016.01.09"

code: (JavaScript) refactoring to allow faster, cleaner load for biomodels

JmolVersion="14.5.1_2016.01.08"

bug fix: labels, echos, and measurements improperly shaded when z-shaded with nonblack background
bug fix: rendering error when set zshade followed by set antialiasdisplay

code: (JavaScript) refactoring to reduce extraneous file download

JmolVersion="14.5.1_2016.01.06"

bug fix: labels, echos, and measurements disappear when z-shaded

JmolVersion="14.5.1_2016.01.04"

bug fix: (JvxlReader) Jmol 12 mapped isosurface jvxl files do not show mapped color
bug fix: setting default label properties using select none;.... fails
bug fix: setting cartoons on for phosphorus-only polymers fails
bug fix: undocumented model-based draw [array of points] broken
 -- points only
 -- selects from visible frames (frame *, for example)
 -- load cyclohexane_movie.xyz; frame *; draw @{{C5}.split().sub({1,0,0})
  
JmolVersion="14.5.1_2016.01.01"

bug fix: file dropping of JVXL files does not work
bug fix: Mesh capper not working for multiple cuts due to unclosed surface cut
 -- for example: load maleic.cif 1;select on atomindex=6;lcaocartoon scale 1.0 CAP unitcell "cpk"
bug fix: Escape.e(P4) returns value for Escape.e(T3) -- only affects SurfaceTool
bug fix: (JSmol only) Java return (int) fValue(x); will return  "NaN" instead of "0" for x NaN
 -- JSmol script 0 + "test" will print "NaN" rather than "0"
 
JmolVersion="14.5.1_2015.12.23b"

bug fix: JavaScript error reporting uses alert() instead of just setting the error message
bug fix: PyMOL 1.8 PSE files cannot be read because of missing settings

code: more efficient loading of PyMOL .pse session files

JmolVersion="14.5.1_2015.12.23"

bug fix: PyMOL 1.8 PSE files cannot be read
bug fix: dots broken when colored none
bug fix: color cartoons red blue not saved in state
bug fix: color cartoons red blue flipping red/blue in sheets

JmolVersion="14.5.1_2015.12.21"

bug fix: color [0xffffff] should not be case-sensitive -- [0Xffffff] should be OK
bug fix: set spin fps ... fails

JmolVersion="14.5.1_2015.12.20"

code: (JavaScript) adding use of array.slice and implementing Java byte[] as JavaScript Int8Array()

bug fix: array handling for labels very inefficient
bug fix: y = javascript("x") only creates string equivalent of x, not actual numerical/object values
bug fix: y = javascript("x") draws "x" from wrapped anonymous function using eval() instead of global context using window.eval()

JmolVersion="14.5.1_2015.12.14"

bug fix: JSmol (JSmolCore.js) check for MS Edge browser, which does not support dataURI

JmolVersion="14.5.0_2015.12.13"


new feature: "#_DOCACHE_" suffix for file name loading tells Jmol to insert full structure into any state
 -- allows SPT files to preserve the original file (as in all PNGJ files) 
 -- for example:
    load caffeine.xyz#_DOCACHE_
	show state
		...
		function _setFileState() {
		    DATA "file_caffeine.xyz#_DOCACHE_"
		24
		
		N     1.31200   -1.04790    0.00250
		C     2.24650   -2.17620    0.00310
		...
		H    -4.16720   -0.83950    0.51680
		    END "file_caffeine.xyz#_DOCACHE_";
		...
		  load /*file*/"c:/jmol-dev/bobtest/caffeine.xyz#_DOCACHE_";
		}
		...
 -- repeated calls to caffeine.xyz#_DOCACHE_ use the cached version, not the actual file
 -- calls to caffeine.xyz still ignore the cache. 
 -- also addded to Jmol 14.4.0, but left undocumented
  

new feature: load =ams loads data from American Mineralogist Crystal Structure Database
 -- many thanks given to Robert Downs and Alex Pires for enabling this functionality.
 -- fetches data from http://rruff.geo.arizona.edu/AMS 
 -- employs "#_DOCACHE_" flag because some of these data files may change after database maintenance
 -- three modes. Only the first, using _database_code_amcsd, is guaranteed to be stable over time,
   =ams/<nnnnnnn>  (seven-digit database code) loads that specific structure based on _database_code_amcsd
      load =ams/0014673
      show _modelfile
	  _modelfile = "http://rruff.geo.arizona.edu/AMS/viewJmol.php?amcsd=14673&action=showcif#_DOCACHE_"
   =ams/<nnnnn>  (less than seven-digit id) loads that specific structure based on sequential id code
      load =ams/10000
      show _modelfile
	  _modelfile = "http://rruff.geo.arizona.edu/AMS/viewJmol.php?id=10000&action=showcif#_DOCACHE_"  
   =ams/<mineralName> loads all structures for a specified named mineral. 
      load =ams/diamond
      show _modelfile
	  _modelfile = "http://rruff.geo.arizona.edu/AMS/viewJmol.php?mineral=diamond&action=showcif#_DOCACHE_"
  -- thus, all of the following are equivalent as of 12/13/2015:
  
	    load =ams/0008986
	    load =ams/10000
	    load =ams/srilankite 4
    
     However, it is possible that new structures will be added to srilankite, making
     this not the fourth structure, and the five-digit code 10000 can change after  
     database maintenance.
 -- also addded to Jmol 14.4.0, but left undocumented

new feature: drawing of spheres in 2D window
  -- as percent position or absolute, as for ECHO
  -- diameter is % if position is %; otherwise it is pixels
  -- examples:
  
    draw d1 diameter 5 [90 90 %] color blue  // percent position; 5% diameter
	draw d2 diameter 15 [90 90] color blue   // absolute position; 15-pixel diameter
	draw dO diameter 2 [80 90 %] color @{ {_O}.color }
	set echo eO [95 90 %]; echo "O"
	
  -- can be used in the context of an element key:
  
	background white
	load $caffeine
	  function createElementKey() {
		var y = 90
		for (var e in {*}.element.pivot){
			var c = {element=@e}.color
			draw ID @{"d_"+ e} diameter 2 [90 @y %] color @c
			set echo ID @{"e_" + e} [91 @{y-1} %]
			echo @e
			font echo 24 bold sansserif
			color echo black
			y -= 5
		}
	  }
	createElementKey


new feature: additional predefined sets for periodic table:
    "@nonmetal _H,_He,_B,_C,_N,_O,_F,_Ne,_Si,_P,_S,_Cl,_Ar,_As,_Se,_Br,_Kr,_Te,_I,_Xe,_At,_Rn",
    "@metal !nonmetal",
    "@alkaliMetal _Li,_Na,_K,_Rb,_Cs,_Fr",
    "@alkalineEarth _Be,_Mg,_Ca,_Sr,_Ba,_Ra",
    "@nobleGas _He,_Ne,_Ar,_Kr,_Xe,_Rn",
    "@metalloid _B,_Si,_Ge,_As,_Sb,_Te",
    "@transitionMetal elemno>=21&elemno<=30|elemno>=39&elemno<=48|elemno>=72&elemno<=80|elemno>=104&elemno<=112",
    "@lanthanide elemno>=57&elemno<=71",
    "@actinide elemno>=89&elemno<=103",
    
    note added: last three changed 1/28/17 as per advice of Frank Weinhold:
    
        // added La, Ac as per Frank Weinhold - these two are not f-block
    "@transitionMetal elemno>=21&elemno<=30|elemno=57|elemno=89|elemno>=39&elemno<=48|elemno>=72&elemno<=80|elemno>=104&elemno<=112",
    // removed La
    "@lanthanide elemno>57&elemno<=71",
    // removed Ac 
    "@actinide elemno>89&elemno<=103",
    
  -- useful for removal of metal-metal bonds in inorganic systems
     and for specifying polyhedra:
    
    connect {metal} {metal} delete
    polyhedra bonds {metal}  
     
bug fix: zoomTo not setting time to 0 in the case of scriptWait
bug fix: set selectAllModels should restrict action of display/hide as well
bug fix: set selectAllModels not working appropriately
bug fix: set selectAllModels should not be saved in state
bug fix: JmolData.jar does not update atom screen positions upon REFRESH or select {visible}
bug fix: JmolData.jar -p flag does not work properly
bug fix: model 0 issued when more than one PDB file is open does not execute model *
bug fix: PDB reader broken for filter "biomolecule n"
bug fix: mmCIF reader can fail to pop up menu when biomolecule is present.
bug fix: JSON generation from arrays broken in HTML5 version due to browser changes in Array.toString().
bug fix: DCD reader broken.
bug fix: getProperty("JSON", "variableInfo", "x") will fail if x is an array
 -- was problem with JSV_predict2 failing to properly map atoms between Jmol and JSME
bug fix: {atomset}.sxyz gives incorrect screen coordinate when antialiased
bug fix: point(pt, true|false) also modifies pt itself 
bug fix: point({atomset}, true) gives incorrect screen coordinate when antialiased.
bug fix: point({atomset}, false) gives incorrect Cartesian coordinate when antialiased.
bug fix: popup menu item "Surfaces...Off" resets atom selection
bug fix: files with names containing "[]" cannot be loaded.
bug fix: {cell=555}.find("cellFormula") can fail because of 2% slop involved in defining cell=555
bug fix: {atomset}.split() [split atomset by model] returns array of strings, not array of atoms
bug fix: getproperty SHAPEINFO fails if CGO is present
bug fix: CGO from state deletes DRAW objects
bug fix: CGO not properly isolated to current model; "fixed" not implemented
bug fix: draw ARC|ARROW|CURVE|LINE|VERTICES @x where x is an array does not work
bug fix: loading mmCIF files where label_asym_id != auth_asym_id will apply biomolecule symmetry to wrong chain
bug fix: echo "" fails in applet
bug fix: 3x3 and 4x4 matrix multiplication of points changes the point itself.

code: BSUtil.cardinalityOf cleanup.
code: synchronizing Jmol-NBO branch
 
JmolVersion="14.5.0_2015.11.06"

bug fix: restoring bonds to a model having fewer bonds than the model for which they were saved throws an exception
bug fix: CIF reader does not read incommensurately modulated magCIF files
bug fix: WRITE xxx.ZIP  crashes Jmol
bug fix: POLYHEDRA ... {xxx} TO {yyy} not working

JmolVersion="14.5.0_2015.11.03"
	 
bug fix: FOR without {} but with ";" after sole statement 
         followed immediately by second FOR improperly loops
  for (var i from [1,5])
    print i;
  for (var i from [1,5])
    print i
    
bug fix: OXT missing from BACKBONE selection
bug fix: (JSmol) CIF parser fails to read CIF files containing only a single (non-loop) _struct_ref_seq_dif.align_id

new feature: polyhedra ID xxx SCALE x.x
  -- ID named polyhedra only
  -- x.x is the scaling factor, initially 1 
  -- x.x > 0 does normal scaling
  -- x.x < 0 does "explode" from {0 0 0} (for higher-order Brillouin zones, for instance)

bug fix: slabbing should reset area and volume of isosurface
bug fix: meshSlicer may fail to add edge to sliced pmesh
 
FEATURE CHANGE: (Application only for now) PDB default for =xxxx 
  -- changed to 
    "pdb", "http://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/%c2%c3/pdb%file.ent.gz"
  -- will be complemented with file.ent for non-binary transfer, but that is not implemented yet at RCSB
  -- mmCIF counterpart not implemented yet.
  -- not HTML5 because for that we need the option to remove .gz

new feature: set testflag3 TRUE  gives random triangle effect to polyhedra

new feature: POLYHEDRON ID "xxx" OFFSET {3 3 3}
 -- allows cartesian offset of named polyhedra
 
bug fix: bug fix: empty format crashes Jmol --  print "testing".format("")
bug fix: polyhedron volume will be incorrect if there is a 
         face triangle that has no edges visible (requires a six or more sided face)  

bug fix: nested if...{...if... } else {...} gives compiler syntax error:

  if (i=1) {
    print "i=1"
    if (j=1)
      print "j != 1" 
  } else {                // } closes if (j=1) instead of if (i=1) {
    print "i != 1"
  }

JmolVersion="14.5.0_2015.10.29"

bug fix: after CALCULATE HYDROGENS TRUE and then deleting hydrogens, hydrogens are not added to aromatic rings in PDB models
bug fix: reading saved state after adding hydrogen atoms results in infinite loop

JmolVersion="14.5.0_2015.10.28"

bug fix: XODYDATA file reader does not read bond info or formal charge // changes in 14.4.0_2015.10.28

FEATURE CHANGE: default RCSB/PDB load format (=xxxx) changed to http://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/%c2%c3/pdb%file.ent.gz

new feature: (JSmol) adding access-allow-origin status for cdn.rcsb.org and ftp.wwpdb.org.
 
JmolVersion="14.5.0_2015.10.27"

code: unnecessary FRAME commands removed from state
bug fix: polyhedra not read from state (14.5 only)

JmolVersion="14.5.0_2015.10.24"

bug fix: [{1,2,3},{4,5,6}].average fails
bug fix: [{1,2,3},{4,5,6}].pivot should return "NaN"

JmolVersion="14.5.0_2015.10.22"

bug fix: CIF parser fails to read CIF files containing only a single (non-loop) _struct_ref_seq_dif.align_id
bug fix: WRITE .... AS does not properly allow for unquoted file name

JmolVersion="14.5.0_2015.10.21"

bug fix:  write c:/temp..... AS PNGJ  does not work without quotes that way; it should

JmolVersion="14.5.0_2015.10.20"

new feature: polyhedra with arbitrary center and vertices, without atom center
  -- for example:
     polyhedra ID "myid" {0 0 0} TO [{1 1 -1}, {1 -1 1}, {-1 1 1}, {-1 -1 -1}] # tetrahedron around origin
     polyhedra ID "myid" @{{*}.xyz} TO @{{*}.xyz.all}  # polyhedron to center of all atoms
      
bug fix: set platformSpeed 1 for pmesh fails
bug fix: polyhedron EDGES fails
bug fix: @{ {"hash":{0.1 0.1 0.1},...} } fails (attempts to turn "," into "OR")
  -- solution is to not allow "," for OR within associative arrays
  
JmolVersion="14.5.0_2015.10.18"

new feature: x = within(0.01, [array of points])
 -- cleans points of duplicates with a tolerance of 0.001 Angstroms
 -- allows multiple pmesh faces to be turned into polyhedra using:
 
   faces = []
	for (var i = 1; i <= nPlanes; i++) {
	  var f = ("$f" + i).getProperty("face")
	  faces.push(f)
	}
   polyhedra @1 to @{within(0.01, faces.join())} color white
   
new feature: $pmeshID.getProperty("faces")
 -- returns an array of points
 -- cleaned so that it is one point per linear edge, regardless of how
    it has been slabbed

new feature: resolution 0.001 with PMESH and ISOSURFACE planes
 -- allows for minimum number of triangles.

bug fix: Polyhedra can have missing triangle for hexagonal faces
bug fix: calculate symmetry can break Jmol if unit cell has been changed
bug fix: DRAW POLYGON front/back nature of winding was reversed.

JmolVersion="14.5.0_2015.10.17"

bug fix: if (...) \n { .... not working (where brace is on next line)
bug fix: CIF reader will read empty second model for IUCr files with terminal data_global block
bug fix: polyhedra bonds unitcell can cause error in HTML5
bug fix: nucleic backbone should include O atoms on P and C
bug fix: nucleic spine should not include C2'
bug fix: pmesh/isosurface RESOLUTION 0.0001 with plane can cause loss of some or all of the plane
         -- resolution 0.0001 creates just a minimum of triangles to construct the plane.	
bug fix: set testflag4;isosurface ... ; does not generate normals	
bug fix: (Application) set refreshing false shows Jmol console in model frame (Java bug??)
 
JmolVersion="14.5.0_2015.10.14"

NOTE: GoDaddy's inadvertent forcing of revocation of the secure certificate for Jmol 
      has disabled ALL applets created since Oct 15, 2014. This is a mandatory upgrade.
      

bug fix: SHOW PROPERTY IDENTIFY crashes Jmol.  

JmolVersion="14.5.0_2015.10.13"
JmolVersion="14.4.0_2015.10.13"
JmolVersion="14.3.16_2015.10.13"

code: compatibility checks with new brace-less if/for/while

note: Use of multi-line IF/END IF, FOR/END FOR, WHILE/END WHILE
      is not compatible with newer JavaScript-like single-line non-brace flow:
      
      Java/JavaScript style:
            
        function test () {
		 for (var i = 0; i < 5; i++)
		  if (i < 2) 
		    print -i 
		}
   
      VB style:
      
        function test () 
		 for (var i = 0; i < 5; i++)
		  if (i < 2) 
		    print -i
		  end if 
		 end for
		end function
   
      The compiler is set to start with assumption that Java/JavaScript
      is the active mode but switches to VB style if END XXX is found
      
Note: Use of single-line   if (...) ..... else ..... endif   is allowed
      in either mode. In this syntax, the final "endif" is optional

Note: END DATA is not affected

JmolVersion="14.3.16_2015.10.12"

code fix: debug comments in isosurface solvent slowing it down significantly

bug fix: PARALLEL/PROCESS not working
bug fix: SHOW DATA does not return model data
bug fix: draw CURVE pt1 pt2   does not work
bug fix: pmesh command cannot read files from zip files 
         because "binary" option is set, and FileManager is returning the wrong input stream 

new feature: unitcell() function
  -- returns unitcell as an array in the form [origin, va, vb, vc]
  -- first parameter is optional unitcell itself; absence uses current model's unit cell. 
  -- optional last parameter: scale
  -- signatures:
    unitcell()   // uses current unit cell
    unitcell(uc) // copies unit cell
    unitcell(uc, "reciprocal") // reciprocal lattice for specified unit cell
    unitcell("reciprocal") // reciprocal lattice for current model's unit cell
    unitcell(ucconv, "primitive","BCC"|"FCC") // convert conventional to primitive
    unitcell("primitive","BCC"|"FCC")
    unitcell(ucprim, "conventional","BCC"|"FCC")  // convert primitive to conventional
    unitcell("conventional","BCC"|"FCC")
    unitcell(origin, [va, vb, vc]) // user-defined unit cell; just produces [origin, va, vb, vc]
    unitcell(origin, pta, ptb, ptc) // user-defined unit cell using four points    
 -- compatible with UNITCELL command:
 
    UNITCELL @{unitcell("reciprocal")}
    draw unitcell
    UNITCELL RESET   
 
   
new feature: point(unitcell, {i, j, k})
  -- returns the Cartesian point corresponding to a specific coordinate in a unit cell system.
  -- unitcell is an array of the form [origin, va, vb, vc]
  -- {i j k} is a point in the unit cell
  -- for general use -- does not require actual setting of the model's unit cell

JmolVersion="14.3.16_2015.10.09"

bug fix:  print 'CCC'.find("SMILES") should throw a ScriptException, not a Java exception

new feature: Gaussian log file reader reads spin density scalars as property_spin

JmolVersion="14.3.16_2015.10.06"

new feature: print within(distance, point, array_of_points)
  -- point array distance iterator
  -- returns subarray of points (in differing order, probably) of array_of_points
     that are within distance of point.
      
bug fix: MRC surface reader: new version of EMAN2 leaves out alpha,beta,gamma; does not load properly

bug fix: for (a in {*}) with no VAR fails if a has already been defined as an integer

bug fix: better error reporting

new feature: load =aflow/AgAu
 -- easy access to binary metal alloy CIF files
 -- http://aflowlib.mems.duke.edu/users/jmolers/binary_new/%FILE.aflow_binary
 
bug fix: braceless if/for fix from 10.04

JmolVersion="14.3.16_2015.10.04"

bug fix: changing bond order of X-H using set picking assignBond_2 generates error messages and removes atoms


new feature: if, for, and while can all operate using no braces for single-line bodies
  -- similar to JavaScript and Java
  -- examples:

   for(var i = 0; i < 10; i++)
     for(var j = 0; j < 10; j++)
       print i*j
       
   if (i == 1)
     print i
   else
     print 0
     
bug fix: translucent echo backgrounds not saved in state properly  
   

JmolVersion="14.3.16_2015.10.01"

bug fix: for (; i < 10; i++)  not working
bug fix: for (;;i++)  not working
bug fix: for (;;)  not working

JmolVersion="14.3.16_2015.10.01"
	
bug fix: hydrogens added to backbone should be part of "backbone" definition
  -- no-hydrogen definition is _bb

NOTE: THIS NEXT NEVER WORKED WELL
new feature: calculate hydrogens TRUE
 -- calculates hydrogens and multiple bonding
 -- same as 
 
    calculate hydrogens
    connect aromatic modify
    calculate aromatic
    
 -- similar to, but not identical to set pdbAddHydrogens
 -- allows reasonable addition of multiple bonds to proteins after loading

bug fix: connect aromatic should not touch H atoms or atoms with 4 or more covalent bonds
bug fix: calculate hydrogen should consider backbone N sp2
bug fix: {backbone} should include attached H atoms 
bug fix: calculate hydrogens should not place H atoms on water

JmolVersion="14.3.16_2015.09.29"

note: I am using "map" for "associative array" now

 
new feature: mapOfMaps.array(k)
 -- generates an array of maps from a map of maps by 
    storing all top-level map keys under key k in lower-level map
 -- reversed by another .array(k) 
 -- causes a script exception if mapOfMaps is not a map of maps

new feature: arrayOfMaps.array(k)
 -- generates a map of maps from an array of maps by 
    removing each map's key k and using that as the key for that map value 
 -- reversed by another .array(k) 
 -- causes a script exception if arrayOfMaps is not an array of maps or key k is not present in all maps

JmolVersion="14.3.16_2015.09.28b"

bug fix: draw ramachandran broken

JmolVersion="14.3.16_2015.09.28"

new feature: array.sort("key")
 -- sorts an array of associative arrays by the specified associative array key.
 -- example:
 
	load sf6.smol
	x= _M.moData.mos.select("energy,index where energy<0")
	x.sort("energy").reverse
	print x

	  {
	    "energy"  :  -0.67001194
	    "index"  :  35
	   }
	  {
	    "energy"  :  -0.67001194
	    "index"  :  34
	   }
	  {
	    "energy"  :  -0.67001194
	    "index"  :  33
	   }
	  {
	    "energy"  :  -0.70143324
	    "index"  :  32
	   }
	   ...
	   	
new feature: JmolSQL xxxx.select("<keys> WHEREIN <clause>")
  -- replaces ** idea
  -- assumes values of xxxx are themselves associative arrays
  -- indicates that the clause should be applied only to the values for the selected keys
  -- returns an associative array that holds only those keys for which the clause is true *for them*
  -- works also for array xxxx where each element of xxxx is an associative array, 
     in which case it returns a subarray of xxxx involving the matching values.  
  -- example:
  
   abc = [ A:[b:1], B:[b:2], C:[b:3, d:50], AA:[b:4] ]
   print abc.select("A* wherein b>2").format("JSON")
   
     { "AA": { "b": 4 } }
     
   Compare this to the following, where we are are checking for validity of abc itself:
   
   abc = [ A:[b:1], B:[b:2], C:[b:3, d:50], AA:[b:4] ]
   print abc.select("A* where B.b=2").format("JSON")
   
     { "A": { "b": 1 },"AA": { "b": 4 } }

   
   abc2 = [ 
      [ A:[b:1], B:[b:2], C:[b:3, d:50], AA:[b:4] ],
      [ A:[b:11], B:[b:22], C:[b:33, d:5050], AA:[b:40] ]
      ]
   print abc2.select("A* wherein b>2").format("JSON")
    
   [ { "AA": { "b": 4 } },{ "A": { "b": 11 },"AA": { "b": 40 } } ]      

new feature: JmolSQL xxxx.select("(<keys>) WHERE/WHEREIN <clause>")
  -- parentheses around keys replaces ";" idea
  -- indicates to return an array of values rather than a key/value pair
  -- works also for array xxxx where each element of xxxx is an array or associative array, 
     in which case it returns an array of matching values, without keys.  
  -- example:

   load =1ehz/dssr
   print _M.dssr.hbonds.select("distance where res_long like '*|C|72|*'")
	  {
	    "distance"  :  2.832
	   }
	  {
	    "distance"  :  2.879
	   }
	  {
	    "distance"  :  2.838
	   }

	print _M.dssr.hbonds.select("(distance) where res_long like '*|C|72|*'")
	
		2.832
		2.879
		2.838

	print _M.dssr.hbonds.select("(distance) where res_long like '*|C|72|*'").average

		2.8496666
       

JmolSQL

JmolSQL is a Jmol math syntax that is designed to query information related to molecular structure. The idea is that associative arrays, with key/value pairs, and especially arrays of associative arrays, are data, and those arrays themselves can be thought of as a mini database. These sorts of data can be found in Jmol in the a model's auxiliary info (variable _M), including validation data returned from LOAD =xxxx/val (_M.validation), sequence domain data returned from LOAD =xxxx/dom (_M.domains), and secondary structure information returned from LOAD =xxxx/dssr (_M.dssr) or LOAD=xxxx/rna3d (_M.rna3d). In addition, the getProperty() function returns a wide variety of data relating to model attributes, including getProperty("atomInfo") and getProperty("bondInfo") among several others.

The original conception of JmolSQL was in the context of the getProperty() function -- for example:

load $caffeine
print getProperty("atomInfo[SELECT atomno,coord WHERE shape LIKE 'trigonal planar']")

  {    "atomno"  :  1    "coord"  :  {1.312 -1.0479 0.0025}   }  {    "atomno"  :  3    "coord"  :  {1.7906001 0.20809999 9.999999E-4}   }   ...
More recent development widens this use to any array data, and use of the .select() function rather than getProperty() is recommended for general use. Thus, alternatively we can use:

print getProperty("atomInfo").select("atomno,coord WHERE shape LIKE 'trigonal planar' ")


object.SELECT("keys WHERE/WHEREIN phrase")
There are three parts to JmolSQL: object, keys, and an optional WHERE or WHEREIN phrase. The object can be either an associative array [key1:value1, key2:value2, key3:value3] or an array of associative arrays, usually all having the same set of keys.

Associative Arrays
When the top-level object is an associative array, .select() can be used to select
out subsets of that array, either as a single associative array or as an array of values.

abc.select("...")
The simplest form of .select() returns a subset of abc. Wild cards can be interspersed with additional keys, for example, "a*,b" or "*_id". In each such case, the case-sensitive LIKE operation is used to match keys.

abc = [ A:[b:1],B:[b:2],AA:[b:3, d:50] ]
print  abc.select("A").format("JSON")

{ "A": { "b": 1 } }
abc = [ A:[b:1],B:[b:2],AA:[b:3, d:50] ]
print  abc.select("A*").format("JSON")

{ "A": { "b": 1 },"AA": { "b": 3,"d": 50 } }
abc.select("(...)")
Using parentheses around the list of keys delivers a list of values of b for only the the subset of xyz for which a=1:

abc = [ A:[b:1],B:[b:2],AA:[b:3, d:50] ]
print  abc.select("(A,B)").format("JSON")

[ { "b": 2 },{ "b": 1 } ]

Arrays of Associative Arrays
In addition to operating on an associative array directly, JmolSQL can operate on an array of associative arrays. Generally we assume here that the elements of that array are associative arrays that all have the same set of keys. This is the essence of a database.  Whether or not the associative arrays have the same keys is not important for Jmol. For example, the getProperty("atomInfo") returns an array giving the information for each atom that is loaded:

load $caffeine
x = getProperty("atomInfo")
print x.count

24
print x[1]

{  "_ipt"  :  0  "atomIndex"  :  0  "atomno"  :  1  "bondCount"  :  3  "clickabilityFlags"  :  48  "colix"  :  -32761  "color"  :  "[x3050f8]"  "coord"  :  {1.312 -1.0479 0.0025}  "element"  :  "nitrogen"  "elemno"  :  7  "formalCharge"  :  0  "info"  :  "N1 #1"  "model"  :  "1"  "partialCharge"  :  0.0  "radius"  :  0.7416667  "shape"  :  "trigonal planar"  "spacefill"  :  0.3565  "sym"  :  "N"  "visibilityFlags"  :  63  "visible"  :  true  "x"  :  1.312  "y"  :  -1.0479  "z"  :  0.0025 }
These data can be "queried" using  JmolSQL.

xyz.select("...")
Creates the sublist of associative arrays having the selected subset of keys:

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("b").format("JSON")

[ { "b": 11 },{ "b": 22 },{ "b": 33 } ]
print x.select("atomno,element")
  {    "atomno"  :  1    "element"  :  "nitrogen"   }  {    "atomno"  :  2    "element"  :  "carbon"   }  {    "atomno"  :  3    "element"  :  "carbon"   }  {    "atomno"  :  4    "element"  :  "oxygen"   }   ...
xyz.select("(...)")
Adding parentheses creates a list of only the values for the specified keys:
xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("(b)").format("JSON")

[ 11,22,33 ]
xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("(a,b)").format("JSON")

[ 11,1,22,2,33,3 ]
load $caffeine
print getProperty("atomInfo").select("(element)").pivot
{  "carbon"  :  8  "hydrogen"  :  10  "nitrogen"  :  4  "oxygen"  :  2 }
The assumption when using (keys) is that you want to know all these values,
but you don't care what order they are in (because that will not be predictable)
and you don't care about their exact context. An example is a list of bonds for
which we just want to know all the atoms involved, but the atoms are listed
under "atom1" and "atom2" in each bond array.

load =1ehz/dssr
select on @{_M.dssr.hbonds.select("(atom1_id,atom2_id)")}

206 atoms selected

Using WHERE
WHERE is used to select a subset of the elements of an array based on specific
key-value relationships.

xyz.select("... WHERE ...")
Delivers all key/value pairs in the subset of xyz element associative arrays
for which the WHERE clause is true for that element.

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("* where a<3 and b<20").format("JSON")

[ { "b": 11,"a": 1 } ]
load $caffeine
print getProperty("atomInfo").select("atomno,element WHERE shape LIKE 'trigonal planar' ").format("JSON")

[ { "element": "nitrogen","atomno": 1 },{ "element": "carbon","atomno": 3 },{ "element": "nitrogen","atomno": 5 },{ "element": "carbon","atomno": 7 },{ "element": "carbon","atomno": 9 },{ "element": "nitrogen","atomno": 10 },{ "element": "carbon","atomno": 12 },{ "element": "carbon","atomno": 13 } ]


xyz.select("(...) where ...")
Using parentheses around the list of keys delivers a list of
values for only the subset of xyz for which the WHERE clause is true:

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("(b) where a>1").format("JSON")

[ 22,33 ]
load $caffeine
 print getProperty("atomInfo").select("(shape) WHERE shape").pivot
{  "bent"  :  1  "tetrahedral"  :  3  "trigonal planar"  :  8 }
Note that "WHERE shape" here just excludes all cases where shape is the empty string, since empty strings in Jmol evaluate as FALSE. (In this case that involves hydrogen atoms.)

For example, finding all the hydrogen bonds created by DSSR for a given residue:

load =1ehz/dssr
x = _M.dssr.hbonds.select("(distance) where res_long like '*|A|C|72|*'");
print x.format("JSON")
print format("%5.3f",x.average)

[ 2.832,2.879,2.838 ]    2.850
Array "Drilling"

WHERE will "drill down" through arrays of arrays to find
elements that are associative arrays, returning a flat array of those objects:

xyz = [ [[a:1,b:11], [a:0,b:0]],[[[a:2,b:22]]],[[a:3,b:33,aa:44]] ]
print xyz.select("a* where a>0").format("JSON")

[ { "a": 1 },{ "a": 2 },{ "a": 3,"aa": 44 } ]
xyz = [ [[a:1,b:11], [a:0,b:0]],[[[a:2,b:22]]],[[a:3,b:33,aa:44]] ]
print xyz.select("(b) where a>0").format("JSON")

[ 11,22,33 ]
 
WHERE vs. WHEREIN
Starting with Jmol 14.4, JmolSQL includes an additional option, WHEREIN. This option
allows selecting specific key/value pairs for which the value is itself an associative
array, and *that array* has a specific set of key/value relationships. Thus, the
clause is checked one level deeper in the structure.

For example, given the associative array

abc = [key_1:[type:"a", i:1],key_2:[type:"b", i:2],key_3:[type:"a", i:3]]

we can select out only those keys for which type='a':

abc = [key_1:[type:"a", i:1],key_2:[type:"b", i:2],key_3:[type:"a", i:3]]
print abc.select("* WHEREIN type='a'").format("JSON");

{ "key_3": { "i": 3,"type": "a" },"key_1": { "i": 1,"type": "a" } }
All of the options that involve WHERE also apply to WHEREIN. For example,
multiple keys can be specified, and keys can be surrounded by parentheses
to return just the values instead of key/value pairs:

abc = [key_1:[type:"a", i:1],key_2:[type:"b", i:2],key_3:[type:"a", i:3]]
print abc.select("(key_1,key2) WHEREIN type='a'").format("JSON");

[ { "i": 1,"type": "a" } ]
In addition, WHEREIN can be applied to arrays as well as associative arrays.
In this case, the WHEREIN phrase applies to the elements of that array, which
are assumed to be associative arrays. For example, we can get a list of just
the occupied orbitals produced by Gaussian that are of a given symmetry:

load http://chemapps.stolaf.edu/jmol/jsmol/data/no2_nbo.log.gz 2 filter "alpha"
print _M.moData.select("mos wherein occupancy>0").select("(symmetry)").pivot

{  "(A1)--O"  :  6  "(A2)--O"  :  1  "(B1)--O"  :  1  "(B2)--O"  :  4 }
Note that this use of WHEREIN with arrays in this way can also be accomplished
more directly with WHERE:

load http://chemapps.stolaf.edu/jmol/jsmol/data/no2_nbo.log.gz 2 filter "alpha"
print _M.moData.mos.select("(symmetry) where occupancy>0").pivot

{  "(A1)--O"  :  6  "(A2)--O"  :  1  "(B1)--O"  :  1  "(B2)--O"  :  4 }
load http://chemapps.stolaf.edu/jmol/jsmol/data/no2_nbo.log.gz 2 filter "alpha"
x= _M.moData.select("mos wherein occupancy>0 and symmetry like '(B2)*' ")
print x.select("(index)").format("JSON")

[ 1,5,8,10 ]




After taking a close look at this, I decided this was getting too cryptic. I think this is much simpler. This long email message summarizes the JmolSQL business, starting with Jmol 11.3.16_2015.09.28. See http://chemapps.stolaf.edu/jmol/zip/jmol-14.3.16_2015.09.28.zip

JmolSQL
JmolSQL is a Jmol math syntax that is designed to query information related to molecular structure. The idea is that associative arrays, with key/value pairs, and especially arrays of associative arrays, are data, and those arrays themselves can be thought of as a mini database. These sorts of data can be found in Jmol in the a model's auxiliary info (variable _M), including validation data returned from LOAD =xxxx/val (_M.validation), sequence domain data returned from LOAD =xxxx/dom (_M.domains), and secondary structure information returned from LOAD =xxxx/dssr (_M.dssr) or LOAD=xxxx/rna3d (_M.rna3d). In addition, the getProperty() function returns a wide variety of data relating to model attributes, including getProperty("atomInfo") and getProperty("bondInfo") among several others.

The original conception of JmolSQL was in the context of the getProperty() function -- for example:

load $caffeine
print getProperty("atomInfo[SELECT atomno,coord WHERE shape LIKE 'trigonal planar']")

  {
    "atomno"  :  1
    "coord"  :  {1.312 -1.0479 0.0025}
   }
  {
    "atomno"  :  3
    "coord"  :  {1.7906001 0.20809999 9.999999E-4}
   }
   ...

More recent development widens this use to any array data, and use of the .select() function rather than getProperty() is recommended for general use. Thus, alternatively we can use:

print getProperty("atomInfo").select("atomno,coord WHERE shape LIKE 'trigonal planar' ")


object.SELECT("keys WHERE/WHEREIN phrase")
There are three parts to JmolSQL: object, keys, and an optional WHERE or WHEREIN phrase. The object can be either an associative array [key1:value1, key2:value2, key3:value3] or an array of associative arrays, usually all having the same set of keys.

Associative Arrays
When the top-level object is an associative array, .select() can be used to select
out subsets of that array, either as a single associative array or as an array of values.

abc.select("...")
The simplest form of .select() returns a subset of abc. Wild cards can be interspersed with additional keys, for example, "a*,b" or "*_id". In each such case, the case-sensitive LIKE operation is used to match keys.

abc = [ A:[b:1],B:[b:2],AA:[b:3, d:50] ]
print  abc.select("A").format("JSON")

{ "A": { "b": 1 } }

abc = [ A:[b:1],B:[b:2],AA:[b:3, d:50] ]
print  abc.select("A*").format("JSON")

{ "A": { "b": 1 },"AA": { "b": 3,"d": 50 } }

abc.select("(...)")
Using parentheses around the list of keys delivers a list of values of b for only the the subset of xyz for which a=1:

abc = [ A:[b:1],B:[b:2],AA:[b:3, d:50] ]
print  abc.select("(A,B)").format("JSON")

[ { "b": 2 },{ "b": 1 } ]


Arrays of Associative Arrays
In addition to operating on an associative array directly, JmolSQL can operate on an array of associative arrays. Generally we assume here that the elements of that array are associative arrays that all have the same set of keys. This is the essence of a database.  Whether or not the associative arrays have the same keys is not important for Jmol. For example, the getProperty("atomInfo") returns an array giving the information for each atom that is loaded:

load $caffeine
x = getProperty("atomInfo")
print x.count

24

print x[1]

{
  "_ipt"  :  0
  "atomIndex"  :  0
  "atomno"  :  1
  "bondCount"  :  3
  "clickabilityFlags"  :  48
  "colix"  :  -32761
  "color"  :  "[x3050f8]"
  "coord"  :  {1.312 -1.0479 0.0025}
  "element"  :  "nitrogen"
  "elemno"  :  7
  "formalCharge"  :  0
  "info"  :  "N1 #1"
  "model"  :  "1"
  "partialCharge"  :  0.0
  "radius"  :  0.7416667
  "shape"  :  "trigonal planar"
  "spacefill"  :  0.3565
  "sym"  :  "N"
  "visibilityFlags"  :  63
  "visible"  :  true
  "x"  :  1.312
  "y"  :  -1.0479
  "z"  :  0.0025
 }

These data can be "queried" using  JmolSQL.

xyz.select("...")
Creates the sublist of associative arrays having the selected subset of keys:

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("b").format("JSON")

[ { "b": 11 },{ "b": 22 },{ "b": 33 } ]

print x.select("atomno,element")
  {
    "atomno"  :  1
    "element"  :  "nitrogen"
   }
  {
    "atomno"  :  2
    "element"  :  "carbon"
   }
  {
    "atomno"  :  3
    "element"  :  "carbon"
   }
  {
    "atomno"  :  4
    "element"  :  "oxygen"
   }
   ...
xyz.select("(...)")
Adding parentheses creates a list of only the values for the specified keys:

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("(b)").format("JSON")

[ 11,22,33 ]

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("(a,b)").format("JSON")

[ 11,1,22,2,33,3 ]

load $caffeine
print getProperty("atomInfo").select("(element)").pivot
{
  "carbon"  :  8
  "hydrogen"  :  10
  "nitrogen"  :  4
  "oxygen"  :  2
 }

The assumption when using (keys) is that you want to know all these values,
but you don't care what order they are in (because that will not be predictable)
and you don't care about their exact context. An example is a list of bonds for
which we just want to know all the atoms involved, but the atoms are listed
under "atom1" and "atom2" in each bond array.

load =1ehz/dssr
select on @{_M.dssr.hbonds.select("(atom1_id,atom2_id)")}

206 atoms selected


Using WHERE
WHERE is used to select a subset of the elements of an array based on specific
key-value relationships.

xyz.select("... WHERE ...")
Delivers all key/value pairs in the subset of xyz element associative arrays
for which the WHERE clause is true for that element.

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("* where a<3 and b<20").format("JSON")

[ { "b": 11,"a": 1 } ]

load $caffeine
print getProperty("atomInfo").select("atomno,element WHERE shape LIKE 'trigonal planar' ").format("JSON")

[ { "element": "nitrogen","atomno": 1 },{ "element": "carbon","atomno": 3 },{ "element": "nitrogen","atomno": 5 },{ "element": "carbon","atomno": 7 },{ "element": "carbon","atomno": 9 },{ "element": "nitrogen","atomno": 10 },{ "element": "carbon","atomno": 12 },{ "element": "carbon","atomno": 13 } ]


xyz.select("(...) where ...")
Using parentheses around the list of keys delivers a list of
values for only the subset of xyz for which the WHERE clause is true:

xyz = [ [a:1,b:11],[a:2,b:22],[a:3,b:33] ]
print xyz.select("(b) where a>1").format("JSON")

[ 22,33 ]

load $caffeine
 print getProperty("atomInfo").select("(shape) WHERE shape").pivot
{
  "bent"  :  1
  "tetrahedral"  :  3
  "trigonal planar"  :  8
 }

Note that "WHERE shape" here just excludes all cases where shape is the empty string, since empty strings in Jmol evaluate as FALSE. (In this case that involves hydrogen atoms.)

For example, finding all the hydrogen bonds created by DSSR for a given residue:

load =1ehz/dssr
x = _M.dssr.hbonds.select("(distance) where res_long like '*|A|C|72|*'");
print x.format("JSON")
print format("%5.3f",x.average)

[ 2.832,2.879,2.838 ]   
2.850

Array "Drilling"

WHERE will "drill down" through arrays of arrays to find
elements that are associative arrays, returning a flat array of those objects:

xyz = [ [[a:1,b:11], [a:0,b:0]],[[[a:2,b:22]]],[[a:3,b:33,aa:44]] ]
print xyz.select("a* where a>0").format("JSON")

[ { "a": 1 },{ "a": 2 },{ "a": 3,"aa": 44 } ]

xyz = [ [[a:1,b:11], [a:0,b:0]],[[[a:2,b:22]]],[[a:3,b:33,aa:44]] ]
print xyz.select("(b) where a>0").format("JSON")

[ 11,22,33 ]

 
WHERE vs. WHEREIN
Starting with Jmol 14.4, JmolSQL includes an additional option, WHEREIN. This option
allows selecting specific key/value pairs for which the value is itself an associative
array, and *that array* has a specific set of key/value relationships. Thus, the
clause is checked one level deeper in the structure.

For example, given the associative array

abc = [key_1:[type:"a", i:1],key_2:[type:"b", i:2],key_3:[type:"a", i:3]]

we can select out only those keys for which type='a':

abc = [key_1:[type:"a", i:1],key_2:[type:"b", i:2],key_3:[type:"a", i:3]]
print abc.select("* WHEREIN type='a'").format("JSON");

{ "key_3": { "i": 3,"type": "a" },"key_1": { "i": 1,"type": "a" } }

All of the options that involve WHERE also apply to WHEREIN. For example,
multiple keys can be specified, and keys can be surrounded by parentheses
to return just the values instead of key/value pairs:

abc = [key_1:[type:"a", i:1],key_2:[type:"b", i:2],key_3:[type:"a", i:3]]
print abc.select("(key_1,key2) WHEREIN type='a'").format("JSON");

[ { "i": 1,"type": "a" } ]

In addition, WHEREIN can be applied to arrays as well as associative arrays.
In this case, the WHEREIN phrase applies to the elements of that array, which
are assumed to be associative arrays. For example, we can get a list of just
the occupied orbitals produced by Gaussian that are of a given symmetry:

load http://chemapps.stolaf.edu/jmol/jsmol/data/no2_nbo.log.gz 2 filter "alpha"
print _M.moData.select("mos wherein occupancy>0").select("(symmetry)").pivot

{
  "(A1)--O"  :  6
  "(A2)--O"  :  1
  "(B1)--O"  :  1
  "(B2)--O"  :  4
 }

Note that this use of WHEREIN with arrays in this way can also be accomplished
more directly with WHERE:

load http://chemapps.stolaf.edu/jmol/jsmol/data/no2_nbo.log.gz 2 filter "alpha"
print _M.moData.mos.select("(symmetry) where occupancy>0").pivot

{
  "(A1)--O"  :  6
  "(A2)--O"  :  1
  "(B1)--O"  :  1
  "(B2)--O"  :  4
 }

load http://chemapps.stolaf.edu/jmol/jsmol/data/no2_nbo.log.gz 2 filter "alpha"
x= _M.moData.select("mos wherein occupancy>0 and symmetry like '(B2)*' ")
print x.select("(index)").format("JSON")

[ 1,5,8,10 ]


JmolVersion="14.3.16_2015.09.25"

bug fix: HBONDS DELETE  broken since 14.1.2 

JmolVersion="14.3.16_2015.09.23"

bug fix: within(0.0, {0 0 0}) fails when no atoms in model

JmolVersion="14.3.16_2015.09.22"

bug fix: for(var x in ...) does not respect "var"

bug fix: x.format("JSON") fails for recursive x
  -- arrays or associative arrays can be recursive
  -- detection of recursion during SHOW, x.format("JSON"), and @x (deep copy)
     now delivers empty array or associative array
  -- works also with expressions using @{...}:  x = @{y.select("* where atomno > 10")}

  -- example:
  
		$ a = [[1,2],3]
		$ a..2 = a
		$ print a.format("JSON")
		  
			    [ [ 1,2 ],[ [ 1,2 ],[  ] ] ]
		  
		$ a = [b:1]
		$ a.b = a
		$ print a.format("JSON")
		  
		    { "b": { "b": {  } } }
		
		$ y = @x
		$ show y
		
		    y = { "b":{ "b":{  } } }


new feature: x = @a
  -- deep copy for a = array or associative array
  -- @a for string variable still gets the value of the variable named by variable a
  -- math environment only, not SELECT

new feature: for allows one continuation line, as in JavaScript and Java
  -- for example:
	for (i = 1; i <= 3; i++)
  	  print i;

bug fix: for (key in hash){...} fails upon functional iteration (deepCopy)
  -- code was reusing the FOR variable when it should have been caching it in the context stack
  
JmolVersion="14.3.16_2015.09.21"

new feature: Raster3D triangle-only file reader (for DSSR cartoon-block representation) 
  -- see http://skuld.bmsc.washington.edu/raster3d/html/render.html
  
bug fix: minor fixes for DSSR

bug fix: print within(0, "XXX", ...) ignores the "XXX" entirely. Should throw an error (Ron Mignery)
bug fix: print within(0, "vdw", ...) ignores "vdw"; should accept that as "vanderwaal"
bug fix: print within(-1.0, "vanderwaal", ...) ignores "vanderwaal" and does a fractional-coordinate calculation  

JmolVersion="14.3.16_2015.09.20"

FEATURE CHANGE: 3DNA DSSR has switched over to JSON; some array names are changed.


new feature: print @1.label("%[unitid]")
  -- generates unit IDs for atoms or residues
  -- unit IDs are a proposed general standard for representing atoms and residues in biomolecules
  -- see http://rna.bgsu.edu/main/rna-3d-hub-help/unit-ids
  -- options follow "-":
  
  $ print {atomno=3}.label("%[unitid]")     // includes residue and atom
  |1|A|G|1|OP1|||
	
  $ print {atomno=3}.label("%[unitid-r]")   // residue only
  |1|A|G|1||||
	
  $ print {atomno=3}.label("%[unitid-mr]")  // adds model id
  1EHZ|1|A|G|1||||
	
  $ print {atomno=3}.label("%[unitid-mra]") // full unitID
  1EHZ|1|A|G|1|OP1|||

  $ print {atomno=3}.label("%[unitid-mrat]") // full unitID, right-trimmed
  1EHZ|1|A|G|1|OP1
 
  -- Note that the full 8-line unit ID is produced under all circumstances. 
     This is  important, because string-matching of unit ids will not work 
     without all fields completed. For example:
     
     |1|A|G|1
     
     would match
     
     |1|A|G|11
     
     without the closing "|". Likewise, 
     
     |1|A|G|11
     
     is not a match for the insertion residue
     
     |1|A|G|11|||3|
     
  -- [Editorial note: I agree that it was ill-advised to put the insertion
      code at the end. This makes it impossible to efficiently match 
      residues in full-atom unit IDs.]
      
  -- Note that in an actual atom label, one needs to add "\n" at the end
     and have the label in quotes in order to avoid having "|" mean "new line"
     
    label "%[unitid]\n"   
  
  not just
  
    label %[unitid]
  
  This is a consequence of having defined "|" as new line early on in Jmol
  development. 
     
bug fix: quoted labels containing \n are supposed to ignore | as new-line char

new feature: select shortcuts for nucleic acid structures
  -- for example: select junctions; select kissingloops
  -- activated after load =xxxx/dssr or calculate structure dssr
  -- includes:
    "@bulges within(dssr,'bulges')",
    "@coaxStacks within(dssr,'coaxStacks')",
    "@hairpins within(dssr,'hairpins')",
    "@hbonds within(dssr,'hbonds')",
    "@helices within(dssr,'helices')",
    "@iloops within(dssr,'iloops')",
    "@isoCanonPairs within(dssr,'isoCanonPairs')",
    "@junctions within(dssr,'junctions')",
    "@kissingLoops within(dssr,'kissingLoops')",
    "@multiplets within(dssr,'multiplets')",
    "@nonStack within(dssr,'nonStack')",
    "@nts within(dssr,'nts')",
    "@naChains within(dssr,'naChains')",
    "@pairs within(dssr,'pairs')",
    "@ssSegments within(dssr,'ssSegments')",
    "@stacks within(dssr,'stacks')",
    "@stems within(dssr,'stems')",

JmolVersion="14.3.16_2015.09.15"

bug fix: JSME's noncanonical SMILES does not match Jmol's standard SMILES for aromatics
 -- solution is to use /noncanonical/ with find().
 
bug fix: JSmol does not automatically start non-English language

new feature: SMILES /noncanonical/
  -- matches Jmol's aromatic with JSME's "noncanonical" aromatic 
  $ load $aspirin
  $ show smiles
    c1=cc=cc2=c1C(O)=O.O2C(C)=O
  $ print {*}.find("smiles", "/noncanonical/C1=CC=CC(OC(C)=O)=C1C(O)=O")
    ({0:20})
  $ print "c1=cc=cc2=c1C(O)=O.O2C(C)=O".find("smiles", "/noncanonical/C1=CC=CC(OC(C)=O)=C1C(O)=O")
    13

new feature: {*}.find("SMILES", "NOAROMATIC")
 -- creates nonaromatic (noncanonical) SMILES 
 
new feature: JmolSQL x.select("...")
  -- shortcut for x.getProperty("[select ... ]")
  -- x should by an associative array  {key:value,..} or a sequential array [a,b,c,d]


>>NOTE: the does not work. Does it matter?
new feature: JmolSQL {associative array}.select("xxx** where...")
  -- double * indicates desire to return full sub-arrays, with keys
  -- "all keys starting with "xxx"; 
  -- uses LIKE
  -- can be at beginning or end or both: xxx**, **xxx, **xxx**
  -- WHERE clause is optional
  -- similar to [array].select("** where 
  
JmolVersion="14.3.16_2015.09.14"

bug fix: load data [2D mol structure...] filter "2D" not working
bug fix: Crystallographic Open Database CIF files have unusual atom_site_label ("MgT") 
         and no atom_site_type_symbol, leading to missing element assignments

JmolVersion="14.3.16_2015.09.09"

#ignore:
#new feature: SMILES/SMARTS atom designations [C(xxxx)]
#   -- allows pointing to the same atom without connection numbers
#   -- (xxxx) may be anything, including just ()
#   -- definition may be anywhere in bracketed atom specification
#   -- any additional primitives in referring expression will be ignored
#   -- involves only a very simple addition to parser code
#   -- Jmol is not currently creating these strings, just interpreting them  
#   -- rationale:
#   
#      One basic aspect of SMILES is that it efficiently uses numbers to 
#      indicate connectivity using a process of "opening" bonds and "closing" them.
#      Along with radical (.) notation, this is totally sufficient for describing
#      any connected network of atoms, including situations where the ordering
#      of connections is critical (e.g., in describing stereochemistry). Basically, 
#      one can simply list all the atoms in an arbitrary order as single-atom 
#      components (separated by "."), then assign bonds as desired, in whatever
#      order is desired.
#      
#      The problem comes when attempting to indicate stereochemistry for 
#      centers with more than six substituents or with geometries that are
#      outside the standard set of AL, TH, TP, SP, and OH. In such cases, 
#      there may arise situations where the ordering of unbonded substituents 
#      will be critical. An example is crystal structures of metals and metal
#      alloys. In this situation there are no covalent bonds. The need is to 
#      be able to compare two such crystal structures. 
#      
#      The solution is to create SMARTS and SMILES strings for complex 
#      "atomic environments" consisting of a central atom and any number of
#      nearby atoms, using a cutoff radius rather than a bonding pattern.
#      One possibility is to create a "pseudobond" that connects the central 
#      atom to all of its connected atoms, but this is not really necessary and
#      slows processing significantly. Instead, the [@PHn] syntax proposed here
#      allows the polyhedral environment to be specified only for the polyhedron
#      itself, exclusive of the central atom. 
#
#      By providing a means of referring to a specific previously defined atom in a
#      SMILES or SMARTS string, we can allow an atom in such an arrangement 
#      to be part of two different polyhedra.   
#        
#      Thus, although isolated polySMARTS can be implemented without atom referents, 
#      extending that to more complex multi-atom polySMARTS searches requires them.
#            
#   -- example, simple branched organic
#      
#		$ load $t-butylmethylether
#		$ select on search("[O][C(a)H0].[C(a)]C")
#		
#		5 atoms selected
#		
#      same as
#      
#		$ select on search("[O][CH0](C)")
#        		
#   -- note that [C(2)] and [O(2)] are not sensible and may be disallowed. 
#      

code: javajs.util reconciled with SwingJS project

bug fix: polyhedra.stereoSmiles --> polyhedra.polySmiles

new feature: polyhedron.polySmiles adds central atom

  -- example:
  
		load SF6.smol -1
		polyhedra
		calculate symmetry polyhedra
		x = {polyhedra}.polyhedra.polySmiles
		print x

		//* S1 #1 *//	[S@PH6].
		//* F6 #7 *//	[F]1234.
		//* F2 #3 *//	[F]5672.
		//* F3 #4 *//	[F]849%10.
		//* F4 #5 *//	[F]%11%10%126.
		//* F1 #2 *//	[F]937%12.
		//* F5 #6 *//	[F]8%1151

	    print  polyhedron(x).atomname

		S1		 			        		
  		        				     
JmolVersion="14.3.16_2015.09.08"

code: Efficient JSON parser javajs.util.JSONParser
  -- requires object being parsed to be an object (bounded by "{" and "}")

JmolVersion="14.3.16_2015.09.06"

new feature: 3DNA DSSR JSON mode 
 -- http://x3dna.bio.columbia.edu/dssr/report.php?id=1ehz&opts=--more%20--json=ebi-no-str-id
 -- uses unit ids
 -- preliminary version is /dssr1 but will replace /dssr
 
  load =1ehz/dssr1
  cartoons only;
  color @{within(dssr,"junctions")} blue
  color @{within(dssr,"hairpins")} white
 
new feature: JSON dssr loading and interpretation
	load =1ehz
	dssr = eval(load("1ehz.dssr.json"));
	y = within(dssr.junctions)
	color @y blue

bug fix: dssr = "testing"  works, but then print dssr  just prints "DSSR"
  -- was true for all within() function keywords, such as substructure, search, sequence, etc.
  
new feature: select within("1ehz|1|A|G|45||||")
new feature: print within("1ehz|1|A|G|45||||")
  -- unit IDs
  -- see http://rna.bgsu.edu/main/rna-3d-hub-help/unit-ids
  -- used for annotations, validations, dssr, and rna-3d processing
  -- pdbid|model|chain|RESNAME|resno|ATOMNAME|altcode|inscode|symmetry
  -- can truncate trailing (but not leading) pipe symbols
    1ehz|1|A|G|15, |1|A|G|15|C2
  -- requires at minimum a model number, chain, and residue number
    |1|A||15
  -- ATOMNAME blank indicates full residue, with altcode indicating "this alt_id or no alt_id" (a configuration)
  -- ATOMNAME nonblank indicates one atom, with altcode indicating "exactly this alt_id" (a location)
  -- can be multiple, white space, comma, "]", "[", and double quote ignored
    1ehz|1|A|G|15||||,1ehz|1|A|U|59||||,1ehz|1|A|C|60|||
    
  //  Unit Identifier Specification
  //
  //  We describe the type and case sensitivity of each field in the list below. In addition, we list which item in the mmCIF the data for each field comes from. We also show several examples of the IDs and their interpretation at the end.
  //
  //  Unit ids can also be used to identify atoms. When identifying entire residues, the atom field is left blank.
  //
  //      PDB ID Code
  //          From PDBx/mmCIF item: _entry.id
  //          4 characters, case-insensitive
  //      Model Number
  //          From PDBx/mmCIF item: _atom_site.pdbx_PDB_model_num
  //          integer, range 1-99
  //      Chain ID
  //          From PDBx/mmCIF item: _atom_site.auth_asym_id
  //          <= 4 character, case-sensitive
  //      Residue/Nucleotide/Component Identifier
  //          From PDBx/mmCIF item: _atom_site.label_comp_id
  //          1-3 characters, case-insensitive
  //      Residue/Nucleotide/Component Number
  //          From PDBx/mmCIF item: _atom_site.auth_seq_id
  //          integer, range: -999..9999 (there are negative residue numbers)
  //      Atom Name (Optional, default: blank)
  //          From PDBx/mmCIF item: _atom_site.label_atom_id
  //          0-4 characters, case-insensitive
  //          blank means all atoms
  //      Alternate ID (Optional, default: blank)
  //          From PDBx/mmCIF item: _atom_site.label_alt_id
  //          Default value: blank
  //          One of ['A', 'B', '0'], case-insensitive
  //      Insertion Code (Optional, default: blank)
  //          From PDBx/mmCIF item: _atom_site.pdbx_PDB_ins_code
  //          1 character, case-insensitive
  //      Symmetry Operation (Optional, default: 1_555)
  //          As defined in PDBx/mmCIF item: _pdbx_struct_oper_list.name
  //          5-6 characters, case-insensitive
  //          For viral icosahedral structures, use \u201CP_\u201D + model number instead of symmetry operators. For example, 1A34|1|A|VAL|88|||P_1
  //
  //  Examples
  //
  //      Chain A in 1ABC = \u201C1ABC|1|A\u201D
  //      Nucleotide U(10) chain B of 1ABC = \u201C1ABC|1|B|U|10\u201D
  //      Nucleotide U(15A) chain B, default symmetry operator = \u201C1ABC|1|B|U|15|||A\u201D
  //      Nucleotide C(25) chain D subject to symmetry operation 2_655 = \u201C1ABC|1|D|C|25||||2_655\u201D
  //
  //  Unit ids for entire residues can contain 4, 7, or 8 string separators (|).

bug fix: after atom deletion, atom iterator still finds atoms.
  -- was not reinitializing the binary search after atom deletion 
  -- affects polyhedra, within()
		$ load $caffeine
		$ delete _N
		4 atoms deleted
		$ print {*}.count
		20
		$ print within(14.0, {c6}).count
		24

JmolVersion="14.3.16_2015.09.05"

new feature: POLYHEDRA
  -- same as POLYHEDRA BONDS {selected}
new feature: POLYHEDRA 4
  -- same as POLYHEDRA 4 BONDS {selected}  
new feature: POLYHEDRA OFFSET 1.4
  -- same as POLYHEDRA COLLAPSED faceCenterOffset 1.4
new feature: POLYHEDRA COLLAPSED 1.4
  -- same as POLYHEDRA COLLAPSED faceCenterOffset 1.4

code: Polyhedra work, including more efficient algorithms for completing set of faces

bug fix: tracking down thread-safe issue in application console
bug fix: in Java, mouse should not lose control if moved out of application

JmolVersion="14.3.16_2015.09.04"

bug fix: Mac OS does not add modifiers (left, right, ctrl, etc.) to drag operations


JmolVersion="14.3.16_2015.08.31"

bug fix: MOVE command with 0 time does not work

JmolVersion="14.3.16_2015.08.31"

bug fix: plot property  with nothing more throws Exception
bug fix: Gaussian Dialog does not add final line ending when saving

new feature: Jmol SMILES/SMARTS generic polySMILES polyhedron option @PHn(....)
 -- totally generic; will work with any number of connected atoms
 -- suitable replacement for all TP, OH, etc. 
 -- standard equivalence to [C@] is [C@PH4(234)]
 -- standard equivalence to [C@@] is [C@PH4(432)]
 -- "reverse" option via "!": [C@PH4(!234)]
 -- designation around any or all of the attached atoms is possible. For tetrahedra, this is
    redundant, but for higher number of vertices, it may not be. This designation is 
    done using "." to separate atoms. 
 -- so [C@] is [C@PH4(234)] or [C@PH4(!432)] or [C@PH4(.134)]
 -- implied H as in [CH@] will be atom 1 if this is the first atom; 2 if not -- Br[CH@]....
    (same as in standard tetrahedral)

 -- not implemented yet for SMARTS searching of SMILES strings
    
		$ load $2-bromobutane
		$ show smiles
		Br[C@@H](C)CC
		$ print {*}.find("Br[C@](C)(H)CC")
		({0:5})
		$ print {*}.find("Br[C@PH4(234)](C)(H)CC")
		({0:5})
		$ print {*}.find("Br[C@PH4(234)](H)(C)CC")
		({})
		$ print {*}.find("Br[C@PH4(432)](H)(C)CC")
		({0:5})
		$ print {*}.find("Br[CH@@](C)CC")
		({0:4})
		$ print {*}.find("Br[CH@PH4(.134)](C)CC")
		({0:4})
		$ print {*}.find("Br[CH@PH4(!.134)](C)CC") 
		({})
		
 -- :)
 
 
JmolVersion="14.3.16_2015.08.30"

code: refactoring of smiles package

new feature: preliminary no-limit SMILES polyhedron stereochemistry @PHn
  -- very preliminary
  -- the format relies on specifying the order of bonds, so it
     creates a new component for each atom in the polyhedron, and it 
     then arranges all bonds listed in @/CCW or @@/CW rotation as projected 
     into the plane perpendicular to the line connecting the given (polygon vertex)
     atom and the (central) reference atom. 
  -- example:
  
		$ load $methane
		$ polyhedra 4
		$ calculate symmetry polyhedra 
		C1 #1 Td
		
		$ print @1.polyhedra.polySmiles
		//* C1 #1 *//	[C@PH4].
		//* H5 #5 *//	[H]123.
		//* H2 #2 *//	[H]245.
		//* H3 #3 *//	[H]356.
		//* H4 #4 *//	[H]641
		 
  -- thus, stereochemistry is set based on the winding of the atom environment.
  -- the reference atom is listed first, but it need not be connected to the other
     atoms, and in fact for polyhedra we leave it out (note that it is not connected) 
  -- there is no limit to the number of connections any particular connecting atom 
     can have. So this covers all general SMILES stereochemistry. 
  -- a match is when the proper winding is found for all vertices. 
     
        load $C(Br)(Cl)F
		color chlorine blue
		polyhedra 4 bonds distancefactor 3.0
		calculate symmetry polyhedra
		print @1.polyhedra.polySmiles

		C1 #1 C1
		
		//* C1 #1 *//	[C@PH4].
		//* H5 #5 *//	[H]123.
		//* Br2 #2 *//	[Br]245.
		//* Cl3 #3 *//	[Cl]356.
		//* F4 #4 *//	[F]641
		$ invertselected
		$ polyhedra 4 bonds distancefactor 3.0
		calculate symmetry polyhedra
		print @1.polyhedra.polySmiles
		
		C1 #1 C1
		
		//* C1 #1 *//	[C@PH4].
		//* H5 #5 *//	[H]123.
		//* Br2 #2 *//	[Br]245.
		//* Cl3 #3 *//	[Cl]641.
		//* F4 #4 *//	[F]356
    
     
new feature: Jmol SMILES and SMARTS accepts look-back bond targeting using (n)
             where n is the sequential atom in the pattern.
  -- for example:
   
      $load cyclopentane
      print {*}.find("CCCCC(1)")   # cyclopentane ring
          
  -- will be very important in building around [@PHn] stereochemistry, because these
     components need to have no other connections, at least at the point of description. 
     Then if we need to attach to these, we can do so by connecting using this look-back
     technique. 
  
bug fix: Jmol bioSMARTS string-based search not implemented correctly
	-- for example, "~p~AC:A".find("SMARTS","~p~A:C", true) should give [[2,1]]
 
new feature: Jmol SMILES trigonal pyramidal stereochemistry 
  -- same as tetrahedral, put without the fourth group.
  
new feature: {*}.find("SEQ")
new feature: {*}.find("SEQ", true)
new feature: {*}.find("SEQ", "H")
 -- no-comment Jmol bioSMILES:
 
	 $ load =3ll2
	 $ print {carbohydrate}.find("seq")
	  ~c~[MAN][MAN][MAN].~c~[MAN][MAN].~c~[MAN][MAN][MAN]
	 $ print {carbohydrate}.find("seq", true)
	  	


code: much more efficient selection for groups, types of monomers, polymers, etc.

bug fix: {*}.find("SMILES",true) should default to covalent crosslinks
bug fix: {*}.find("SEQUENCE",true) should not include hydrogen bonded crosslinks

undocumented feature: Jmol bioSMILES includes ~c~ for carbohydrate
  -- for example:
   
   $ load =3LL2
	SUGAR BINDING PROTEIN                   28-JAN-10   3LL2
	MONOMERIC GRIFFITHSIN IN COMPLEX WITH A HIGH-MANNOSE BRANCHED
	CARBOHYDRATE
	found biomolecule 1: A
	
   $ select carbohydrate
	168 atoms selected
   $ show smiles true
	//* Jmol bioSMILES 14.3.16_2015.08.29  2015-08-29 12:03 1 *//
	//* chain A CARBOHYDRATE 122 *// ~c~[MAN]:1[MAN]:2[MAN] //* 124 *//.
	//* chain A CARBOHYDRATE 125 *// ~c~[MAN]:2[MAN] //* 126 *//.
	//* chain A CARBOHYDRATE 127 *// ~c~[MAN]:1[MAN][MAN] //* 129 *//


new feature: show SMILES TRUE  
  -- shows bioSMILES
new feature:  {*}.find("SEQUENCE","H") adds hydrogen-bonded crosslinks

bug fix: select within(polymer, water) should select nothing
bug fix: select !within(polymer, *) should not select nothing

bug fix: SMILES/SMARTS not accepting two separate processing directives such as /noaromatic/ /nostereo/
new feature: GaussianReader reads high precision vibrational mode data
  -- Gaussian input options must include Freq=(HPModes)
new feature: GaussianRedaer filter "NOHP" flag ignores high precision vibrational mode log info
new feature: Gaussian FCHK file reader reads vibrational modes 
  -- Gaussian input options must include Freq=(SaveNormalModes)
 
JmolVersion="14.3.16_2015.08.26"

new feature: SMARTS conformational search no longer limited to one range. 
  -- example:
  
    select on search("{[CH3]}(.t:50,70,-70,-50)CC{[CH3]}")
    

JmolVersion="14.3.16_2015.08.25b"

bug fix: {3/, 2/, 1/} notation broken

JmolVersion="14.3.16_2015.08.25"


bug fix: JmolThread should use setTimeout in resumeEval

new feature: JmolSMILES $(.x:1,2,3,4,5,6,7,8)
    -- x is oen of d,a,t
	-- up to four ranges per measurement
new feature: print  {2.1}.find("SMILES",{1.1})

bug fix: compare() function returning matrix with translation about center, not origin
bug fix: print compare({1.1},{2.1}, "SMILES", "stddev") broken
bug fix: select search("[$(select atomno < 5)]")  broken
bug fix: select search("[$(select atomno < 5) or @5]")  broken

new feature: _hoverLabel  
   -- reports general hover label set by hover command
   
new feature: _hoverEnabled
  -- reports if hover is enabled or not
  
bug fix: calculate partialCharge does not store result if all values are 0 (Otis Rothenberger)
bug fix: still problems with aTest = "testing"; x = [aTest:aTest] or a = [property_MYINFO:aTest] (Rolf Huehne)
bug fix: cross(a,b) broken
bug fix: write PDB broken; works without "PDB" keyword broken in 14.3.15_2015.06.18


new feature: /invertStereo/ flag for SMARTS search
  -- allows quick check for enantiomers
  -- example: select search("/invertStereo/C[C@H](Br)CC") will match (R)-2-bromobutane
              even though it is for (S)-2-bromobutane
              
FEATURE CHANGE: Definitions of dna, rna, purine, and pyrimidine were ambiguous and 
                not particularly viable for group fragments. This is much clearer
                now: Fragments and P-only and N-only monomers are identified by 
                name only:
                
  // These masks are only used for P-only and N-only polymers
  // or cases where there are so few atoms that a monomer's type
  // cannot be determined by checking actual atoms and connections.
  // They are used for NucleicMonomer or AminoMonomer classes only as 
  // a last resort.
  //
  //             I  A G        
  //   purine:   100101 = 0x25
  
  //              UT C
  // pyrimidine: 011010 = 0x1A
  //
  //            +IUTACGDIUTACG IUTACG
  //        rna: 110000 000000 110111 = 0x30037
  
  //            +IUTACGDIUTACG IUTACG
  //        dna: 001111 111111 001000 = 0x0FFC8
  

bug fix: SMILES recognizes atom name [*.CA] but not residue name [ALA.*]
bug fix: Jmol BioSMILES broken

bug fix: set cartoonLadders with phosphorus-only polymers crashes Jmol

bug fix: protein and nucleic are not set properly for non-monomer groups (Eric Martz)
 -- broken in Jmol 14.3.11 (12/13/2014)  
 -- general definition of protein is from having CA, C, and N. But there
    are situations where we know it is protein from its group name (ALA,LEU..)
    despite the fact that it is just one atom. Same for nucleic.
 -- note that non-canonical (HETERO) amino acids or nucleic bases that do not have
    the requisite atoms to identify them as such will still not test positive for 
    "protein" or "nucleic". 

JmolVersion="14.3.16_2015.08.21"

bug fix: Tools...Spectra...JSpecView broken

JmolVersion="14.3.16_2015.08.21"

new feature: load var x 
  -- same as load "@x"
  -- similar in syntax to write var x t.png
  -- example:
  
  var x = load("quartz.cif")
  load var x {1 1 1}
  
bug fix: creating and running and saving binary hash from PNGJ fails
  -- allows creating an associative binary array from a PNGJ file
     then modifying it and loading that variable
     then saving it as a new PNGJ file
  -- initial PNGJ file is not necessary if binary array x is created by some other means
  -- example:
  
      var x = load("test.png",true)
      load "@x"
      write test2.png as PNGJ
      
bug fix: hover callback is not supposed to be stopped with HOVER OFF
bug fix: atom.sx and atom.sy and atom.sz report incorrectly when antialiasing is on
bug fix: write VAR x "test.png" creates a ZIP file instead of a PNGJ file when x is from load("test.png",true)
bug fix: write test.png as PNGJ (without initial quotes) fails

JmolVersion="14.3.16_2015.08.19"

bug fix: PyMOL reader does not load surface from PNGJ file
bug fix: PDB reader can skip assignments of secondary structure after first structure loaded during session

JmolVersion="14.3.16_2015.08.18"

bug fix: PyMOL reader not reading "H69" as "helix" (RGS-Ga_8pdb_structures_aligned_S90_20.5.15.pse)
bug fix: PyMOL labels offset in Y direction (down.pse) see http://noys3.weizmann.ac.il/a2jb/browse
bug fix: PyMOL session with isosurface cannot be read from state 
known bug: RGS-Ga_8pdb_structures_aligned_S90_20.5.15.pse has two frames; showing frame 2 with no displayed atoms

JmolVersion="14.3.16_2015.08.17"

bug fix: select %? not working
bug fix: select ^? not working
  

JmolVersion="14.3.16_2015.08.17"
released

bug fix: PDB reader cuts off long titles.
bug fix: slab setting by wheel can be unintentional
bug fix: wheeling slab could run range unintentionally way too high or low

new feature: slab/depth setting.

  -- these enable wheel actions
  
    bindAction(SINGLE|CTRL|WHEEL, ActionManager.ACTION_wheelZoom);
    bindAction(SINGLE|SHIFT|WHEEL, ActionManager.ACTION_wheelZoom);
    bindAction(SINGLE|CTRL|SHIFT|WHEEL, ActionManager.ACTION_wheelZoom);
    
  -- these enable slab-wheel actions
  
    bindAction(SINGLE|CTRL|WHEEL, ActionManager.ACTION_slab);
    bindAction(SINGLE|SHIFT|WHEEL, ActionManager.ACTION_depth); 
    bindAction(SINGLE|CTRL|SHIFT|WHEEL, ActionManager.ACTION_slabAndDepth);


JmolVersion="14.3.16_2015.08.16"

run up to full documentation
 
JmolVersion="14.3.16_2015.08.15"

new feature: xxx.array
 -- forces xxx if xxx is already an array, otherwise returns an array created from xxx.
 -- matrix3f and matrix4f are converted to standard 3x3 or 4x4 arrays; others are returned as [ xxx ].
 -- can be used to force an array where a string or other single value will be returned.
 -- particularly useful to force an array from a bitset operation that is evaluated for one atom.
 -- example:
     
       print {altloc=='A'}.sort  # causes an error if {altloc="A"} is one atom
       print {altloc=='A'}.array.sort # forces an array [ "A" ]  
 
bug fix: x.array.pivot returns "NaN" for empty array -- should return an empty associative array

JmolVersion="14.3.16_2015.08.14"

bug fix: label "3%"  reads "3null"
bug fix: {*}.label = ... resets offsets, fonts, and alignment
bug fix: label "3%%" is saved in the state as "3%"
 
JmolVersion="14.3.16_2015.08.13"

released

JmolVersion="14.3.16_2015.08.12"

released - but a bad build

bug fix: set labeloffset 4 4  (specifically) just centers label
bug fix: var b = a..B  fails (found by Rolf Huehne)
  -- non-lower-case associative array name same as user variable name 
     turned into lower case and then looked up as a["b"] instead of a["B"], so not found

bug fix: show xxx (variable) broken in 4.3.15_2015.06.13          

JmolVersion="14.3.16_2015.08.11"

released

bug fix: a = {*}.label("%[xxx]") does not work.
bug fix: "".format([a,b]) crashes Jmol

new feature: load <mmCIF file> filter "addBonds"
 -- processes _struct_conn records
 -- inter-group connections only
 -- includes _struct_conn bond types:
		covale           covalent bond
		covale_base      covalent modification of a nucleotide base
		covale_phosphate covalent modification of a nucleotide phosphate
		covale_sugar     covalent modification of a nucleotide sugar
		disulf           disulfide bridge
		metalc           metal coordination
 -- ignores _struct_conn bond types: 
		hydrog  hydrogen bond
		mismat  mismatched base pairs
		modres  covalent residue modification
		saltbr  ionic interaction
 
new feature: load *1crn*
 -- loads PDBe "updated" CIF files to allow CONECT-like bond creation
 -- for example, http://www.ebi.ac.uk/pdbe/static/entry/1h68_updated.cif
 -- suitable replacement for PDB CONECT
 -- processes _chem_comp_bond and _struct_conn categories
 -- presence of _chem_comp_bond will process _struct_conn as well, regardless of filter "addbonds"
      (because _chem_comp bonds are only intra-group, and for full CONECT-like behavior, we need all bonds)
 
JmolVersion="14.3.15_2015.08.09"

bug fix: CML reader can fail (e.g. nsc244a.cml)

code: refactoring of JmolDataManager

JmolVersion="14.3.15_2015.08.08"

new feature: atom property "monomer" same as %g
new feature: atom property "seqcode" same as %r
new feature: load "test.pdb" from write property atomno temperature now restores values for atomno and temperature for points on plot 

bug fix: label %g does not indicate group index in chain
bug fix: JSmol does not recognize label %W %g %r %O etc. with single digits where there is no %[xxx] equivalent

bug fix: "print stateVersion" not reporting as documented. 
bug fix: write property atomno temperature "test.pdb" does not preserve long residue names from CIF files or long atom names from other file types 

JmolVersion="14.3.15_2015.08.06"

bug fix: stereo setting should not be saved in state. 
  -- though saved, it was not by default set to normal,
  -- thus influencing later loads.
  
bug fix: STEREO not implemented in JavaScript

new feature: STEREO DTI
  -- left/right dual panel, as just STEREO
  -- compresses width by 50% for DTI mode (Dimension Technologies, Inc.)
  
bug fix: calculate STRUTS broken for 3dfr, with peptide ligand MTX

JmolVersion="14.3.15_2015.08.01"

bug fix: SMARTS matching broken for [r5] ring designation
 
bug fix: reference to functions as commands requires lower case:
  -- for example:  
  function F(a){ print a }
  F("test") // OK
  f("test") // OK
  f "test"  // OK
  F "test"  // fails
  

JmolVersion="14.3.15_2015.07.30b"

bug fix: JavaScript deletion of array elements fails for int[] arrays.

JmolVersion="14.3.15_2015.07.30"

new feature: set multipleBondBananas TRUE
  -- displays multiple bonds as banana bonds
  -- does not carry over after model loading
  
new feature: set multipleBondSpacing 0.15; set multipleBondRadiusFactor -1.0
  -- positive number for spacing but negative for radiusFactor rotates fixed multiple bonds 90 degrees.

bug fix: magnetic spin vectors do not render properly (broken in 14.3.13_2015.05.12)

JmolVersion="14.3.15_2015.07.29"

new feature: [Font] button added to ScriptEditor

bug fix: config 2 and  select config=2 may not work properly (still)
bug fix: minimization of PCl4 (==PC4) does not auto-switch to UFF from MMFF94 (bond key not set)

FEATURE CHANGE: org.jmol.awtjs.swing.Dimension dependency removed from JmolViewer and JmolStatusListener interfaces
  -- changed to int[]
 
JmolVersion="14.3.15_2015.07.22"

bug fix: config 1  does not work; listing is not complete. 

JmolVersion="14.3.15_2015.07.11"

bug fix: format("%5.-5i") broken -- only shows right  four  digits if # digits is 5. 
bug fix: write PDB broken for some systems (14.3.12)

JmolVersion="14.3.15_2015.07.09"

released as 14.2.15_2015.07.09


bug fix: load "xxx" 1 {10 10 10} does not recognize lattice information when model number is given (broken in 07.07)

JmolVersion="14.3.15_2015.07.08c"

bug fix: load files "xxx.png|xxxx" "xxx.png|zzzz"  not read from state properly
bug fix: polyhedra not saved in state property
bug fix: moving atoms with 4x4 matrix not saved in state
bug fix: moving of an atom having a polyhedron fails to move the polyhedron as well


new feature: smiles2.find("SMILES",smiles1, asMap, allMappings)
  -- asMap = TRUE (default false) indicates you want an atom 
     correlation map indicating positions in smiles2 corresponding to smiles1 
  -- allMappings = TRUE (default false) indicates you want 
     all mappings, not just the first found 
  -- returns a number, -1, 0, n>0 when asMap is false (allMappings ignored)
  -- returns int[] when allMappings is false
  -- returns int[][] when allMappings is true  
  -- example:
    var s1 = atom1.polyhedron.getProperty("SMILES")
    var coords = atom2.polyhedron.getProperty("vertices")
    var s2 = atom2.polyhedron.getProperty("SMILES")
    var coords2 = atom2.polyhedron.getProperty("vertices")
    var map12 = s2.find("SMILES", s1, true, false)
    var coords2Mapped = []
    for (var i in map12) coords2Mapped.push(coords2[i + 1]) 
    coords2 = coords2Mapped
    var mat = compare(coords1, coords2)
    select {1.1}
    rotateselected @mat
    
JmolVersion="14.3.15_2015.07.07c"

bug fix: x.getProperty("[select name where composition[1] == 0.5]")
 -- the [ there is tripping us up. True, ..1 could be used instead as well.

JmolVersion="14.3.15_2015.07.07b"

bug fix: 2015.07.06 breaks text writing in JSmol
bug fix: Crystal reader cannot handle   TOTAL ENERGY CORRECTED... line

new feature: JSmol  Jmol._persistentMenu = true 
 -- allows menu to persist and not be removed
 
new feature: JSmol  <div id=JmolApplet0_console></div>  sets a place on the page for the JSmol console.

new feature: load xxx filter "latticeScaling=1.2"
  -- scales model based on a crystal lattice
	  -- allows volume matching for crystal comparison
  
bug fix: SMARTS processing with "." may not find substructure 

JmolVersion="14.3.15_2015.07.03"

bug fix: mmCIF reader does not recognize load MODEL ... 
bug fix: PDB reader should be reading load "" [1 3 4] as MODEL record numbers, not sequential numbers
bug fix: load MODELS "" [1 3 4] does not work (although load "" [1 3 4], without with MODELS keyword, works)

clarification: 

  load "" 1             # loads the first model in a file when not PDB or mmCIF. 
  load "" 1             # loads the model with MODEL 1 record for a PDB file. 
  load "" 1             # loads the model with _atom_site.pdbx_PDB_model_num = 1 for an mmCIF file 
  load "" [1]           # same as load "" 1; brackets allow for more than one model, for instance [1 3 5]
  load MODELS ({1}) ""  # always loads the SECOND model in a file
  

  
JmolVersion="14.3.15_2015.06.30"

bug fix: POVRay and VRML exporters mishandle label backgrounds
bug fix: exports not handling rockets correctly

JmolVersion="14.3.15_2015.06.19c"

bug fix: 1/{a b c} gives 0, not 1/length({a b c})

JmolVersion="14.3.15_2015.06.19b"

new feature: MACRO command
 -- runs predefined script, generally defining new functions of general use
 -- contributions welcome!
 -- will be expanded
 
		$ macro aflow
		running http://aflowlib.mems.duke.edu/users/jmolers/jmol/spt/AFLOW.spt
		aflowLoad(binaryAlloy) loaded
		aflowBinaries loaded
		aflowDualArray(binaryAlloy, a, b) loaded
		aflowDualWrite loaded
		aflowConvexHull(binaryAlloy) loaded
		aflowCheckBinary(binaryAlloy) loaded
		aflowGetPG(binaryAlloy, a, range1, range2,radius) loaded
		$ aflowLoad("AgAu")
		294 models

		$ print aflowConvexHull
		  {
		    "Cb"  :  0.0
		    "Hf_eV_VASP"  :  0.0
		    "modelNumber"  :  2
		   }
		  {
		    "Cb"  :  0.25
		    "Hf_eV_VASP"  :  -0.0472733
		    "modelNumber"  :  26
		   }
		  {
		    "Cb"  :  0.5
		    "Hf_eV_VASP"  :  -0.085589
		    "modelNumber"  :  180
		   }
		  {
		    "Cb"  :  0.75
		    "Hf_eV_VASP"  :  -0.0463823
		    "modelNumber"  :  25
		   }
		  {
		    "Cb"  :  1.0
		    "Hf_eV_VASP"  :  0.0
		    "modelNumber"  :  260
		   }

bug fix: AFLOW binary file reader can fail with certain VASP formats containing 
         both in-line atom labels and atom elements prior to #elements line. (AlPd#5, for example)  

JmolVersion="14.3.15_2015.06.19"

new feature: pt.distance(plane,ptRef)
 -- returns a negative distance if pt and ptRef are on different sides of the plane
 -- useful for constructing 3D convex hulls and polyhedra, where all points
    must be on the same side of all planes
  
new feature: removing empty array values using array.find() and opposite using array.find("")
 -- "empty" means an entry that is "", [], or {}
 -- for example:
   
   print [0 3 4 "" 5 {} [] 6].find()
   
     [0 3 4 5 6]
 
   print [0 3 4 "" 5 {} [] 6].find("")
     [ "" {} [] ]
     
bug fix: msCIF reader can hang if occupancy is not fractional
bug fix: JSmol applet not returning full set of parameters in animFrameCallback
bug fix: load FILL command can fail if base unit cell is not part of the needed set for the specified volume

JmolVersion="14.3.15_2015.06.18"

new feature: polyhedra ONLY

new feature: calculate symmetry POLYHEDRA
  -- sets values for ShapeInfo.Polyhedra.smiles, .smarts, and .pointGroup  

bug fix: wireframe ONLY (RESTRICT) executes polyhedral DELETE instead of OFF 
bug fix: Polygons not indicating visibility when they are the only thing visible.
bug fix: x[++y] did not increment y. x[y++] and other contexts were fine

JmolVersion="14.3.15_2015.06.17"

new feature: extracting array of sequential arrays from array of associative arrays
 -- pull out just the values desired into a sequential array
 -- example, where b is an array of associative arrays [....., energy:..., pointGroup....]
 
 	  print b.format(["energy", "pointGroup"])
   
new feature: array of sequential arrays formatting using array.format("format")
 -- example 
	
	  energy_pg = b.format(["energy", "pointGroup"])
	  print energy_pg.format("%5.3f\t%5s")

new feature: associative array binning:
 -- creates a pivot table of the bins
 -- adds keys "_bin", "_binMin", and "_binMax" to the initial array
 -- example:

  
    load "AgAu.aflow_binary"
    polyhedra 4-24 3.65 unitcell translucent 0.2
	m = _("aflowInfo[Select modelNumber where Cb=0.5]")
	b = {@1  and model=m}.polyhedra.all.getProperty("[select energy,pointGroup,modelNumber");
	c = b.bin(-0.1,0.1,0.02,"energy")
	print b.format(["energy", "pointGroup"]).sort(1).reverse.format("%5.3f  %5s")
 
 

new feature: polyhedra highlight with select ON or set selectionHalos ON

new feature: getProperty("ShapeInfo.polyhedra") includes keys 
				atomIndex
				atomNumber
				center
				energy  // from model auxiliaryInfo _m.Energy, if available 
				faceCount
				faces
				modelIndex
				modelNumber
				smarts
				smiles
				vertexCount
				vertices
				
new feature: polyhedra properties "smiles" and "smarts"
 -- uses JmolSMILES, extending SMILES for periodic structures
 -- smiles is a SMILES string for the polyhedron, not including its center atom.
 -- smarts is smiles but replacing atom descriptors with *
 -- can be searched for using x = polyhedron(s) where s is SMILES or SMARTS


 
new feature: polyhedron(smiles)
new feature: polyhedron(smarts)
 -- searches for a polyhedron (which must be already present) matching the given SMILES
 -- for example:
 
        // load a set of binary alloy structures
 		load "AgAu.aflow_binary"
 		// generate all polyhedra on the first atom of each model 
 		select @1
 		polyhedra 4-24 3.65 unitcell translucent 0.2
 		// find all SMARTS codes for 12-vertex polyhedra; taking the first 
		x= polyhedra(12).polyhedra.all.getProperty("smarts")[1]
		// find central atoms for all similar polyhedra
		y= polyhedra(x)
		// get their model numbers
		print y.model.all
		z= y.model.all
		// make the current frame set just those models
		frame @z
		
 -- not fully worked out		

new feature: array.getProperty("xxxx")
  -- same as getproperty(array, "xxxx")
  -- drills down into an array of associative arrays to get sublist
  -- can be used with [SELECT ... WHERE]
   
    
bug fix: ++x and x++ do not increment properly when in expressions 
	// no problem here because it is compiled as "x = x + 1"
		x = 0
		x++
		print "x should be 1 " + x

	// x does not increment, but the test passes
		x = 0
		if (++x) {
		print "good"
		}
		print "x should be 1 " + x
		
	// x does not increment, but the test passes ("bad" is not printed)
		x = 0
		if (x++) {
		 print "bad"
		}
		print "x should be 1 " + x
		x = 0
	// works
		x++
	// y is OK, but x does not increment
		y = x++
		print "x should be 2 " + x
		x = 0
	// z is OK, but x does not increment
		z = ++x
		print "x should be 1 " + x

    // result:
    
		x should be 1 1
		good
		x should be 1 0
		x should be 1 0
		x should be 2 1
		x should be 1 0

JmolVersion="14.3.15_2015.06.16"
bug fix: msCIF reader failing for Legendre polynomials of order greater than 4 
  -- JavaScript fix for new double[m + 1][]
  -- must use AU.newDouble2(m + 1);

JmolVersion="14.3.15_2015.06.14c"

bug fix: var firstPARAM  = "p1_b"; x = [FIRSTParam: "p1_a"]; results in lowering of case as [firstparam:....]
bug fix: set drawPicking draw;set drawpicking  does not show handles
bug fix; point group not calculated when the selected atoms are a subset of a model
bug fix: x.find("SMILES") is incorrect for structures that have hypervalent atoms and branches such as inorganic nitrates
bug fix: msCIF reading with two models, and only one has displacement modulation causes "render error" crash
bug fix: msCIF reader failing for Legendre polynomials of order greater than 4
bug fix: DRAW for quadrilateral broken when perspective depth is turned off.
bug fix: SET ECHO IMAGE broken in JavaScript version


new feature: POLYHEDRA 12 UNITCELL
 -- creates a polyhedron (12-gon in this case) around each of the
    currerntly selected atoms that has that bonding environment
 -- DOES NOT require atoms at these positions - can simply use the 
    unit cell and periodicity to find the relevant atom positions. 
 -- will check bonding as necessary using autobonding parameters 
 -- accepts all standard polyhedra options. For example:
 
    polyhedra 12,16 3.5 UNITCELL
    
new feature: POLYHEDRA 4-16 
 -- allows a range of unit cell bonding patterns.
 -- in this case, same as 4,5,6,7,8,9,10,11,12,13,14,15,16
 
    polyhedra 4-16 3.5 UNITCELL 

new feature: getProperty shapeInfo.polyhedra

    print getProperty("shapeInfo.polyhedra[1]").keys

		_ipt
		center
		modelIndex
		planeCount
		polygons
		vertexCount
		vertices

new feature: draw POINTS [ array of points ]

	 draw diameter 0.2 points @{getProperty("shapeInfo.polyhedra[1].vertices")}
	    
new feature: show pointgroup POLYHEDRON
 -- uses points from the polyhedron of the first selected atom
 -- recommended to use specific atom reference in POLYHEDRA command:
 
    select @21
    polyhedron 3.5 UNITCELL
    show pointgroup polyhedron 
    
    
$ show pointgroup polyhedron
# 13 atoms


Oh	Ci	{2.1020985 -4.3122215 2.1430104}

Oh	nC4	3	2
Oh	C4_1	{0.99993926, -0.007795072, 0.0077921236}
Oh	C4_2	{7.8514034E-7, -0.9997856, -0.020707628}
Oh	C4_3	{7.619045E-7, 0.009661385, -0.9999533}

Oh	nC3	4	2
Oh	C3_1	{-0.58944535, 0.5712053, 0.57120806}
Oh	C3_2	{-0.58944565, -0.5712049, -0.57120824}
Oh	C3_3	{-0.5824926, -0.58349025, 0.5658989}
Oh	C3_4	{0.5764604, -0.5864354, 0.5690228}

Oh	nC2	9	1
Oh	C2_1	{0.7004682, -0.71362424, -0.0092081865}
Oh	C2_2	{0.7004673, 0.009209763, 0.7136251}
Oh	C2_3	{0.99993926, -0.007795072, 0.0077921236}
Oh	C2_4	{-0.70046806, -0.71362436, -0.009208187}
Oh	C2_5	{-8.22445E-7, 0.7071046, -0.707109}
Oh	C2_6	{7.8514034E-7, -0.9997856, -0.020707628}
Oh	C2_7	{0.7056006, -0.019795598, -0.70833325}
Oh	C2_8	{7.619045E-7, 0.009661385, -0.9999533}
Oh	C2_9	{5.440252E-7, 0.70734024, 0.7068733}

Oh	nS6	4	2
Oh	S6_1	{-0.58944535, 0.5712053, 0.57120806}
Oh	S6_2	{-0.58944565, -0.5712049, -0.57120824}
Oh	S6_3	{-0.5824926, -0.58349025, 0.5658989}
Oh	S6_4	{0.5764604, -0.5864354, 0.5690228}

Oh	nS4	2	2
Oh	S4_1	{0.99993926, -0.007795072, 0.0077921236}
Oh	S4_2	{7.619045E-7, 0.009661385, -0.9999533}

Oh	nCs	9	1
Oh	Cs_1	{0.0, 0.7071068, -0.7071067}
Oh	Cs_2	{0.0, -0.7071068, -0.7071068}
Oh	Cs_3	{0.007949507, 0.020366998, -0.999761}
Oh	Cs_4	{0.007952394, 0.999761, -0.020367}
Oh	Cs_5	{1.0, 0.0, 0.0}
Oh	Cs_6	{0.7030396, 0.014484465, 0.71100324}
Oh	Cs_7	{0.7030395, 0.71100324, 0.014484464}
Oh	Cs_8	{0.70023495, -0.008727634, -0.7138592}
Oh	Cs_9	{0.7030395, -0.71100324, -0.014484464}

Oh	type	nType	nUnique
Oh	E	  1	  1
Oh	Ci	  1	  1
Oh	Cs	  9	  9
Oh	Cn	 16	 23
Oh	Sn	  6	 12
Oh		TOTAL	 46

    
 -- displays a table showing point group information.
 -- notice that not all the operators may be found because of settings of 
    set pointGroupDistanceFactor 0.2  being too tight a restriction. 

new feature: draw POINTS <list of points or array of points> 
new feature: draw POLYGON <list of points or array of points> -1
  -- these two are identical; POINTS is a bit nicer. 
  
load "=aflow/AgAu" 20

select @1 & 1.1
polyhedra 4-16 3.7 unitcell

x = within(4, true, "unitcell", {selected})
print x;

draw width 0.2 points @{x["points"]} color red mesh nofill translucent


new feature: select POLYHEDRA
 -- selects central atoms of any atoms having polyhedra. 
 
new feature: select polyhedra(4)
 -- selects central atoms of any atoms having tetrahedral polyhedra. 
 
new feature: x.find("SMILES","*")
 -- creates a topology SMILES, involving just * and connections
 -- does not include stereochemistry
 -- allows comparison of connection patterns without respect to any other consideration.
 -- can be used to check equivalences in inorganic crystal structures.


code: SMILES code cleaned up.
code: most image loading is now asynchronous. (Not BMP, not from PNGJ files with "|" in filename)
code: introducing interfaces to allow less use of @j2sNative and more traceability of method calls in Eclipse

 

bug fix: polyhedra broken for number of vertices > 6.
 -- needed smaller default distanceFactor (set to 1.5; formerly 1.85)
 -- this setting is for any 
  
code: to be released 6/11/15

JmolVersion="14.3.14_2015.06.10c"

bug fix: "transparent" PNG images as echos in front still hide pixels

code : PNG images with partial transparency are not supported. 
       They COULD be supported, but currently the rendering is
       in the first pass, but it could be in a later pass.    

code: g3d.ImageRenderer removed; code moved to g3d

bug fix: GaussianDialog fails to write element symbols
bug fix: animation buttons go to wrong first frame for FRAME [3 2 1]

bug fix: JSmol set echo IMAGE not working properly (Frieda Reichsman)

new feature: {atomset}.bondcount({atomset2})
   -- counts bonds to a specific set of atoms
   -- result is an array 

new feature: [array].pivot 
  -- creates a pivot table using strings, integers, or floats
  -- result is a hash for which the keys are  

$ print {*}.label("%a").pivot
{
  "Ag"  :  1561
  "Cd"  :  1360
 } 


$ load $caffeine
$ print {_N}.bondCount({_C})
	3
	3
	2
	3

$ print {_N}.bondCount({_C}).pivot
{
  "2"  :  1
  "3"  :  3
 }
$  


JmolVersion="14.3.14_2015.06.08"

new feature: [Font] button added to Console


 _ by itself, not as a function, is shorthand for getProperty("auxiliaryInfo")
 
 $ print _.keys
 
 boundbox
 group3Counts
 group3Lists
 modelLoadNote
 models
 properties
 someModelsHaveFractionalCoordinates
 someModelsHaveSymmetry
 someModelsHaveUnitcells
 symmetryRange
 
 
 _m by itself, not as a function, is shorthand for getProperty("auxiliaryInfo.models")[_currentFrame]
 
 $ print format("json",_m.unitCellParams)
  
  [ 0.0,0.0,0.0,0.0,0.0,0.0,0.0,-2.1660376,-2.1660376,0.0,-2.1660376,2.1660376,-4.10273,0.0,0.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN ]
  
  
 {atomset}._  by itself delivers a subset array of auxiliaryInfo.models  for all models in {atomset}
  
 $ print {*}._..1..aflowInfo
 
 (first model's aflowInfo)
 
 
 _(key) prepends "auxiliaryInfo.models", delivering a modelCount-length array of information
 
 $ print _("aflowInfo[SELECT auid WHERE H__eV___VASP_ < 0]")
 
 
 {atomset}._(key) selects for model Auxiliary info related to models of the specified atoms
 
 {atomset}.getProperty(key) defaults to atomInfo, but also allows key to start with "bondInfo" 
 
 Examples:
 
 print _("aflowInfo[select sg where volume_cell > 70]")
 
 print {model>10}._("aflowInfo[select sg where volume_cell > 70]")
 

bug fix: [array].find("xxx") should always return a sub-array; previously if there was only one hit, it returned that hit
bug fix: [array].find("xxx") should not return string equivalent even if it uses that in the find.

JmolVersion="14.3.14_2015.06.07"

new feature: _m.xxx   _m shortcut for @{getProperty("auxiliaryInfo.models[<currentModel>]")}
 -- much easier syntax for getting auxiliary information
 -- <currentModel> was not available, so this was not easily determined
 -- for example - a dynamic echo with model-specific info that changes when the frame is changed
    set echo top center
    echo "@{_m.modelNumber}
    
new feature: _.currentModelIndex  _  shortcut for @{getProperty("auxiliaryInfo", "")}
 -- much easier syntax for getting auxiliary information
new feature: 

new feature: {*}.getProperty("atomInfo.xxx")  alternative for getProperty("atominfo.xxx", {*})
new feature: {*}.getProperty("xxx")  same as {*}.getProperty("atomInfo.xxx") 
new feature: {*}.getProperty("bondInfo.xxx") alternative for getProperty("bondinfo.xxx", {*})
new feature: {*}._(...)  same as {*}._getProperty(...)
 -- note that {*}.getProperty was present but undocumented and not useful

bug fix: Console should be checking scripts after space-bar is pressed.
bug fix: script checking should not trigger screen refresh

code: refactoring of vi	ewer.JC for label/echo business

new feature: set labeloffset range expanded to [-500,500]

new feature: set labelOffsetAbsolute x y  
 -- was undocumented as "set labelOffsetExact" but used in state (still available)
 -- sets label to specific value; same as set labelOffset, but allows 0 in x or y
 -- range [-500,500]
 
bug fix: dragging labels not working properly
bug fix: axisAngle (javajs.util.A4) not resetting angle to 0 --> wrong default orientation saved to state immediately after RESET (broken in 14.1.6_dev_2014.01.16c)

JmolVersion="14.3.14_2015.06.05"

new feature: load "...." FILL BOUNDBOX
new feature: load "...." FILL UNITCELL
new feature: load "...." FILL [o va vb vc]
new feature: load "...." FILL [o vabc]
new feature: load "...." FILL 

 -- loads a crystal structure such that a given volume is packed
 -- volume can be the current boundbox or the current unitcell
 -- can specify origin and a,b,c vectors or origin and diagonal vector
 -- no parameters --> {0 0 0} {10 10 10}
 -- when not a crystal, just loads this model with the specified boundbox 
 -- simplification of initial idea (6/4/2015)

JmolVersion="14.3.14_2015.06.04"

new feature: _argCount, _arguments for functions and scripts

new feature: _caller for functions
 -- a hashtable of local VARs defined in the calling function
 -- note that _caller._caller is not valid. But you can define 
 
   var caller = _caller
   
 and then that will be exposed to the next level of function calls.
 Or you could use use it as a parameter:
 
   function xx() {
    ....
    yyy(_caller)
    ...

given t.spt:
   
function showme(a,b,c) {
  var x = "showme"
  print "c._arguments =" + (c ? format("json",c._arguments) : "<n/a>")
  print "_argCount = " + _argCount + "\nx = " + x
  print "_caller.x = " + _caller.x
  print "_caller.caller.x = " + _caller.caller.x
  print "_arguments = " + format("json", _arguments)
  print " "
}

var x = "scriptlevel"
var caller = {}
showme(1)

function show2() {
 var x = "show2"
 var caller = _caller
 showme(5,6,_caller,7,8,9)
}
show2(4)


$ t.spt("testing" ,"here")
c._arguments = <n/a>
_argCount = 1
x = showme
_caller.x = scriptlevel
_caller.caller.x = 
_arguments = [ 1 ]
 
c._arguments = [ "testing","here" ]
_argCount = 6
x = showme
_caller.x = show2
_caller.caller.x = scriptlevel
_arguments = [ 5,6,{ "x": "scriptlevel","caller": {  },"_arguments": [ "testing","here" ] },7,8,9 ]


JmolVersion="14.3.14_2015.06.03"

new feature: AFLOW binary alloy file reader centers unit cells in all frames at the same point

new feature; AFLOW binary alloy file reader can filter "list=xx" to produce a list of values start with xx. 
  
   load "file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary" {2 2 2} packed filter "list=Hf_a"


new feature: AFLOW binary alloy file reader selective for a given composition:

   load "file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary" {2 2 2} packed filter "Ca=0.5"

new feature: AFLOW binary alloy file reader reading -- DATA -- block into associative arrays:

   load "file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary" {2 2 2} packed 
   print getProperty("auxiliaryInfo.models.aflowInfo['Hf_atom (VASP)']")


bug fix: [SELECT ... WHERE ...] can fail with spaces or [ ] in key names. For example:

    print getProperty("auxiliaryInfo.models.aflowInfo[SELECT Cb,\"Hf_atom [eV](VASP)\" WHERE Cb > 0.4 and Cb< 0.6]")
   
   
The call to the AFLOWLIB API to do this in Jmol involves forcing use of the POST method. The following link will work only in Jmol:

  http://aflowlib.mems.duke.edu/php/apool.php?POST?job=awrapper_apool&lattice=all&alloy=AgAu

Notice that when Jmol reads these files, it automatically catalogs the models along the lines of composition, and it translates their unit cells to be on a common center from frame to frame.

Using a local file, requesting a listing of Hf_atom:

  load "file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary" {2 2 2} packed filter "list=Hf_a"

FileManager opening 1 file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary
The Resolver thinks AFLOW
filtering with ;LIST=HF_A;
[AgCd] REFERENCE: S. Curtarolo, W. Setyawan, S. Wang, J. Xue, K. Yang, R. H. Taylor, L. J. Nelson, G. L. W. Hart, S. Sanvito, M. Buongiorno Nardelli, N. Mingo, and O. Levy, AFLOWLIB.ORG: a distributed materials properties repository from high-throughput ab initio calculations, Comp. Mat. Sci. 58, 227-235 (2012).
[AgCd] REFERENCE: S. Curtarolo, W. Setyawan, G. L. W. Hart, M. Jahnatek, R. V. Chepulskii, R. H. Taylor, S. Wang, J. Xue, K. Yang, O. Levy, M. Mehl, H. T. Stokes, D. O. Demchenko, and D. Morgan, AFLOW: an automatic framework for high-throughput materials discovery, Comp. Mat. Sci. 58, 218-226 (2012).
[AgCd] REFERENCE: S. Curtarolo, D. Morgan, and G. Ceder, Accuracy of ab-initio methods in predicting the crystal structures of metals: review of 80 binary alloys, Calphad 29, 163-211 (2005).
AgCd    0.00000000000000    11    Hf_atom [eV] (VASP)    0.0
AgCd    0.04347826086957    1    Hf_atom [eV] (VASP)    0.0870304
AgCd    0.07142857142857    1    Hf_atom [eV] (VASP)    0.15737298
AgCd    0.11111111111111    1    Hf_atom [eV] (VASP)    -0.011088
AgCd    0.12500000000000    1    Hf_atom [eV] (VASP)    -0.027350498
AgCd    0.16666666666667    7    Hf_atom [eV] (VASP)    -0.037070002
AgCd    0.17241379310345    1    Hf_atom [eV] (VASP)    0.020694898
AgCd    0.20000000000000    9    Hf_atom [eV] (VASP)    -0.0460172
AgCd    0.25000000000000    30    Hf_atom [eV] (VASP)    -0.056237496
AgCd    0.33333333333333    42    Hf_atom [eV] (VASP)    -0.0609502
AgCd    0.37500000000000    3    Hf_atom [eV] (VASP)    -0.0589556
AgCd    0.40000000000000    12    Hf_atom [eV] (VASP)    -0.0618938
AgCd    0.41379310344828    1    Hf_atom [eV] (VASP)    0.00122355
AgCd    0.42857142857143    2    Hf_atom [eV] (VASP)    -0.037301403
AgCd    0.44444444444444    2    Hf_atom [eV] (VASP)    -0.0335542
AgCd    0.46153846153846    1    Hf_atom [eV] (VASP)    -0.0150388
AgCd    0.50000000000000    46    Hf_atom [eV] (VASP)    -0.068898305
AgCd    0.53846153846154    1    Hf_atom [eV] (VASP)    0.0721082
AgCd    0.55555555555556    2    Hf_atom [eV] (VASP)    -0.033519298
AgCd    0.57142857142857    2    Hf_atom [eV] (VASP)    -0.0333517
AgCd    0.58620689655172    1    Hf_atom [eV] (VASP)    -0.0124974
AgCd    0.60000000000000    12    Hf_atom [eV] (VASP)    -0.047418
AgCd    0.61538461538462    1    Hf_atom [eV] (VASP)    -0.06818979
AgCd    0.62500000000000    3    Hf_atom [eV] (VASP)    -0.040674802
AgCd    0.66666666666667    42    Hf_atom [eV] (VASP)    -0.0603182
AgCd    0.75000000000000    29    Hf_atom [eV] (VASP)    -0.0485616
AgCd    0.80000000000000    9    Hf_atom [eV] (VASP)    -0.0095262
AgCd    0.82758620689655    1    Hf_atom [eV] (VASP)    0.033198204
AgCd    0.83333333333333    7    Hf_atom [eV] (VASP)    -0.025705501
AgCd    0.87500000000000    1    Hf_atom [eV] (VASP)    0.0031846298
AgCd    0.88888888888889    1    Hf_atom [eV] (VASP)    0.0286024
AgCd    0.92857142857143    1    Hf_atom [eV] (VASP)    0.114186
AgCd    0.95652173913043    1    Hf_atom [eV] (VASP)    0.065135606
AgCd    1.00000000000000    12    Hf_atom [eV] (VASP)    0.0
Time for openFile(file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary): 288 ms
reading 24509 atoms
297 models

Notice that I could have used a different listing key.

You can load just a single composition by filtering with "Ca=x"

  load "file:/C:/jmol-dev/bobtest/aflow/binary/AgCd.aflow_binary" {2 2 2} packed filter "ca=0.5"

[AgCd] REFERENCE: S. Curtarolo, W. Setyawan, S. Wang, J. Xue, K. Yang, R. H. Taylor,
L. J. Nelson, G. L. W. Hart, S. Sanvito, M. Buongiorno Nardelli, N. Mingo, and O. Levy, AFLOWLIB.ORG: a distributed materials properties repository from high-throughput ab initio calculations, Comp. Mat. Sci. 58, 227-235 (2012).
[AgCd] REFERENCE: S. Curtarolo, W. Setyawan, G. L. W. Hart, M. Jahnatek, R. V. Chepulskii, R. H. Taylor, S. Wang, J. Xue, K. Yang, O. Levy, M. Mehl, H. T. Stokes, D. O. Demchenko, and D. Morgan, AFLOW: an automatic framework for high-throughput materials discovery, Comp. Mat. Sci. 58, 218-226 (2012).
[AgCd] REFERENCE: S. Curtarolo, D. Morgan, and G. Ceder, Accuracy of ab-initio methods in predicting the crystal structures of metals: review of 80 binary alloys, Calphad 29, 163-211 (2005).

46 models


The file loader parses all the -- DATA -- information into arrays, so that can all be accessed using getProperty(). For example:

  print getProperty("auxiliaryInfo.models.aflowInfo['space group POST']") print getProperty("auxiliaryInfo.models.aflowInfo['Hf_atom [eV] (VASP)']") 

JmolSQL selectors can be used to select out specific records.

  print getProperty("auxiliaryInfo.models.aflowInfo[SELECT Cb,'Hf_atom [eV] (VASP)' WHERE Cb > 0.4 and Cb< 0.6]")


Jmol adds two additional fields, "fileModelNumber" and "modelNumber":

  print getProperty("auxiliaryInfo.models.aflowInfo[SELECT modelNumber,Ca,'Hf_atom [eV] (VASP)' WHERE Cb > 0.4 and Cb< 0.6]")


JmolVersion="14.3.14_2015.06.01b"

bug fix: unncessary dialog with LOAD ?   when using JSmol/HTML5

JmolVersion="14.3.14_2015.06.01"

new feature: preliminary AFLOW AaBb binary file reader 
 - see http://www.aflowlib.org/binary_alloys.php
 
new feature: NBO cfi file writer 
 - print data({*}, "cfi")

bug fix: draw pointgroup  also draw arrow  broken 
bug fix: write("pdb") not returning string data and instead creating file "pdb" 
bug fix: VASP reader for in-line atom labels 
bug fix: measure pending dashed line does not appear

JmolVersion="14.3.14_2015.05.25"

release; synchronized with 14.2.14

JmolVersion="14.3.13_2015.05.23"

bug fix: select conformation=1  broken for non-bio CIF data

JmolVersion="14.3.13_2015.05.19"

bug fix: CML reader not recognizing "fragment/join/fragment" sequence
         from http://www.xml-cml.org/schema/schema3/schema.xsd (Stuart Chalk)

JmolVersion="14.3.13_2015.05.14"

new feature: set contextDepthMax 
  -- sets the maximum depth of contexts, including {}, if{} for{} while{} function{}  
     as well as the SCRIPT command and a number of expression-related situations
  -- default 100
  -- minimum 10

bug fix; 05.12 breaks Jmol.evaluate and Jmol.evaluateVar and print getProperty("variableInfo", exp)
bug fix: using historyLevel = ... or scriptlevelMax = ...  doesn't really set these
bug fix: a number of settings have not been excluded from state scripts, which
         only should save critical information for the state, not general processing
  -- no longer saved in state
  -- no longer read using "set xxxxx" when that is in a state script
  -- includes: historylevel;imagestate;iskiosk;useminimizationthread;
  -- includes: showkeystrokes;saveproteinstructurestate;testflag1;testflag2;testflag3;testflag4
                
JmolVersion="14.3.13_2015.05.12"

bug fix: re-entering functions loses if/else state
bug fix: more issues with low-resolution linear-z index lines.
         Need to compromise for isosurfaces and nucleic cartoons and bonds
         -- which became very slow to render with precision Z placement.

JmolVersion="14.3.13_2015.05.08"

bug fix: BIND can cause fault
bug fix: write "?"  can cause fault when [x] box is pushed on window
bug fix: set picking dragMolecule, set picking dragMinimizeMolecule, set picking dragLigand   broken

JmolVersion="14.3.13_2015.05.07"

bug fix: x = plane(@1 @2 @3)  fails

bug fix: isolated bio groups such as AMP, which are not part of biopolymers, can result in crashes
         when colored or queried about their parameters (Hiroufmi Suzuki)

bug fix: new JmolSQL ** feature needed a tweak

JmolVersion="14.3.13_2015.05.06"

new feature: JmolSQL "drilling" in associative arrays for sub arrays with a given property (Rolf Huehne)
   -- NOTE ADDED: replaced by WHEREIN in Jmol 14.3.16
   -- uses "**" as the SELECT option, sort of the way ** sometimes means "subdirectories of"
   -- returns an associative array or "" if no match
   -- example:
   
    x = [key_1:[type:"a"],key_2:[type:"b"],key_3:[type:"a"]]
	z = getProperty(x, "[SELECT ** WHERE type='a']");
	show z;

		z = { "key_1":{ "type":"a" },"key_3":{ "type":"a" } }

JmolVersion="14.3.13_2015.05.05"

bug fix: set structureModifiedCallback does not work with "JmolScript:...."

JmolVersion="14.3.13_2015.05.03"

new feature: for msCIF (modulated structure files), setting modulation or using vibration ON 
             now also indicates occupancy changes 
bug fix: sawtooth and Legendre displacement modulations should set occupancy to 0 outside of their range.
 
JmolVersion="14.3.13_2015.05.02"

bug fix: color atoms property vxyz crashes Jmol if no vibrations
bug fix: with msCIF, select subsystem=1 does not select anything
bug fix: vibrations in trajectories not animating (14.3.6_2014.08.14)

JmolVersion="14.3.13_2015.04.30d"

bug fix: reading Molden file with no MOs crashes Jmol

JmolVersion="14.3.13_2015.04.30c"

bug fix: color $id [30 40 50] translucent 0.8  fails
bug fix: Jmol.jar was requiring Java 1.7
bug fix: POV-Ray fixed for perspective and orthographic cameras using new z-depth formula.
thanks: Many thanks to Laurent Proville for motivating me to look in this issue.

JmolVersion="14.3.13_2015.04.29"

bug fix: perspective renderer was using the wrong formula for calculating Z depth of pixels:

 * Note added 4/2015 BH:
 * 
 * Well, it turns out that the calculation of the intermediate pixel z value
 * in all methods involving rasterization of lines is incorrect and has been
 * incorrect since Jmol's inception. I noticed long ago that large triangles such as
 * produced in DRAW could incorrectly overlay/underlay other objects, but I could
 * never determine why. It turns out that the assumption that z-value is linear
 * across a line when perspectiveDepth is TRUE is simply incorrect. 
 * 
 * Basically, the function z(x) is non-linear. Treating it as simply a 
 * linear function results in oddities where lines and planes
 *  -- particularly created using DRAW and large distances -- appear
 * to be where they are not. 
 *  
 * Through Jmol 13.3.13 we had the standard linear relationship:
 * 
 *   z = (x - xa) / (xb - xa) * (zb - za) + za
 * 
 * I worked it out, and, amazingly, it should be
 * 
 *   z = (xb - xa) * za * zb / ((xb - x) * zb + (x - xa) * za)
 * 
 * Note that it is still true that when x = xb, z = zb 
 * and when x = xa, z = za, as required.
 * 
 * This equation can be rearranged to 
 * 
 *   z = a / (b - x)
 *   
 * where 
 * 
 *  a = (xb - xa) * za * (zb / (zb - za))
 *  
 * and
 * 
 *  b = (xb * zb - xa * za) / (zb - za)
 * 
 * These values must be floats, not integers, to work properly, because
 * these are extrapolations from long distances in some cases. So there is
 * considerable overhead there. It will take some experimentation to figure this
 * out.
 * 
 * The practical implications are for line, cylinder, and triangle drawing.
 * First-pass corrections are for axes and DRAW objects. They tend to be the
 * larger objects that result in the issue. 
 * 
 * Also affected is POV-Ray output, because right now POV-Ray is created using
 * perspective on and plotted as though it were orthographic, but although that
 * works in x and y, it does not work in z!
 * 


JmolVersion="14.3.13_2015.04.27"

bug fix: with set dragSelected, highlight does not recognize whole molecule

JmolVersion="14.3.13_2015.04.25"

code: integration of changes made for SwingJS into JSmol code
 

JmolVersion="14.3.13_2015.04.22"

bug fix: loading mmCIF data in-line loses multi-character chain IDs

bug fix: with set picking dragSelected with allowMoveAtoms FALSE and allowRotateSelected TRUE
         rotating the atoms with ALT-left ignores setting of allowMoveAtoms
          
    // see footnotes below for ^, #, *, and $
    //
    // settings:^    set picking dragSelected             set dragSelected 
    //
    // move:#                 drag                          alt-shift-drag
    // rotate:#*          alt-drag                                alt-drag
    // z-shift:#        shift-drag                                  (n/a)
    // 
    // double-click:$  (starts measurement)       (sets selected if set picking SELECT)
    //
    // ^ set picking dragSelected overrules set dragSelected
    // # all actions involve whole molecules unless   set allowMoveAtoms TRUE
    // * rotate requires   set allowRotateSelected TRUE
    // $ set dragSelected allows setting of a new molecule with double-click when    set picking SELECT
    // $ set picking dragSelected allows measurements with double-click, as usual

  
code: introduce use of (int... ) syntax in ActionManager simplifies logic

JmolVersion="14.3.13_2015.04.17"

bug fix: for in/from broken in 14.3.13_2015.04.05
 -- entering a FOR loop with empty has pops {...} context one level too far, exiting functions

JmolVersion="14.3.13_2015.04.12"

code: refactoring PT.isAxxx to AU.isAxxx  (array type testing)

JmolVersion="14.3.13_2015.04.09b"

feature update: EBI validation site updated from wwwdev.ebi to www.ebi
 -- for example, LOAD *1crn/val

JmolVersion="14.3.13_2015.04.09"

bug fix: MO calculation hanging when G orbitals are present

JmolVersion="14.3.13_2015.04.08"

bug fix: echo id myecho "testing" reports "myecho" instead of "testing"

JmolVersion="14.3.13_2015.04.07" 

bug fix: Molden reader broken for Dalton2015 version

JmolVersion="14.3.13_2015.04.05b" 

bug fix: language switching not working from popup menu;
bug fix: language bundles not processed in the correct order for variants 

JmolVersion="14.3.13_2015.04.05" 

code: rewriting FOR loop code to enhance performance

new feature: set showScript -1 
  -- turns off history (on when commands come from the keyboard)
  -- stops every-second JavaScript interruptions -- Caution!
  
new feature: for (var i FROM [a, b]) {...}
  -- same as for (var i = a; i <= b; i++) when a < b
  -- same as for (var i = a; i >= b; i--) when a > b
  -- much more efficient

bug fix: for (var i in hashArray) {....}  broken (also in 14.2; not fixed there)

JmolVersion="14.3.13_2015.04.02" 

bug fix: [3 4 5].min should give integer 3, not decimal 3.0 (same with .max)

JmolVersion="14.3.13_2015.04.01b" 

bug fix: hash values created from named int variables do not clone properly
bug fix: hash[key1]..key2.push()  does not work properly
bug fix: show hash  where one of the elements is an empty hash ignores that key
bug fix: local var xxx with same name of ..xxx forces lower case xxx
 
JmolVersion="14.3.13_2015.04.01" 

bug fix: local var xxx with same name of foo..xxx forces lower case xxx
 
new feature: draw polygon [@1 @2 @3...]
  -- fills polygon with triangles
  -- order is important -- must be cw or ccw
  -- does not have to be convex
  -- indeterminate result if atoms are not coplanar 
  -- example:
    
		load $caffeine
		draw polygon [@5 @7 @12 @13 @1 @3]

new feature: ".[a]" notation extended to x.. and allows mixing with .a.
	function a(){return 1}
	x = [A:[1,2,3], a:[4,5,6]] 
	$ print x.a.[a()]
	 4
	$ print x..a..[a()]
	 4
	$ print x.a..[a()]
	 4
	$ print x..a..[a()]
	 4
	$ print x..a.[a()]
	 4
	$ y = x.a[1][2]; show y
	 y = [ 4,5 ]
  
JmolVersion="14.3.13_2015.03.30" 

bug fix: {hash}.Key = value will be stored as "key" rather than "Key" if "key" is also a user-defined function.
bug fix: {hash}.key will fail if "key" is also a user-defined function. 
bug fix: print a  where a is an associative arrays fails in JavaScript (since jmol-14.3.7_2014.08.25) 

JmolVersion="14.3.13_2015.03.27"

new feature: "." notation extended to x.[a]
  disambiguifies x[a][b][c]...
  allows for variables and expressions in "." notation
  i = 2
  x = [1,[2 3 4 [5 6 7]],3]
  show x[2].[4].[i]  
   ==> "6"
  x = [ 1,[ 2,3,4,[ 5,6,7 ],{ "testing":"now" } ],3 ]
  x[i + 1].[5].["testing"] = "again"
  show x
   ==> x = [ 1,[ 2,3,4,[ 5,6,7 ],{ "testing":"again" } ],3 ]
   
  
JmolVersion="14.3.13_2015.03.25"

bug fix: translate SELECTED {1 1 1} @1 not working (works fine without the SELECTED keyword)
         
JmolVersion="14.3.13_2015.03.23"

bug fix: isosurface solvent will fail if max volume is smaller than cavity max even though not cavity

JmolVersion="14.3.13_2015.03.21"

bug fix: JmolVersion="14.3.13_2015.03.20b" broke JSmol due to error in coding URL.js

JmolVersion="14.3.13_2015.03.20b"

bug fix: popup menu Symmetry broken
bug fix: PDB reader does not save unit cell on simple load

JmolVersion="14.3.13_2015.03.20"

bug fix: use of {*}.xxxx = for(i;{*};....) fails

JmolVersion="14.3.13_2015.03.19"

bug fix: VASP chgcar surface reader fails to recognize 10-per-line file format 

JmolVersion="14.3.13_2015.03.16"

bug fix: label <color ...> xxxx </color>  does not calculate stringwidth properly; set labeloffset 0 incorrect

JmolVersion="14.3.13_2015.03.13"
released

bug fix: fonts too small with antialiasDisplay (14.2.12)
bug fix: PNG generation uses iTXt instead of tEXt; problems with diacritical marks (German translation of "March" month in creation time)

JmolVersion="14.3.13_2015.03.11"

bug fix; pdb and mmcif readers not doing biomolecule 2 properly
bug fix: load filter "bychain" broken
bug fix: x.a.push(6) does not work
bug fix: (x.a).push(3) does not work
bug fix: (x.a)[3] = 5  does not work

JmolVersion="14.3.13_2015.03.10"

new feature: print  command by itself clears JavaScript and Jmol consoles

new feature: color polyhedra red blue (edge color blue)

bug fix: show state/xxxx does not work

JmolVersion="14.3.13_2015.03.07"
synchronized with 14.2.12_2015.03.07

bug fix: x[2] = y[2] fails

new feature: NBO command with no arguments starts NBO panel (Java application only)

JmolVersion="14.3.12_2015.03.05b"
synchronized with 14.2.13_2015.03.05

bug fix: reading legacy mapped plane (2ptn-molecular_slice1.jvxl.txt) 	crashes Jmol

JmolVersion="14.3.12_2015.03.05"
synchronized with 14.2.13_2015.03.05
released

bug fix: (14.3 only) write VRML|MAYA|OBJ|POVRAY  broken

JmolVersion="14.3.12_2015.03.01"

bug fix: late discovery of mmCIF format does not load secondary structure
bug fix: reading PNGJ file saved after load with /dssr or /rna3d annotations ignores annotations
bug fix: {*}.find("~d~G:C")  broken (find with bioSMARTS)

new feature: image             # the current view as an image
new feature: image 300 400     # adjustable size
new feature: image "c:/temp/t.bmp" # image from a file

new feature: image "" close    # close the current view image
new feature: image "c:/temp/t.bmp" close # close image from a file
new feature: image CLOSE       # close all

new feature: image ID ...
 -- id for IMAGE CLOSE;
 -- displayed in title of frame
 -- examples:
  
     image ID "test" 
     image ID "test" 400 500
     image ID "test" "bob.png"
     image ID "test" close
     
new feature: write IMAGE
 -- same as IMAGE
 
new feature: write IMAGE 500 500
 -- same as IMAGE 500 500

new feature: (JavaScript/HTML5; see JSmol_Console.java) 
  // page designer may indicate one of three divs for images on the page:  
  // <appletID>_Image_app_holder for IMAGE command by itself (current app image)
  // <appletID>_Image_<cleaned id or filename>_holder  for IMAGE ID "xxx" ... or IMAGE "xxx"
  //   where cleaning is with .replace(/\W/g,"_")
  // <appletID>_Image_holder for all images not identified as above
  // if a page div is not identified, then the image will be placed in a new floating div
  

note: experimental SHOW IMAGE now replaced by new command IMAGE

JmolVersion="14.3.12_2015.02.26"

bug fix: imageFontScaling integer instead of float; does not scale appropriately on resize
bug fix: writing image of MO fails to write info (Jmol 12 or before)
 
JmolVersion="14.3.12_2015.02.25c"
bug fix: legacy non-XML JVXL files with color mapping should default to RGB color scheme
bug fix: Jmol 14.1.2_2013.12.13 disabled some mmCIF file reading for non-wwPDB mmCIF files


JmolVersion="14.3.12_2015.02.25b"

new feature: random(low,high,seed)
 -- provides a new seed for the random() function
 -- seed may be any 48-bit integer. 
 -- x = random(0.0,1.0,121231223)
 -- low and high are simply placeholders
 -- does return the first number from this seed
 -- note that Java and JavaScript will have DIFFERENT seedings
 -- utilizes https://github.com/davidbau/seedrandom/blob/released/seedrandom.js
    (appended to java.util.Random.js)
 
JmolVersion="14.3.12_2015.02.25"

new feature: show chemical drawing
new feature: show drawing
 -- pops up window with drawing of model
 -- service is from NCI
 -- uses SMILES if structure was not loaded using $... (NCI) or :... (PubChem)

JmolVersion="14.3.12_2015.02.24"

// 02.28 removes "show " from these

new feature: show IMAGE
 -- pops up a frame with the current image
 -- allows "Save As..."
 
new feature: show IMAGE "filename"
 -- pops up a frame with the image loaded from a file
 -- allows "Save As..."

new feature: show image 300 400     # adjustable size
new feature: show image none        # closes all image panels
new feature: show image CLOSE                 # "all" presumed 
new feature: show image CLOSE ""              # the model image
new feature: show image CLOSE "c:/temp/t.bmp" # the image for this file

new feature: write IMAGE
 -- same as SHOW IMAGE
 
new feature: write IMAGE 500 500
 -- same as SHOW IMAGE 500 500; allows customization of width and height
  
new feature: Windows BMP image reading
 -- reads 24-bit (full color) as well as 16-, 8-, 4-, 2-, and 1-bit color palette modes
 -- 14-byte and 40-byte headers only
 -- does not read compressed modes
 
bug fix: restriction against getting SMILES string for biomolecule lifted
bug fix: end-on bonds may appear to disappear
bug fix: JavaScript -2.format("%8.3") gives 2.000 not -2.000

bug fix: minimizer treats hydrogen bonds as covalent single bonds

code: javajs.img.BMPDecoder
code: org.openscience.jmol.app.jmolpanel.ImageDialog

JmolVersion="14.3.12_2015.02.19"

bug fix: CML reader does not show proper atom names for crystal structures
bug fix: POV-Ray renderer does not show proper backbone width (since forever)
bug fix: POV-Ray renderer with a translucent surface shows bonds that should be hidden (since 13.1) 
bug fix: unitcell info for PDB file biomolecule does not show "biomolecule 1"

JmolVersion="14.3.12_2015.02.18"

bug fix: load filter "biomolecule 1" broken in 14.3.12_2015.02.14

JmolVersion="14.3.12_2015.02.17b"

bug fix: writing to PNGJ data to .ZIP file should create a standard ZIP file.
  -- especially useful now that some zip readers will not open PNGJ files as zip files
     (with newer 7zip you can right-click file, then select 7zip...open archive...zip)
  
  var x = load("t.png", true)
  write var x "t.zip"
   
 
bug fix: VASP POSCAR fix for atom symbols in header line

JmolVersion="14.3.12_2015.02.17"

new feature: set zshadePower 0
 -- allows examination of depth buffer and writing to image for external processing
 
		set zShadePower 0
		set zSlab 100
		set zDepth 0
		set zShade true
		write z.jpg
		set zShade false
		write rgb.jpg

JmolVersion="14.3.12_2015.02.16"

new feature:  x.dot(y) for planes and points -- was present but undocumented and not working correctly
new feature: (undocumented) x.distance.all(y)

new feature: load MUTATE "==LYS"
 -- loads using set appendNew false
 -- bypasses regeneration of secondary structure
 -- not to be documented
 -- issued by MUTATE command only

bug fix: write isosurface "./xxx.jvxl" broken  -- concatenates "isosurface" with filename
bug fix: write ISOSURFACE  by itself broken (similarly for write POINTGROUP and others)
bug fix: MUTATE command adjustments for saving state
bug fix: MUTATE command should not force recreation of shapes
bug fix: MUTATE command should not change backbone atoms
bug fix: x = measure(a,b) where b is {none} crashes Jmol
bug fix: compare({atomA},{atomsB}) should return standard 4x4 matrix, not one involving a rotation
         about an atom center 
  -- (not adjusted when ROTATESELECTED was fixed in 14.3.11_2014.12.17; Angel Herraez)

code: org.jmol.modelsetbio.BioExt 
 -- extracts struts, quaternion plots, polymerInfo, mutate into optional module
 -- saves 15K in corebio.js
 
JmolVersion="14.3.12_2015.02.11"

bug fix: 14.3.12_2015.02.09 breaks   MODEL "someTitle"   syntax
bug fix: MUTATE not properly saved in state
bug fix: "USER  MOD" not accepted at beginning of PDB file (MolProbity breaking PDB format here)
bug fix: 02.10 may break loading ligand files

JmolVersion="14.3.12_2015.02.10"

bug fix: color $contact1 "roygb" range -0.5 1.0; broken (in state after using CONTACT)
bug fix: mmCIF reader does not flag first model of a multimodel set as type PDB


JmolVersion="14.3.12_2015.02.09"

new feature: frame align {atoms} FIXED
 -- shifts atom positions in each frame to match first atom in {atoms}
 -- unlike just frame align {atoms}, frame * will still show alignment
 -- objects such as DRAW and ISOSURFACE will NOT be shifted
 -- needs testing
  
new feature: frame align [modelNo] [pt]
 -- FIXED is assumed
 -- used in state; shifts a model by a specific amount after removing any current frame alignment
  
JmolVersion="14.3.12_2015.02.07"
released

bug fix: set meshScale is not being applied to isosurface contours
bug fix: zoomTo{xxx} 0  does not center (broken in 13.1.16_dev_2013.05.23)
bug fix: appending a model to a model with data can fail
bug fix: 02.04 select conformation=1 broken
bug fix: 02.04 select within(chain,...) broken

bug fix: hydrogen addition should not follow component file
	ILE7 HG12 != ILE7 HG13
	ILE7 HG13 != ILE7 HG12

	ARG10 HB2 != ARG10 HB3
	ARG10 HB3 != ARG10 HB2
	ARG10 HG2 != ARG10 HG3
	ARG10 HG3 != ARG10 HG2
	ARG10 HD2 != ARG10 HD3
	ARG10 HD3 != ARG10 HD2

	LEU18 HB3 != LEU18 HB2
	LEU18 HB2 != LEU18 HB3

	PRO19 HD2 != PRO19 HD3
	PRO19 HD3 != PRO19 HD2

	ILE25 HG12 != ILE25 HG13	
	ILE25 HG13 != ILE25 HG12



JmolVersion="14.3.12_2015.02.04"
released

new feature: print data({*},"xyz") 
  -- (lower case) writes only atom data lines
   
new feature: print data({*},"XYZ", true) 
  -- third parameter TRUE writes all trajectories

bug fix: show mouse  fails in JavaScript
  -- we cannot test using AU.isAI() in org.jmol.viewer.binding.Binding 
  -- because of a Java2Script compiler creates standard array [...] 
  -- from new int[] {....} whereas it should create Clazz.newArray() and fill it
bug fix: writing of file formats was inconsistent between WRITE and data()  (not fixed in 14.2)	  
bug fix: Jmol writing of PDB file data did not include TER records (not fixed in 14.2)
bug fix: label %r should print "1" for non-PDB file atoms
bug fix: 01.30 mutate {xxx} ~... skips first-listed replacement group identifier
bug fix: 01.29 breaks loading non-trajectory file after a trajectory is loaded

JmolVersion="14.3.12_2015.01.30b"

bug fix: select %w %x %y %z not implemented
bug fix; lcaoCartoon broken in 14.3.10_2014.11.27/14.2.12_2015.01.22
bug fix: isosurface id surf1 solvent; select within(2.0, $surf1) broken

JmolVersion="14.3.12_2015.01.30"

new feature: MUTATE command
 -- operates only on last model present if multiple models are loaded
 -- replaces one or more amino acids group with others
 -- can read from RCSB or from user-specified file
 -- examples: 
      mutate 33 lys          // replace resno=33 with lysine
      mutate @3 arg          // replaces group of atom 3 with arginine
      mutate @r gly          // replaces groups in variable r with glycine
      mutate 22 "myfile.cif" // user-defined replacement
      mutate {1-3} ala	     // replace first three residues with alanine
      mutate {1-5} GLVAG     // (sequence codes) replace residues 1-5 with gly-leu-val-ala-gly
      mutate {1-3} ~LYS      // (force 1-character sequence codes) replace 1-3 with leu-tyr-ser
      mutate {1-3} A?L       // replace 1 with ala, 3 with  leu; skip 2
      mutate {within(sequence, "GAT")} GYT // replace locations of GAT with GYT (needs testing) 
      mutate 35 @fname       // replaces resno=33 with file data (use "==ALA" or "~A" for RCSB)
      mutate {r} his         // same as above; r must be an atom selection
      

bug fix: code fixes relating to calculate structure in 01.29

JmolVersion="14.3.12_2015.01.29"

bug fix: 01.28 version does not write correct PDB CONECT records
bug fix: 01.22 version may not correctly clear rasmol hydrogen bonds in trajectories
code: simplification of BioModel; extraction of legacy Chime messaging into ChimeMessenger class
code: extraction of org.jmol.modelset.Trajectory

JmolVersion="14.3.12_2015.01.28"

bug fix: write "t.pdb" now correctly sequences groups and atoms, even after mutation
      
new feature: resno is user settable

JmolVersion="14.3.12_2015.01.27"

bug fix: select thisModel does not select all atoms in visible frame set

new feature: @@3 for "atomno=3 and thisModel"
 -- provides a function distinct from @3 when there are multiple models
 -- includes all atoms in current frame set
 -- example:
 
  load "cyclohexane_movie.xyz"
  select @10
     35 atoms selected
  select @@10
     1 atom selected
  frame [1 2 4 6]
  select @@10
     4 atoms selected   
  @@10.label = "atom 10"
  
  
new feature: frame [1 3 5 6]
 -- sets limited number of frames for animation and frame * 
 -- same as animation frame [1 3 5 6]; frame *
  
new feature: CGO SCREEN option
 -- CGO [SCREEN z ...]
 -- reads CGO 2D VERTEX records as screen coordinates, installing them at a depth of z
  - where z > 0 indicates a percent (0.01 far back; 100 front)
  -       z < 0 indicates an absolute screen z value as -z. 
  - uses 2D VERTEX and other CGO point elements, not 3D
 -- example: a static border 20% from the back of the model
 
cgo test2 [ SCREEN 20
 BEGIN LINE_LOOP
 VERTEX 10 10 
 VERTEX 90 10
 VERTEX 90 90
 VERTEX 10 90
 END
]
 
new feature: CGO UVMAP option
 -- CGO [UVMAP @origin @x @y x0 y0 x1 y1 scaleX scaleY ...]
 -- 2D VERTEX records are scaled and mapped to a plane defined by @origin @x @y
 -- example: a parallelogram based on atoms 1, 6, and 11
 
cgo test1a [ UVMAP @1 @6 @11 0 0 80 80 1 1
 BEGIN LINE_LOOP
 VERTEX 0 0 
 VERTEX 80 0
 VERTEX 80 80
 VERTEX 0 80
 END
]
 
new feature: CGO PostScript option
 -- CGO [ PS @origin @x @y ] data "PS" [primitive encapsulated postscript data] end "PS"
 -- maps 2D EPS data onto a plane defined by an origin point, an x-axis point, and a y-axis point.
 -- somewhat similar to UV mapping of textures in other programs
 -- allows 2D data to be superimposed on a model.
 -- a crude implementation still in development; doesn't properly implement stroke; 
 -- just for drawing lines; does not implement PS fill, gsave, grestore
 -- just moveto, lineto, newpath, closepath, setlinewidth, scale
 -- uses %%BoundingBox x0 y0 x1 y1 prolog record 
    to map [x0 y0] to @origin, [x1 0] to @x, and [0 y1] to @y
 -- used for NBO contour mapping
    
CGO[ PS @{point(-5,-5,0)} @{point(5,-5,0)} @{point(-5,5,0)] data "PS"
%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Bob Hanson (from NBO)
%%Title: nbo orbital slice
%%CreationDate: 1/26/2015 5:36 AM
%%DocumentFonts: Helvetica
%%BoundingBox: 211 300 428 518
%% note: above numbers are from 0.24*881 0.24*1781 0.24*1256 0.24*2156
%%EndComments
%%EndProlog
 0.2400 0.2400 scale
 newpath                    
  3 setlinewidth
 newpath
  881 1256 moveto
 1781 1256 lineto
 1781 2156 lineto
  881 2156 lineto
 closepath
 stroke
 1241 1717 moveto
 1250 1713 lineto
...
 stroke
%%Trailer
showpage
end "PS"

bug fix: CGO LINE_LOOP not closing
bug fix: configuration 1  broken
bug fix: display configuration=1  broken (in Jmol 12.0, 2011)

JmolVersion="14.3.12_2015.01.25"

bug fix: image echos broken

JmolVersion="14.3.12_2015.01.24"

new feature: load NBO CH3CH2CH3
 -- retrieves the stucture of propane (in this case) from a local NBO server. 
 -- including inorganics. For example:

	 load nbo "Cr 3::acac"
	 load nbo "Cr 2:::Bz"
	 
code: new interface for "services" that can provide valuable information to Jmol 
      over ports or by running executable processes.
 -- currently just NBO


bug fix: MOPAC reader loses two atoms in IRC calculation for MOPAC 2012
bug fix: _slabPlane and _depthPlane not set immediately when slab and depth are set

JmolVersion="14.3.12_2015.01.22"
released simultaneously with 14.2.12

bug fix: color rockets amino fails
bug fix: "color TRANSLUCENT -1" (screened translucency) restored; 
  -- had been removed in 14.3.12_2015.01.20 because broken in jmol-11.7.27_02-27-09
bug fix: atom screened translucency not saved in state
bug fix: isosurfaces with screened translucency not restored from JVXL with that 
bug fix: screened translucent bonds broken

code: adding org.jmol.g3d.PixelatorScreened, PixelatorT
 
JmolVersion="14.3.12_2015.01.21"

new feature: load =cod/1000041  loads Crystallographic Open Database CIF files

bug fix: load =xxx/..... (special database) fails
bug fix: (JavaScript) using "Helvetica Neue, Sans-serif" instead of just "Sans-serif" (org.jmol.awtjs2d.JSFont.java)
 - gets around Safari bug in Safari v. 7


JmolVersion="14.3.11_2015.01.20"
released simultaneously with 14.2.11

bug fix: Languages lost in Jmol Application

new feature: select :"X"  where quotes are used now forces case sensitivity

bug fix: DIPOLE command broken in Jmol 14.3.10_2014.11.27 (OK in 14.2)

bug fix: for old PDB files with no chain ID, "select :" fails

JmolVersion="14.3.11_2015.01.18"

new feature: Jmol Application Tools|NBO... (Experimental Only; requires NBOServer)

bug fix: Typing select his and :A  will set chain selection to be case sensitive due to a bug that
         processes   "his an" as "{his:}an". 
         

JmolVersion="14.3.11_2015.01.15"

bug fix: modulation x.x  and modulation n  not described correctly in documentation

new feature: modulation T x.x     
new feature: modulation Q n     
new feature: modulation T {t1 t2 t3}
new feature: modulation Q {q1 q2 q3}


JmolVersion="14.3.11_2015.01.12"

bug fix: color PMESH reader not working properly

JmolVersion="14.3.11_2015.01.11"

bug fix: JSpecView -- version/date not appearing in menu
bug fix: GIF images bleed into background.
bug fix: GIF writing of xxx.gif (three character name) broken.
bug fix: proper isosurface capping. Test code:

		function test(i) {
			set echo top left
			echo @i
			isosurface slab none
			isosurface cap plane {1 1 1 1} @i
			refresh
		}
		
		load 1crn.pdb
		rotate y 60
		rotate y -120
		isosurface s1 vdw;
		display none
		center $s1
		for (var i = -2	; i < 58; i++){test(i)}
		

JmolVersion="14.3.11_2014.12.21"

code: major refactoring into BioModel of PDB-specific code in ModelSet

new feature: CGO (undocumented command from Jmol 13.1.16; never tested)

cgo test1a [
 BEGIN LINES
 VERTEX 0 0 0 VERTEX 2 2 2
 VERTEX 2 2 2 VERTEX 3 2 0  
 END
]

cgo test1b [
 BEGIN LINE_LOOP
 VERTEX 4 0 0  
 VERTEX 6 2 2
 VERTEX 5 2 0  
 END
]

cgo test1c [
 BEGIN LINE_STRIP
 VERTEX 4 0 0  
 VERTEX 6 2 2  
 VERTEX 5 2 0  
 END
]

cgo test2 [
 BEGIN POINTS
 COLOR 255 0 0  
 LINE 0 0  3 0 0 3 2 2 
 COLOR 0 255 0  
 LINE 0 0  3 2 2 4 2 0 
 END
]

cgo test2b [
 BEGIN LINE_LOOP
 DIAMETER 0.3
 VERTEX 4 0 0  
 VERTEX 6 2 2  
 VERTEX 5 2 0  
 END
]


new feature: NBO command
  -- same as MO command, but allows TYPE keyword
  -- to be developed with, perhaps, different defaults, 2D slices, etc.
  
new feature: NBO TYPE <nboType>
  -- options AO, PNAO, NAO, PNHO, NHO, PNBO, NBO, PNLMO, NLMO, MO
  -- results in immediate loading of .32-.41 file if present
  -- generally after a .47 archive file has been loaded

new feature: ... PLANE {pt1} {pt2} frac12  
   -- wherever a PLANE parameter is required
   -- perpendicular plane frac12 of the distance from pt1 to pt2
   
new feature: x = plane(pt1, pt2, frac12)
   -- perpendicular plane frac12 of the distance from pt1 to pt2

JmolVersion="14.3.11_2014.12.19"

bug fix: JavaScript connect broken 
         due to j2s failure to create bsAromatic when BondCollection created (14.3.7)
         due to j2s bug in instantiating global definitions in super classes using Clazz_prepareFields

bug fix: label, echo, and measurement text should not display when deeper
         than zSlab with zShade is TRUE  
bug fix: mmCIF reader load filter biomolecule 1 
         broken for viruses with symmetry ranges listed as "1-60" with a hyphen  
bug fix: mmCIF reader coarse-grain load filter bysymop broken
bug fix: mmCIF reader coarse-grain load filter bychain broken 
 
JmolVersion="14.3.11_2014.12.17"

bug fix: rotate selected <4x4 matrix> should not rotate about center of atoms
bug fix: use of a subset command will change value of a variable bitset if "select x" is used
 -- example:
   x = {*}
   subset {atomno < 10}
   print x // just the first 9 
   select x // just the first 9
   subset all
   print x // but now x itself is truncated; this is not supposed to be the case
   
     
new feature: SYNC nnnn x   
  -- x is a math expression, possibly just a string, but also possibly an associative array.
    
new feature: SYNC nnnn {type:"command",  "command" : command, "var": vname, "data":vdata}
  -- script command request, with optional definition of a Jmol user variable prior to execution)
  -- for example:
	  x = {"type":"command","command":"background green; print y", "var": "y", "data":['an array',2]}
	  sync 3000 x
  -- allows simple transfer of data via JSON strings between applications
  
    
JmolVersion="14.3.11_2014.12.15"

FEATURE CHANGE: JmolViewer interface streamlined
  -- many esoteric methods removed
  -- can be reinstated upon request
  -- many are available via public fields
  -- for economy of performance and .js file size

FEATURE CHANGE: "screened translucency TRANSLUCENT -1"  removed (broken in jmol-11.7.27_02-27-09)

bug fix: mol2 reader fails to read "THR1" as a PDB group

bug fix: PyMOL reader should not reset user variables

bug fix: show LIGHTING does not report a full list of settings

new feature: reset LIGHTING
  public void resetLighting() {
    vwr.setIntProperty("ambientPercent",  45);
    vwr.setIntProperty("celShadingPower", 10);      
    vwr.setIntProperty("diffusePercent",  84);
    vwr.setIntProperty("phongExponent",   64);
    vwr.setIntProperty("specularExponent", 6); // log2 of phongExponent
    vwr.setIntProperty("specularPercent", 22);
    vwr.setIntProperty("specularPower",   40);
    vwr.setIntProperty("zDepth",           0);
    vwr.setIntProperty("zShadePower",      3);
    vwr.setIntProperty("zSlab",           50);
    
    vwr.setBooleanProperty("specular",    true);
    vwr.setBooleanProperty("celShading", false);
    vwr.setBooleanProperty("zshade",     false);
  }

code: moved PDB-related methods and constants in JC.java to org.jmol.modelsetbio.Resolver
  -- allows 50K savings in core.z.js

code: reduced method sets for Viewer, ModelSet, and several other classes
 -- a bit contrary to standard practice, I know
 -- direct access of class fields instead of using methods with just one or two references
 -- direct access of class fields instead of using getXXX() and setXXX()
    because these are NOT optimized in JavaScript.

JmolVersion="14.3.11_2014.12.09"

new feature: Castep reading of .ts files

bug fix: array.add("\t",array) broken 2014.12.04
bug fix: array.split("",true) doesn't handle CSV with new lines in quotes

JmolVersion="14.3.11_2014.12.06"

new feature: MODEL 1 PROPERTY "xxx" x
  -- adds property to model's auxilliaryInfo
  -- x may be any valid math expression, for example 
     model 1 property  "test" {1.1}.temperature.mul(0.1)
  -- if x is an array, then these become atom data accessible via %{...}
  -- for example:
	  x = "1\n2\n3\n".lines
	  model 1 property "mydata" x
  	  {model=1}.property_n = {*}.label("%{mydata}") // converts to numbers
  	  
  	  data "myd @x"	// similar, but not model-based 
	  label %{myd}   
	  
  	  
bug fix: format() function broken
bug fix: SHOW DATA  should be cleared when a file is loaded

JmolVersion="14.3.11_2014.12.04"

new feature: "....".split("",true) // CSV split of string to array of arrays
new feature: [...].split("",true) // CSV split of array to array of arrays
new feature: "...".split("\t",true) // tab split of string to array of arrays
new feature: [...].split("\t",true) // tab split of array to array of arrays
new feature: [...][...].join("",true) // CSV join to array of lines
new feature: [...][...].join("\t",true) // tab join to array of lines
  -- example:
   x = load("test.csv").split("",true) //from CSV
   print x.join("",true) // back to CSV
   print x.join("\t",true) // to tab-separated
new feature: [...][...].col(n)
  -- extracts nth column from an array of arrays
  -- example:
   x = load("test.csv").split("",true).col(3) //3rd column from CSV
  
    
JmolVersion="14.3.11_2014.12.02"

bug fix: for (x in yUpperCase) fails
bug fix: draw SYMOP fails for incommensurate space groups
bug fix: incommensurate magnetic CIF reading does not apply magnetic spin operation to spin modulations
bug fix: CIF reader can cycle infinitely if loop_ keywords are not followed by any data

new feature: Gaussian Input File creation defaults to "opt pop=full gfprint" to generate orbital information by default.
FEATURE CHANGE: Gaussian Input File creation moved to Tools menu rather than file...export

JmolVersion="14.3.11_2014.11.28"

new feature: readers for ESS input types: CFILE, VFILE, MOPAC, NWChem, Gaussian, GAMESS, Orca, PQS
  -- CFILE and VFILE require CFI:: and VFI:: (or C:: and V::)
  -- MOPAC requires MND::  
  -- any of these could also use ZMATRIX:: or INPUT::
  

bug fix: dynamicMeasurements deprecated in 14.1.1 but 
         not left in as a valid token to allow use

JmolVersion="14.3.11_2014.11.27"

new feature: GAMESS input reader
new feature: NBO .37 archive file coordinate reader (not MOs)
new feature: ZMatrixReader also serves as simple input file reader 
             for Q-Chem, Gaussian, Jaguar, MolPro, and ADF, as produced by NBO6Pro
             

JmolVersion="14.3.10_2014.11.27"

released as 14.3.10

(note - these were not fixed in 14.2)

bug fix: SPIN BRANCH {atomno=2} {atomno=1}   does not work

code: scriptExt.IsoExt splits CmdExt into two parts 
 -- (note this will require changes to build_03_tojs_stable)
code: simplification of SurfaceGenerator

bug fix: JVXL files do not record selected contour 
bug fix: isosurface CONTOUR -n broken (in Jmol 12)
bug fix: isosurface "t.jvxl" loading of contoured planes broken
bug fix: isosurface plane xy map property atomno broken every other time used

new feature: isosurface contour 0 "t.jvxl" will override contour selected in JVXL file

new feature: isosurface CONTOUR n i 
  -- n contours; i-th only
  
FEATURE CHANGE: For the ISOSURFACE command, there is an undocumented 
     syntax that the CUTOFF keyword prior to a number is optional, 
     as in "ISOSURFACE 2.0". This was never documented and was never
     shown in any examples. This change is to require the CUTOFF keyword 

new feature: isosurface LATTICE {i j k} FIXED
  -- creates an isosurface from periodic volumetric data
     with the specified number of unit cells
  -- "fixed" in the sense that the operation is at load time
     not at rendering, allowing slabbing and use of WITHIN
     
new feature: isosurface UNITCELL x.x .... 
  -- for periodic lattices only
  -- adjusts grid by x.x in fractional coordinates
  -- caution is advised, as the grid is expanded in this process,
     leading to more grid points and more memory required
  -- negative x.x results in a selection of a subset of the data
     centered on the center of the unit cell
  
JmolVersion="14.3.10_2014.11.26"

bug fix: hover OFF disables hover callback, but should not
bug fix: reading of JVXL file saved with noFill still does fill
bug fix: CASTEP DENSITY surface file reader does not do downsampling

new feature: VASP CHGCAR default cutoff set to 0.5
new feature: set edsUrlFormatDiff 
  -- specifies difference map location
  
new feature: isosurface "==1blu"  
  -- difference map fo-fc
  -- defaults to sigma=3
  -- automatically implements SIGN option

new feature: isosurface RMSD (same as SIGMA)

JmolVersion="14.3.9_2014.11.23"

released as Jmol 14.3.9 and Jmol 14.2.9

bug fix: isosurface slab plane -xy  not recognizing "-"	  
bug fix: PNGJ writing broken
bug fix: VASP CHGCAR reader not recognized for primitive cell
bug fix: Euler ZYZ and ZXZ for quaternion({0 0 1},theta) where theta < 0 in error
 

JmolVersion="14.3.9_2014.11.17"

released as Jmol 14.3.9 and Jmol 14.2.9

new feature: VASP CHGCAR reader
new feature: VASP CHGCAR isosurface reader

new feature: load HISTORY "saved.his" (Gabor Oszlanyi)
 -- loads command history with script in saved.his

new feature: CTRL-PAGE_UP CTRL-PAGE_DOWN in console (Gabor Oszlanyi)
 -- searches for next instance of current start of command up or down command history
  
new feature: capture END 
 -- closes capture without annoying popup message
 -- also for capture CANCEL and just CAPTURE

new feature: transparent GIF using WRITE GIFT "xxx.gif"
new feature: GIF images use dithering to approximate full palette.
new feature: CAPTURE "file.gif" 10 transparent
 - or CAPTURE "file.gift" -- "gift" automatically changed to "gif"

new feature: CAPTURE "filename0000.png"  
  -- captures set of PNG files
  -- 0000 is not required
  
new feature: CAPTURE "filename0000.gif"  
  -- captures set of GIF files
  -- 0000 IS required in order to distinguish this from animated GIF
  
bug fix: set labelOffset {1 2 3} or set labelOffset [1 2 3 4 5 6 7] 
         fails if selection does not contain a label at each selected atom
         
bug fix: Molden reader fails to read orbitals if [GEOCONV] is present

bug fix: JmolVersion 14.3.3_2014.07.27 broke ligand bond reading when fetching ligands.
  -- mmCIF reader was not being selected by the Resolver 
  -- Requires an increment of version number to 14.3.9

bug fix: slightly better GIF processing

bug fix: GIF writer not properly handling large numbers of colors
  -- use of CIE L*a*b for color quantification
  -- nearly identical to GIMP
  -- uses MEAN_cut (not MEDIAN_cut) 
  -- uses Floyd-Steinberg dithering
  -- will not discolor background (as GIMP will do)

bug fix: GIF and PPM writing broken in JavaScript
  -- initial putString improperly forces string buffer mode in OC (Output Channel)
  
bug fix: WRITE command should remove "t" or "j" in WRITE xxx.PNGJ, WRITE xxx.PNGT, WRITE xxx.GIFT
  -- specifically when no PNGJ, GIFT, or PNGT designation is made.
  
bug fix: PDB reader limited to 20 connections per atom
 
bug fix: up-arrow in console may not return command if contains unicode
bug fix: antialiasing can subtly change background color

bug fix: working on GIF writer -- some success with 256 colors using median-cut with RGB

bug fix: GIFT (transparent-background GIF) dithering transparent background

bug fix: Legendre for U not implemented in msCIF reader - preliminary
bug fix: Legendre for D,U in Jana2006 reader not implemented - preliminary

code: code clean-up in GData, Graphics3D, and Export3D
code: PDB reader CONECT efficiency

released as Jmol 14.3.9 and Jmol 14.2.9

bug fix: set labelOffset {1 2 3} or set labelOffset [1 2 3 4 5 6 7] 
         fails if selection does not contain a label at each selected atom
         

JmolVersion="14.3.9_2014.11.15"

new feature: VASP CHGCAR reader
new feature: VASP CHGCAR isosurface reader

JmolVersion="14.3.9_2014.11.12"

bug fix: Molden reader fails to read orbitals if [GEOCONV] is present

JmolVersion="14.3.9_2014.11.11"

bug fix: JmolVersion 14.3.3_2014.07.27 broke ligand bond reading when fetching ligands.
  -- mmCIF reader was not being selected by the Resolver 
  -- Requires an increment of version number to 14.3.9

JmolVersion="14.3.8_2014.11.10"

bug fix: slightly better GIF processing

JmolVersion="14.3.8_2014.11.09"

new feature: CAPTURE "filename0000.png"  
  -- captures set of PNG files
  -- 0000 is not required
  
new feature: CAPTURE "filename0000.gif"  
  -- captures set of GIF files
  -- 0000 IS required in order to distinguish this from animated GIF
  
bug fix: GIF writer not properly handling large numbers of colors
  -- use of CIE L*a*b for color quantification
  -- nearly identical to GIMP
  -- uses MEAN_cut (not MEDIAN_cut) 
  -- uses Floyd-Steinberg dithering
  -- will not discolor background (as GIMP will do)

bug fix: GIF and PPM writing broken in JavaScript
  -- initial putString improperly forces string buffer mode in OC (Output Channel)
  
bug fix: WRITE command should remove "t" or "j" in WRITE xxx.PNGJ, WRITE xxx.PNGT, WRITE xxx.GIFT
  -- specifically when no PNGJ, GIFT, or PNGT designation is made.
  
bug fix: PDB reader limited to 20 connections per atom
 
code: code clean-up in GData, Graphics3D, and Export3D
code: PDB reader CONECT efficiency


JmolVersion="14.3.8_2014.10.27"

bug fix: up-arrow in console may not return command if contains unicode
bug fix: antialiasing can subtly change background color

bug fix: working on GIF writer -- some success with 256 colors using median-cut with RGB

new feature: load HISTORY "saved.his" (Gabor Oszlanyi)
 -- loads command history with script in saved.his

new feature: CTRL-PAGE_UP CTRL-PAGE_DOWN in console (Gabor Oszlanyi)
 -- searches for next instance of current start of command up or down command history
  
JmolVersion="14.3.8_2014.10.15b"

bug fix: GIFT (transparent-background GIF) dithering transparent background

JmolVersion="14.3.8_2014.10.15"

new feature: capture END 
 -- closes capture without annoying popup message
 -- also for capture CANCEL and just CAPTURE

JmolVersion="14.3.8_2014.10.14"

new feature: transparent GIF using WRITE GIFT "xxx.gif"
new feature: GIF images use dithering to approximate full palette.
new feature: CAPTURE "file.gif" 10 transparent
 - or CAPTURE "file.gift" -- "gift" automatically changed to "gif"

bug fix: Legendre for U not implemented in msCIF reader - preliminary
bug fix: Legendre for D,U in Jana2006 reader not implemented - preliminary

JmolVersion="14.3.7_2014.10.13"

new feature: modulation occupancy settable using {*}.occupancy = {*}.modulation('O',t)
 -- for example:
  
		load "t3.cif" {20 1 1} packed 0.5
		connect {_Mn} {_Mn} delete
		polyhedra bonds {_Mn} collapsed;
		set echo top right;
		capture "occ.gif" 120
		for (var i = 0; i <= 100; i++) {
		 var f = i/100.
		 modulation @f
		 {*}.occupancy = {*}.modulation("O",f);
		 display  _Mn and occupancy > 0;
		 var t = "t=" + f 
		 echo @t
		 refresh;
		}
		capture
  
bug fix: msCIF reader superspace group operators with mixing of x1,x2,x3 into x4,x5
         was still not quite correct.
           
bug fix: data "occupancy set" spelled wrong in state

JmolVersion="14.3.7_2014.10.12"

bug fix: JSmol/HTML5 SCRIPT command broken (forces async, which is not working yet) 
 -- since 14.3.7_2014.9.17
 
feature change: DSSR reference to "lonePairs" changed to "isolatedPairs"
 -- select within(dssr,"isolatedPairs") preferred
 -- select within(dssr,"lonePairs") still OK
 
bug fix: msCIF reader incorrectly handling multiple Legendre orders
bug fix: msCIF reader incorrectly handling superspace operators with x1,x2,x3 mixed into x4,x5
bug fix: CONTACT FULL does not report proper volume (Young ho Jhon)
bug fix: (Java only) write FILE fails for string (copy/pasted) data

JmolVersion="14.3.7_2014.10.10"

bug fix: set waitForMoveTo not controlling script for ROTATE x.x y.y (finite spin)
bug fix: capture command not waiting properly for full spin 
bug fix: msCIF reader: wave vectors of the form {a -a 0} were being ignored.
         (14.3.6_2014.08.16 and 14.2.6)

JmolVersion="14.3.7_2014.10.05"

bug fix: isosurface molecular reader misassigning voxel source atom
bug fix: JSpecView integration not displaying properly
bug fix: JSmol does not allow Info._coverImage

JmolVersion="14.3.7_2014.09.30"

bug fix: CGD reader for fractional coordinates; alternative EDGE syntax

JmolVersion="14.3.7_2014.09.29"

bug fix: JavaScript j2sjmol.js -- should not create object .isArray() method as it conflicts with
   JavaScript Array.isArray

bug fix: CGD reader space groups set to Bilbao (origin 2) setting.

   
JmolVersion="14.3.7_2014.09.28"

bug fix: Molden reader overlaying MO info and unit cell info

new feature: Molden reader adds [CellAxes] block
 -- three vectors -- a, b, c
 -- Angstroms assumed; no other option, actually
 -- Use 0 0 0 for c to indicate slab
 -- example 
  [CellAxes] (Angs)
	2.963407 0.0 0.0
	0.0 6.513587 0.0
	0.0 0.0 0.0
 

JmolVersion="14.3.7_2014.09.27"

bug fix: interpretation of space group I41 by name only, without operations,
 drops second (centered) C2 axis.
   

JmolVersion="14.3.7_2014.09.26"

new feature: TOPOS Crystal Graph Data (CGD) file reader

JmolVersion="14.3.7_2014.09.24"

bug fix: exporter generally not allowing creating meshes with PovRAY

JmolVersion="14.3.7_2014.09.23"

bug fix: Clazz.floatToLong not aliased as Clazz_floatToLong in corebottom2.js/coretop2.js
 -- causes CAPTURE command to fail for JSmol/HTML5
 
new feature: {xxx}.find("MF","CH2O")
 -- returns subset of {xxx}
 -- first atoms that match formula; not necessarily sequential
   
new feature: {*}.find("MF", TRUE)
 -- calculates EMPIRICAL formula
 -- example:
	$ load $glucose
	$ print {*}.find("MF")
	H 12 C 6 O 6
	$ print {*}.find("MF",true)
	H 2 C 1 O 1
 
new feature: {cell=555}.find("CellFormula");
 -- calculates cell formula for specified unit cell
 -- weights interior 1, face 1/2, edge 1/4, vertex 1/8
 -- selection should be a single packed unit cell
 -- fails with "?" if end result is not integral
 -- example:
	$ load quartz.cif packed
	$ print {*}.find("cellFormula");		
	O 6 Si 3 

new feature: {cell=555}.find("CellFormula", TRUE);
 -- calculates empirical cell formula for specified unit cell
 -- weights interior 1, face 1/2, edge 1/4, vertex 1/8
 -- selection should be a single packed unit cell
 -- fails with "?" if end result is not integral
 -- example:
	$ load quartz.cif packed
	$ print {*}.find("cellFormula", true);		
	O 2 Si 1 

new feature: label %O
 -- lists all symmetry operators leading to this position (as a string)
 -- if more than one operator (contains a comma), this is a special position
 -- same as %[symmetry] but just a simple list of operators

JmolVersion="14.3.7_2014.09.22"

FEATURE CHANGE: atoms without vibration will no longer report out as vxyz = {0 0 0} or vx = 0
 -- print {atomno=3}.vxyz and {*}.vxyz.all will report -1
	instead of {vx vy vz} when atom does not have a vibration
 -- print {atomno=3}.vx  will report "NaN" (also vy and vz)
 -- label %[vxyz] will be blank
 -- label %[vx] will be blank (also vy and vz)
 -- select vxyz >= 0 will select for atoms with vibrations of any magnitude
 -- select vxyz < 0 will select for atoms without vibrations of any magnitude
 -- select vx = 0 will NOT select atoms with no vibration vector 
 -- select vx != 0 will NOT select atoms with no vibration vector 
 -- select vx = 0 || vx != 0 will select for atoms with vibrations of any magnitude
 -- same with modulations and modxyz, modx, mody, modz
 
FEATURE CHANGE: {xxx}.vxyz = a,  where a is an array
 -- no longer throws an exception if a[i] is not a point
 -- simply does not set that value. 
 -- allows for  v = {*}.vxyz.all; {*}.vxyz = v;
  
	
JmolVersion="14.3.7_2014.09.21"

bug fix: magCIF reading with symmetry scaling (-x+1/2,-2x+y,z+1/2,+1 mx,2mx-my,-mz)
         improperly rotates moments (1.34.cif)

JmolVersion="14.3.7_2014.09.20b"

bug fix: array sorting broken in JavaScript

code: magCIF change to _space_group_symop.magn_ssg_centering_algebraic
code: efficiencies in storage of CIF keys

bug fix: CIF reader not reading magnetic lattice centering for incommensurately modulated structures
bug fix: {*}.modulation("M") not functional

bug fix: script queue broken in 2014.09.17

JmolVersion="14.3.7_2014.09.17"

bug fix: cartoon OFF does not remove nucleic bases from visible set
bug fix: select visible does not recalculate visible set 
 -- after RESTRICT, for instance; Eric Martz
 -- at least since 14.1.14
		load =1d66
		cartoons only # if this is omitted, 'select visible' works correctly
		refresh
		restrict 28-36:B
		print {visible}

bug fix: x = {visible} does not COPY the visible set
bug fix: spin broken in WebGL

code: further progress with fully asynchronous HTML5
 -- all initial script loading and program start-up
 -- general LOAD and SCRIPT command processing
 -- minimization (static resource loading)
 -- PNGJ file loading

JmolVersion="14.3.7_2014.09.16"

bug fix: chainCaseSensitive ignored for select :a
bug fix: JmolData not reporting out properly


JmolVersion="14.3.7_2014.09.15b"

bug fix: 14.3.7_2014.09.14 breaks nucleic acid rendering

JmolVersion="14.3.7_2014.09.15"

bug fix: CARTOON OFF does not remove visibility flag for alpha carbons
         (introduced in jmol-14.1.17_2014.06.03)
         
JmolVersion="14.3.7_2014.09.14"

bug fix: JSmol/HTML5 fails to show rockets
bug fix: setting structures after displaying rockets does not reset rockets correctly

bug fix: load *xxxx/val  validation loading not working (14.3.7_2014.09.07)

new feature: load =xxxx/rna3d
 -- mmCIF only
 -- fetches http://rna.bgsu.edu/rna3dhub/loops/download/xxxx
 -- hairpinLoops, internalLoops, junctions
 -- allows for such constructs as:
       select within(rna3d,"hairpinLoops")
       select within(rna3d,"hairpinLoops where index=5")
       x = getproperty("auxiliaryInfo.models[1].rna3d.internalLoops.5")
       x = getproperty("auxiliaryInfo.models[1].rna3d.internalLoops")[5]
	   print x
		{
		  _atoms  :  ({3023:3062 3639:3706})
		  _isres  :  true
		  _path  :  "internalLoops"
		  index  :  5
		  units  :  "1S72|1|0|C|153,1S72|1|0|C|154,1S72|1|0|G|182,1S72|1|0|A|183,1S72|1|0|G|184"
		}
	   y = x._atoms
       select y
       
new feature: load =xxxx/val        
new feature: load =xxxx/dom
 -- extends PDBe validation/domain annotation to RCSB calls

new feature: load *xxxx/dssr 
new feature: load *xxxx/rna3d
 -- DSSR analysis extended to PDBe calls
 -- RNA3D analysis extended to RCSB calls 
  
JmolVersion="14.3.7_2014.09.12"

bug fix: Draw broken in JSmol/HTML5 in 14.3.7_2014.09.07

JmolVersion="14.3.7_2014.09.11"

bug fix: Unit cell display and other characteristics offset or wrong when
         crystallographic coordinates include an intrinsic offset from 
         Cartesian coordinates, as in the case of ENT/mmCIF 1hbb and 2hhb.
         
bug fix: PDB reader not reading SCALEn records; required in certain cases for load =xxxx {1 1 1}
 
         
JmolVersion="14.3.7_2014.09.10"

bug fix: Pending measurements lost when dragging to reposition molecule
bug fix: EM files not allowing unit cell creation for PDB or mmCIF files   

JmolVersion="14.3.7_2014.09.08"
  
bug fix: binary document reader can skip bytes if an http connection
         fails to deliver the full set of requested bytes in one operation
         (nonstandard MRC files and PyMOL files)
                      
JmolVersion="14.3.7_2014.09.07"

code: note new Jmol. in front of ___xxx here

code: further work on asynchronous file loading
  -- uses script state machine to reset state
  -- xhr used only for data files; DOM for scripts
  -- caches data files 
  -- principal shown to work
  -- works for package.js and corexxx.js files
  -- works for most Java-class xxxx.js files
  -- fails (requires multiple attempts) for some cases
     -- animation/vibration/spin threads
     -- PNGJ file loading	
  -- cleaned up j2sjsmol code
  -- abandons complex j2s Clazz file loading methods; just uses jQuery
      
new feature: Legendre polynomials for MSCIF file reading

bug fix: adds correct dates for code versions of JSmol files
bug fix: load quartz.cif {1 1 1};draw symop @1 @5 does not work
	     due to refactoring error 7/9/2014 (14.3.3)
bug fix: dssr broken in 14.3.5
bug fix: throw context prior to try/catch within function causes exception
bug fix: polyhedra not removed from rendering when central atoms are deleted

code: refactoring symmetry info into org.jmol.symmetry.SymmetryDesc

JmolVersion="14.3.7_2014.08.29"

code: preliminary all-asynchronous JSmol/HTML5

JmolVersion="14.3.7_2014.08.25"

bug fix: translation of atoms after deleting atoms having dots on crashes Jmol

JmolVersion="14.3.7_2014.08.22"

new feature: AXES TYPE "a"|"b"|"c"|"ab"|"ac"|"bc"|"abc"
 -- for axes position [x y] only shows specified axes

new feature: load quartz.cif supercell "2a,2b+a,c;1/2,0,0"
 -- allows adjusting origin without changing symmetry operations
 -- same as load quartz.cif filter "cell=2a,2b+a,c;1/2,0,0"
 -- default lattice set to {555 555 -1} (i.e., PACKED)
 -- sets packing range based on the supercell
 -- packing can be avoided by specifying the lattice:
     load quartz.cif {1 1 1} supercell "2a,2b+a,c;1/2,0,0"

doc note: load ... SUPERCELL "2a,2b,2c" is the same as load ... SUPERCELL {2 2 2}
          except that the packing will be based on the supercell dimensions, not the
          original cell dimensions, with range 0.02. 
          This can be adjusted using PACKED x.x, which is still a fraction of the supercell dimensions.
          load quartz.cif supercell "10a, 10b+5a,c" PACKED 0.002
          
doc note: load ... SUPERCELL ... defaults to PACKED, but simply adding a lattice overrides this:
          load ... {1 1 1} SUPERCELL ...


bug fix: magnetic CIF files incompatible with displacement modulation
bug fix: write PNG xxx.png  when xxx.png is currently loaded saves 0-length data files
bug fix: load ASYNC was documented for 14.1.12_2014.03.10 but never implemented

JmolVersion="14.3.7_2014.08.18"

bug fix: load quartz.cif supercell "2a,2b+a,c" not working properly

JmolVersion="14.3.6_2014.08.17b"
released as Jmol 14.3.6

bug fix: modulated magnetic moment scaling by VECTORS MAX x.x not saved in state
         for modulations that are 0,0,0. 
bug fix: magnetic CIF reader not automatically showing modulation
bug fix: load SUPERCELL {x y z} not working correctly in terms of packing
bug fix: load SUPERCELL not working correctly with modulation or magnetic 

JmolVersion="14.3.6_2014.08.15"

new feature: upgrade of application file...export...Gaussian Input File...
 
new feature: pmesh files can contain triangle colors

JmolVersion="14.3.6_2014.08.14"

bug fix: JavaScript drag-drop clears cache inappropriately when spt file is dropped

IMPORTANT NOTE: The problem described here only affects the reading of states that 
	have been created for crystallographic files, and then only if the 
	state was created in Java and then displayed in JavaScript, 
	or vice-versa.
    
	The problem is due to the fact that the Java implementation 
	of Jmol uses float values for atom coordinates, while JavaScript 
	is restricted to using only double values. The problem arises when
    a comparison must be made between two decimal values. After symmetry
    has been applied, it is possible for atom coordinates to be off in the
    4th-7th decimal digit for floats and 14th-17th for doubles in the
    range -256 to 256.
     
    The problem is most acute for inorganic crystal systems where 
    symmetry has been applied and especially after the CONNECT NONE command
    has been issued.
    
    Aspects where a problem might arise include:
     -- packing of unit cells, where atoms are discarded
     -- iterating over atoms, where atom order is important
     -- autobonding, where distances and order are critical
     -- comparing Cartesian or fractional coordinate values
      
    Solution to the problem is to automatically round all fractional 
    atom coordinates to a precision of 0.00001 and all Cartesian
    atom coordinates to a precision of 0.0001. This forces both
    double and float implementations to the same value and
    results in no practical error, since these ranges are
    well beyond the precision of atom coordinates in crystals.
    Coincidence is assured for fractional coordinates up to 
    about 126 and for Cartesian coordinates up to about 838.
    
    This rounding is not implemented for state or PNGJ file
    with state version v where
       
        v < 140206 || v >= 140300 && v < 140306
        
    and in general only in the case where the file coordinates are 
    fractional. Thus, those files will be read exactly as in the 
    version they were created by. And they will have have the same
    issues as well.
    
    The result is also much cleaner-looking atom coordinates. 
    For example, in JavaScript:
    
    print {*}.fxyz
    
	    {0.33333328149215147 0.999999891271352 1.0000000000000024}
		{0.6666666148254848 0.999999891271352 1.0000000000000024}
		{0.9999999844017011 1.000000000000001 0}
		{0.9999999616049127 0.9999999316096356 0.6290004156275991}
		{0.9999999709556066 0.9999999596617175 0.3709995843724032}
		{0.9999999481588181 0.999999891271352 1.0000000000000024}

    becomes:
    	
		{0.33333 1 1}
		{0.66667 1 1}
		{1 1 0}
		{1 1 0.629}
		{1 1 0.371}
		{1 1 1}

                
new feature: set legacyJavaFloat
 -- set by Jmol when a state is read that is before 14.2.6 or in the range 14.3.0 - 14.3.5; 
 -- prevents fractional and cartesian coordinate rounding.
 -- cleared by ZAP or LOAD or loading of any later state script
                  
new feature: MOLDEN extensions [SpaceGroup] [Operators] [Cell]

JmolVersion="14.3.5_2014.08.10"

code: static Txt functions moved to javajs.util.PT

new feature: SHOW/WRITE PROPERTIES ... format "%s %i %f %f %f"
 -- allows specifying the format for a set of up to three properties.
 -- %s is atom name; %i is atom number
   
bug fix: show PROPERTIES broken
bug fix: plot PROPERTIES changes axis settings

JmolVersion="14.3.5_2014.08.09"

bug fix: magCIF file reading broken for new file format

new feature: magCIF file reading for incommensurately modulated magnetic structures
 -- very preliminary only; not tested 

new feature: set showModulationVectors true/false
 -- required now for showing modulation vectors rather than vibration vectors

new feature: vibration max x.x
new feature: vector max x.x  // alternative; the same
 -- renormalizes all vibrations and vibration/spin vectors to have a maximum value of x.x



JmolVersion="14.3.5_2014.08.08"
 
bug fix: CIF operators with n/9 not supported 
 
JmolVersion="14.3.5_2014.08.05"

bug fix: CIF reader broken for load xxx.cif 1  (14.1.17_2014.06.07)
bug fix: CONTACT command not functioning properly with multiple models

JmolVersion="14.3.4_2014.08.03"
note: Sourceforge release of 14.3.4 and 14.2.4

bug fix: annotation atom sets not adjusted for added hydrogens
bug fix: 14.3.3_2014.08.02 broke mmCIF reader
bug fix: BinaryDocument (Spartan file) reading broken in 14.1.12_2014.03.18

JmolVersion="14.3.3_2014.08.02"
note: Sourceforge release of 14.3.3 and 14.2.3

new feature: point({x,y,z}, true)
 -- TO screen coordinates

new feature: point({sx,sy,sz}, false)
 -- FROM screen coordinates

JmolVersion="14.3.3_2014.08.01"

bug fix: move+moveto/zoomto still an issue.

summary of new features for annotations, July 17 - Aug 1

new feature: load *1cbs/dom
 -- loads mmCIF file from EBI along with sequence domain data
 -- uses URL http://wwwdev.ebi.ac.uk/pdbe/api/mappings/sequence_domains/1cbs?metadata=true&pretty=false
 -- use example:

	load *1cbs/dom
		
		Domains loaded:
		   CATH  2.40.128.20 
		   GO  GO:0001972 GO:0005215 GO:0005501 GO:0005634 GO:0005730 GO:0005737 GO:0005783 GO:0006355 GO:0006810 GO:0007165 GO:0008289 GO:0008544 GO:0016918 GO:0019841 GO:0035115 GO:0042573 GO:0070062 
		   InterPro  IPR000463 IPR000566 IPR011038 IPR012674 
		   Pfam  PF00061 
		   SCOP  50847 
		   UniProt  P29373
		   
		Use SHOW DOMAINS for details.
		
	$ show domains

		metadata	restapi_version=0.8
		metadata	date=20140801
		metadata	url=http://wwwdev.ebi.ac.uk/pdbe/api/mappings/1cbs?pretty=false&metadata=true
		1cbs	SCOP	50847	identifier=Fatty acid binding protein-like
		1cbs	SCOP	50847	fold	description=Lipocalins
		1cbs	SCOP	50847	fold	sunid=50813
		1cbs	SCOP	50847	description=Fatty acid binding protein-like
		1cbs	SCOP	50847	class	description=All beta proteins
		1cbs	SCOP	50847	class	sunid=48724
		1cbs	SCOP	50847	superfamily	description=Lipocalins
		1cbs	SCOP	50847	superfamily	sunid=50814
		1cbs	UniProt	P29373	name=RABP2_HUMAN
		1cbs	UniProt	P29373	identifier=RABP2_HUMAN
		1cbs	GO	GO:0005215	name=transporter activity
		1cbs	GO	GO:0005215	identifier=transporter activity
		1cbs	GO	GO:0005215	definition=Enables the directed movement of substances (such as macromolecules, small molecules, ions) into, out of or within a cell, or between cells.
		1cbs	GO	GO:0005215	category=Molecular_function
		...
		1cbs	CATH	2.40.128.20	architecture=Beta Barrel
		1cbs	CATH	2.40.128.20	identifier=Lipocalin
		1cbs	CATH	2.40.128.20	name=Cellular retinoic acid binding protein type ii. Chain: a. Engineered:yes
		1cbs	CATH	2.40.128.20	homology=Lipocalin
		1cbs	CATH	2.40.128.20	class=Mainly Beta
		1cbs	CATH	2.40.128.20	topology=Lipocalin
		1cbs	Pfam	PF00061	identifier=Lipocalin / cytosolic fatty-acid binding protein family
		1cbs	Pfam	PF00061	description=Lipocalin / cytosolic fatty-acid binding protein family
		1cbs	InterPro	IPR012674	name=Calycin
		1cbs	InterPro	IPR012674	identifier=Calycin
		1cbs	InterPro	IPR000566	name=Lipocalin/cytosolic fatty-acid binding domain
		1cbs	InterPro	IPR000566	identifier=Lipocalin/cytosolic fatty-acid binding domain
		1cbs	InterPro	IPR011038	name=Calycin-like
		1cbs	InterPro	IPR011038	identifier=Calycin-like
		1cbs	InterPro	IPR000463	name=Cytosolic fatty-acid binding
		1cbs	InterPro	IPR000463	identifier=Cytosolic fatty-acid binding	

	select within(domains,"InterPro where domain.identifier='calycin'")
	
new feature: load *1cbs/val
 -- loads mmCIF file from EBI along with validation data
 -- use URL http://wwwdev.ebi.ac.uk/pdbe/api/validation/outliers/all/1cbs?metadata=true&pretty=false
 -- places that data into property_xxxx arrays
 -- use examples:
  
	  load *2x9t/val
	  color property_rsrz "bwr"  
	  display group within(5, property_rsrz > 0)

		found biomolecule 1: A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y
		
		Validations loaded:
		  property_sidechains (residues: 181)
		  property_rama (residues: 262)
		  property_rsrz (residues: 87, max: 10.6)
		  property_chirals (atoms: 1)
		  property_planes (residues: 21, max: 0.08)
		  property_RNA_suite (residues: 241)
		  property_RNA_pucker (residues: 33)
		  property_bond_angles (atoms: 31, max: 14.12)
		  property_clashes (atoms: 2655, max: 3.42)
		  
	  load *1d66/val
	  select on within(validation,"clashes")

new feature: load *1cbs/all
 -- loads mmCIF file from EBI along with validation and domain data
 -- may be extended to more types as they arise.

new feature: label %[validation.xxxx]
 -- retrieves comma-separated validation values after load *yyyy/val
 -- xxxx is an entry in the validation API return, such as clashes or rsrz
 -- NOT a sum of absolute values, as %[property_xxxx] is for validation data
 -- example:
		load *1d66/val
		select within(validation,"bond_angles")
		label val=%[validation.bond_angles]

new feature: set hoverlabel "%[validation.xxxx]"
 -- allows customized hover based on validation data
 -- example:
    	set hoverlabel "%[validation.bond_angles]"

new feature: select within(validation, "clashes where value>3")
 -- selects atoms from "outliers" array
 -- similar to select within(domains, "....")
 -- uses sum of absolute values for each atom
 
new feature: print getProperty("validationInfo[select * where _type='clashes']", atomset) 
 -- WHERE close can contain any validation type (see SHOW VALIDATION)
 -- second parameter can be atom set -- {2.1} for instance -- defaults to current model 
 -- allows uses SQL-like select phrases
 -- example:
  
   set hoverlabel "@{getProperty(\"validationInfo[select value where _type='bond_angles' and (_atoms and {hovered})]\").join(',')}"
  
new feature: print getProperty("domainInfo[select * where _type='SCOP']") 
 -- subset of auxiliaryInfo
 -- assumes model of visible
 -- second parameter can be atom set: {2.1} for instance 
 -- uses sum of absolute values for each atom
 -- allows uses SQL-like select phrase: 
 
   print getProperty("domainInfo[select * where _type='SCOP' and _domain like '508']")


new feature: SQL NOCACHE flag
 -- prevents caching when using outside variables or functions
 -- can be anywhere in the clause
 -- example:
       select within(domains,"NOCACHE SCOP where myFunc(domain, _atoms)")

new feature: SHOW DOMAINS "some info"
 -- selects specific records
 -- text-based matching in all fields and key names
 -- dot-notation allowed
 -- examples:
	   show domains name
	   show domains CATH
	   show domains InterPro.IPR002409
	   show domains Gal4	   

new feature: SHOW DOMAINS "<annotationRecordIinfo> all"
 -- shows JSON-like array data
 -- will involve a circular reference because the domain key
     points to the parent.parent entry in the main array
 -- example:
		load *1cbs/dom
  	   	show domains InterPro.IPR002409 all  

		  {
		    _atoms  :  ({15:204})
		    _path  :  "InterPro.IPR000463"
		    chain_id  :  "A"
		    domain  :
		    {
		      identifier  :  "Cytosolic fatty-acid binding"
		      mappings  : "<circular reference>"
		      name  :  "Cytosolic fatty-acid binding"
		     }
		    end  :
		    {
		      author_insertion_code  :  ""
		      author_residue_number  :  25
		      residue_number  :  25
		     }
		    entity_id  :  1
		    start  :
		    {
		      author_insertion_code  :  ""
		      author_residue_number  :  3
		      residue_number  :  3
		     }
		    struct_asym_id  :  "A"
		   }
		  {
		    _atoms  :  ({32:185})
		    _path  :  "InterPro.IPR000463"
		    chain_id  :  "A"
		    domain  :
		    {
		      identifier  :  "Cytosolic fatty-acid binding"
		      mappings  : "<circular reference>"
		      name  :  "Cytosolic fatty-acid binding"
		     }
	     ...
	
	

JmolVersion="14.3.3_2014.07.27"

bug fix: set pdbAddHydrogens incompatible with mmCIF *xxxx/val

new feature: select within(validation, "clashes where value>3")
 -- selects atoms from "outliers" array
 -- similar to select within(domains, "....")
 -- uses sum of absolute values for each atom
 
new feature: print getProperty("validationInfo[select * where _type='clashes']") 
 -- subset of auxiliaryInfo
 -- WHERE close can contain any validation type, currently including:  
 -- assumes model of visible
 -- second parameter can be atom set: {2.1} for instance 
 -- allows uses SQL-like select phrase: 
 
   print getProperty("domainInfo[select * where _type='SCOP' and _domain like '508']")

 -- does NOT use abolute value; report is as an array when select value is used:

   set hoverlabel "@{getProperty(\\"validationInfo[select value where _type='bond_angles' and (_atoms and {hovered})]\\").join(',')}"


new feature: print getProperty("domainInfo[select * where _type='SCOP']") 
 -- subset of auxiliaryInfo
 -- assumes model of visible
 -- second parameter can be atom set: {2.1} for instance 
 -- uses sum of absolute values for each atom
 -- allows uses SQL-like select phrase: 
 
   print getProperty("domainInfo[select * where _type='SCOP' and _domain like '508']")


JmolVersion="14.3.3_2014.07.26"

code: refactoring dssr/domains/validation clases

new feature: load *1crs/val
 -- loads PDBe file with validation data
 -- places that data into property_xxxx arrays
 -- use examples:
  
	  load *2x9t/val
	  color property_rsrz "bwr"  
	  display group within(5, property_rsrz > 0)

found biomolecule 1: A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y

Validations loaded:
  property_sidechains (residues: 181)
  property_rama (residues: 262)
  property_rsrz (residues: 87, max: 10.6)
  property_chirals (atoms: 1)
  property_planes (residues: 21, max: 0.08)
  property_RNA_suite (residues: 241)
  property_RNA_pucker (residues: 33)
  property_bond_angles (atoms: 31, max: 14.12)
  property_clashes (atoms: 2655, max: 3.42)
  

	  load *1d66/val
	  select on within(validation,"clashes")

    
JmolVersion="14.3.3_2014.07.23"

bug fix: write PDB fails

JmolVersion="14.3.3_2014.07.22"

new feature:  getProperty(x,"[select a,b,c ....
    - selection of specific keys to report in getProperty command 
    - does not require star-slash, which could mark end-of-comment
    
new feature:  x.in(a,b,c,d...)   # suggestion of Sameer Velankar
new feature:  x.in([a,b,c,d])
    - returns 0 (x not in group) or position 1-n

new feature: SQL NOCACHE flag
    - prevents caching when using outside variables or functions
    - can be anywhere in the clause
    - example:
       select within(domains,"NOCACHE ...")

JmolVersion="14.3.3_2014.07.20"

new feature: load *1cbs/dom
	- loads domain info from EBI along with mmCIF file
	- enables seqid (_atom_site.label_seq_id) required for animation
	- ` information is in the JSON form (in all cases below, 
		additional key/value pairs are allowed):
	
	 { "<pdbID>" : { <databaseInformation> } }
	 
	 where <PdbID> is a lower-case PDB id such as 1crs or 1d66
	 and <databaseInformation> is one or more records:
	 
	       "<databaseID>" : { <entryInfo> }
	      
	  <dataBaseID> is a database identifier such as: 
	       "CATH", "SCOP", "InterPro", "UniProt", "GO", "EC"
	       
	  <entryInfo> is one or more records of the form:
	     
	     "<entryID>" : { <entry> }
	     
	 <entry> must at the very least contain:
	 
	    "identifier" : "<some identifier>"
	    "mappings" : [ array of <mapping> ]
	    	    
	 <mapping> must minimally be
	    
	    { "chain_id" : "<author chainIdentifier>" }
	    
	 but is more likely to contain start/end records:
	    
	    { "chain_id" : "<author chainIdentifier>", 
		  "start" : <residueRecord>,	    
		  "end" : <residueRecord>	    
	    }
	      
	 <residueRecord> must minimally be:
	 
	 	{ "residue_number" : <mmCIF _atom_site.label_seq_id> }
	 	
	 but usually also contains "author_residue_number" and "author_insertion_code".
	 
	- reports to console:
	
	Domains loaded:
	   CATH  2.40.128.20 
	   EC  
	   GO  GO:0001972 GO:0005215 GO:0005501 GO:0005634 GO:0005730 GO:0005737 GO:0005783 GO:0006355 GO:0006810 GO:0007165 GO:0008289 GO:0008544 GO:0016918 GO:0019841 GO:0035115 GO:0042573 GO:0070062 
	   InterPro  IPR000463 IPR000566 IPR011038 IPR012674 
	   Pfam  PF00061 
	   SCOP  50847 
	   UniProt  P29373
	Use SHOW DOMAINS for details.
	
new feature: SHOW DOMAINS
    - displays tab-separated annotation information
    
		1cbs	CATH	2.40.128.20	topology=Lipocalin
		1cbs	Pfam	PF00061	identifier=Lipocalin / cytosolic fatty-acid binding protein family
		1cbs	Pfam	PF00061	description=Lipocalin / cytosolic fatty-acid binding protein family
		1cbs	InterPro	IPR012674	name=Calycin
		1cbs	InterPro	IPR012674	identifier=Calycin
	
new feature: SHOW DOMAINS "<annotationRecordIinfo>"
	- selects specific records
	- text-based matching in all fields

new feature: SHOW DOMAINS "<annotationRecordIinfo> mappings"
	- adds information about mapping
	
new feature: select within(annotation, "<query>")

	- allows selection of atoms based on annotations. 
	- <query> can be:
		- a databaseID:
		
			select within(domains,"InterPro")
		
		- a specific databaseID.entryID:
		
			select within(domains,"InterPro.IPR012674")
		
		- a specific databaseID, with WHERE clause:
		
			select within(domains,"InterPro where domain.identifier='calycin'")		
			select within(domains,"InterPro where identifier='calycin'")
			select within(domains,"InterPro where identifier like '*-like*'")
			
			
		
	 
note: "annotations" references changed to "domains"
bug fix: Jmol application starts in English regardless of language

JmolVersion="14.3.3_2014.07.29"

new feature: label %[validation.xxxx]
 -- retrieves comma-separated validation values after load *yyyy/val
 -- xxxx is an entry in the validation API return, such as clashes or rsrz
 -- NOT a sum of absolute values, as %[property_xxxx] is for validation data
 -- example:
		load *1d66/val
		select within(validation,"bond_angles")
		label val=%[validation.bond_angles]

new feature: set hoverlabel "%[validation.xxxx]"
 -- allows customized hover based on validation data
 -- example:
    	set hoverlabel "%[validation.bond_angles]"

JmolVersion="14.3.3_2014.07.27"

bug fix: set pdbAddHydrogens incompatible with mmCIF *xxxx/val

new feature: select within(validation, "clashes where value>3")
 -- selects atoms from "outliers" array
 -- similar to select within(domains, "....")
 -- uses sum of absolute values for each atom
 
new feature: print getProperty("validationInfo[select * where _type='clashes']") 
 -- subset of auxiliaryInfo
 -- WHERE close can contain any validation type, currently including:  
 -- assumes model of visible
 -- second parameter can be atom set: {2.1} for instance 
 -- allows uses SQL-like select phrase: 
 
   print getProperty("domainInfo[select * where _type='SCOP' and _domain like '508']")

 -- does NOT use abolute value; report is as an array when select value is used:

   set hoverlabel "@{getProperty(\"validationInfo[select value where _type='bond_angles' and (_atoms and {hovered})]\").join(',')}"


new feature: print getProperty("domainInfo[select * where _type='SCOP']") 
 -- subset of auxiliaryInfo
 -- assumes model of visible
 -- second parameter can be atom set: {2.1} for instance 
 -- uses sum of absolute values for each atom
 -- allows uses SQL-like select phrase: 
 
   print getProperty("domainInfo[select * where _type='SCOP' and _domain like '508']")


JmolVersion="14.3.3_2014.07.26"

code: refactoring dssr/domains/validation clases

new feature: load *1crs/val
 -- loads PDBe file with validation data
 -- places that data into property_xxxx arrays
 -- use examples:
  
	  load *2x9t/val
	  color property_rsrz "bwr"  
	  display group within(5, property_rsrz > 0)

found biomolecule 1: A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y

Validations loaded:
  property_sidechains (residues: 181)
  property_rama (residues: 262)
  property_rsrz (residues: 87, max: 10.6)
  property_chirals (atoms: 1)
  property_planes (residues: 21, max: 0.08)
  property_RNA_suite (residues: 241)
  property_RNA_pucker (residues: 33)
  property_bond_angles (atoms: 31, max: 14.12)
  property_clashes (atoms: 2655, max: 3.42)
  

	  load *1d66/val
	  select on within(validation,"clashes")

    
JmolVersion="14.3.3_2014.07.23"

bug fix: write PDB fails

JmolVersion="14.3.3_2014.07.22"

new feature:  getProperty(x,"[select a,b,c ....
    - selection of specific keys to report in getProperty command 
    - does not require star-slash, which could mark end-of-comment
    
new feature:  x.in(a,b,c,d...)   # suggestion of Sameer Velankar
new feature:  x.in([a,b,c,d])
    - returns 0 (x not in group) or position 1-n

new feature: SQL NOCACHE flag
    - prevents caching when using outside variables or functions
    - can be anywhere in the clause
    - example:
       select within(domains,"NOCACHE ...")

JmolVersion="14.3.3_2014.07.20"

new feature: load *1cbs/dom
	- loads domain info from EBI along with mmCIF file
	- enables seqid (_atom_site.label_seq_id) required for animation
	- ` information is in the JSON form (in all cases below, 
		additional key/value pairs are allowed):
	
	 { "<pdbID>" : { <databaseInformation> } }
	 
	 where <PdbID> is a lower-case PDB id such as 1crs or 1d66
	 and <databaseInformation> is one or more records:
	 
	       "<databaseID>" : { <entryInfo> }
	      
	  <dataBaseID> is a database identifier such as: 
	       "CATH", "SCOP", "InterPro", "UniProt", "GO", "EC"
	       
	  <entryInfo> is one or more records of the form:
	     
	     "<entryID>" : { <entry> }
	     
	 <entry> must at the very least contain:
	 
	    "identifier" : "<some identifier>"
	    "mappings" : [ array of <mapping> ]
	    	    
	 <mapping> must minimally be
	    
	    { "chain_id" : "<author chainIdentifier>" }
	    
	 but is more likely to contain start/end records:
	    
	    { "chain_id" : "<author chainIdentifier>", 
		  "start" : <residueRecord>,	    
		  "end" : <residueRecord>	    
	    }
	      
	 <residueRecord> must minimally be:
	 
	 	{ "residue_number" : <mmCIF _atom_site.label_seq_id> }
	 	
	 but usually also contains "author_residue_number" and "author_insertion_code".
	 
	- reports to console:
	
	Domains loaded:
	   CATH  2.40.128.20 
	   EC  
	   GO  GO:0001972 GO:0005215 GO:0005501 GO:0005634 GO:0005730 GO:0005737 GO:0005783 GO:0006355 GO:0006810 GO:0007165 GO:0008289 GO:0008544 GO:0016918 GO:0019841 GO:0035115 GO:0042573 GO:0070062 
	   InterPro  IPR000463 IPR000566 IPR011038 IPR012674 
	   Pfam  PF00061 
	   SCOP  50847 
	   UniProt  P29373
	Use SHOW DOMAINS for details.
	
new feature: SHOW DOMAINS
    - displays tab-separated annotation information
    
		1cbs	CATH	2.40.128.20	topology=Lipocalin
		1cbs	Pfam	PF00061	identifier=Lipocalin / cytosolic fatty-acid binding protein family
		1cbs	Pfam	PF00061	description=Lipocalin / cytosolic fatty-acid binding protein family
		1cbs	InterPro	IPR012674	name=Calycin
		1cbs	InterPro	IPR012674	identifier=Calycin
	
new feature: SHOW DOMAINS "<annotationRecordIinfo>"
	- selects specific records
	- text-based matching in all fields

new feature: SHOW DOMAINS "<annotationRecordIinfo> mappings"
	- adds information about mapping
	
new feature: select within(annotation, "<query>")

	- allows selection of atoms based on annotations. 
	- <query> can be:
		- a databaseID:
		
			select within(annotations,"InterPro")
		
		- a specific databaseID.entryID:
		
			select within(annotations,"InterPro.IPR012674 where identifier='calycin'")
		
		- a databaseID followed by a WHERE clause:
		
			select within(annotations,"InterPro where identifier='calycin'")
			select within(annotations,"InterPro where identifier like '*-like*'")
			
			
		
	 
	any text information in the
	  SHOW ANNOTATION report. 
	
bug fix: 1-letter sequence for water showing as "I" not "?"
bug fix: SHOW SEQUENCE FALSE not giving 1-letter sequences	
bug fix: for (i in x)   where x is an associative array does not work

JmolVersion="14.3.3_2014.07.17"

new feature: load *1cbs/all
 -- preliminary only
  
new feature: show annotation

bug fix: DSSP analysis not returning information to console

JmolVersion="14.3.3_2014.07.13"

code: refactoring of HTML5 Jmol, JSpecView, and AstexViewer for cleaner
      interaction with web-page based JavaScript. All interations now 
      go directly through JS

bug fix: move and moveto cannot be in the same session

JmolVersion="14.3.3_2014.07.12"

bug fix: x.func(y) as second operand in a boolean "and" operation 
         where the first operand evaluates to FALSE 
         (so that x.func(y) is never evaluated), triggers a script error.
bug fix: set atomPicking, setDrawPicking, pickLabel, pickingSpinRate 
         all should not be in state

new feature: load /pdbe/xxxx
 -- loads CIF file http://www.ebi.ac.uk/pdbe/entry-files/download/xxxx.cif
 -- can be abbreviated as "*":
  
     load *1ai6
     
 -- can be supplemented with annotations (TODO)
    
new feature: {*}.seqid
 -- mmCIF only
 -- settable using {*}.seqid = ....
 -- from _atom_site.label_seq_id
 -- a pointer to _entity_poly_seq.num in the ENTITY_POLY_SEQ category.
     Data items in the ENTITY_POLY_SEQ category specify the sequence
     of monomers in a polymer. Allowance is made for the possibility
     of microheterogeneity in a sample by allowing a given sequence
     number to be correlated with more than one monomer id - the
     corresponding ATOM_SITE entries should reflect this heterogeneity.
  
bug fix: ModelKit menu does not allow setting of new element
bug fix: set atomPicking, setDrawPicking should not be in state

JmolVersion="14.3.3_2014.07.09"

new feature: eval(...)

code: org.jmol.util.Measure moved to javajs.util.Measure

JmolVersion="14.3.3_2014.07.02"

bug fix: getproperty structureInfo can fail with phosphorus monomers
bug fix: PDB reader not placing compoundSource in model auxiliary info

JmolVersion="14.3.2_2014.06.29"

bug fix: MCIF reader misreads magnetic symmetry operators involving xyz scaling
bug fix: isosurface "=3hyd" AS "3hyd.omap" fails to save proper file
         (error in seek() method of javajs.util.binaryDocument)
         
JmolVersion="14.3.1_2014.06.28"

bug fix: zz = write("coord") should write untransformed coordinates in XYZ format. It is writing untransformed coordinates in MOL format.
bug fix: zz = write("coord", "MOL") should write transformed coordinates in MOL format. It is writing untransformed coordinates.
bug fix: write COORD should display untransformed coordinates in XYZ format in the console, but it does not. It writes a JPG file named "coord".
bug fix: MCIF reader not reading magnetic centerings 1/3, 2/3
bug fix: JSV jsvAddHighlight broken
bug fix: JSmol HTML5 console broken for Safari and Chrome
bug fix: CASTEP phonon .geom file reading broken

JmolVersion="14.3.0_2014.06.13"

RELEASE OF Jmol 14.2.0 Friday, June 13, 2014

new feature: readers with unit cells may load as trajectories

bug fix: CASTEP reader broken for multiple cells and geometry optimization

JmolVersion="14.1.17_2014.06.12"

new feature: protein sidechain minimization
 -- enabled by set picking dragMinimizeMolecule
 -- proteins only
 -- uses MMFF or UFF force field automatically
 -- important to use set pdbAddHydrogens prior to loading 
     to avoid stereochemical switch (ILE, THR, e.g.)
     or to be very careful about that 

JmolVersion="14.1.17_2014.06.11"

bug fix: set pdbAddHydrogens fails for structures with ANISOU records
bug fix: select x < 0.3 reports error when checking, though it does run when executed
bug fix: SMILES for model with nonbonded atoms fails

JmolVersion="14.1.17_2014.06.10"

bug fix: 06.09 broke unitcell display
bug fix: WebPanel error trapping problem; too long file name for tar file

synchonized with Jmol 14.0.17 June 9, 2014

bug fix: zoomto broken
bug fix: atoms turned off with restrict still clickable

JmolVersion="14.1.17"
JmolVersion="14.1.17_2014.06.07"

FEATURE CHANGE: jmolCommandInput 6th parameter added is default value
 -- defaults to "help"

FEATURE CHANGE: set useArcBall removed 
 -- no longer necessary; never documented
 -- arcBall is always used anyway
  
FEATURE CHANGE: removed UNITCELL "xxx" where xxx is an isosurface ID
 -- undocumented
 -- not necessary, as UNITCELL $xxx or UNITCELL isosurface xxx  does as well
 -- conflicts with new UNITCELL "parent" and other unit cell types
  
FEATURE CHANGE: REMOVED: set fractionalRelative
 -- an odd quantity -- related specifically to scripts commands
     using {1/1 1/2 1/3} and cell=nnn
 -- Its use with cell= was never documented.
 -- It makes no sense to change the unit cell and not change the 
     meaning of {1/1 1/2 1/3} and cell=nnn
 -- Only relates to situations where the unit cell has been offset.
 -- Its presence caused unitcell [{origin} {a} {b} {c}] to fail.
 -- It should never have been set in state, as it has nothing to do with the state 
  
FEATURE CHANGE: default space group names for Int. Tables # 39, 41, 64, 67, 68 added

new feature: x= format("JSON", data)
 -- simple way to generate JSON code.

new feature: x = format("base64", data)
 -- creates base64-encoding of the data
 -- data can be an array, a byteArray, a string, or a base64-encoded array
 -- prepends the string with ";base64,"
  	 
new feature: x = format("byteArray", data)
 -- creates byte array from the data
 -- data can be an array, a byteArray, a string, or a base64-encoded array
  	 
new feature: x = format("array", data)
 -- data can be an array, a byteArray, a string, or a base64-encoded array
 -- turns byteArrays and strings into integer arrays
 -- copies arrays if data is an array
  	 
new feature: load xxxx filter "CELL=va,vb,vc;oa,ob,oc"
 -- generic cell transformation during load
 -- applicable to any crystallographic file
 -- must be the LAST element of a filter
 -- operators are applied BEFORE this transformation
 -- can be expanded with {i j k} or {mmm nnn 1}
 -- can be used to create a supercell with or without offset
 -- reversed with "cell=!a,b,c:0,0,1/2"
 -- forces packing, with range based on specified cell dimensions
 -- example:
   load t.mcif filter "cell=2a,2b,c:0,0,1/2"

new feature: load xxxx filter "NOPACKCELL=va,vb,vc;oa,ob,oc"
 -- same as CELL=  except without any packing
  
new feature: load filter "cell=parent" or "cell=standard"
 -- for MCIF files (magnetic spin CIF files
 -- later, UNITCELL "conventional" displays conventional cell

new feature: set showUnitCellInfo TRUE (default)
 -- set FALSE to hide unit cell information display
  
new feature: unitcell "type"
 -- type can be "standard" or "parent" for now
     derived from CIF records
 -- "primitive" may follow
   unitcell "standard"
   unitcell "parent"
   unitcell "conventional"
   
new feature: unitcell "abc_offset"
 -- abc_offset is of the form "a,b,c;0,0,0"
     where a, b, and c, can be any expression involving a, b, and c
     and 0 can be an offset 
 -- numbers can be expressed fractionally or as decimals
 -- offset is optional, but semicolon is not
 -- effect is cumulative -- unit cell is NOT first restored
 -- reversed using !
 -- examples:
  
    unitcell "a+b,a-b,c;1/4,1/4,1/4"
    unitcell "!a+b,a-b,c;1/4,1/4,1/4"
    unitcell "a+b,a-b,c;"  
    
new feature: unitcell {555 575 0}
 -- 0 here means "draw these cells without internal lines"
 -- (currently) .uxyz does not scale
  
new feature: unitcell OFFSET and RANGE
 -- explicit parameters for unitcell {i j k} and unitcell {nnn mmm x}
  
new feature: unitcell BOUNDBOX
 -- allows calculation of positions relative to boundbox using fractional coordinates
 -- for example
  
     unitcell boundbox
     draw {1/2 1/2 1/2}
     unitcell reset
     
new feature: x.push(key,value) for associative array
 -- same as x.key = value; seems appropriate
  
new feature: x.pop("key") for an associative array
 -- same as x - "key"; just seems more appropriate
  
new feature: load ORIENTATION or load DATA "...orientation..." ...
 -- loads a file and preserves current orientation
 -- creates saved orientation "preload"
 -- shortcut for save orientation preload;load....;restore orientation preload
 -- example:
       load orientation "" // reload file with same orientation
       
new feature: V3000 reading of DATA SGROUP records:
 -- for example:
 		...
		M  V30 BEGIN SGROUP
		M  V30 1 DAT 0 ATOMS=(1 1) FIELDNAME=pc FIELDDATA=-0.2344 
		M  V30 1 DAT 0 ATOMS=(1 2) FIELDNAME=pc FIELDDATA=0.3344 
		M  V30 1 DAT 0 ATOMS=(1 3) FIELDNAME=pc FIELDDATA=-0.4344 
		M  V30 END SGROUP
   		...
   	then partialCharges, for example, can be set using: 
   	   {*}.partialCharge = {*}.property_pc.all  	
 -- optionally, if FIELDNAME contains "partial" then the atom's partial charge 
    is automatically set instead of property_partialCharge
 -- if more than one field starts with "partial" then the 
    first one indicated in the file is assigned to partialCharge
    and the any others are left as property_partialXXXX

new feature: moveTo AXIS [a,b,c,x,y,z]
 -- for example: moveTo AXIS a        
 -- rotates the model smoothly to a crystallographic or cartesian axis.
 -- in the case of abc, the rotation places the remaining two axes
     to the right and down (International Tables standard)
 -- in the case of xyz, the rotation places the remaining two axes
     to the right and up (standard Cartesian orientation)
 -- for abc, if no unit cell is available, a simple {1 1 1 90 90 90} unit cell is used
 -- added to application and popup View menus

new feature: JSmol: allow for a user callback for customization of menu
  if (Jmol._showMenuCallback)
		Jmol._showMenuCallback(menu, x, y);

new feature: show(xxx) function
 -- same as script("show " + xxx)

new feature: set showUnitCellDetails TRUE (default)
 -- FALSE removes a,b,c,alpha,beta,gamma lines

new feature: unitcell RESET (or RESTORE)
 -- returns unit cell to original values and removes offset and scaling
 -- resets width to fine line

new feature: restore UNITCELL
 -- returns unit cell to original values and removes offset and scaling

new feature: show symop n "fmatrix"
new feature: show symop @1 @2 "fmatrix"
 -- gives rational fractional matrix
  
new feature: BilbaoReader NONORM option -- reads displacements as actual values, not normalized

new feature: load ... filter "symop=..."
 -- list of numbers separated by space, for example:
     load quartz.cif packed filter "symop=2"
     load quartz.cif packed filter "symop=2 3"
     
new feature: set echo depth x.x for standard echos
 -- works for 3D echos now as well as 2D echos
 -- values in percent of depth
 -- x.x >= 1000 are (x.x % 1000) in front of the 3D position
 -- x.x <= -1000 are (-x.x % 1000) behind the 3D position
    
new feature: set starWidth
 -- replaces set set starScale
  
new feature: menu item color--atoms--by scheme--vectors

new feature: load "filename" packed x.x
 -- x.x is the range in fractional coordinates within which an atom
     can be close to being in the 555 cell but not quite and still be
     accepted by the atom loading filter.
 -- default is 0.02
 -- in some cases, this adds too many atoms and can be reduced to 0.01 or 0.001
 -- modulation reader uses 0.001 strictly.
 -- for example:
  
		load t2.bcs packed 0.01
		{1.1}.property_dist =  {1.1}.distance.min({1.2})
		{1.1}.spacefill={1.1}.property_dist.all
		color {1.1} property_dist "bwr" range 0 0.5
		select 1.2
		stars -0.3
		set starscale 0.1
		frame *
		unitcell {1.2}
   
new feature: Bilbao Crystallographic Server file reader
 -- scrapes Bilbao HTML pages for Bilbao structure format
 -- for example, http://www.cryst.ehu.es/cryst/compstru.html
     or http://www.cryst.ehu.es/cryst/amplimodes.html
 -- reads Bilbao standard setting data:
		15
		13.800 5.691 9.420 90.0 102.3 90.0
		7
		Pb    1   4e    0.0000 0.2910 0.2500
		Pb    2   8f    0.3170 0.3090 0.3520
		P     1   8f    0.5990 0.2410 0.4470
		O     1   8f    0.6430 0.0300 0.3920
		O     2   8f    0.6340 0.4640 0.3740
		O     3   8f    0.6420 0.2800 0.6120
		O     4   8f    0.4910 0.2220 0.4200
 -- identified by 1st and third line being a single integer only
     (IT spacegroup  number and atom count, respectively)
      
new feature: dipole ID m1 ALL {...}
 -- creates a molecular dipole set with ID
 -- one dipole per molecule in specified range
 -- connected to associated molecule in terms of visibility

new feature: unit cell display includes k (mCIF) and q (CIF, Jana2006) vectors

bug fix: cannot zap model for which atoms are all deleted
bug fix: isosurface "=1bna" does not work for zapped file
bug fix: label %[x] does not work
bug fix: show spacegroup not complete for magnetic and modulated structures
bug fix: legacy JVXL file data skipping broken in 14.1.13
bug fix: MO file line includes full path; should be just the filename
bug fix: V3000 reader skips 2nd file in multiple files separated by $$$$
bug fix: isosurface color density broken
bug fix: isosurface slab @1 @2 @3 broken
bug fix: (undocumented) isosurface slab @3   fails when isosurface has not been mapped
bug fix: console not properly handling TAB key
bug fix: double-click drag doesn't drag the model, and 
         since double-click is determined by time, not location,
         it appears as though sometimes the model drags and 
         sometimes it does not. Solution is to
           a) add a localization to double clicking. I think that
              was removed because of touch interface problems.
           b) add left-double-drag to left-single-drag for standard rotation
           
bug fix: browser errant zero mouse move 
         causes collapse of rotation matrix
         due to coding error in arcball routine
 
bug fix: drag-drop followed by model building may fail.
bug fix: tm.matrixRotate protected from setting to all zeros (Chrome issue; reason unknown)
bug fix: JavaScript state creation not properly representing integral decimal numbers
bug fix: draw length pt1 pt2 only makes half the line 
bug fix: color $m* green blue wild card coloring for isosurfaces doe not work
bug fix: {*}.trace = {*}.bfactor  crashes Jmol (.bfactor does not exist)
bug fix: ramachandran plot scaling off
bug fix: color $isosurface1 "rwb" range 3.0 4.5   fails to set color scheme
bug fix: write VAR X fails if X is an associative array
bug fix: show NMR broken
bug fix: H1 simulation not happening in Jmol.jar
bug fix: write() function does not work for write("coords")
bug fix: vibration vectors may have incorrect length if vector scale and vibration scale are different
bug fix: LOAD ... SUPERCELL not saved in state
bug fix: CASTEP reader not handling supercell correctly (packing and phonons)

bug fix: Jmol 14.1.12 broke atom.fxyz for models that have vibrations.
 -- atom.fxyz SHOULD change with changes in unit cell, but when an update was
     made to accommodate modulated subsystems, where different atoms in a 
     model may have different unit cells, this capability was lost for any
     atom having any sort of vibration other than a modulation. 
          
bug fix: set hoverlabel will be ignored if no hover has already taken place

bug fix: symmetry operation drawing/description with centering
bug fix: Bilbao uses 2nd origin for numerous spacegroups

bug fix: magCIF reader using 4x4 determinant, not 3x3

bug fix: file drag-drop doing append if no atoms
bug fix: BilbaoReader amplimode correction
bug fix: polyhedra not vibrating
bug fix: application file open preview not working
bug fix: show file only shows file for model 1.1
bug fix: signed applet not accepting drag-drop
bug fix: getProperty "fileInfo" for CIF should fix keys (lower case and change '.' to '_')
bug fix: problems reading PNGJ files for Jana2006

code: V3000 reader split off from MolReader; saves 2K or so.    
code: faster calculations involving point-based atom properties such as fx
code: TransformManager clean-up; 
code: Viewer/FileManager clean-up; image loading moved to jzu 


JmolVersion="14.1.15"
JmolVersion="14.1.15_2014.05.08"

bug fix: pubChem reader broken

new feature: mCIF (magnetic CIF) file reader
 -- preliminary reader for CIF format development testing
 -- includes latest proposal in committee as of May 8, 2014 
  
new feature: unitcell [ {origin} {a} {b} {c} ] 
 -- defines unit cell in terms of an origin and three vectors
 -- just wasn't documented. 
  

JmolVersion="14.1.15_2014.05.06"

bug fix: CIF reader not filtering atoms by element
bug fix: structure command may not properly remove residues from structures (F. Reichmann)
bug fix: FRAME n  setting frame to n - 1.  (F. Reichmann)
bug fix: unitcell {0 0 0};   in state leaves unit cell on
bug fix: modulation of anisotropic parameters broken
bug fix: Jana2006 reader does not accept filter "MODAVE"
bug fix: msCIF with filter "MODAXES=X" broken

JmolVersion="14.1.15_2014.05.04"

new feature: reset PRINT
 -- clears the output buffer (scriptWait, scriptEcho, evaluateVar
bug fix: color property x   does not pass script check, so not allowed in web command box
bug fix: echo "@{xxx}" may fail
but fix: print @b fails for referred variable an array
bug fix: xxx.format("%8.-3p") does not work
bug fix: [array].format("%8.3p") does not work
bug fix: PDB Reader skips first ANISOU record
bug fix: SFTP not supported
bug fix: fix for measurements not updating with modulation x.x

new feature: replace()
 -- no arguments means "clean whitespace to single space and trim"
  
new feature: replace(x, y, TRUE)
 -- all occurrences of characters of x will be replaced with y.

new feature: mCIF reader
 -- Bilbao Crystallographic Server format
 -- magnetic extension to CIF reader
  
new feature: set vectorsCentered
 -- centers vibration vector on atom
 -- vector is never animated
 -- useful for magnetic/spin properties

new feature: select xyz > 1.0
 -- xyz, fxyz, fuxyz, uxyz, vxyz 
 -- uses length
   
JmolVersion="14.1.14"
JmolVersion="14.1.14_2014.04.28"

FEATURE CHANGE: Application Tools...Spectrum menu removed
 -- Issue is that EPFL returns with a new 2D structure,
 -- and Jmol would have to determine from that an atom selection map.
 -- we are doing this with JSmol, but not yet with the application.
 -- Bummer!

new feature: getProperty(x, SQL_query) 
 -- Full SQL for any Jmol associative array. 
 -- Result is an array if x is an array.  
 -- example:
		x = [ 1,2,3,{ "testing":"here","val":33 } ]
		y = getProperty(x, "SELECT val WHERE testing LIKE 'here'")
		show y
		
		[ 33 ]
		  
		z = x[4]
		show z
		
		z = { "testing":"here","val":33 }
		
		y = getProperty(z, "SELECT val WHERE testing LIKE 'here'")
		show y
		
		33

new feature: LIKE operator extended to atom expressions 
 --IS case-sensitive (unlike "=")
 --examples:  
    load =1crn
    select group like "G*"
    print "x" like "X"  // FALSE

new feature: "like" operator, strings only:
     a LIKE "x"    a equals x
     a LIKE "*x"   a ends with x
     a LIKE "x*"   a starts with x
     a LIKE "*x*"  a contains x
     
new feature: rich SQL logic in GETPROPERTY, getProperty(), and within(dssr,"xxxx.yyy..."):
 -- syntax: [SELECT keys WHERE expression]
 -- keys indicating only one key, such as "nt1", return just the value
 -- keys may be a LIKE wildcard such as "nt*" or "*nt" or "*nt*" (but are NOT case sensitive)
     also return just the value(s)
 -- keys * or */* means "return all values as an associative array"
 -- keys */nt1,nt2  means "return a new associative array including only keys nt1 and nt2"
 -- keys */nt*  means "return a new associative array including all keys starting with nt"
 -- if drilling to this associative array from a list,  * or */... returns an array of key/value pairs
 -- expression may be any standard Jmol expression that does not involve actual Jmol variables
     (instead, the variable names should all be the keys, and their values will be that given in the key:value pair)
 -- example:
	load files "=1ehz/dssr"
	x = getProperty("auxiliaryInfo.models.1.dssr.basepairs");
    print getProperty(x,"[SELECT nt* WHERE bp='C-G']")
    print getProperty(x, "[SELECT */nt* WHERE Saenger LIKE '19*']")
 -- keys may be "dotted" -- modelProperties.FreqValue -- but in this case
     the dotted key (FreqValue here) must be exact case. "modelProperties.freqvalue" would not work.
 -- example:
    load C6H6.smol
    x = getProperty("modelInfo.models[select _ipt where modelProperties.PATH='Frequencies' and modelProperties.FreqValue > 3000]")
	select modelIndex = x  // 6 models selected 

new feature: JANA2006 reader adds M40 molecular group support
 -- no TLS modulation
 -- no local axes (third header line of pos# record)
 
new feature: calculate structure dssr
 -- fetches http://x3dna.bio.columbia.edu/dssr/?POST?opts=--hl%20--more&model=[pdb data]
 -- builds auxiliaryInfo.models.n.dssr
 -- displays summary report
 -- complements calculate structure dssp, except it is done by the x3dna server at Columbia, not Jmol
  
new feature: (application only) -a --autoAnimationDelay
 -- delay time in seconds for press-and-hold operation of 
     toolbar animation buttons (default 0.2; set to 0 to disable)

new feature: calculate hbonds structure   
 -- now includes DSSR-calculated bonds for nucleic acids
  
new feature: select leadAtom
 -- selects *.CA, *.P and terminal O in nucleotides

  
new feature: set backboneSteps TRUE
 -- draws base pair steps between dssr-identified base pairs

TRANSCRIPTION/DNA                       06-MAR-92   1D66
DNA RECOGNITION BY GAL4: STRUCTURE OF A PROTEIN/DNA COMPLEX
found biomolecule 1: D, E, A, B

DSSR: a software program for Defining the Secondary
Structures of RNA from three-dimensional coordinates
v1.0.6-2014apr04, Xiang-Jun Lu (xiangjun@x3dna.org)
List of 19 base pairs
List of 1 helix
List of 4 stems
List of 1 coaxial stack
List of 3 internal loops


new feature: load =1msy/dssr
 -- very simple RCSB/DSSR connection
 -- loads both files: 
		FileManager opening 1 http://www.rcsb.org/pdb/files/1msy.pdb.gz
		FileManager opening 1 http://x3dna.bio.columbia.edu/dssr?id=1msy

	load =1msy/dssr
	set backboneSteps
	backbone -0.2
	select within(dssr,"helices")
	color blue
	select within(dssr,"stems")
	color red
	select within (dssr,"singleStranded")
	color white
	select within (dssr,"multiplets")
	color green
	select within (dssr,"isolatedPairs") // was "lonePairs"
	color orange
	select leadatom
	spacefill 1.5
	label %[group1]
	font label 24 bold
	set labeloffset 0 0
	color label grey

new feature: select within(dssr,"subset")
 -- subsets include 
		aMinorMotifs
		basePairs
		bulges
		coaxialStacks
		hairpinLoops
		helices
		internalLoops
		junctions
		kinkTurns
		kissingLoops
		lonePairs
		multiplets
		riboseZippers
		singleStranded
		stems
		summary
  -- optionally followed by ".n" where n is a number starting with 1
  -- optionally followed by ".linkedBy" for loops, bulges, and junctions 
  -- optionally followed by ".res1" or ".res2"
  -- can accommodate SQL
  -- results are cached for individual models
  -- example:
   
     select within(dssr,"multiplets")
     select within(dssr,"bulges.3")
     select within(dssr,"bulges.3.linkedBy")
     select within(dssr,"basePairs[SELECT res* WHERE twist > 1]")

new feature: select x = [array or array variable]
 -- implied OR
 -- operators other than equals use implied AND
  
new feature: DSSR server
 -- load files "=1d66" + "=dssr/1d66"

         DSSR: a software program for Defining the Secondary
         Structures of RNA from three-dimensional coordinates
         v1.0.6-2014apr04, Xiang-Jun Lu (xiangjun@x3dna.org)

 -- uses new "concatenate" notation to combine data from two sources
 -- after loading, try
   
     print getProperty("auxiliaryInfo.models.1.dssr")
     
     
new feature: array.keys.all
 -- drills down in sequential or associative arrays
 -- gives all keys as well as number of array elements:
  
    load files "=1d66" + "=dssr/1d66"
    x=getProperty("auxiliaryInfo.models.1.dssr")
    print x.keys.all

basePairs
basePairs.19.DSSR
basePairs.19.LW
basePairs.19.Saenger
basePairs.19.bp
basePairs.19.id
basePairs.19.info
basePairs.19.name
basePairs.19.nt1
basePairs.19.nt2
coaxialStacks
coaxialStacks.1.helix
coaxialStacks.1.nts
coaxialStacks.1.nts.4.5.DSSR
coaxialStacks.1.nts.4.5.LW
coaxialStacks.1.nts.4.5.Saenger
coaxialStacks.1.nts.4.5.bp
coaxialStacks.1.nts.4.5.id
coaxialStacks.1.nts.4.5.info
coaxialStacks.1.nts.4.5.name
coaxialStacks.1.nts.4.5.nt1
coaxialStacks.1.nts.4.5.nt2
coaxialStacks.1.stemCount
helices
helices.1.basePairs
helices.1.basePairs.19.DSSR
helices.1.basePairs.19.LW
helices.1.basePairs.19.Saenger
helices.1.basePairs.19.bp
helices.1.basePairs.19.id
helices.1.basePairs.19.info
helices.1.basePairs.19.name
helices.1.basePairs.19.nt1
helices.1.basePairs.19.nt2
helices.1.info
internalLoops
internalLoops.3.count
internalLoops.3.dssrType
internalLoops.3.id
internalLoops.3.linkedBy
internalLoops.3.nts
internalLoops.3.nts.3.count
internalLoops.3.nts.3.nt
internalLoops.3.nts.3.seq
stems
stems.4.basePairs
stems.4.basePairs.5.DSSR
stems.4.basePairs.5.LW
stems.4.basePairs.5.Saenger
stems.4.basePairs.5.bp
stems.4.basePairs.5.id
stems.4.basePairs.5.info
stems.4.basePairs.5.name
stems.4.basePairs.5.nt1
stems.4.basePairs.5.nt2
stems.4.info



new feature: array.join()
 -- creates a flat array from an array of arrays:
 -- example:
	 $x = [1,2,[3,4,5],[6,[7,8,9]]].join()
	 $show x
        x = [ 1,2,3,4,5,6,7,8,9 ]
                
new feature: DSSR output reading 
 -- Defining the (Secondary) Structures of RNA
 -- see http://forum.x3dna.org/rna-structures/dssr-software-for-defining-the-%28secondary%29-structures-of-rna/
 -- brain-child of Xiang-Jun Lu (3dna.lu@gmail.com; Columbia University)
 -- use system command x3d-dssr.exe --input=xxxx.pdb > xxxx.out 
 -- then in Jmol:
       load files "xxxx.pdb" + "xxxx.out"
 -- all DSSR information will be in auxiliaryInfo.models.dssr with the following keys:
  
		aMinorMotifs
		basePairs
		bulges
		coaxialStacks
		hairpinLoops
		helices
		internalLoops
		junctions
		kinkTurns
		kissingLoops
		lonePairs
		multiplets
		riboseZippers
		singleStrandedSegments
		stems
  
 -- all entries are lists. 
 -- most of these list entries have "nt" entries, and those
     are nucleotide residue identifiers, so Jmol's 
     getProperty() "drill-down" capabilities allow for:
     
       x = getProperty("auxiliaryInfo.models.1.dssr.basepairs.nt")
  	   select @{x}
    
bug fix: x=3;select atomno=x can fail (E. Martz)
bug fix: JSmol deferred (image-covered) applet can produce unwanted multiple canvases (J. Gutow)
 
bug fix: print "x" = "X" returns false; should be TRUE (broken in 14.0/1.10)
bug fix: script error in JavaScript xxx.spt stops all subsequent script processing (P. Bays)
bug fix: color property_x fails (broken in jmol-14.1.14_2014.04.16) (P. Bays)
bug fix: halos ON fails for small vdw radii (A. Herraez)
bug fix: CIF reader with bsModels fails
 -- example:
     load maleic.cif [3 5 7]
bug fix: reading concatenated files from PNGJ with model selected
bug fix: reading gzip files from PNGJ fails when concatenated
bug fix: group1 codes for nonstandard residues not read from mmCIF (_struct_ref_seq_dif.db_mon_id) or PDB (SEQADV) 
bug fix: select group="ALA" fails due to select group ..... option
bug fix: getProperty("auxiliaryInfo") fails for JavaScript
bug fix: Gaussian FCHK file reader fails when no SP coefficients
bug fix: set defaultVDW not working (A. Herraez)
bug fix: color isosurface range broken (Lucy Cusinato)
bug fix: script compiler error: x.x*x.x requiring space: x.x * x.x (Alexander Rose)
bug fix: lost H atoms of PDB-designated water (E. Martz)
bug fix: mouse rotation can cause loss of model (E. Martz)
bug fix: Jana2006 reader not reading groups correctly
bug fix: functions called in script defined by script called by this script
         must be lower case. (A. Rose)
bug fix: clickable atoms may not be considered visible for hover
bug fix: select color=red  should be   color="red"  to allow
         for variable after "color="

code: upgrade of Apache Commons CLI (Command Line Interface) to 1.2 from 1.0

code: T4 generalized as extending T3, allowing 4D mesh reading.
code: implementation of Andrew Hanson's 3D Ball Roll mouse algorithm
     -- no significant practical improvement, but nicer mathematics
     -- a bit more involved, but this is once per mouse move. Doesn't matter.
	      
JmolVersion="14.1.13"

new feature: load files "xxx" + "yyy"
 -- concatenates yyy onto xxx as a single string of file data

new feature: Gaussian fchk file reader

new feature:  var x,y,z;
 -- commas optional
 -- similar to JavaScript
 -- initializes the variable to ""
  

JmolVersion="14.1.13_2014.04.03c"

bug fix: LOAD command cannot force XML types
 -- load xmlvasp::vasprun.xml
 -- load vasp::vasprun.xml  
    -- option without "xml" required only for Odyssey, as there are both Odyssey and XmlOdyssey 
bug fix: application file open fails when preview is unchecked in Edit|Properties

bug fix: vectors using vibration scale, not vector scale
bug fix: vector 0.01 misread as if integer "20" (pixel width) 
bug fix: Gaussian fchk+freq needs to propagate bonding as well to modes
bug fix: JDX reading of older Chime-related ##PEAKASSIGNMENTS records

bug fix: polyhedra display improperly when some vertex atoms are hidden (Nick Greeves)

code: Huge refactoring for JavaScript and judicious post-Google Closure Compiler 
      editing serves to reduce code size by 5% -- to 1.38 MB for core.z.js
      partially due to additional directory changes in JavaScript and
      partially due to removing unnecessary final static variable defs. 
      (These are just constants that are never referred to.)
      
JmolVersion="14.1.13_2014.04.02"

code: JavaScript additional global reduction
new feature: load files "xxx" + "yyy"
 -- concatenates yyy onto xxx as a single string of file data

JmolVersion="14.1.13_2014.04.01d"

bug fix: JmolAppletSigned0.jar missing export classes (POV-Ray, VRML, for example)
bug fix: Mac Spartan spardir reading
 -- for web, use zipped up version of spardir
 
new feature: Gaussian fchk file reader

bug fix: A=[]; A[3] = 5  not working

new feature:  var x,y,z;
 -- commas optional
 -- similar to JavaScript
 -- initializes the variable to ""
  

bug fix: var x not isolated to script context  
bug fix: ellipsoid command broken

JmolVersion="14.1.12"
JmolVersion="14.1.12_2014.03.30"

changes since 14.1.11:

new feature: JSpecView getSolutionColor fill/all/none/false
 -- any combination of these four flags
 -- fill: fill area under a VIS spectrum with color
 -- none: remove fill
 -- all:  do this for all spectra, not just the selected spectrum
 -- false: use interpolation method rather than curve fitting
     (see jspecview.common.Visible.java for details)

new feature: JSpecView PEAK command -- adds PEAK GC/MS "#1" 
 -- #1 here indicates "MS for first GC peak"
  
summary: We now have general ZIP and image file (including PDF) creation in 
         JavaScript independent of Jmol itself.

new feature; byteArray type
 -- from format("byteArray", x) where
        x is an integer array, or
        x is a string starting with ";base64,"
        x is any other variable (converted to byte list of string equiv.        
 -- from binary associative arrays
   
new feature: binary associative arrays
 -- Any array containing "$_BINARY_$" as a key.
 -- Values may contain raw byte array data, but need not.
 -- Can be expanded or changed, just like any associative array.
 -- Seen in string form when in a string context.
 -- .type of elements will report "byteArray"
  
new feature: x = write("PNGJ")
 -- Creates a binary associative array equivalent to writing a PNGJ file
 -- Contains keys "_IMAGE_", "JmolManifest.txt", "state.spt"
     and all associated files.
    
new feature: write VAR x "filename"
        or   write @x "filename"
 -- Where x is a byteArray or a (possibly binary) associative array.
 -- When x is a byteArray, writes binary data to a file.
 -- When x is an associative array, creates a ZIP file 
     (or PNGJ file, if _IMAGE_ is present and is PNG format),
     automatically converting strings starting with ";base64," to 
     byte arrays in the ZIP file. To do the same with x a binary
     array, just use @{array(x)} instead of @x.
     
new feature: x = load("myfile",true)
 -- Creates a binary associative array variable x that contains the contents of
     the file.
 -- data are stored as byte arrays.
 -- If the file is a standard file, the key "_DATA_" will hold the file data.
 -- If the file is a PNGJ file, the key "_IMAGE_" will hold the image data,
     and additional files are keyed by file name. 
 -- If the file is a zip file, the files are keyed by file name.
 -- Note that x = load("myfile") without "true" loads the contents of 
  	 the file into x and, if the file is a PNGJ or ZIP file, just loads 
  	 the list of files in the collection, not the actual data.

new feature: filter "ATOM" opposite of filter "HETATM"

new feature: load ASYNC ....
new feature: script ASYNC ....
 -- load and script ASYNC start a new asynchronous thread to load the file
     and then continue after that.
 -- JSmol/HTML5 only; others ignore
 
new feature: Mol3D reader
 -- using load "MOL3D::xxx.mol" one can force only 3D mol files to be read
 -- 2D mol files will throw an error.

new feature: show CHEMICAL STDINCHIKEY
new feature: show CHEMICAL STDINCHI

new feature: load ":inchikey:xxxxx"
   -- requires STANDARD InChIKey (as from {*}.find("chemical", "stdinchikey")

new feature: x = {*}.find("chemical",type)
	-- type is "smiles", "inchi", "stdinchi", "inchikey", "stdinchikey"
	-- uses NCI/CADD CIR
	-- Note that unlike SHOW CHEMICAL, "InChIKey=" and "InChI=" are dropped
	-- Note that unlike SHOW CHEMICAL, trailing new line char is removed

new feature: x = smilesString.find("chemical",type)
	-- type is "smiles", "inchi", "stdinchi", "inchikey", "stdinchikey"
	-- allows going directly from SMILES to other quantities
	-- uses NCI/CADD CIR
	-- Note that unlike SHOW CHEMICAL, "InChIKey=" and "InChI=" are dropped
	-- Note that unlike SHOW CHEMICAL, trailing new line char is removed

bug fix: NWChem reader broken
bug fix: JSpecView GC/MS issues
bug fix: JSmol callbacks should refer to "jmolApplet0" not "jmolApplet0_object"
bug fix: set cameraDepth not working
 -- note that loading of PyMOL files affects this setting, which
     is reset only using the INITIALIZE command
bug fix: getProperty() function does not recognize a list as a variable and returns it as a string
bug fix: Dsn6Reader.java misnamed, causing EDS map file load error
         in JavaScript only. (I did not know that was even possible!)
bug fix: java.io.dataStreamReader.readShort() does not take into
         account JavaScript equivalence of short and int, causing
         "-1" to be read as 65535. 
bug fix: minimum modulationScale set to 1; should be 0.1.
bug fix: translucent echo backgrounds broken
bug fix: filter "HETATM" does not work
bug fix: write XYZ broken by changes to the way arrays 
		 are shown with the PRINT command
bug fix: x = adfjladj(3) crashes Jmol
bug fix: x[0] = "tst" "here" "now" should cause script exception
bug fix: isosurface MOLECULAR delivers wrong surface
bug fix: spacefill ionic not working
bug fix: set cameraDepth disabled
bug fix: some translations not being carried out.
bug fix: msCIF reader not accepting normalized commensurate Fourier vectors
bug fix: JSmol/HTML MSIE local installation AJAX working again (still no binary files)

code: variable compression issues in Jmol and JSV
code: org.jmol.io and org.jmol.io2 consolidated
code: select water hard-coded for speed (2 x faster)
code: careful attention to loading of biomolecules results in 160K core bio load savings
code: JavaScript core load reduced by 2% (30KB) by changing high-frequency global name "viewer" to "vwr"
code: refactoring of image writing code to javajs.img for general use
code: refactoring of zip code into javajs.util for general use
code: refactoring of minimization code saves 10KB
code: isosurface MOLECULAR speed-up by a factor of 10.
 -- better handling of constants during iteration
 -- better identification of unnecessary edges and faces
  

JmolVersion="14.1.12_2014.03.27b"

bug fix: NWChem reader broken

new feature: JSpecView PEAK command -- adds PEAK GC/MS "#1" 
 -- #1 here indicates "MS for first GC peak"
  
bug fix: JSpecView GC/MS issues
bug fix: JSmol callbacks should refer to "jmolApplet0" not "jmolApplet0_object"
bug fix: set cameraDepth not working
 -- note that loading of PyMOL files affects this setting, which
     is reset only using the INITIALIZE command

code: variable compression issues in Jmol and JSV

JmolVersion="14.1.12_2014.03.21"

bug fix: getProperty() function does not recognize a list as a variable and returns it as a string

code: org.jmol.io and org.jmol.io2 consolidated
code: select water hard-coded for speed (2 x faster)
code: careful attention to loading of biomolecules results in 160K core bio load savings
code: JavaScript core load reduced by 2% (30KB) by changing high-frequency global name "viewer" to "vwr"
code: refactoring of image writing code to javajs.img for general use
code: refactoring of zip code into javajs.util for general use
code: refactoring of minimization code saves 10KB

summary: We now have general ZIP and image file (including PDF) creation in 
         JavaScript independent of Jmol itself.


JmolVersion="14.1.12_2014.03.19"

new feature: x= format("JSON", data)
 -- simple way to generate JSON code.

new feature: x = format("base64", data)
 -- creates base64-encoding of the data
 -- prepends the string with ";base64,"
  	 
new feature; binary byte array
 -- from array(s) where s starts with ";base64,"
 -- from binary associative arrays
   
new feature: binary associative arrays
 -- Any array containing "$_BINARY_$" as a key.
 -- Values may contain raw byte array data, but need not.
 -- Can be expanded or changed, just like any associative array.
 -- Seen in string form when in a string context.
 -- .type of elements will report "byteArray"
  
new feature: x = write("PNGJ")
 -- Creates a binary associative array equivalent to writing a PNGJ file
 -- Contains keys "_IMAGE_", "JmolManifest.txt", "state.spt"
     and all associated files.
    
new feature: write VAR x "filename"
        or   write @x "filename"
 -- Where x is a byteArray or a (possibly binary) associative array.
 -- When x is a byteArray, writes binary data to a file.
 -- When x is an associative array, creates a ZIP file 
     (or PNGJ file, if _IMAGE_ is present and is PNG format),
     automatically converting strings starting with ";base64," to 
     byte arrays in the ZIP file. To do the same with x a binary
     array, just use @{array(x)} instead of @x.
     
new feature: x = load("myfile",true)
 -- Creates a binary associative array variable x that contains the contents of
     the file file.
 -- data are stored as raw bytes.
 -- If the file is a standard file, the key "_DATA_" will hold the file data.
 -- If the file is a PNGJ file, the key "_IMAGE_" will hold the image data,
     and additional files are keyed by file name.
 -- If the file is a zip file, the files are keyed by file name.
 -- Note that x = load("myfile") without "true" loads the contents of 
  	 the file into x and, if the file is a PNGJ or ZIP file, just loads 
  	 the list of files in the collection, not the actual data.

         
  
  
JmolVersion="14.1.12_2014.03.18"

bug fix: Dsn6Reader.java misnamed, causing EDS map file load error
         in JavaScript only. (I did not know that was even possible!)
bug fix: java.io.dataStreamReader.readShort() does not take into
         account JavaScript equivalence of short and int, causing
         "-1" to be read as 65535. 

JmolVersion="14.1.12_2014.03.17"

bug fix: minimum modulationScale set to 1; should be 0.1.

new feature: filter "ATOM" opposite of filter "HETATM"

bug fix: translucent echo backgrounds broken
bug fix: filter "HETATM" does not work
bug fix: write XYZ broken by changes to the way arrays 
		 are shown with the PRINT command
bug fix: x = adfjladj(3) crashes Jmol
bug fix: x[0] = "tst" "here" "now" should cause script exception
  
JmolVersion="14.1.12_2014.03.16"

code: isosurface MOLECULAR speed-up by a factor of 10.
 -- better handling of constants during iteration
 -- better identification of unnecessary edges and faces
  
bug fix: isosurface MOLECULAR delivers wrong surface

JmolVersion="14.1.12_2014.03.13"

bug fix: spacefill ionic not working
bug fix: set cameraDepth disabled

JmolVersion="14.1.12_2014.03.10"

bug fix: some translations not being carried out.

new feature: load ASYNC ....
new feature: script ASYNC ....
 -- load and script ASYNC start a new asynchronous thread to load the file
     and then continue after that.
 -- JSmol/HTML5 only; others ignore
 
bug fix: msCIF reader not accepting normalized commensurate Fourier vectors

bug fix: JSmol/HTML MSIE local installation AJAX working again (still no binary files)

new feature: Mol3D reader

new feature: show CHEMICAL STDINCHIKEY
new feature: show CHEMICAL STDINCHI

new feature: load ":inchikey:xxxxx"
   -- requires STANDARD InChIKey (as from {*}.find("chemical", "stdinchikey")

new feature: x = {*}.find("chemical",type)
	-- type is "smiles", "inchi", "stdinchi", "inchikey", "stdinchikey"
	-- uses NCI/CADD CIR
	-- Note that unlike SHOW CHEMICAL, "InChIKey=" and "InChI=" are dropped
	-- Note that unlike SHOW CHEMICAL, trailing new line char is removed

new feature: x = smilesString.find("chemical",type)
	-- type is "smiles", "inchi", "stdinchi", "inchikey", "stdinchikey"
	-- allows going directly from SMILES to other quantities
	-- uses NCI/CADD CIR
	-- Note that unlike SHOW CHEMICAL, "InChIKey=" and "InChI=" are dropped
	-- Note that unlike SHOW CHEMICAL, trailing new line char is removed

JmolVersion="14.1.11"
JmolVersion="14.1.11_2014.03.08"

FEATURE CHANGE: associative array .count, .length, .lines removed
 -- specifically for associative arrays, nothing more
 -- these were unnecessary equivalents of .size
 -- change will not be incorporated into Jmol 14.0
  
new feature: JSpecView readers for ACD/Labs annotated MS, IR, Raman, and UV/VIS
 -- displays fragments for MS (highlights atoms)
 -- highlights atoms involved in an IR/Raman stretch 
 -- UV/VIS and Raman untested

new feature: JSpecView and Jmol read ACD/Labs assigned spectra block JDX files.
 -- 2D MOL files with missing hydrogens on hetero atoms.
 -- fully synced
 -- drag-drop enabled
  
new feature: associative array standard "dot" notation
 -- a.test = 33
 -- print a.test
 -- caveat: cannot do this with a.keys, a.size, or a.type
 -- not implemented in Jmol 14.0 because of the feature change
  
new feature: associative array alternative ".." syntax
 -- same as JavaScript and Java, but ".." instead of "."
 -- for example:
    a["test"] == a..test

new feature: .covalentRadius added as more appropriate alias for .covalent

new feature: .bondingRadius added as more appropriate alias for .ionic

new feature: set bondingVersion
 --  0: Jmol default, from OpenBabel 1.100.1
  	 -- uses a mix of covalent and ionic radii for autobonding
  	  
 --  1: Pyykko and Atsumi, 2009
	 -- changes the distance criteria for autobonding to be specifically covalent 

 -- saved in state only for file loading; should be unchanged after state loading.
  
new feature: color(color1, color2, n, asHSL)
 -- returns a color scheme as a string
 -- colors can be of any nature -- string or point, name or rgb
 -- n colors; simple interpolation from color1 to color2
 -- asHSL must be TRUE or FALSE; 
    -- when TRUE, uses hue/saturation/luminance instead of rgb gradient
    
 -- example:
  
	$ print color("white", "red", 5, false)
	
	 [xffffff][xffbfbf][xff7f7f][xff3f3f][xff0000]

	$ print color("red", "blue", 5, true)

	 [xff0000][xffff00][x00ff00][x00ffff][x0000ff]
	 
	$ set propertyColorScheme color("yellow","black",50,true)
	$ color property temperature

		
new feature: added simpler associative array notation: [key:value,...]
 -- no quotes required
 -- supplements {"key":value,...} where quotes are still required
     due to conflict with atom set chain descriptors such as {a:b}.
  
new feature: catchable THROW

 -- as in Java or JavaScript, allows a way of jumping
     out of a process. 

 -- outside of try/catch gives the expected error report:
  
   $ print "testing"
   $ throw "testing here"
   $ print "we will never see this"

	testing
	script ERROR: testing here
	----
         throw >> "testing here" <<
     
 -- passes a string as the variable thrown_value

	$ print thrown_value
	
	  testing here
	
 -- can be trapped with try/catch:

    try{
		  print "testing"
		  throw "testing here"
		  print "continuing"
	} catch(e) {
 	  print "thrown_value=" + thrown_value;
	}
	
	results in:
	
	testing
	thrown_value=testing here
     
new feature: asynchronous resumable processes

 -- THROW CONTEXT contextName

 -- throws a catchable error, but in the process of doing so,
     creates a script context that allows RESUMING
     at the point of the throw, unlike anything in JavaScript
     or Java (or perhaps like a debug mode).
      
 -- if within a try/catch phrase, is handled by catch.
     in which case the error message is simply the context name.

 -- if not within a try/catch phrase just reports 
      
       to resume, enter: &contextName
       
 -- essentially provides a callback into the running
     script, so you could, for example, put a running script
     on hold while you load a file, check variables, etc., 
     then continue. 
     
 -- can be resumed using RESUME CONTEXT or just & followed
     by the name of the context:
     
       &test
      
       resume context &test
       
 -- replaces PAUSE/RESUME, now deprecated.
  
 -- The current context returns to the highest level, however
     the variables in the context that was thrown are 
     accessible as though the context variable was an
     associative array. So, for example, if we have
    
     function f(a, b, c) { 
        var x = 5
        throw context testing
        print "x=" + x
     }
     
     f(1,2,3)
     print "done"
     
     The context will be saved as the variable "testing", and
     we can then test all the variables in that saved context, 
     (and change them before continuing):
     
     print testing["x"]
     
       5
     
     testing["x"]++
     
     print testing
     		
		_path	:	[script] >> function f
		_retval	:	0
		
		a	:	2
		b	:	2
		c	:	3
		x	:	6
        
 -- contexts can be restored using
  
     &contextName
     
     In the above case, we would get the report:
     
     x=6
     done
  	   	 
new feature: SAVE CONTEXT contextName
 -- similar to THROW, but does not stop processing.
     So in the above example, if we change THROW to SAVE,
     the processing continues, but after it has completed,
     we can change context variables and run it again.
     
new feature: show SAVED
 -- same as show SAVE
    
new feature: delete $SAVED savedName
    
  	 delete $SAVED Context_xxxx
  	 
 -- $ is important; case is not.
 -- allows selective deletion of saved objects
 -- Contexts always start with "Context_" but the subname
     "xxxx" in this case will work as well.

new feature: RESUME with arguments is synonymous with RESTORE      

new feature: Better idea for THROW:
    throw "this is an error"
    throw x
 -- that is, throw is like PRINT, not LABEL  

bug fix: applet language localization skipping translations containing \"
bug fix: application language localization does not include defs defined for JmolApplet
bug fix: JSpecView/JSME connection with simulated and ACD/Labs annotated spectra
bug fix: JSpecView loading simulation now compatible with synced applets
bug fix: drag/drop not working for JSV applet
bug fix: solid-state NMR calc (Magres) should not apply "nearest-atom-only"
  algorithm for measure ALL in dipolar coupling measurements
bug fix: state contains:  zap;load /*data*/ data "append inline"
bug fix: zoomto without time goes over 2 seconds, not 1 second
bug fix: print "id" + "x"   fails (back to 13.2 at least)
bug fix: animFrameCallback not reporting for each morph
bug fix: inline-if fails if not at end of statement 
 -- Bug goes back to at least 11.8 
bug fix: Jmol math fix for new . notation.
 -- needs testing 
 -- examples:

	-- note that .. notation works with numbers
       and in all expressions
 
 	b = [1 2 3 [ 1 2 [1 2 [1 [testing:"here"] 3]]]]
	print b..4..3..1
	b..2 = 34
	
	b..2..1 = 33
	print b..2..1
	
   -- alternative single dot notation also on both sides
   -- associative arrays only
   -- no numbers here
    
	b = [testing:"here"]
	b.testing= 33
	print b.testing
	
   -- note that sequential brackets for arrays
       work only on the left side of an assignment
        
	b = [ [2] 10 11 ]
	b[1][2]= 33
	#NOT print b[1][2]  (that's a range)

 	b = [1 2 3 [ 1 2 [1 2 [1 [testing:"here"] 3]]]]
	b[4][3][3][2].more = "yes"
	#NOT print b[4][3]  (that's a range)

   -- extends to matrices
    
	b = quaternion()%"matrix"
	b[1] = [1 2 3]
	b[-1] = [1 2 3]
	b[2][3] = 2
	
	-- extends to string
	
	b = "testing"
	b[1] = "T"
	b[1][3] = "T"
	b["t"] = "T"

	-- extends to points
	
	p = {3 3 3}
	p.x = 10
	p.y = 5
	p.z = 3
	
	-- extends to bitsets
	-- single dots only, not a["color"] or a..color
	
	a = {*}
	a.color = "red"
	a.property_x = {*}.temperature.all


bug fix: state reading broken in most recent version at chemapps
bug fix: ++/-- compatibility with no-comma arrays
bug fix: print ++b["test"] fails
bug fix: ++b["test"] fails
bug fix: a[6][8] = "q"  not working correctly when a is a string
bug fix: {*}.covalent is misleading in that it is a mix of covalent and ionic bonding
  distances. As such, I have replaced it with data at the Blue Obelisk Data Repository
  which are from 
  
   Pyykkö, P. and Atsumi, M. (2009), 
   Molecular Single-Bond Covalent Radii for Elements 1\u2013118. 
   Chem. Eur. J., 15: 186\u2013197. doi: 10.1002/chem.200800987
  
bug fix: try { ... throw ...} catch {....}   continues through catch when resumed.
bug fix: anonymous context   { ..... }   not closed 
bug fix: JSON of 4x4 matrix (M4) fails
bug fix: modelKitMode broken for Java in 14.1.10

code: unused obrador package removed from application
code: JavaScript org.jmol.modelset->JM, org.jmol.modelsetbio->JMB
code: org.jmol.util.Quaternion moved to javajs.util.Quat
code: Refactoring of script.ScriptEvaluator to make it more manageable:

   * ScriptEval               -- entry point and script command code
   * 
   *   extends ScriptExpr     -- expression parsing
   * 
   *     extends ScriptParam  -- parameter parsing
   * 
   *       extends ScriptError -- error handling 
   * 
   *   scriptext.CmdExt       -- optionally loaded, less-used commands
   *   scriptext.MathExt      -- optionally loaded, less-used functions
   *   scriptext.SmilesExt    -- optionally loaded methods for cmds and math

code: faster CONNECT [{...}] process for specified bonds
      
JmolVersion="14.1.10"
JmolVersion="14.1.10_2014.02.20"

new feature: THROW command
 -- accepts unquoted string or @x simple variable substitution
 -- examples:
      throw this is an error
   or
      x = "this is an error"
      throw @x 
   resulting in:   	
      	this is an error
	----line 3 command 3 of try:
         throw >> "this is an error" <<
	----line 10 command 1 of t.spt:
         end 
	----
         script "t.spt"
         
      
JmolVersion="14.1.10_2014.02.19"

bug fix: color atoms formalcharge not saved in state
bug fix: averageAtomPosition never updated. 
bug fix: load of model with one atom does not set center to that atom
bug fix: ==/!= comparison not appropriate for arrays or strings
 -- string/string comparison should be case sensitive, but wasn't
    -- (you can use x %9999 == y %9999 to force no-case comparison)
 -- array/array comparison should be element by element and exact
 -- assoc.array/assoc.array should be key/value by key/value and exact
 -- int/decimal comparison should be simply numerical, always
 -- decimal/decimal comparison should be able to be done without the < 1e-6 cutoff
    -- you can now use [x] == [y] for exact numerical comparison 
 -- string/int and string/decimal comparison should also only be outside of arrays
 -- all approximations for type1/type2 should be only outside the context of arrays 
    
bug fix: array/string assignment broken in 14.1.9
 -- a[2] = ...
 -- a["testing"] = ...
  
bug fix; HTML5 popup frank mini-menu not implemented
bug fix: HTML5 popup menu checkboxes not turning off 
bug fix: zap <model Number> or zap {atom expression} broken
  -- does not affect ZAP command without parameters
   
JmolVersion="14.1.9"
JmolVersion="14.1.9_2014.02.18"

bug fix: recently released 14.0.8 introduced a math bug that caused
  y = "test" + x.f() to be evaluated as ("test" + x).f()
bug fix: long-time multiple unary minus bug (at least 6 years!) 
  that print 3 +(- -3) evaluates to 0, not 6.
   
new feature: WRITE "filename" AS type
 -- allows setting type at end of WRITE command using AS
 -- for example:
  
     write "t.png" as PNGJ
     
 -- meant only for very simple production; no additional parameters.
 -- all parameterized cases must use standard notation
      write PNGJ 300 300 "t.png"
       
  
JmolVersion="14.1.8_2014.02.17"

bug fix: JSpecView issues with navigating through spectra
bug fix: PyMOL reader multiple bond view
bug fix: popup menu fixes
bug fix: bond/draw/isosurface picking broken
bug fix: [1 -5 6 -2] gives [1 (-5+6-2)] instead of [1 -5 6 -2]

bug fix: set defaultLoadScript "{0 0 0}" actually sets that to {1 1 1}
 -- goes way way back to early Jmol math where there were no point-type variables
bug fix: PyMOL reader update for Version 1700 lacking setting 83. 
bug fix: -m option not working with Jmol.jar

bug fix: PNGJ files within ZIP collections not being read. 
 -- full PNGJ models can be extracted from MS Word .docx files. 
 -- for example:
     show file "t.docx"
		[Content_Types].xml
		_rels/.rels
		word/_rels/document.xml.rels
		word/document.xml
		word/media/image1.png
		word/theme/theme1.xml
		word/settings.xml
		word/webSettings.xml
		docProps/core.xml
		word/styles.xml
		word/fontTable.xml
		docProps/app.xml
    load t.docx|word/media/image1.png
     
new feature: JSmol Info.z, Info.zIndexBase
bug fix: tensor("efg", "value") should return sparce array, not dense for missing tensors
bug fix: JSmol now allows writing POVRAY, MAYA, IDTF, VRML, etc. 
         both from Java and from HTML5
code: reworking of export classes 
bug fix: label @{math expression...} not working
bug fix: interpretation of x and @x in select commands and {...} phrases
 -- Variable substitution has been unintuitive and inconsistent.
     For instance:
     
     x = "C or T"
     
     select @x  -- works fine
     print {@x} -- fails
  
     The problem is the use of @ to reference the variable NAMED BY another 
     variable within a math expression (print context) but not a select context.
     For instance:
     
     y = 3
     x = "y"
     print x  --> "y"
     print @x --> 3
     
     Such referencing is important for math expressions, but the
     extension of this to atom expressions is not necessary and 
     not generally useful. 
 -- The current situation is as follows:
     
     x = "A or T"
     select @x   --> all A and T groups
     print {@x}  --> nothing (because @x is "the contents of the variable 'A or T'")
     
 -- This fix simplifies the situation by not allowing variable-variable
     referencing within atom expressions bounded by braces, just like 
     within implicit atom expression commands (select, display, hide, delete, etc.).
 -- The result is much more consistent. The following do exactly what
     you think they would do:
     
     x = "A or T"
     select @x
     print {@x}
     
 -- The current way of doing this, by defining a temporary atom
     expression using the DEFINE (or @) command still works:
     
     x = "A or T"
     @y @x
     select y       same as    select @x
      
 -- Note that the difference between "select x" and "select @x" 
     may be significant:
     
     ala = "cys"
     
     select ala  --> selects all alanines
     select @ala --> selects all cysteines
          
   
     
code: way more efficient for loop -- loop overhead decreased by > 80% 
bug fix: for(i in ...) does not exit when i is assigned a value, as per documentation
bug fix: for(x in ...) command broken and also quite inefficient.
 

JmolVersion="14.1.8_dev_2014.02.06"

new feature: set cartoonRibose
 -- draws in ribose rings, with facets showing puckering
 -- connects via C4'-C5'-O5'-P explicitly
 -- shows C3'-O3' for reference.
 -- disables cartoonBaseEdges (Leontis-Westhof Edges)
 -- disabled by SET cartoonBaseEdges ON
 -- suggested by Rick Spinney, Ohio State
  
new feature: anim frame [a,b,c,d] works with negative numbers to indicate ranges:
  -- anim frame [1, -5, 10, -6] --> [1,2,3,4,5,10,9,8,7,6]
  -- read as "1 through 5 and then 10 through 6"
   
new feature: Tinker file reader (and FoldingXYZ reader upgrade)
  -- see http://dasher.wustl.edu/tinker/
  -- Can use Tinker:: but this is only required if first line is JUST an atomCount
  -- accommodates older Tinker format with n-1 atoms for atomCount
  -- allows for trajectories and desired model number
   
new feature: (actually 13.1 but undocumented) animation frame [ 51 50 49 48 47 46 45 (etc) 27 1 2 3 4 5 6 7 (etc)....]

new feature: x = compare({atomset1}, {atomset2}, "MAP")
new feature: x = compare({atomset1}, {atomset2}, "MAP", "all")
new feature: x = compare({atomset1}, {atomset2}, "MAP", "best")
new feature: x = compare({atomset1}, {atomset2}, "MAP", "H")
new feature: x = compare({atomset1}, {atomset2}, "MAP", "allH")
new feature: x = compare({atomset1}, {atomset2}, "MAP", "bestH")
 -- generates one or more correlation lists based on non-aromatic SMILES
 -- optionally includes H atoms
 -- optionally generates all possible atom mappings
 -- returns int[][] = [ [a1 b1],[a2 b2],[a3 b3],... ] 
    where an and bn are integer atom indices 
    or list<int[][]> when "all" option is chosen.  
 -- the following will generate one atom correlation 
     map for two structures including hydrogen atoms:  
		load files "a.mol" "b.mol"
		x = compare({1.1} {2.1} "MAP" "H")
    (useful for 2D/3D model atom matching)
 -- the following compares the model of caffeine from NCI to that from PubChem:
		load $caffeine;load append :caffeine;frame *
		select 2.1; label %[atomIndex]
		compare {1.1} {2.1} SMILES rotate translate
		x = compare({1.1}, {2.1}, "MAP" "bestH")
		for (a in x) {a1 = a[1];a2=a[2];select atomindex=a1;label @a2}
		
new feature: compare {model1} {model2} SMILES
 -- no need to give SMILES; Jmol can generate it from {model1}
       
new feature: x = {*}.find("SMILES", "H")
 -- generates SMILES with explicit H atoms

bug fix: substructure() function using SMILES instead of SMARTS, so only full structures;
bug fix: better error trapping and messages in SMILES-related methods
bug fix: make webexport discovery of path to Jmol.jar and jsmol.zip more robust.
bug fix: getProperty extractModel not honoring subset
bug fix: set pdbGetHeader TRUE does not capture REMARK3 REMARK290 REMARK350 
bug fix: getProperty("JSON",....) should wrap value in {value:...}
bug fix: MO persistent translucency broken in 11.x
bug fix: show MENU  write MENU  load MENU all broken in 12.2
bug fix: {*}[n] should be empty if nAtoms <=n
bug fix: abinit reader was nonfunctional
bug fix: assign atom into into PDB file loses atom names
bug fix: y = ([3])[1][1]  should be [3] not 3
bug fix: break n nonfunctional
bug fix: format() and label() functions limited to 4 arguments; should be unlimited 
bug fix: errors in paths to js code in web export templates.

code: JSmol: applying atom mapping between mol2D and mol3D for viewSets
code: refactoring to enable SWING in JavaScript for all menus
code: methods from jcampdxReader extracted to org.jmol.jsv.JDXMOLParser 
code: reader overhaul for setting atom coordinates in a consistent fashion


JmolVersion="14.1.7"

JmolVersion="14.1.7_dev_2014.01.20"

  bug fix: 14.0.6 fatally bugged -- unitcell and echo rendering, getProperty

JmolVersion="14.1.6"

bug fix: translucent geosurface was turned off;

JmolVersion="14.1.6_dev_2014.01.19"

bug fix: Jmol2.js should have commented lines in Jmol.Info but does not
bug fix: JSpecView cannot close "Options...Show Header" panel in HTML5
bug fix: select visible not right after this sequence:

  load $C\C=C\CC
  select _C
  wireframe off
  spacefill off
  display !_H
  select visible // 5  (but nothing is showing)

bug fix: for (a in {displayed}) { a.property_x = 3 } construction fails
bug fix: FireFox browser in mode to open files in new tabs in the background
         fails to load second applet of a page unless Jmol.__execDelay is more than 55 ms
         and the user specifically right-clicks a link to open a page in a new tab. 
bug fix: write ....?POST? fails
bug fix: getproperty broken in 14.1.6_dev_2014.01.15
bug fix: GETPROPERTY command and function can return SV.toString() rather than property escaped value
bug fix: getProperty for certain arrays returns string "[object Array]"
bug fix: Jmol2.js not working when there is no jmolInitialize()
bug fix: _DirectDatabaseCalls not including NMR prediction site
bug fix: reading of *co*mmensurately modulated structures (e.g. Lilianite) working
bug fix: wrong name for coverimage in WebExport.

code: refactored matrix classes javajs.util.M34/M3/M4
code: JSpecView upgrade includes
 -- operational applet from jnlp
 -- append options from menus
 -- file helper for local files using load ? 
 -- file helper for URL using load http://? 
 -- file helper for simulation using load $?
 code: reader refactoring isolates symmetry aspects

update: images and instructions for WebExport

JmolVersion="14.1.5"
JmolVersion="14.1.5_dev_2014.01.09"

bug fix: LCAOCartoon translucency broken
bug fix: translucent backbone broken
bug fix: pqr,p2n readers broken         
bug fix: isosurface map property xxx can fail if surface is a
         fragment that (somehow) has a point not associated with 
         an underlying atom.



JmolVersion="14.1.4"
JmolVersion="14.1.4_dev_2014.01.05"

bug fix: PDB byChain, bySymop not supported.

//TODO: Add BSPF for symmetry distance checking in AtomSetCollection to speed special-position checking
 
new feature: {xxx}.distance.all({yyy})  returns float[][] of values

new feature: expanded unit cell ijk notation:
   -   111 - 1000 --> center 5,5,5; range 0 to 9 or -5 to +4
   -   1000000 - 1999999 --> center 50,50,50; range 0 to 99 or -50 to +49
   -   1000000000 - 1999999999 --> center 500, 500, 500; range 0 to 999 or -500 to +499

JmolVersion="14.1.3"
JmolVersion="14.1.3_dev_2013.12.29"

new feature: filter "MODCELL=x"
 -- incommensurate composite readers Jana2006 and CIF 
 -- sets base cell to specified subsystem
  
new feature: MSCIF reader now allowing up to d=10; was d=6

new feature: escape pressed cancels pending measurement

new feature: {xxx}.getProperty("yyy")
 -- only for FIRST atom
 -- returns getProperty("atomInfo.yyy", {xxx})[1] (not xxx.yyy.all)
  
new feature: unitcell {atomset}
 -- unit cell based on first atom of atom set.
 -- canceled by any unitcell {none} 
     or other unitcell command other than on/off and width

new feature: altloc set for msCIF _atom_site_subsystem_code
 -- sets % and also configuration
 -- prevents covalent bonding between subsystems
    
new feature: select ON ; select OFF
 -- same as selectionHalos ON/OFF
 -- deprecates selectionHalos command
  
new feature: atomSet1.distance.min(atomSet2, TRUE)	
new feature: atomSet1.distance.min(point, TRUE)
new feature: atomSet1.distance.max(atomSet2, TRUE)
new feature: atomSet1.distance.max(point, TRUE)
 -- returns single closest/furthest atom in atomSet1 from point or atomSet2
   
bug fix: incommensurate composite structures not packed into unit cell properly
bug fix: incommensurate composite structures - wrong unit cell for d > 1
bug fix: if load "" fails, last file name is lost
bug fix: print a (operator) b not processing string parameter B consistently across operators
bug fix: composite structures reading for JANA2006 M50/M40 files
bug fix: capture time slightly off; needs 50 ms addition. This may vary with rendering speeds.
bug fix: CIF reader goes into molecular mode even if geom_bond block is all "? ? ? ? ?"   
bug fix: n-d incommensurate modulated composite structures (preliminary testing)
bug fix: getProperty  atomInfo broken for modulated atoms
bug fix: x.distance.min(y) broken
 
code: generic javajs.util.Matrix class added based on Jama code for inversion using L/U decomposition

JmolVersion="14.1.2"
JmolVersion="14.1.2_2013.12.13"

new feature: JavaScript: JSmol api Jmol.evaluateVar(applet, expression)
 -- better than Jmol.evaluate because result is a JavaScript variable, not a string.
 -- DEPRECATING JSmol api Jmol.evaluate(applet, expression)

new feature: getProperty("JSON", ....)
 -- returns JSON code for property
 -- allows JavaScript: x = Jmol.getPropertyAsArray("variableInfo","some expression")
  
new feature: getProperty variableInfo  <expression>
 -- allows retrieval of variables in Java or JSON format
 -- evaluates expression
 -- defaults to "all"
    
new feature: modulation adjustable by q and t, up to d=3
    // modulation on/off  (all atoms)
    // moduation {atom set} on/off
    // modulation int  q-offset
    // modulation x.x  t-offset
    // modulation {t1 t2 t3} 
    // modulation {q1 q2 q3} TRUE 

new feature: pickedList -- ordered array of recently picked atoms
 -- can be used the same as the PICKED variable, 
     but that is ordered sequentially, not temporally
 -- twice clicking off structure clears the list
 -- @{pickedList}[0] last-picked atom
 -- @{pickedList}[-1] next-to-last-picked atom
 -- @{pickedList}[-1][0] last two picked atoms
  
new feature: array.pop(), array.push()
 -- similar to JavaScript
 -- for example:
     a=[];a.push("testing");print a.pop()

    // create a distance t-plot
      
    at = [] // t points
    am = [] // distance measurements
    
    var p1 = a.modulation(1e10)[1]
    var p2 = a2.modulation(1e10)[1]
    for (var i = 0; i <= 50; i++) {
      var t = i / 50.0;
      at.push(t);
      var b1 = a.modulation(t)[1];
      var b2 = b.modulation(t)[1];
      var m = distance((p1 + b1).xyz, (p2 + b2).xyz);
      am.push(m);
    }
    d = at.add("\t", am)
  
new feature: modulation scale x.x
new feature: caption "xxxxx" x.x -- number of seconds to run
new feature: modulation 0.2  // sets t-value
 
new feature: select ON/OFF atom-set
 -- turns selection halos on or off as well as doing the selection
 -- convenience only
 -- for example:
  
  select on _O2
  select off *
  
new feature: pt1.mul3(pt2)  
 -- returns {pt1.x*pt2.x, pt1.y*pt2.y, pt1.z*pt2.z}
 -- if both are not points, reverts to simple multiplication
  
new freature: array.mul3(pt2) 
 -- applies mul3 to all elements of array

new feature: {atomset}.modulation(type, t) 
 -- delivers P3 (displacement modulation)
 -- implemented only for type="D" (optional)
 -- optional t is 0 by default
 -- if t is missing, the unmodulated displacement is returned

bug fix: modulation not distinguishing between q and t;
bug fix: modulated measurements not working

bug fix: not skipping set defaultLattice "{NaN NaN NaN}"
bug fix: isosurface map atomic orbital fails

bug fix: vibrational display of modulation with distances doesn't update
bug fix: vibration off causes unnecessary warning in console
bug fix: draw symop broken

bug fix: array.mul(matrix3f) crashes Jmol

bug fix: select symop=1555 broken
bug fix: set picking dragSelected  not working

code: refactored CifReader, separating out MMCifReader and MSCifReader

code: minor renaming/refactoring of methods in SV
  
code: adds javajs.api.JSONEncodable interface
 -- super-simple implementation in org.jmol.script.SV
 -- allows implementations of javajs to deliver custom JSON results

JmolVersion="14.1.1_2013.12.04"
JmolVersion="13.3.9_dev_2013.12.04"

  
new feature: Jmol._j2sLoadMonitorOpacity  (default 55)

new feature: load() function, as in print load("xxx"), limited local file reading in applet:
 -- no root-directory files
 -- no files without extension
 -- no files with any "/." in path
  
new feature: JAR files securely signed

new feature: applet JAR files include JNLPs (Java Network Launch Protocols) for local file loading 

new feature: JSmol URL options _USE=  _JAR=  _J2S=  overrides for Info data

new feature: (was present but undocumented) print quaternion([array of quaternions])
 -- returns spherical mean a la Buss and Fillmore (http://www.math.ucsd.edu/~sbuss/ResearchWeb/spheremean/)
  
new feature: print quaternion([array of quaternions], true)
 -- returns standard deviation for spherical mean a la Buss and Fillmore (http://www.math.ucsd.edu/~sbuss/ResearchWeb/spheremean/)
 -- units are angular degrees
  
new feature: named quaternion modulus values
 -- print quaternion(1,0,0,0)%"matrix"
 -- options include w x y z normal eulerzxz eulerzyz vector theta axisx axisy axisz axisangle matrix
  
new feature: set celShadingPower
 -- sets strength of cel shading
 -- integer values 
 -- default 10 is a thick line
 -- 5 is a fine line 
 -- 0 turns cel shading off
 -- negative value removes interior shading -- outline only
 -- operates on pixel based on normal to light source (power > 0) or user (power < 0) 
 -- sets color to background contrast (black or white) when
         normal_z < 1 - 2^-(|celShadingPower|/10)
  
new feature: mmCIF reading reports _citation.title in Jmol scripting console

new feature: minimize SELECT {atomset} ONLY
 -- ONLY option excludes all other atoms
  
new feature: minimize {atomset}
 -- implicit SELECT and ONLY
  
new feature: "extensions" directories in JSmol for contributed JS and SPT scripts
 -- jsmol/js/ext
 -- jsmol/spt/ext
 
new feature: load ... filter "ADDHYDROGENS"
 -- local set pdbAddHydrogens just for one load command
 
new feature: compare {1.1} {2.1} BONDS SMILES

new feature: list = compare({atomset1} {atomset2} "SMILES" "BONDS")
new feature: list = compare({atomset1} {atomset2} SmartsString "BONDS")

new feature: write JSON  xxx.json

new feature: [#210] JSON {"mol":...} reader
 -- example (penicillin; no actual line breaks)
     {"mol":{
      "_is2D":false,
      "_scale":{"x":1,"y":1,"z":1},   
      "a":[{"x":3.9236999,"y":-0.9222,"z":0.1835},{"x":3.2479,"y":-3.2106004,"z":0.3821},{"x":5.1731,"y":-1.3284999,"z":-0.24640003},{"x":4.4973,"y":-3.6169,"z":-0.0478},{"x":5.4598002,"y":-2.6759,"z":-0.3623},{"x":1.599,"y":-1.4203,"z":0.9663},{"x":-4.2137,"y":0.8188001,"z":2.5929},{"x":-5.7525997,"y":0.1604,"z":0.70350003},{"l":"H","x":-0.92130005,"y":-0.6858,"z":0.8503},{"x":2.961,"y":-1.8632,"z":0.49760002},{"l":"O","x":-4.989,"y":2.5026002,"z":-1.2333001},{"l":"O","x":-1.2756001,"y":1.6640999,"z":-1.9360001},{"l":"O","x":1.104,"y":-1.4738001,"z":-1.3405999},{"l":"O","x":-4.604,"y":3.4702,"z":0.7158},{"x":-4.4305005,"y":2.47,"z":-0.1623},{"x":0.68810004,"y":-1.2541,"z":-0.2227},{"x":-3.5391,"y":1.3063,"z":0.1875},{"x":-1.4742,"y":-0.7,"z":-1.1997},{"x":-1.8847001,"y":0.7218999,"z":-1.4753001},{"l":"H","x":-5.185,"y":4.1949,"z":0.44660002},{"l":"N","x":-0.5887,"y":-0.86149997,"z":-0.043799996},{"x":-2.9578,"y":-0.84800005,"z":-0.8823999},{"x":-4.298,"y":0.3443,"z":1.1408},{"l":"S","x":-3.3189998,"y":-1.1949,"z":0.8809},{"l":"N","x":-3.159,"y":0.59889996,"z":-1.0386},{"l":"H","x":-2.6423,"y":1.6747,"z":0.6855},{"l":"H","x":-3.5207,"y":-1.4693998,"z":-1.5789001},{"l":"H","x":-4.6569,"y":1.8111,"z":2.6771998},{"l":"H","x":-4.7551003,"y":0.123500004,"z":3.2344003},{"l":"H","x":-3.1692,"y":0.86,"z":2.9017},{"l":"H","x":-5.7794,"y":-0.2569,"z":-0.3031},{"l":"H","x":-6.2558002,"y":-0.5187,"z":1.3918},{"l":"H","x":-6.2588997,"y":1.1256,"z":0.71029997},{"l":"H","x":-1.1443,"y":-1.2523,"z":-2.0796},{"l":"H","x":1.1846,"y":-2.1707997,"z":1.6393999},{"l":"H","x":1.6871,"y":-0.46960002,"z":1.4921},{"l":"H","x":3.7012,"y":0.1303,"z":0.2784},{"l":"H","x":2.4957001,"y":-3.9457002,"z":0.62750006},{"l":"H","x":5.9251003,"y":-0.5933,"z":-0.4921},{"l":"H","x":4.7215,"y":-4.6695,"z":-0.13759999},{"l":"H","x":6.4357004,"y":-2.9933,"z":-0.6989}],
      "b":[{"b":10,"e":14,"o":2},{"b":13,"e":14},{"b":14,"e":16},{"b":16,"e":24},{"b":16,"e":22},{"b":21,"e":24},{"b":18,"e":24},{"b":6,"e":22},{"b":7,"e":22},{"b":22,"e":23},{"b":21,"e":23},{"b":17,"e":21},{"b":17,"e":18},{"b":11,"e":18,"o":2},{"b":17,"e":20},{"b":15,"e":20},{"b":5,"e":15},{"b":12,"e":15,"o":2},{"b":5,"e":9},{"b":0,"e":9,"o":2},{"b":1,"e":9},{"b":0,"e":2},{"b":1,"e":3,"o":2},{"b":2,"e":4,"o":2},{"b":3,"e":4},{"b":13,"e":19},{"b":16,"e":25},{"b":21,"e":26},{"b":6,"e":27},{"b":6,"e":28},{"b":6,"e":29},{"b":7,"e":30},{"b":7,"e":31},{"b":7,"e":32},{"b":17,"e":33},{"b":8,"e":20},{"b":5,"e":34},{"b":5,"e":35},{"b":0,"e":36},{"b":1,"e":37},{"b":2,"e":38},{"b":3,"e":39},{"b":4,"e":40}]
    }}
 -- is2D will trigger minimization
 -- scale indicates overall scaling present in the "a" records

new feature: set particleRadius
  -- global radius for atoms over the max radius value (16.0)
  -- defaults to 20.0
    
new feature: CIF and PDB filters "BYCHAIN" and "BYSYMOP" for virus particulation
 -- creates just one atom per chain or per symop
 -- size can be scaled larger than the max of 16 Angstroms using, for example:
  	   set particleRadius 30;
       spacefill 30; // any number over 16 here uses particleRadius instead 

new feature: symop() function allows symmetry from biomolecule filter for PDB and mmCIF

new feature: isosurface SYMMETRY
 -- applies symmetry operators to isosurface
 -- more efficient rendering and creation
 -- default selection is {symop=1} only
 -- default coloring is to color by symop based on propertyColorScheme
 -- example:
	load 1stp filter "biomolecule 1"
	color property symop
	isosurface sa resolution 0.8 symmetry sasurface 0
	 
new feature: new atom property: chainNo
 -- sequentially from 1 for each model;
 -- chainNo == 0  means "no chain" or chain = '<space>'
  
new feature: new propertyColorScheme "friendly"
 -- color-blindness-friendly color scheme
 -- used at RCSD
 -- example:
  
      set propertyColorScheme "friendly" 
      color {chainNo > 0} property chainNo

new feature: JSpecView completely Java-free; includes 2D nmr and PDF printing of spectra

new feature: WRITE PDF <width> <height> <quality> "xxx.pdf" quality > 1 requests landscape mode
 -- uses efficient custom PDF creation classes
 -- sizes image to fit if too large

new feature: JSpecView adds PDF and 2D NMR for JavaScript
 
new feature: load "==xxx" FILTER "NOIDEAL"
 -- chemical component load from PDB using the "nonideal" coordinate set

bug fix: write CD removed; ChemDoodle has changed formats; use JSON instead
bug fix: PDB and CIF files indicated assemblies such as PAU as large negative number   
bug fix: COMPARE with no rotation starts infinite loop
bug fix: looping problem with delay(-1)
bug fix: Mouse wheeling for Chrome in JavaScript
bug fix: JavaScript popup menu fix for language changes
bug fix: JavaScript core components not being processed; Jmol._debugCode not recognized
bug fix: unitcell offset incorrectly for biomolecules; origin incorrect for axes.
bug fix: isosurface/mo FRONTONLY broken
bug fix: language localization broken in JavaScript 
bug fix: ADF reader not reading MO output from DIRAC Build 201304052106 
bug fix: Safari reports yellow Jmol info instead of asking to accept applet
 -- <object> tag needed to be <applet>
bug fix: CIF reader not handling _pdbx_struct_assembly_gen.assembly_id properly
 -- wrong atom set for load =3fsx.cif filter "ASSEMBLY 1"
bug fix: [#558 Compatibility issue with ChemDoodle]  JSmol error in definition of Number.toString()
bug fix: mouse wheel not working properly
bug fix: JavaScript J2S compiler error does not coerce int += float to integer
bug fix: JavaScript WEBGL option broken
bug fix: JavaScript NMRCalculation does not access resources
bug fix: JavaScript stereo not implemented
bug fix: MOL reader fix for multiple-model file (just 13.3.9_dev)
bug fix: MOL reader error with load APPEND -- does not continue atom numbers 
bug fix: CIF modulation reader not reading linear combinations of cell wave vectors
bug fix: CIF reading with filter "BIOMOLECULE 1" fails if only the identity operation
bug fix: mmCIF reader not reading all _pdbx_struct_assembly_gen.oper_expression options
bug fix: PDB CRYST entry 1.0 1.0 1.0 90 90 90 should mean "no unit cell" regardless of biomolecule filter
bug fix: isosurface slab <percent> not adapting well for flat molecules such as HEM
bug fix: print userfunc() may fail (userfunc() by itself is fine)
bug fix: within(helix) not implemented for C-alpha-only polymers
bug fix: _modelTitle not updated when a new file is loaded or zapped
bug fix: {*}.symop.all not delivering symmetry operator appropriately
bug fix: for triple bond in SMILES in URLs
bug fix: build.xml missing PDF creation classes
bug fix: [#554] for 
  load http://sourceforge.net/p/jmol/code/18631/tree/trunk/Jmol-datafiles/xyz/3structs.xyz?format=raw;
  zap model!=1.1; 
bug fix: following Java update, adding proper path check for local signed applet
bug fix: {xxx}.property_xx not saved in state (broken 8/7/2013 rev 18518)
bug fix: Manifests updated for signed and unsigned applet JAR files
bug fix: write <type> <filename> fails
bug fix: applet scriptWait() method broken
bug fix: PyMOL session may display unit cell after read from saved state
bug fix: MMCIF reader fails for multiple assembly types
bug fix: CIF reader "biomolecule 1" translating to "molecular" rather than "assembly"
bug fix: load trajectory with multiple files not working
bug fix: JS applet popup menu not closing properly upon language change
bug fix: HTML checkbox id attribute not assigned


code: refactoring of applet/appletjs code; org.jmol.util.GenericApplet
code: refactoring, simplification of buffered readers and buffered input streams.
code: JavaScript refactoring, better build_...xml
code: JavaScript Integer, Long, Short, Byte, Float, Double all reworked 
code: disambiguation of GT._
code: Refactored all unnecessarily inner classes to top level
code: isolated util/ModulationSet using api/JmolModulationSet
code: All applet language localization read from plain .po files 
 -- as for JavaScript already
 -- no need to compile class files for applet languages
 -- no language .jar files
 -- new jsmol/idioma directory holds .po files for both Java and HTML5
code: faster isosurface rendering adding implicit "frontonly" with select {xxx} ONLY
code: faster isosurface rendering with implicit "isosurfacepropertySmoothing FALSE" in relevant (integer) cases
code: JmolBinary.getBufferedReaderForResource() 
 -- consolidates all references to URL.getContent() and Class.getResource()  
code: JavaScript work around for inner class problem with variable name reassignment
code: work-around for eval(functionName) not working in JavaScript.
code: experimenting with ambient occlusion
code: Required manifests added for Java Ju51 (January, 2014).
code: JmolOutputChannel moved to javajs.util.OutputChannel
code: jsmol.php fixed to allow " in saveFile method
code: refactoring Parser into javajs.util
code: DSSP moved to org.jmol.dssx, reducing JSmol bio load by 20K
code: iText package jettisoned, no longer nec, as I wrote my own PDF creator


JmolVersion="13.3.7"

code; JavaScript comparison, 13.2.7 with 13.3.7. 

module		           13.2.7	  13.3.7	  dBytes       %

core.z.js*		      781,122	 582,590	-198,532	  75
corebinary.z.js		   10,958	  10,852	    -106	  99
corebio.z.js		  199,251	 199,249	      -2	 100
coreconsole.z.js  	   13,421	  13,421           0	 100
coremenu.z.js		  105,606	 107,832	   2,226	 102
coremin.z.js		  113,754	 113,938	     184	 100
coreprop.z.js		   28,601	  28,918	     317	 101
corepymol.z.js	      153,236	 153,271	      35	 100
corescript.z.js*	  430,832	 339,062	 -91,770	  79
corescript2.z.js	  			 159,078	 159,078	
coresmiles.z.js		   90,317	  90,317	       0	 100
corestate.z.js		   60,478	  49,667	 -10,811	  82
coresurface.z.js	  271,642	 271,535	    -107	 100
coresym.z.js		  129,456	 129,529	      73	 100
coretext.z.js		  			  46,033	  46,033	
corezip.z.js		  163,080	  92,476	 -70,604	  57

*core+scripting		1,211,954	 921,652    -290,302	  76
TOTAL       		2,551,754  2,387,768	-163,986	  94

JmolApplet0.jar		1,034,203  1,044,111
JmolApplet.jar    	2,757,469  2,766,400

JmolVersion="13.3.7_dev_2013.10.01"

bug fix: Crystal reader not applying lattice translations
bug fix: translations incomplete
bug fix: state saving of echo "bottom left" instead does "top left"
bug fix: multiple-file crystal structures may fail to load if there is a lattice shift
bug fix: space group not being calculated automatically for user-defined space groups
bug fix: measures broken

code: further consolidation:
 --                        uncompressed(former)     gzipped                      
 -- JSmol.min.nojq.js          134K                  38K
 -- core.z.js                 1583K(1781K)          363K
 -- corescript.z.js            339K (436K)           83K
  
 -- TOTAL                     2056K(2217K)          484K
                             (7% reduction)
      
 -- JmolApplet0.jar           1038K                1005K
  

JmolVersion="13.3.7_dev_2013.09.30"

JmolVersion="13.3.6"

bug fix: angle measurements can end with "//nanometers"
bug fix: first pending measurement loses label

JmolVersion="13.3.6_dev_2013.09.27" 

new feature: adds remote logging for applet and app via http:// and via function for applet using
    jmolApplet0._applet.viewer.setLogfile(function(data) {......})

new feature compare {1.1} {2.1} BONDS "smiles"
 -- does flexible fit based on dihedrals. 
 -- does internal rotation even if ROTATION TRANSLATION are not given
      (considered a possible bug)
 -- concatenation of:
	   list = compare({1.1},{2.1},"smiles","BONDS")
	   rotate branch @list 1
   	   compare {1.1} {2.1} SMARTS "smiles" rotate translate
   	   
   	 so, for example:
   	   
   load files "$tyrosine" "$lysergamide"
   select 1.1; color bonds red
   select 2.1; color bonds yellow
   sm = "c1ccccc1CCN"
   compare {1.1} {2.1} BONDS @sm rotate translate
   
new feature: show BEST ROTATION / show BEST VOLUME (better than undocumented show rotation best, show rotation volume)

new feature: set animationMode "ONCE" "LOOP" "PALINDROME"
new feature: show animationMode; x = animationMode

new feature: CAPTURE command, including ROCK and SPIN
   -- application and signed applet only (no JS)
   -- creates animated GIF
   -- uses ANIMATION FPS to determine play-back rate.
    CAPTURE "filename" 
     -- starts capturing
     -- uses ANIMATION MODE to determine looping 
     -- both PALINDROME and LOOP create looping; ONCE (default) does not
    CAPTURE "filename" ROCK x|y|z degrees
     -- does a clean rocking of the molecule about one of the three major axes
     -- axis and degrees optional; y 5 assumed
     -- based on: rotate Y 10 10;delay 2.0; rotate Y -10 -10; delay 2.0;rotate Y -10 -10; delay 2.0;rotate Y 10 10;delay 2.0
     -- uses LOOP mode 
    CAPTURE "filename" SPIN x|y|z
     -- does a full spin of the molecule about one of the three major axes
     -- axis optional; y assumed
     -- based on: rotate Y 360 30;delay 15.0; 
     -- uses LOOP mode 
    CAPTURE off/on
     -- temporarily disables/enables capturing
    CAPTURE "" or just CAPTURE 
     -- end capturing

new feature: set drawFontSize // defaults to 14.0

FEATURE CHANGE: added bindings: "drag" and "up" -- may affect power users who use BIND command
    			new: _center               	CTRL+SHIFT+LEFT+click
				new: _reset                	SHIFT+LEFT+double+click

				mouse actions include one (each) of:
					SINGLE DOUBLE
					LEFT MIDDLE RIGHT WHEEL
					DOWN DRAG UP CLICK
					    	
				for example:
					SINGLE-RIGHT-CLICK
					DOUBLE-LEFT-DRAG
					
				defaults are SINGLE, LEFT, and CLICK
							
    			sequence is always:
    				
    				down 
    				(drag,drag,drag...) 
    				up 
    				(click) (only if no drag)
    			
    			Any of these actions may be tapped using
    			
    				bind "<some mouse action>" "<jmol action or script>"
    			
    			Note that adding "+:" to an action
    			
	    			bind "<some mouse action" "+:<script...>"
    			
    			does not replace the Jmol action, just supplements it.
    			    			
$ show mouse
_assignNew            	LEFT+click          	assign/new atom or bond (requires set picking assignAtom_??/assignBond_?)
_center               	CTRL+SHIFT+LEFT+click	center
_clickFrank           	LEFT+click          	pop up recent context menu (click on Jmol frank)
_pickConnect          	LEFT+click          	connect atoms (requires set picking CONNECT)
_deleteAtom           	LEFT+click          	delete atom (requires set picking DELETE ATOM)
_deleteBond           	LEFT+click          	delete bond (requires set picking DELETE BOND)
_depth                	CTRL+SHIFT+LEFT+double+drag	adjust depth (back plane; requires SLAB ON)
_dragAtom             	LEFT+drag           	move atom (requires set picking DRAGATOM)
_dragDrawObject       	SHIFT+LEFT+drag     	move whole DRAW object (requires set picking DRAW)
_dragDrawPoint        	ALT+LEFT+drag       	move specific DRAW point (requires set picking DRAW)
_dragLabel            	SHIFT+LEFT+drag     	move label (requires set picking LABEL)
_dragMinimize         	LEFT+drag           	move atom and minimize molecule (requires set picking DRAGMINIMIZE)
_dragMinimizeMolecule 	LEFT+drag           	move and minimize molecule (requires set picking DRAGMINIMIZEMOLECULE)
_dragSelected         	ALT+SHIFT+LEFT+drag 	move selected atoms (requires set DRAGSELECTED)
_dragZ                	SHIFT+LEFT+drag     	drag atoms in Z direction (requires set DRAGSELECTED)
_navTranslate         	LEFT+drag           	translate navigation point (requires set NAVIGATIONMODE and set picking NAVIGATE)
_pickAtom             	LEFT+click          	pick an atom
_pickIsosurface       	LEFT+click          	pick an ISOSURFACE point (requires set DRAWPICKING
_pickLabel            	LEFT+click          	pick a label to toggle it hidden/displayed (requires set picking LABEL)
_pickMeasure          	LEFT+click          	pick an atom to include it in a measurement (after starting a measurement or after set picking DISTANCE/ANGLE/TORSION)
_pickNavigate         	CTRL+SHIFT+LEFT+click	pick a point or atom to navigate to (requires set NAVIGATIONMODE)
_pickPoint            	LEFT+click          	pick a DRAW point (for measurements) (requires set DRAWPICKING
_popupMenu            	CTRL+LEFT+down, RIGHT+down	pop up the full context menu
_reset                	SHIFT+LEFT+double+click, MIDDLE+double+click	reset (when clicked off the model)
_rotate               	LEFT+drag           	rotate
_rotateBranch         	SHIFT+LEFT+drag     	rotate branch around bond (requires set picking ROTATEBOND)
_rotateSelected       	ALT+LEFT+drag       	rotate selected atoms (requires set DRAGSELECTED)
_rotateZ              	ALT+LEFT+drag, SHIFT+RIGHT+drag	rotate Z
_rotateZorZoom        	SHIFT+LEFT+drag, MIDDLE+drag	rotate Z (horizontal motion of mouse) or zoom (vertical motion of mouse)
_select               	LEFT+double+click   	select an atom (requires set pickingStyle EXTENDEDSELECT)
_selectToggleOr       	LEFT+click          	if all are selected, unselect all, otherwise add this group of atoms to the set of selected atoms (requires set pickingStyle DRAG)
_setMeasure           	LEFT+double+click   	pick an atom to initiate or conclude a measurement
_slab                 	CTRL+SHIFT+LEFT+drag	adjust slab (front plane; requires SLAB ON)
_slabAndDepth         	CTRL+ALT+SHIFT+LEFT+drag	move slab/depth window (both planes; requires SLAB ON)
_slideZoom            	LEFT+drag           	zoom (along right edge of window)
_spinDrawObjectCCW    	LEFT+drag           	click on two points to spin around axis counterclockwise (requires set picking SPIN)
_spinDrawObjectCW     	SHIFT+LEFT+drag     	click on two points to spin around axis clockwise (requires set picking SPIN)
_stopMotion           	LEFT+double+click   	stop motion (requires set waitForMoveTo FALSE)
_swipe                	LEFT+drag           	spin model (swipe and release button and stop motion simultaneously)
_translate            	CTRL+ALT+LEFT+drag, CTRL+RIGHT+drag, SHIFT+LEFT+double+drag, MIDDLE+double+drag	translate
_wheelZoom            	WHEEL               	zoom

bug fix: JSON NIO port SYNC broken
bug fix: print getProperty("image", "width=200;height=300;type=png") not working

bug fix: write IMAGE "t.png" not working
bug fix: rotate -10 -10 not working

bug fix: mouse bindings not distinguishing DOWN/CLICK/DRAG/UP properly
bug fix: mouse bindings _center and _reset not working
bug fix: show MOUSE not including user-defined mouse bindings

bug fix: chains improperly selected in JSmol/HTML5
bug fix: JSmol/HTML5 not allowing drag-drop or file loading from a local drive.
bug fix: JSmol/HTML5 not allowing WRITE FILE ?
bug fix: JSmol/HTML5 not allowing WRITE xxx.pdb, xxx.mol, etc

bug fix: platformSpeed persists	 but appears unreadable after loading a state
bug fix: JavaScript version InputStreamReader not processing non-UTF data correctly
bug fix: second reading of older PNG files with embedded script fails
         due to improper png file caching

code: overhaul of image creation methods

code: careful attention to core functions yields results in 5% reduction in core download size:
 --                        uncompressed(former)     gzipped                      
 -- JSmol.min.nojq.js          134K                  38K
 -- core.z.js                 1586K(1781K)          364K
 -- corescript.z.js            378K (436K)           95K
  
 -- TOTAL                     2098K(2217K)          497K
                             (5% reduction)
      
 -- JmolApplet0.jar           1038K                1005K
  
 -- Thus, the "real" transfer size -- based on server-side gzipping -- is half the size of Jmol/Java.
  
code: continued refactoring of ScriptEvaluator to ScriptExt
code: refactoring to isolate LabelToken and Labels from core JavaScript load
code: refactoring, simplification of image output and export
 -- folders created: org.jmol.image, org.jmol.dialog
 -- JpgEncoder, Jpg64Encoder, PngEncoder brought to org.jmol.image
     and made subclasses of ImageEncoder
 -- PpmEncoder fixed
 -- ImageEncoder stripped of all unnecessary ImageConsumer/producer business
 -- org.jmol.export.image.ImageCreator and parts of org.jmol.viewer.stateCreator reorganized
     into org.jmol.OutputManager, org.jmol.OutputManagerAwt, and org.jmol.OutputManagerJS
 -- clipboard functions moved into org.jmol.awt and org.jmol.awtjs2d
 -- org.jmol.io.JmolOutputChannel now serves for just about all output needs.
     
   
code: major simplification and consolidation of file I/O methods, including exporters, using JmolOutputChannel class.
code: only FileOutputStream reference is one reference in org.jmol.awt.
  
code: code merge between 13.2 and 13.3   18 Sept 2013
code: major clean-up of ActionManager

JmolVersion="13.3.5"

JmolVersion="13.3.5_dev_2013.09.06"

new feature: show NMR taps into NMRDB directly
 -- for now, application only

bug fix: CRYSTAL reader not allowing vibration for conventional cell
bug fix: JavaScript binary for Safari and Opera
new feature: strutureModifiedCallback
bug fix: ID @id vector  fails

JmolVersion="13.3.4"

bug fix: select 1-5 broken

JmolVersion="13.3.4_dev_2013.08.21"

bug fix: JANA2006 reader not processing occupancies 
  -- read now forced to "PACKED" in order to calculate site multiplicity 
bug fix: CIF reader not reading _CCDC_GEOM_BOND_TYPE record
bug fix: File dialog problems with paths having space
bug fix: GAMESS reader not reading energies
bug fix: TRY failure in a load command followed by a successful load 
         having a loadScript will pop past the second TRY and crash Jmol
          
new feature: _logfile  holds full path to logfile

code: Incommensurate modulated structure CIF and M50/40 file loading validation
 -- includes d=1 and d=2
 -- Fourier, sawtooth, crenel
 
bug fix: translation not read from state

new feature: set platformSpeed [0 to 10] 
   -- basically an expanded "set wireframe OFF" with more options
   -- only effected during model rotation
      (including mouse dragging, spin, vibration, and animation)
   -- default value is 10 (all features; no compromises)
	--    value >=     enables
	         8          antialiasDisplay (and thus, all features)
	         7          translucency
	         6          meshes (contact, draw, isosurface, MO, pmesh, lcaocartoon, CGO)
	         5          cartoons, rockets, trace, ribbon
	         4          geosurfaces
	         3          ellipsoids
	         2          wireframe and balls
	         1          none of the above (same as "set wireframeRotation off")
	         0          [reserved for "auto"]

FEATURE CHANGE: set wireframeRotation expanded

new feature: show ROTATION BEST
 -- operates on currently selected atoms
 -- reports "{quaternion}"

new feature: quaternion("best")
 -- delivers actual quaternion 

new feature: show ROTATION VOLUME
 -- calculates approximate best box (from 1495 quaternion-based alternatives)
 -- reports "<volume> {dx dy dz}"
   -- where <volume> is the volume,
   -- and {dx dy dz} are the dimensions, where dx > dy > dz

new feature: rotate BEST
new feature: rotate SELECTED BEST

new feature: pop-up menu selection "view...best"

bug fix: CIF reader does not find Hall name for space groups

bug fix: binding names not included in SHOW MOUSE
bug fix: "single" touch can fire double-click
bug fix: {x}.tensor() command fails when no atom tensors
bug fix: isosurface slab not allowing two different slabs for two diffrent isosurfaces
bug fix: set wireframeRotation not working ("inMotion" flag not properly read in Viewer).
bug fix: screen repaints were being requested far too frequently

	*indicates when a refresh is made (external apps and applets only)
	
	external apps only 
		via loadInline(List)*
		 	createModelSetAndReturnError
	
	openDOM, openReader, openFile, openFiles
		via loadModelFromFileRepaint*
		 	createModelSetAndReturnError
	
	loadInLine(String) via loadInLineScriptRepaint*
	FileDropper (string drop) via openStringInline*
		via openStringInlineParamsAppend
			createModelSetAndReturnError

	external apps, applet only, via loadInline(String[])*
		via openStringsInlineParamsAppend
		 	createModelSetAndReturnError

	script LOAD
		via loadModelFromFile
		 	createModelSetAndReturnError
		 	
	script CALCULATE HYDROGENS, PLOT, ZAP (ModelKit)
		via openStringInlineParamsAppend
			createModelSetAndReturnError
	
	script LOAD DATA via loadFileFull and loadInlineScript
		openStringsInlineParamsAppend
		 	createModelSetAndReturnError

new feature: incommensurate modulation of ADPs.
new feature: Jana2006 M40/M50 file reading

bug fix: set loglevel 6 (debugHigh) not working
bug fix: {*}.tensor("", "id") not implemented
bug fix: {*}.tensor("") not implemented
bug fix: {*}.tensor("adp") fails
bug fix: {*}.symmetry fails when space group is P1
bug fix: atom tensors lost when merging

bug fix: Jsmol menu and console broken in 2013.08.07 when jQuery calls were all moved into JSmolCore.js

bug fix: float parser broken in dev_2013.08.07

code: reorganization of ScriptEvaluator into two sections, one optional

new feature: COMPARE {atoms} [coords]
new feature: COMPARE {atoms} ATOMS {subset1} [coords1] {subset2} [coords2] ...

new feature: MODULATION command -- for modulated structures 
 -- operates on currently selected set of atoms
 -- MODULATION ON
 -- MODULATION OFF
 -- MODULATION t
   -- sets modulation "t" of selected atoms
 -- MODULATION PLAY t1 t2
   -- animates a once-through sequence of t from t1 to t2
 -- MODULATION FPS x.x  // may be < 1
   -- sets speed of animation
               
bug fix: zoom setting lost in state

code: incommensurate crystal work -- Uiso, preliminary Uij and subsystems
code: incommensurate crystal work -- occupancy Crenel, displacive sawtooths

bug fix: shapeInfo not reporting visibility of isosurface

code: pdb, cif readers separated into separate packages; p2n, pqr readers with pdb now
 
new feature: Jana2006 reader -- reader for http://jana.fzu.cz/
new feature: CIF reader reads incommensurate modulated structures
 -- FILTER options include:
   -- NOSPECIAL (include special atoms for debugging
   -- MODAVERAGE (do not read modulation
   -- MODAXES=xyz (select only specific axes -- x, y, and/or z)
   -- NOSYM (no symmetry read)
    
code: Even faster float parsing
bug fix: filter lost after CENTROID or PACKED load option
bug fix: set rangeSelected  not functional 

new feature: msCIF file reading of incommensurate modulation data as vibration
new feature: msCIF file filter "MODAXES=xxx" where xxx = X,XY,XYZ,YZ,etc.
new feature: msCIF file filter "MODAVE" gives average structure with vibration vectors.

bug fix: minimization can fail after MMFF switches to UFF.
bug fix: CIF reader fix for no element given "phenyl1" in ZjzxlegN.cif
JSmol: Jmol form moved to end of body
JSmol: All $(xx) references moved to JmolCore.js

JmolVersion="13.3.3_dev_2013.07.27"

code: reconfigured JSmol build no longer needs jsmol/make directory.

bug fix: Gaussian cube format changed and not recognized (extra "1" in third line).
bug fix: PDB header don't do trim();
bug fix: isosuface ID @x ... becomes isosurface ID "@x"
bug fix: color chain broken
bug fix: rockets with color chain
bug fix: filter ":X" broken
bug fix: O not 2- in PDB adding hydrogens	
bug fix: NWChem reader error


bug fix: isosurface SLAB TRANSLUCENT 0.x color  
       -- inherits color of isosurface when color parameter is absent
           
bug fix: JSmol 2-sided surface color problem due to Java2Script miscoding of Number.shortValue()
bug fix: PyMOLMeshReader code clean-up.

JmolVersion="13.3.2_dev_2013.07.21"

bug fix: PyMOL mesh reader broken for EDS files

JmolVersion="13.3.1_dev_2013.07.20"

bug fix: MMCIF_PDBX structures not being read

bug fix: allow PyMOL PSE files reading as part of a set of files, not just by itself

bug fix: quaternion plots not synched with originating structure
bug fix: 1skt.cif loses secondary structure (MMCIF_PDBX reader needed)
        
new feature: calculate formalCharge

bug fix: set showTiming not functional
bug fix: set pdbAddHydrogens does not set formal charge on O(1-) or "O" of H2O (2-)
bug fix: PNGJ files not properly caching, and PSE files with DOCACHE option
 
JmolVersion="13.3.0"
JmolVersion="13.1.19_dev_2013.07.18"

new feature: set exportScale x.x
 -- adjusts export scale 
 -- only implemented for VRML and X3D exporters
new feature: unitcell center {atomset}
new feature: unitcell center {fx fy fz}
new feature: {*}.ms, {*}.cs %[ms] %[cs] magnetic shielding and chemical shift
new feature: label <color red>xxx</color>
new feature: set shift_H xxx  (ppm)
new feature: getProperty("nmrInfo")
new feature: NMR analysis tools:
 -- x = measure({a} {b} "isc_hz") -- J coupling
 -- x = measure({a} {b} "dc_khz") -- dipolar constant
 -- MEASURE {a} {b} "2://dc_hz" -- dipolar constant
 -- MEASURE {a} {b} "2:%3.2VALUE//dc_khz" -- dipolar constant
 -- MEASURE {a} {b} "2://khz" -- defaults to dc_khz
 -- MEASURE {a} {b} "2://hz" -- defaults to isc_hz
 -- MEASURE {a} {b} "2://isc_1hz"
    
new feature: {xxx}.tensor(type,what)
 -- type = "temp", "ms", "efg", etc.
 -- returns a list of data. isc-type returns a list of lists [index1, index2, value] 
 -- what = 
    "j" (isc-type only)
    "chi" (efg only)
    "dc" (dipolar coupling constant; type ignored)    
  	"eigenvalues" float[v1,v2,v3]
  	"eigenvectors" P3[V1,V2,V3]
  	"value" Float (v3)
  	"asymMatrix" Matrix3f
  	"symMatrix" Matrix3f
  	"isotropy" Float v_iso=(v1 + v2 + v3)/3 
  	"anisotropy" Float v3 - (v1 + v2)/2
  	"asymmetry" Float (v2 - v1)/(v3 - v_iso)
  	"eulerzxz" float[]
  	"eulerzyz" float[]
  	"quaternion" Quaternion
  	"indices" float[modelIndex,atomIndex1,atomIndex2]
  	"string" selected readable data
  	"type"
  	anything else -- all key/value pairs
  
new feature: bind "+:<script...>" 
 -- added "+:" indicates to NOT unbind Jmol action

new feature: ellipsoid OPTIONS "xxxx"
 -- "xxxx" is a quoted string of options separated by semicolon:
      "arcs;arrows;axes;ball;dots;fill;wireframe"
      with optional "no" in front of each

new feature: SET ECHO POINT {atom or point} 
 -- allows 2D and 3D echos to have pointers to atoms or points 
  
 
bug fix: set shift_XX not saved in state
bug fix: JSmol menu not disappearing upon touch outside menu
bug fix: PyMOL surface map reading error
bug fix: magres measurement of dipole coupling constants do not reach just min-distance set
bug fix: "cs" for Cs symmetry broken in chemicalshift
bug fix: cartoons with too small nonzero size will not render anything

code: org.jmol.quantum.NMRCalculation smoothly handles J-coupling and dipolar coupling constant display.   
code: org.jmol.quantum.NMRCalculation implements org.jmol.api.JmolNMRCalculation:
  public float getQuadrupolarConstant(Tensor efg);
  public float getJCouplingHz(Atom a1, Atom a2, String type, Tensor t);
  public float getDipolarConstantHz(Atom a1, Atom a2);
  public float getDipolarCouplingHz(Atom a1, Atom a2, V3 vField);
  public JmolList<Tensor> getInteractionTensorList(String type, BS bs);
  public BS getUniqueTensorSet(BS bs);
  public JmolList<Object> getTensorInfo(String tensorType, String infoType, BS bs);
  public Map<String, Float> getMinDistances(MeasurementData md);
  public boolean getState(SB sb);
  public Object getInfo(String sym);

JmolVersion="13.1.17_dev_2013.06.27"

new feature: CASTEP reader filter option q=all
new feature: set picking DRAGLIGAND
 -- won't move the protein
new feature: CIF reader upgrade to allow multicharacter chain specs. 
 -- See 1bgl_1bgm.cif
 -- automatically switches to chainCaseSensitive if multi-character 
     or lower-case chains are read in a CIF file.
 -- note that in certain cases quotation marks will be needed:
		select chain=0123     NOT OK
		select :0123          NOT OK
		select chain="0123"   OK
		select :"0123"        OK
		select :"A*" or :"A'" or :'A"' or :"A\""
		
new feature: {atomset1}.distance.min({atomset2})
 -- returns an array
 -- minimum distance of each atom in atomset1 to any atom in atomset2
new feature: {atomset1}.distance.max({atomset2})
 -- returns an array
 -- maximum distance of each atom in atomset1 to any atom in atomset2

note: much of the next compare/branch business was built into a 
      new COMPARE command for Jmol 13.3.6
      
new feature: list = compare({atomset1} {atomset2} "ccCCN" "BONDS")
 -- determines the dihedrals that match atomset1 to atomset2
 -- returns arrays of length 6n, list[6n]
     which lists six numbers for each dihedral in the comparison set, 
     including i1 i2 i3 i4 set1value set2value, where i1-i4 are 
     atom indices, and set1value and set2value are the dihedral angles
     in sets 1 and 2, respectively.
 -- feeds into the rotate BRANCH @list command
  
new feature: BRANCH @list
 -- takes a list of 6n numbers from compare function
 -- rotates all dihedrals in the selected atom set to target values concurrently
  
 // application: flexible substructure fit using a SMARTS search

   load files "$tyrosine" "$lysergamide"
   select 1.1; color bonds red
   select 2.1; color bonds yellow
   sm = "c1ccccc1CCN"
	   list = compare({1.1},{2.1},sm,"BONDS")
	   rotate branch @list 1
   compare {1.1} {2.1} SMARTS @sm rotate translate
   // at this point the two models match almost perfectly among these key atoms.
   
new feature: {1.1}.find("ccCCN", "BONDS")
 -- finds the first match in the structure to the given SMARTS string
 -- returns an n-length array of 4-length arrays, list[n][4]
 -- each list[i] is a set of four atoms in bond-connected order
 -- full list comprises all dihedrals in the found set of atoms.

new feature: set translucent
 -- default TRUE : translucent objects are fully translucent
 -- FALSE: translucent objects are opaque to other translucent objects

bug fix: CrystalReader broken by recent change to simpleReplace()
bug fix: PyMOL movie start frame
bug fix: PyMOL putty broken
bug fix: pdbAddHydrogens may miss O3' or O5' H atoms at end of DNA strands
bug fix: pdbAddHydrogens may miss H in first group of a chain
bug fix: set defaultDrawArrowScale broken 
bug fix: "ligand" should include all _g=0 (nonPDB atoms)
bug fix: applet getpropertyAsArray("bondInfo") fails 
bug fix: JSmol script/scriptWait nuance with moveto.
 -- when using scriptWait with HTML5, there can be no threading
bug fix: invertSelected on trajectory causes nullPointerException
bug fix: POLYHEDRA with faceCenterOffset not saved in state properly; EDGES option nonfunctional
bug fix: JavaScript not returning arrays properly from Jmol.getPropertyXXXX()
 -- very important to have {} after j2sNative directive!
bug fix: COMPARE could rotate to less-good fit with SMARTS search
bug fix: draw ARROW ATOM/BOND broken
bug fix: animation MORPH broken for non-PyMOL files
 -- load trajectory ({0 6}) 1cdr.pdb
 -- animation MORPH 10
 -- animation ON
 -- load trajectory "test1.pdb" "test2.pdb"
 -- animation MORPH 30
 -- animation ON  
bug fix: draw ARROW ATOM/BOND broken
bug fix: draw ARROW with offset disallows set picking draw adjustments
bug fix: concurrent loading of two cif files by two different applets fails 
bug fix: draw LINEDATA not operative (undocumented, for state; from draw xxx INTERSECT yyy)
 -- needs revision to create DATA option; can be huge and very long to process state file
bug fix: load :2-butanone fails
bug fix: PyMOL volume map data saved from PyMOL 1.6 has slightly different data structure 
bug fix: jvxl reader ignores jvxlVertexColorData 
bug fix: ellipsoid rendering problems

code: MagRes/CASTEP reader upgrades
code: color/translucent/opaque clean up in ScriptEvaluator
 
=============================================================================

JmolVersion="13.1.16_a"

new feature: set defaults PyMOL 
 -- zoomHeight TRUE
 -- measurementUnits ANGSTROMS
  
	new feature: color BALLS 
	 -- distinct from color ATOMS because it doesn't get inherited
	 -- for PyMOL compatability with sphere_color 

new feature: restore SCENE "xxxx" nSec

new feature: Scene menu
 -- PyMOL scene names, in order
  
new feature: added parameters to moveTo allows setting cameraDepth, cameraX, and cameraY
new feature: moveTo <nseconds> PYMOL [18-element standard PyMOL view matrix]
	-- used for PSE file loading
	-- to be used also for scenes 
    [0-8] are 3x3 rotation matrix (row/column inverted)
    [9,10] are x,y translations (y negative)
    [11] is distance from camera to center (negative)
    [12-14] are rotation center coords
    [15-16] are slab and depth distance from camera (0 to ignore)
    [17] is field of view; positive for orthographic projection
	-- internal use only; not documented

new feature: cache CLEAR 
 -- same as cache REMOVE ALL

new feature: load xxx.pse FILTER "DOCACHE"
 -- specifically for editing large PSE files when included in a state
 -- caches streamlined file that is still readable by PyMOL (needs testing!)
     (no electron density map data, for instance -- see HupA_2.pse)
 -- caches all isosurfaces, creating JVXL equivalents
 -- should be followed with WRITE xxx.pngj or WRITE xxx.jmol or WRITE xxx.zip
 -- for example: 
     before:
		04/07/2013  07:46 AM        11,929,507 HupA_2.pse
		
	$ zap;load "HupA_2.pse" filter 'docache'
	$ write t.zip
	
	 after:
		Listing archive: t.zip
		Physical Size = 395174
		
		   Date      Time    Attr         Size   Compressed  Name
		------------------- ----- ------------ ------------ ------------------------
		2013-05-17 06:46:36 .....      1092432       219718  HupA_2.pse
		2013-05-17 06:46:36 .....      1473760         6589  isosurface_level2
		2013-05-17 06:46:36 .....        25495        11624  state.spt
		2013-05-17 06:46:36 .....          134          119  JmolManifest.txt
		2013-05-17 06:46:36 .....            0            2  Jmol_version_13.1.16_dev_2013.05.17__2013-05-15_07.09
		2013-05-17 06:46:36 .....       158082       156316  preview.png
		------------------- ----- ------------ ------------ ------------------------
		                               2749903       394368  6 files, 0 folders
		                               
new feature: anim FRAMES [1, 3, 9, 9, 9, 3, 1] 
 -- arbitrary PyMOL-like model list

new feature: FRAME n
 -- same as MODEL n, unless we have PyMOL-like frames
 -- if have frames, then FRAME 2 goes to the second frame (model 3 in this case)
 -- MODEL n still always goes to a specific model.
 -- all relative options -- FIRST LAST PREV NEXT -- refer to frames if there are frames
     even if the MODEL command is given.
  
new feature: pyMOL PSE state options: LOAD "FOO.PSE" state FILTER "xxxx"
 -- [state not present; default] load all PyMOL states (one PyMOL state == one Jmol model)
 -- state = 0 (load only the current PyMOL state)
 -- state > 0 (load just a specific PyMOL state)
 -- FILTER "nosurface" -- load PyMOL file without surfaces

new feature: getProperty BONDINFO {atomset1} {atomset2}

new feature: measurements with IDs and radius/diameter:
	-- measure ID "xxx" ...
	-- measure ID "xxx" RADIUS x.y (or DIAMETER x.y) 
	-- renders as dots

new feature: set zoomHeight 
  -- FALSE by default
  -- set TRUE for PyMOL-like resizing (scale only set by height adjustment) 
   
new feature: isosurface color density (decimal) 
  - variable decimal point size

new feature: PyMOL CGOs as CGO command 
  - needs testing
  - CGO ID "xxx" [ cgo data (float array) ]
  - includes basic CGO methods 
      BEGIN
      		GL_POINTS
      		GL_LINES
      		GL_LINESTRIP
      		GL_TRIANGLE
      		GL_TRIANGLE_STRIP
      		GL_TRIANGLE_FAN
      VERTEX
      END
      COLOR
      NORMAL
      SIMPLE_LINE
      SAUSAGE
      TRICOLOR_TRIANGLE
      
popup: added menu for MEP range -0.1 0.1

PyMOL: uniqueBondSettings working

PyMOL: better scene restore; 

PyMOL: adds SASURFACE option (surface_solvent ON), with "carving" (ProFusion_ABL.pse, scene F6)

PyMOL: abstraction of scene setting from reader

PyMOL: first phase of reader development complete (working with Jaime Prilusky)
 -- 104 test models http://ispcsrv3.weizmann.ac.il/a2jmolb/browse 
 -- implementation of standard objects, including:
    -- atoms with labels
    -- bonds
    -- standard PyMOL rendering, including:
       -- lines
       -- sticks
       -- nonbonded (stars)
       -- nb_spheres
       -- cartoons of various types (not plank)
       -- rockets
       -- ribbon (backbone/trace)
       -- putty (trace)
       -- dots
    -- measures
    -- simple CGO objects
    -- molecular surfaces
    -- electron density as points and meshes
    -- custom colors
    -- fog and slab
    -- morphing movies
    -- JVXL caching of isosurfaces

PyMOL: measurement font/offsets enabled
 -- adds measure ID "xxx" FONT scale face style
 -- adds measure ID "xxx" OFFSET [mode, sx, sy, sz, ax, ay, az]
 -- adds measure ID "xxx" OFFSET {sx, sy, sz}
   
PyMOL: perspective fix for translated center -- H115W.PinM.PSE

PyMOL: preliminary scene implementation 
 -- view only
 -- use RESTORE ORIENTATION xxxxx 

code: Text.java, Object2d.java moved from shapes to modelset

bug fix: COMPARE move of group saved in state may not be correct when restored
bug fix: write command doesn't accept parameter sequence IMAGE PNGJ ... (broken in 13.1.14)
bug fix: load APPEND with PDB file loses structure (broken in 13.1.15)
bug fix: restore command broken  
bug fix: JavaScript: adding SYNC
bug fix: antialiasing or resizing stray lines problem solved (introduced in 11.0, 08/2006!)
bug fix: "display add" by itself should not do anything
bug fix: Hall translation initialization problem
bug fix: JavaScript reading of old-style JVXL files
bug fix: Gaussian reader not splitting MO set by model
bug fix: polyhedron reading from state
bug fix: connect delete not saved in state
bug fix: rockets not working for alpha polymer (also in 13.0.16)
bug fix: GXL added to carbohydrates
bug fix: show state/anim turns "anim" into "animation"
bug fix: MoldenReader orbitals are not in energy order; use FILTER "NOSORT" to prevent sorting by energy
bug fix: simultaneous spin/animation broken in 13.1.13
bug fix: MoldenReader fix for file blank lines and g,h,i orbitals - also for 13.0.16
bug fix: COMPARE does not allow nSeconds at beginning, as described in documentation
bug fix: isosurface VOLUME/AREA SET n cannot return to full array reporting; SET -1 added.
bug fix: isosurface VOLUME/AREA always returns an array, possibly of length 0
bug fix: isosurface molecular/solvent can give inappropriate inner surfaces
bug fix: show selected includes deleted atoms

=============================================================================

JmolVersion="13.1.15"

FEATURE CHANGE: default JPEG quality set to 100 (was 75, which looks crappy)

new feature: select command parameter completion using [TAB] includes variables

new feature: PyMOL-like label offset options:
   
   set labelOffset [sx, sy, sz]
   set labelOffset [mode, sx, sy, sz, ax, ay, az]
   
 where
   
   sx,sy,sz are screen coord offsets 
   	-- in Angstroms 
    -- applied after view rotation
    -- sy > 0 LOWERS label
   ax,ay,az are xyz position (in Angstroms; applied before view rotation)
   mode == 1 indicates xyz position is an offset to the atom position
   mode != 1 indicates xyz position is absolute
   defaults: mode == 1; ax = ay = az = 0
   
   
new feature: CASTEP energy reading
new feature: XCrysDen file reader
new feature: VASP POSCAR reader

new feature: set cartoonLadders -- no bases, like PyMOL

new feature: model CREATE n   
 -- allows "empty" model creation without atoms
 -- n = number of models to create
 -- defaults to 1
  
new feature: "all frames" toolbar button starts/stops PyMOL movies: if(_isMovie){if (_animating) {animation off}else{animation play}} else {frame *}

new feature: Jmol/JmolData application -I flag accepts input from System.in and command piping:

   				  type t.spt | jmol -I		  start Jmol with this script
   				  
   				Note: if you use a pipe, be sure to make "exitJmol" the last command of the script
   				
	         Add -o for output to System.out.   Without the pipe, we are going to control Jmol 
	         									from a Jmol> prompt on the command line console
   
   				  jmol -Io		  see messages on input console
   				  ...messages from Jmol
   				  Jmol> background red;load 1crn.pdb;....
   				  ...messages from Jmol
   				  Jmol> exitJmol
   				  
	         Add -n for headless operation (will not exit automatically). 
   
   				  type t.spt | jmol -Ion
   				    
   				Note: if you use a pipe, be sure to make "exitJmol" the last command of the script
   				
	         Add -i for silent operation (no writing to System.output). 
   

new feature: dots IGNORE {atom set} ON;

new feature: Jmol or JmolData with -g0x0 and load filter "DORESIZE" will automatically
             resize the image to what is given in the PyMOL file as its default size:
             JmolData -ns "load t.pse filter 'DORESIZE'" -g0x0 -w "PNGJ:t.png"
bug fix: isosurface map property may not reference correct atom
bug fix: set isosurfacekey may not work with slabbing
bug fix: deleting atoms does not remove bioshape rendering
bug fix: isosurface in multi-model context saved in state with wrong model number
bug fix: PyMOL label fix, including fonts
bug fix: PyMOL rockets, nucleic acid rendering
bug fix: write JPG not working in JavaScript
bug fix: isosurface ... map property colors   not cleared entirely before next mapping
bug fix: MSMS reader broken
bug fix: labels lost upon z-shading
bug fix: isosurface property temperature default smoothing broken in 13.1.13.
bug fix: {xxx}.cartoon = {xxx}.temperature.all  fails to use correct values (also backbone, trace, etc.)
bug fix: isosurface translucent level not re-zeroed properly
bug fix: IDTF exporter with translucency fails
bug fix: commands f.sort() and f.reverse() fail. 
bug fix: {;...;} syntax does not work in 13.1
bug fix: select dots > 0   does not work
bug fix: JmolData broken 

code: PyMOL work; CGO command and class CGO extends DRAW preliminary only; preliminary putty; fix for putty+sticks issue
code: PyMOL reader localSettings
code: PyMOL putty hack for Cover1.pse removed; colix index error fixed
code: PyMOL slab and depth; better field of view; even better zslab/zdepth
code: PyMOL reader "backbone" (really a trace -- fixed width?)
code: PyMOL reader isosurface solvent 
code: PyMOL reader and full surfaces, mixed bigEndian/littleEndian Pickle reading
code: PyMOL reader: cartoon_ladder_mode approximation as cartoons
code: PyMOL reader: includes cartoon type 1,4,7 -> trace
code: String JmolViewer.runScript(String script) runs script immediately and returns output buffer  
code: continued work on PyMOL PSE file reader
code: simplification of JmolViewer interface and access to global parameters:

  // several; methods were deprecated and removed in 13.1.15. All are accessible via "getXxxx" methods:
  
  abstract public float getFloat(int tok);
  abstract public int getInt(int tok);
  abstract public boolean getBoolean(int tok);

  //abstract public int getAnimationFps();  see getInt(T.animationFps)
  //abstract public boolean getShowHydrogens(); see getBoolean(T.showhydrogens)
  //abstract public boolean getShowMeasurements(); see getBoolean(T.showmeasurements)
  //abstract public boolean getAxesOrientationRasmol(); see getBoolean(T.axesorientationrasmol)
  //abstract public int getPercentVdwAtom(); see getInt(T.percentvdwatom)
  //abstract public boolean getAutoBond(); see getBoolean(T.autobond))
  //abstract public boolean showModelSetDownload(); deprecated -- was just "true"



=============================================================================

JmolVersion="13.1.14"

new feature: JVXL vertex-only data encoding "none" allows hand-coding of JVXL files  
new feature: isosurface efvet reader data "0" is "indicated colors"
 -- isosurface "test.efvet" 0

JavaScript: WebGL fix involving Collections.list calling ArrayList.add()
JavaScript: disambiguation of Mesh()
JavaScript: changing to utf-8 String nonbinary reading of .po files
JavaScript: localization working

code: cleaning up of Escape and checks for array types
code: JavaScript does not need a visible canvas to create images -- could allow for "headless" JS operation

bug fix: isosurface boundbox plane ....
bug fix: isosurface boundbox {pt1} {pt2} plane ...
bug fix: JVXL 1.0 format reading broken
bug fix: MOL2 reader not properly assigning element symbols
bug fix: isosurface slab translucent broken when saved in state
bug fix: isosurface slab translucent mesh broken when saved in state
bug fix: JavaScript minimization fix 
bug fix: sync socket connections not working
bug fix: "navigate percent" broken
bug fix: isosurface area/volume broken
bug fix: JavaScript WRITE IMAGE with HTML5 does not allow change of width or height
bug fix: WRITE PNGJ does not allow sizing of image	
bug fix: backbone/spine defs do not take into account phosphorylated proteins. Better:
    "@backbone protein&(_a>=1&_a<6|_a>=64&_a<72)|nucleic&(_a>=6&_a<14|_a>=72)",    
    "@spine protein&_a>=1&_a<4|nucleic&_a>=6&_a<14&_a!=12",
bug fix: getProperty fileInfo fixed and documented
bug fix: assign atom does not update selections for elements
bug fix: FileDropper broken
bug fix: LcaoCartoon "-sp3d" not working
bug fix: PyMOL PSE files not accessible by Jmol app File...Open or drag/drop
bug fix: incorrect calculation of RMSD for COMPARE and SMILES
bug fix: ModelKit menu "SHIFT to rotate" should read "ALT to rotate"
bug fix: starting applet console takes two clicks
bug fix: JavaScript SMILES bug (String.replaceAll() does not work
bug fix: JavaScript LOOP command not implemented

=============================================================================

JmolVersion="13.1.13"

FEATURE CHANGE: multiple applets no longer share the same lighting space

new feature: animation DISPLAY {atomset} 
    - applies a filter to a running animation to display only a certain set of atoms. 
    - for example:
        load test.pse
        animation display {act_site}  // defined in test.pse
        
new feature: animation MORPH n
    - where n is a number of frames to be inserted between trajectories
    - requires previous LOAD TRAJECTORY 
      or the loading of a PyMOL PSE file having a movie (automatically a trajectory)
    - Jmol will do a linear morph as the animation runs.
    - for example:
        load test.pse
        animation morph 3
    - could be used for a linear morph between just two structures:
        load trajectory "test1.pdb" "test2.pdb"
        animation morph 32 // animation will run 33 frames

new feature: frame -x.y
	- negative decimals indicate a linear morph is requested between two
	  trajectory frames.
	- for example:
	    load test.pse
	    frame -3.5	      
                
new feature: set celShading TRUE -- produces cel shading effect
	- see http://en.wikipedia.org/wiki/Cel_shading
	- introduced by N David Brown

new Feature: Experimenting with ellipsoid {atom set} and ellipsoid $isosurfaceID

new feature: PyMOL PSE reader enhancements -- labels, simple surfaces, measures

new feature: isosurface xxxx MAP property COLOR 
 -- allows inheritance of color from underlying atom (as in PyMOL)

new feature: UHBD grid file reader
new feature: DelPhi grid file reader

new feature: load =xxx/ where xxx is a database code that can be set up in the future by a user. 
 -- currently including mp MaterialsProject http://www.materialsproject.org/materials/%FILE/cif
 -- along with ligand, nci, nmr, pdb, pubchem
 -- see JmolConstants.databases for the full list.
 -- note that nci can take an additional tag such as /names after the name, and pubchem can take one before it:
 
		load =mp/1
		load =nci/caffeine
		load =pubchem/caffeine
		load =pubchem/cid/2345
		print(load('=nci/caffeine/names'))
		
bug fix: set picking IDENT when picking is already ident can cancel a pending measurement
bug fix: applet does not refresh when mouse exits with pending measurement
bug fix: labels within fog should be hidden
bug fix: load CENTROID does not always work -- wrong implicit normalization flag (was -1 instead of 1)
bug fix: property_xxx does not work (since 10/3/12, 13.1.7)
bug fix: The "show  history" command is supposed to clear out the "show history" command 
         itself, but only if it is a top-level command (from the console), 
         but it does more than that if it is part of script("show history"). 
         Probably true with all recent versions of Jmol.
bug fix: isosurface binary file reading (MRC, CCP4, O, binary PMESH, etc.) broken
bug fix: JavaScript: zoomTo [seconds > 0]... and restore rotation|orientation [name] [seconds > 0]  not waiting

code: Refactoring class names to reduce JSmol JavaScript footprint
		ScriptVariable --> SV
		Token --> T
		BitSet --> BS
		BitSetUtil --> BSUtil
		Colix --> C
		Point3f --> P3
		Point3fi --> P3i
		StringXBuilder --> SB
		Vector3f --> V3
		JmolConstants --> JC
		
code: shader functions removed from Colix; Shader class made nonstatic
code: refactored to allow scriptless JavaScript. (reduces initial core code load size by 25%, to 2.5Mb) 
 
=============================================================================

version="13.1.12"

new feature: PDB reading of X-PLOR using hybrid-36 and NAMD files using hex
 -- see   https://www.schrodinger.com/AcrobatFile.php?type=supportdocs&type2=&ident=530
 -- see   http://cci.lbl.gov/cctbx_sources/iotbx/pdb/hybrid_36.py
  
new feature: load xxx.pdb filter "TYPE i,n"
 -- loads custom text fields into the "atomType" property of an atom upon customized PDB file loading
     where i is the number of the column (starting with 1) and n is the number of columns
 -- text is trimmed
 -- e.g. load xxx.pdb filter "TYPE 73,4" loads four characters starting at column 73 as "atomType" (segID)
 -- to convert to a numerical value, convert that to .property_foo:
     load xxx.pdb filter "type 22,4"; {*}.property_seqNo = {*}.atomType
     
new feature: PDB filter "TYPE 73,4=xxx" 
 -- loads four characters starting at column 73 (1-based) as "atomType"
 -- loads only those atoms with atom types starting with "xxx"

new feature: axes labels "a" "b" "c" "xxx"  where "xxx" is the label for the origin

bug fix: PDB file reading of remediated 1A7Y and 1E9W error due to too many CONECT bonds
	-- now reads HEADER columns 63-66 for 4-digit PDB ID. 
	-- only if this ID is absent will the number of CONECT bonds be checked in decision to autobond
	  
bug fix/update: revision of the pages that make the About menu (application) in each language. 
 -- Some changes that had been formerly applied to the English page are now in all.
      (Removal of copyright date in text)
 -- All About_xx.html files are now encoded and saved in UTF-8 w/o BOM, 
      except Chinese which is in GB2312/GB18030.
 -- Extended characters in tr and zh that had become corrupt across revisions were restored from old ones.
 -- Several html header tags updated or added (html5 doctype, charset, lang)
 -- Hopefully all will display correctly after these changes!

JavaScript: fix for SMILES matcher and   compare({*},{*},"isomer")
 -- j2s reminder: Can't use Java   new int[n][]; must use org.jmol.util.ArrayUtil.newInt2(n)
JavaScript: going to Float64Array for all noninteger arrays -- all numbers double
  Note that this could cause differences with Jmol, but I think we will have to live with that. 
  The problem was with (new Float32Array([13.48]))[0] != 13.48. So instead of trying to force
  floats, it seems to make more sense to me to force doubles, using Float64Array instead of Float32Array.
  Thanks given to Ira Hanson for clearing this up for me. 
JavaScript: JSmol writes PNG, PNGJ, JMOL, ZIP files from a web page
JavaScript: JSmol writes text files from a web page

=============================================================================

version="13.1.11"

new feature: Jmol app "recent files" recognizes if file was drag-dropped or opened via "File Open"
new feature: color cartoons red blue  
 -- front/back colors
 -- preliminary - only for hermiteLevel = 0, not cartoonFancy
 -- a bit rough at the edges
 -- not in state

bug fix: 13.1 does not calculate partial charges (mark/reset fault in reading resource files)  
bug fix: MOPAC2012 files not recognized
bug fix: patch 3581394 - small fixes for cartoon meshes
bug fix: 13.1.8 does not display translucent bonds when only bonds are translucent
JavaScript: flat cartoons for WebGL using mesh
JavaScript: adds XML model file readers 
  -- tested: VASP, XODYDATA, CML, Chem3D, MolPro, XSD

code: refactoring for JavaScript popup/ModelKit menus
code: GT optimization, refactoring
code: Naga sockets upgrade to Naga-3_0. (MolecularPlayground and jsonKiosk)

=============================================================================

version="13.1.10"

FEATURE CHANGE: set perspectiveMode  removed
 -- nonlinear version 10 perspective mode no longer supported

bug fix: !quit was not stopping animation and vibration
bug fix: slowed zoomTo in Java version of 13.1.9
bug fix: PDB occupancies for first atoms may be 0.0 instead of 1.0 (broken in 11.7)
bug fix: select *W   does not work
bug fix: setEllipsoid... options not implemented for nonthermal ellipsoids in 13.0 or 13.1
bug fix: nonthermal ellipsoids broken in 13.1.

JavaScript: !quit and navigation enabled
JavaScript: script queue enabled
JavaScript: move thread implemented; needs navigation threads

code: JmolApplet0_Navigate.jar and JmolApplet0_Parallel.jar added
code: Navigator separated from TransformManager11
code: TransformManager10 removed
code: TransformManager11 combined with TransformManager


=============================================================================

version=13.1.9

new feature: MO or (ISOSURFACE MO)   DENSITY 
 -- electron density
 -- same as MO [1] SQUARED
new feature: MO HOMO|LUMO|NEXT|PREV|[c1 n2 c2 n2...] SQUARED
 -- Squares wave functions as it combines them.
 -- That is, displays the collective electron density (if occupied)
 -- if [...] is not given, groups orbitals by energy
 -- examples:
     load c6h6.smol;mo homo squared // displays symmetric squared sum of two degenerate orbitals
     load co2.smol; mo homo squared // displays cylindrical electron density
     mo next squared // lumo, provided homo was just displayed
 
bug fix: Molden reader tweaks
bug fix: Jmol application toolbar picking tool should not select none
bug fix: ellipsoid rendering fails
bug fix: translucent echo oddities in Jmol 13.1.8
bug fix: lost volume rendering in 13.1.8 
bug fix: CASTEP density reader fails to reset origin to 0 0 0 in mapping 
bug fix: UTF files with BOM (byte order marker) present not read correctly
bug fix: UTF files within GZIP or ZIP files not read correctly
bug fix: set picking draw no longer works in Jmol 13.0 or 13.1
bug fix: translucent echo backgrounds lost in 13.1.8
bug fix: select resno=@{n+3} fails in 12.2, 13.0, and 13.1
bug fix: isosurface AtomicOrbital broken in 13.1.8

JavaScript: removing ambiguity in AtomObject in setColix(short, int, int) and (int, short, int)
JavaScript: binary Spartan SMOL reader enabled
   - nice IEEE calculator: http://www.merlyn.demon.co.uk/js-exact.htm#DW4
JavaScript: delay, hover, animation, vibration, moveto, spin, timeout
JavaScript: full binary loading for JavaScript -- tested only in Firefox, but specifically
      designed for Chrome's insistence that synchronized AJAX processes must not be binary  
JavaScript: base64 translation of encoded binary strings from JS file reading
      prefix: ";base64," initiates decoding.
JavaScript: com.json JSON package removed due to licensing issues
JavaScript: JSmol -- all references to InputStream.read(byte[]) --> InputStream.read(byte[], 0, len)
               to speed file reading processing
JavaScript: JSmol -- float[].clone(), int[].clone() not supported in Java2Script
JavaScript: java.text.DateFormat not supported in Java2Script
JavaScript: Note -- org.jmol.adapter.smarter.Atom is not fully cloned
              (anisoBorU and ellipsoid are not copied
               and their values must be considered "final")

code: adding quotes to above properties allows them to be used in JavaScript; j2sNative in JmolConstants.java
code: refactoring org.jmol.util into org.jmol.io and org.jmol.io2


=============================================================================

version=13.1.8

new feature: much better text rendering using 3-bit translucency

bug fix: boundbox $pmeshID, center $pmeshID, and zoomto $pmeshID not implemented
bug fix: stronger (bold) frame labels
bug fix: no automatic change to bold for antialiasDisplay or PovRAY
bug fix: try/catch not working when embedded in another context
bug fix: JmolData not producing output for PRINT commands
bug fix: JmolData setting haveDisplay true, then failing to get mouse manager
bug fix: MRC file reader not setting default cutoff correctly
bug fix: (13.1 only) MRC/DNS6 file readers fail
bug fix: MRC surface file reader with symmetry error
bug fix: (13.1 only) minimization broken

code: clearing font cache upon zap. 
code: HTML5-only JavaScript full text working
code: HTML5-only JavaScript version working

=============================================================================

version=13.1.7

FEATURE CHANGE: getProperty isosurfaceInfo no longer returns vertex data
 	
new feature: getProperty isosurfaceData returns vertex data
new feature: set cartoonFancy -- creates elliptical ribbon for cartoons 
	-- if ribbonAspectRatio is its default value of 16, it is reset to 4 while cartoonFancy = true.

bug fix: (13.1 only) reading of states with select BONDS fails to select bonds broken in 13.1.6 
bug fix: (13.1 only) centered/right-aligned text only aligned after first line
bug fix: export WRL missing various objects requiring transformMatrixInv
bug fix: export may be missing protein cartoon turn
bug fix: set ribbonAspectRatio improperly widens ribbon
bug fix: zShadePower should not be static (affecting all applets/Jmol application frames)
bug fix: write OBJ xxx.obj not working (but write xxx.obj is fine)
bug fix: cartoons (with hermiteLevel > 1) adjusted to have smooth 
    normals between segments (Alexander Rose)
    also, hermiteLevel >= 6 now gives ellipse cross-section
    recommended settings: set hermiteLevel 6;set ribbonAspectRatio 4
bug fix: JmolControls.js had broken radio buttons       
bug fix: DRAW {x y z} "title" can fail in multimodel cases with translucency

=============================================================================

version=13.1.6

new feature: showTiming

new feature: CIF reader reads assembly information
 -- load =1vif.cif filter "ASSEMBLY 1"
 -- load =1vif.cif filter "ASSEMBLY 1;$A" # just label_asym_id A
 -- load =1vif.cif filter "ASSEMBLY 1;!$C" # just label_asym_id values not C
new feature: LOAD "xxx.cif" APPEND "appendedData" @x
 -- specifically for CIF files, reads a CIF file, appending string in variable
 -- intentionally not documented.
 -- feature particularly for RCSB (John Westbrook), so, for example:

		Var x = load("test.txt")
		load "1vif-early.cif" append "appendedData" @x FILTER "assembly 1;$A"
		
 -- or in one line:
       load "1vif-early.cif" append "appendedData" @{load("test.txt")} FILTER "assembly 1;$A"
  
_pdbx_struct_assembly_gen.assembly_id       1 
_pdbx_struct_assembly_gen.oper_expression   1,2,3,4 
_pdbx_struct_assembly_gen.asym_id_list      A,B,C 
# 
loop_
_pdbx_struct_oper_list.id 
_pdbx_struct_oper_list.symmetry_operation 
1 x,y,z  
2 y,x,-z+1 
3 -x+1,-y+1,z
4 -y+1,-x+1,-z+1 
# 

new feature: LOAD "xxx.cif" APPEND DATA "appendedData" .... end "appendedData"
 -- specifically for CIF files, reads a CIF file, appending string in lines of script
 -- intentionally not documented 
 -- most important for saving the state:
  
load "1vif-early.cif" append data "appendedData"
_pdbx_struct_assembly_gen.assembly_id       1 
_pdbx_struct_assembly_gen.oper_expression   1,2,3,4 
_pdbx_struct_assembly_gen.asym_id_list      A,B,C 
# 
loop_
_pdbx_struct_oper_list.id 
_pdbx_struct_oper_list.symmetry_operation 
1 x,y,z  
2 y,x,-z+1 
3 -x+1,-y+1,z
4 -y+1,-x+1,-z+1 
# 
end "appendedData" FILTER "assembly 1;$A"

 -- option reserved to allow different data names for different purposes
 -- not general yet -- specific to CIF reader.

bug fix: PDB 4B2Q, with faulty (incomplete) REMARK 350 not read

code: successfully refactored for JavaScript
	(see http://chemapps.stolaf.edu/jmol/jsmol-10-1/jsmol2.htm)
	-- note that all code development is done in Jmol, then
	   Java src code is transferred to JSmol project
	 
	-- adding:
		javax.util.BitSet 
		javax.util.StringXBuilder
	-- streamlining:
		javax.vecmath...
	-- removed all references to StringBuffer
	-- StringXBuilder allows optimization of performance in JavaScript
	-- workaround for Java2Script compiler bug setting "char x;" to 0
	-- Java2Script compiler is not distinguishing int[] from float[] when creating the array
	-- StringXBuilder takes care of adding ".0" to floats and doubles, but 
	   we need to be on the lookout for not places where we are constructing
	   a string where the difference between an int and a float is significant.
	-- optimize class hierarchy return by cataloging classes
	   as org_jmol_xxxx in addition to org.jmol.xxxx
	-- tie in graphics on JavaScript side
	-- add fonts
	-- add "billboard" objects such as labels, 3D echos, etc.
	-- add 2D echos
	-- ultimately write an asynchronous version of JSmol
	
code: org.jmol.jvxl.readers classes accessed reflexively (for JavaScript optimization)
code: JSmol classes incorporated into Jmol code -- org.jmol.awtjs, org.jmol.appletjs, org.jmol.exportjs
code: refactored for JavaScript (mostly removing ambiguity in method names)

       
=============================================================================

version=13.1.5

bug fix: CASTEP PHONON files not loading

code: refactored for JavaScript

=============================================================================

version=13.1.4

new feature: ISOSURFACE PLANE ... MAP ... LATTICE {i j k} [volume data]
 -- allows periodic volume data to be mapped to a plane
     based on a specified translational lattice
 -- for example: isosurface plane x=2 map LATTICE {1 2 2} "data.dat"

new feature: POLYHEDRA {atom1} to {atoms_including_atom1} 
 -- polyhedra with or without central atom, but with a reference atom

bug fix: translate selected x ... bug

bug fix: ISOSURFACE saving in state broken 7/30/12 in 13.0.RC3
bug fix: simple isosurface PLANE not saved in state
bug fix: isosurface command with MAP from state when saved to state may fail
bug fix: 13.1.2 offsets label positions incorrectly

code: refactored for JavaScript

=============================================================================

version=13.1.3

bug fix: 13.1.2 breaks loading of ZIP files
bug fix: CUBE reader reading atom Z numbers as partial charge
bug fix: 13.1.2 breaks   LOAD ?

=============================================================================

version=13.1.2

new feature: cache ADD "filename" 
 -- adds a file into the memory cache as a set of bytes
new feature: cache REMOVE "filename"|ALL
 -- removes a file from the cache
new feature: show cache
 -- displays the cache as an array
new feature: cache() function
 -- returns the cache as an associative array {filename: nBytes, filename: nbytes,...}
new feature: write INLINE "xxxx" "filename"
    for example: write INLINE "testing" "myfile.txt"
    for example: write INLINE @{load("$caffeine")} "caffeine.mol"
new feature: set defaultDropScript for drag-drop and File|Open

bug fix: translate x 0 does not recenter the model in the window
bug fix: PDB polymers of length 1 allow size to be set and appear {visible} but are not
bug fix: OPEN dialog doesn't allow for no PDB cartoons.
bug fix: open dialog for 1-residue PDB files does not show atoms.
bug fix: pngj storage of Spartan directory zip files or Spartan directories cannot be read
         because the PNGJ files created do not contain the necessary files from the directory
 
code: (JmolViewer) public void cacheFile(String fileName, byte[] bytes)
 -- allows a mechanism for applets or embedding apps to deliver file content as bytes
 -- for applets, first getPropertyAsJavaObject("Viewer")
code: refactored for Java2Script due to inner class bug there.

=============================================================================

version=13.0.1

APPLET:
-- a new OOP JavaScript interface (Jmol-JSO) 
  allowing nonJava options such as ChemDoodle and GLmol 
  as well as JME/JSpecView connectivity
-- JmolData full "headless" operation for server-side processing

BIOPHYSICS:
-- COMPARE command

FILE READING:
-- reading of JCAMP-DX files having structure/spectra assignment data
    using ##$MODELS and ##$PEAKS (see http://chemapps.stolaf.edu/jmol/jspecview)
-- Gaussian log reading of Natural Transition Orbitals
-- automatic PNGJ file caching for immensely faster loading of PNGJ files from remote servers

FILE WRITING:
-- write PNGJ files encapsulate all model file data into one PNG file
-- write image 400 400 PNGJ "http://....."      POSTs JMOL or IMAGE or structure to a server as application/octet-stream
-- write MOL adds partial charge data as > <JMOL_PARTIAL_CHARGES> in SDF format
-- multiple-scene PNGJ files allowing minimal or full data loading and scripted animations

ISOSURFACES:
-- isosurface caching
-- isosurface MOVE [[...matrix4f...]]  moves/rotates an isosurface (for the state)

MINIMIZATION:
-- MMFF94/UFF minimization and energy calculation

MOLECULAR DATA:
-- show CHEMICAL
-- show NMR

MOLECULAR PLAYGROUND:
-- MolecularPlayground -- remote status and remote control

SOLID-STATE PHYSICS:
-- solid state physics support

SPECTROSCOPY:
-- integration of JSpecView into Jmol, including 2D spectral display and manipulation

STRUCTURE SEARCHING:    
-- extended Jmol SMARTS searching
-- PubChem search for name (which can be a CAS number), cid, or SMILES using ":"

=============================================================================

version=13.0.RC7_dev

bug fix: isosurface CAVITY not saved in state

=============================================================================

version=13.0.RC6

bug fix: isosurface CAVITY not saved in state
bug fix: Gaussian reader not reading "AO basis set in the form of general basis input" properly ("Gen" keyword)
bug fix: Gaussian reader not reading "7D 0" correctly
bug fix: Trajectories still broken for PDB files

code: all import foo.*; removed, specified

=============================================================================

version=13.0.RC5

bug fix: broke trajectories in 13.0.RC4

=============================================================================

version=13.0.RC4

new feature: write SCENE PNG|PNGJ "xxxx.spt" option to create PNG or PNGJ files (same file, just different extension)
new feature: "menu" as sole contents of a script pops up the context menu
 -- joins category of special commands, including "exit" "pause" and "quit"

bug fix: load append TRAJECTORY (upper case) fails
bug fix: load append trajectory "$mannose" fails (loads two models)
bug fix: load trajectory "maleic.cif" fails with cryptic error message (not appropriate for trajectory loading)
bug fix: undocumented and inaccurate CALCULATE VOLUME removed

=============================================================================

version=13.0.RC3

new feature: automatic PNGJ file caching for immensely faster loading
new feature: write MOL adds partial charge data as > <JMOL_PARTIAL_CHARGES> in SDF format
new feature: isosurface CACHE <surface creation parameters> ....
 -- parameter CACHE along with isosurface creation or alone instructs Jmol to
     immediately create JVXL data for the specified surface and to load that data instead.
     The surface remains in memory (in this version of Jmol) can can be used again
     using cache://isosurface_<ID> where <ID> is the isosurface ID such as "isosurface1".
 -- The command ISOSURFACE CACHE alone will cache the current isosurface
 -- If the cache is no longer needed, then RESET CACHE will release the memory used to hold the JVXL data for the isosurface
 -- The result should be essentially equivalent to the original command.
     (It is recommended that the original be a relatively simple command, because not all nuances
      of an isosurface may be stored in the JVXL data.)
 -- THIS OPTION IS NOT COMPATIBLE WITH SAVING THE STATE AS AN SPT FILE.
 -- Instead, one needs to save the state in PNGJ or JMOL format, where the cached isosurface
     can be reloaded from a file saved in the  PNGJ or JMOL zip directory
     
bug fix: load a model, then  load append TRAJECTORY -- will fail
bug fix: load APPEND xxx where xxx is FILE, INLINE, SMILES, TRAJECTORY, MODEL 
         all save incorrect LOAD command in state         
bug fix: shelx reader (.res) not assigning space group name or applying normalization

=============================================================================

version=13.0.RC2

bug fix: isosurface molecular producing artifacts
bug fix: isosurface select {...} molecular not excluding all other atoms for troughs
new feature: Gaussian log reading of Natural Transition Orbitals
new feature: isosurface MOVE [[...matrix4f...]]  moves/rotates an isosurface (for the state)

bug fix: isosurface moved by atom connection not saved correctly in state
bug fix: isosurface SET n  not read properly from JVXL file.
ant fix: changing the way  Jmol.properties is handled vis-a-vis # and underscores
bug fix: isosurface SOLVENT producing artifacts --- needed minimum resolution
bug fix: isosurface with selected set not delivering just those vertices for within distance calc
bug fix: isosurface CONNECT in documentation but never implemented
bug fix: isosurface SET n  not saved in state or JVXL file.
bug fix: Gaussian reader fails for 2-digit basis orbital names such as "12XX"
bug fix: PNGJ creation not handling same-file or same-name issues.
bug fix: isosurface SOLVENT producing cavity-like artifacts
bug fix: SCENE writing with toggle (pause scene 2 ... pause scene 2) in error
bug fix: SCENE min spt script needs wrapping by pathForAllFiles
bug fix: isosurface MINSET or SET not compatible with SLAB
bug fix: show $d1  where d1 is a DRAW object broken
bug fix: calculate hydrogens incorrect for proteins

=============================================================================

version=13.0.RC1

-- a new OOP JavaScript interface allowing nonJava options and JME/JSpecView connectivity
-- MMFF94/UFF minimization and energy calculation
-- integration of JSpecView into Jmol, including 2D spectral display and manipulation
-- reading of JCAMP-DX files having structure/spectra assignment data
    ##$MODELS and ##$PEAKS (see http://chemapps.stolaf.edu/jmol/jspecview)
-- multiple-scene PNGJ files allowing minimal or full data loading and scripted animations
-- write PNGJ files encapsulate all model file data into one PNG file
-- extended Jmol SMARTS searching
-- show CHEMICAL
-- show NMR
-- solid state physics support
-- MolecularPlayground -- remote status and remote control
-- COMPARE command
-- JmolData full "headless" operation for server-side processing
-- PubChem search for name (which can be a CAS number), cid, or SMILES using ":"
-- isosurface caching
-- write image 400 400 PNGJ "http://....."      POSTs JMOL or IMAGE or structure to a server as application/octet-stream

=============================================================================

version=12.3.33 (13.0.RC1)

new feature: full JSpecView support for NMR
 -- integration, peak listing, measurements
 -- printing with peak measurements
new feature:  measure(a b "minArray")
 -- measures minimum distance from atom set a to atom set b atom by atom
 -- return array with number of elements corresponding to the number of selected atoms
 -- for example:  {1.1}.property_distTo12 = measure({1.1}, {1.2} "minArray"); color property_distTo12 
new feature: {x}.property_d = [....]
 -- allows for [....] to have length of the number of atoms in {x}
    in which case the values are assigned on a 1:1 basis
new feature: PDB reader reads gromacs-created "pdb_wide_format" files
             and also automatically reads PQR based on gromacs REMARK

bug fix: select within(1.0, withinallmodels, 1.1) and 1.2  causes exception
bug fix: script xxx(yyy).spt  broken

=============================================================================

version=12.3.32

FEATURE CHANGE: LOAD "myfile.xxx" with no additional parameters
    where xxx is "png" or "pngj" or "spt" 
    now assumes these are scripts and runs SCRIPT "myfile.spt" instead

new feature: write SCENE "xxxx.spt"
 -- creates pngj files
 -- using "xxxx.png" will STILL USE "xxxx.spt" but will create PNGJ files with ".png" extensions
 -- scene creation with linked PNGJ files
 -- xxxx.spt should include "pause scene n" commands, which are then
    used to separate the script into separate scenes. "n" must be an integer.
 -- Two files are created for each scene (pngj unles:
      xxxx_scene_n.min.pngj  very small; does not contain anything more than 
                             an image, JmolManifest.spt, and scene.spt
      xxxx_scene_n.all.pngj  adds all necessary files, plus script.spt
 -- Either of these files can be used, but if x.min.pngj is used, 
    then x.all.pngj needs to be present as well in the same directory. 
 
new feature: drawHover displays ID for isosurface and reports to hoverCallback
new feature: load "$$xxxxx" loads 2D version, not 3D (used for JmolData connection with JME)
 -- basically, use of two $ signs results in drop of "&get3d=True" from NCI call

bug fix: compiler not synchronized; allows jmolEvaluate() to fail if two threads access it simultaneously
bug fix: getproperty isosurface after a "no-surface" isosurface call like load $water;isosurface sasurface fails
bug fix: color for hbonds/ssbonds backbone incorrect

=============================================================================

version=12.3.31

bug fix: isosurface plane ... within ... map ... fails
bug fix: write broken in 12.3.30

=============================================================================

version=12.3.30
	
new feature: atom properties sx, sy, sz, and sxyz -- screen coordinates
new feature: app flag -r restricts file access 
 -- like -R, but allows reading of ".spt" files
new feature: load("http://.....?POST?_PNGJBIN_")
 -- accompanies load("http://....?POST?_PNG_") and load("http://....?POST?_PNGJ_")
 -- sends PNGJ image to server as byte array instead of as  application/octet-stream
    instead of Base64-encoded string and application/x-www-form-urlencoded
 -- return value is whatever server is set up to send
new feature: select within(distance, $drawID)

bug fix: isosurface plane... map property temperature not working
bug fix: PNG files written by Jmol from 12.3.7 - 12.3.29 have incorrect
         checksum. Browsers do not seem to care, but Java does
         when loading a background image in Jmol!
bug fix: background image NONE fails
bug fix: if(...) statement   (no braces) broken in 12.3.21 

=============================================================================

version=12.3.29

new feature: (JmolCore.js/JmolApplet.js/JmolCD.js/JmolApi.js)
 -- changes "useChemDoodleOnly" to "disableJmol"
    in preparation for non-ChemDoodle plug-ins similar to JmolCD.js
 -- allows for default values for Info
 -- adds Info.src 
   -- similar to src in an <image src="xxx.png" /> tag
   -- turned into LOAD "xxx.png"
 -- more efficient coding
new feature: set MESHSCALE (default 1) also allows isosurface/mo mesh scaling
 -- was DOTSCALE in 12.3.26, but that is not appropriate
new feature: Mopac archive reader, including internal coord. defs
 -- use FILTER "NOCENTER" to NOT center atoms in unit cell
 -- use CENTROID for complete molecules with centroids within unit cell
 -- use PACKED CENTROID for complete molecules with any atoms within unit cell 
 -- properties stored in auxiliaryInfo 
    use getProperty auxiliaryInfo or x = getProperty("auxiliaryInfo".foo) to retrieve
new feature: set pathForAllFiles "..."
 -- all files, local or remote, will be taken from the indicated path
 -- the indicated path may be a zip file entry (ending with "|")
 -- automatically reset to '' in case of an unrecoverable error in execution
 -- used for creating JMOL files containing user scripts instead of a state
 -- disallows all writing and image creation
 -- scripts including prompts to read wildcard files (for example, "load ?")
    will still prompt for those and read them properly
new feature: write SCRIPT ["scriptFileName", "filename2","filename3",...] PNGJ|JMOL...
 -- syntax is WRITE SCRIPT followed by an array of file names
    then whatever else is necessary to create the PNGJ or JMOL file
 -- for example:  write script ["wind.spt"] test.jmol
 -- Creates a single PNGJ or JMOL file that instead of containing the state 
    contains the script and additional files listed by the user. 
    The first script is run, and it is presumed that the other files are
    needed for full execution of that script. 
 -- Allows for creating PNGJ and JMOL files that run as animations, not just final states.
 -- Jmol will automatically add any files current to the state,
    but other files not indicated by the state (script files especially)
    required for the script to run need to be indicated by the user.
 -- When the script is executed, pathForAllFiles is set to the zip file
    itself. Thus, even scripts containing references such as "script2.spt" or "=xxxx" 
    can be run, provided the user supplies script2.spt xxxx.pdb.gz as one of the required filenames. 
 -- Note that if a file is saved locally using LOAD =xxxx AS t.pdb, Jmol will automatically use
    the local file reference to t.pdb, not the RCSB reference.
 -- If the file is loaded using only LOAD =xxxx, then Jmol will reload the
    remote file and store it in the PNGJ/JMOL file as xxxx.pdb.gz.  

bug fix: Jmol 12.3.28 breaks writing JMOL/PNGJ files
 -- Jmol 12.3.28 release DELETED
bug fix: ModelKit mode creating atoms after load "@x" fails
bug fix: script javascript:xxxx() broken for Jmol object javascript
bug fix: JmolCore.js fix for getPropertyAsArray
bug fix: draw arrows not adjustable using set picking draw
bug fix: Exception for select within(molecule,...) when atoms have been deleted

=============================================================================

version=12.3.28

DELETED 6/10/2012 due to breaking of JMOL/PNGJ format

new feature: isosurface ... map PERIODIC ...
 -- allows mapping grid-based data beyond the unit cell defining its grid
new feature: write VIBRATION n
 -- writes 20 * n frames
 -- n periods
 -- some issues with first frame and value of n
new feature: load PACKED CENTROID 
 -- only complete molecules having one or more atoms within or on the face of the unit cell
 -- may not preserve # of atoms of unit cell
 -- reverts to simple PACKED if this is a single-molecule solid (such as diamond)
new feature: unitcell $isosurfaceID
new feature: unitcell [{center}, {a}, {b}, {c}]
 -- sets unit cell for current model only
new feature: "plot data" command by itself opens a new frame with just one atom in it, at (0,0,0)
new feature: isosurface SLAB BRILLOUIN (or WIGNERSEITZ)
 -- transposes an isosurface into the Brillouin-zone/Wigner-Seitz unit cell
 -- based on the isosurface's vectors if there is no unit cell for this model. 
 -- for creating isosurfaces of Fermi surfaces

bug fix: LOAD with SPACEGROUP or RANGE or UNITCELL should default to {555 555 -1} (packed) lattice
bug fix: JVXL reading of mapped data does not use file's rendering option for lighting
bug fix: default measure dotted lines are too thin for export
bug fix: measures not offset correctly when given width in line. 

=============================================================================

version=12.3.27

new feature: [menu] vibration [*,/] 2 
new feature: XSF isosurface reader
new feature: load CENTROID 
 -- only complete molecules having centroid in unit cell
 -- preserves # of atoms of unit cell

bug fix: write PNGJ broken in 12.3.26
bug fix: 12.3.26 breaks Jmol/JspecView connection
bug fix: draw pointgroup scale x.x -- changing x.x does not revise point group
bug fix: reading of JVXL-version 1 (nonXML) files does not display colors
bug fix: translate y 10 works, but translate Y 10 does not

=============================================================================

version=12.3.26

new feature: Jmol SMARTS searching can include full Jmol selection syntax within
    an atom primitive using the "atomType" option and "select:":
    
    load caffeine.xyz
    print {*}.find('{c}$(select _N and connected(2, _C))')

new feature: model ID "xxx" (or frame ID....)
 -- sets the model's ID to "xxx"
 -- can be used to switch to that model using  model "xxx"
 -- can be targeted file-specifically using "filename#xxx"
 -- if two models have the same ID and no filename is given, 
    then the first model found becomes the current model
 -- used for correlating non-Jmol synced applets
new feature: script "t.spt"(...variables...)
 -- quotes are optional if file name does not include " " or "("
 -- "script" is optional if file name is quoted or ends with ".spt"
 -- allows passing variables to a script much like a function call
 -- variables will be in VAR named "_arguments" within that script (like JavaScript)
 -- _arguments, like all arrays in Jmol, is 1-based, 0-terminated (unlike JavaScript)
 -- _arguments is unsettable by the user
 -- for standard script functions, _arguments will be []

 -- for example, if test.spt is simply "show _arguments", then
      load $caffeine
	    test.spt({*}, {*}.xyz ,35, [1,2,3,4])

will output:

     _arguments = [({0:23}),{-0.086670786 -0.02787502 5.6667876E-4},35,[1,2,3,4]]

new feature: set forcefield "UFF" or "MMFF" 
 -- default is MMFF
 -- automatically switches to UFF if atom types cannot be set
 -- minimizationCallback reports actual force field used

new feature: set energyUnits kJ|kcal
new feature: antialiased display and image creation uses larger mesh scaling for cleaner look

code: adding empirical rules to MMFF94 calculation

checkmm.spt;checkAllEnergies

checking calculated energies for 761 models
1 COMKAQ     E=   -7.3250003   Eref=  -7.6177    diff=  0.2926998
2 DUVHUX10   E=   64.759995    Eref=  64.082855  diff=  0.6771393
3 FORJIF     E=   35.978       Eref=  35.833878  diff=  0.14412308
4 JADLIJ     E=   25.104       Eref=  24.7038    diff=  0.4001999
5 PHOSLA10   E=   111.232994   Eref=  112.07078  diff=  0.8377838
6 PHOSLB10   E=   -93.479004   Eref=  -92.64081  diff=  0.8381958

for 761 atoms, 6 have energy differences outside the range -0.1 to 0.1 
with a standard deviation of 0.05309403

bug fix: nested SMARTS strings can give incorrect response
load data "mol"
C:/jmol-dev/bobtest/t6.mol
__Jmol-12_05191218593D 1   1.00000     0.00000     0
Jmol version 12.3.26  2012-05-19 18:34 EXTRACT: ({0 3 4})
  3  2  0  0  0  0              1 V2000
   2.89480   4.81990   0.01710 N   0  0  0  0  0  0
   3.52580   2.75730  -0.17290 N   0  0  0  0  0  0
   3.94370   4.03730  -0.25710 C   0  0  0  0  0  0
  1  3  2  0  0  0
  2  3  1  0  0  0
M  END
end "mol"
select search("$([#7][#6]([#7&!$([#7][O])])=[#7])")
show selected
 was returning 1 atom, but should be 0 (because there are only two N atoms!)
bug fix: measurementUnits = "au"   does not work
bug fix: select 1.0 fails
bug fix: COMPARE broken
bug fix: Writing file into .jmol file after reading it from another results in the whole
         zip file being copied into the new .jmol file. 


=============================================================================

version=12.3.25

new feature: MMFF94 single point energy calculation and minimization
  set forcefield "MMFF"
  checkmm.spt
  checkmm "AMHTAR01";minimize energy
  AMHTAR01 Initial E =     66.180 kcal/mol  # should be 66.18011
  checkmm "ARGIND11";minimize energy
  ARGIND11 Initial E =   -207.436 kcal/mol  # should be -207.43598

validation complete. The following 13 structures (of 761) do not validate to within 0.1 kcal/mol

1 COMKAQ   E=   -7.3250003   Eref=  -7.6177  diff=  0.2926998
 -- MMFF94 ignores 1 of 5-membered ring torsions for a 1-oxo-2-oxa-bicyclo[3.2.0]heptane
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate

2 DUVHUX10   E=   64.759995  Eref=  64.082855  diff=  0.6771393
 -- MMFF94 ignores 5-membered ring issue for S-S-containing ring
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate
 
3 FORJIF   E=   35.978   Eref=  35.833878  diff=  0.14412308
 -- MMFF94 uses some sort of undocumented empirical rule used for 1 torsion not found in tables
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate

4 JADLIJ   E=   25.104   Eref=  24.7038  diff=  0.4001999
 -- ignores 5-membered ring for S (note, however, this is not the case in BODKOU)
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate

5 KEPKIZ   E=   61.127   Eref=  61.816277  diff=  0.68927765
 -- MMFF94 requires empirical rule parameters
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate

6 PHOSLA10   E=   111.232994   Eref=  112.07078  diff=  0.8377838
 -- MMFF94 ignores all 5-membered ring torsions in ring with P
 -- (note, however, this is not the case in CUVGAB)
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate

7 PHOSLB10   E=   -93.479004   Eref=  -92.64081  diff=  0.8381958
 -- MMFF94 ignores all 5-membered ring torsions in ring with P
 -- (note, however, this is not the case in CUVGAB)
 -- MMFF94_bmin.log: WARNING - Conformational Energies May Not Be Accurate

empirical-rule-requiring models: (all are nonaromatic heterocycles)

8   ERULE_01   E=   -22.582  Eref=  -21.515108   diff=  1.0668926
9   ERULE_02   E=   29.407999  Eref=  29.799572  diff=  0.39157295
10  ERULE_03   E=   -3.326   Eref=  -2.9351802   diff=  0.3908198
11  ERULE_04   E=   -2.572   Eref=  -2.31007   diff=  0.26193
12  ERULE_07   E=   2.873  Eref=  3.16775  diff=  0.29474998  (fixed in 123.3.26 by correcting angle calc)
13  ERULE_08   E=   33.734   Eref=  34.41382   diff=  0.6798172 
 

bug fix: compare {22-31} {7-16} subset {*.ca} should work without ATOMSET next 
bug fix: compare {22-31} {7-16} should work, using {spine} as default
bug fix: isosurface molecular for certain flat models will fail to cap H atoms
bug fix: calculate partial charge fails after ModelKit changes
           (because Bond[] bonds field not cleaned
bug fix: dipole command fails after ModelKit changes 

code: refactoring of minimize for generalization

=============================================================================

version=12.3.24

new feature: SMARTS search for atom type using quotes: ["37"]-["58"]
new feature: SMARTS option /aromaticdouble/  allows distinguishing between aromatic single and double bonds
new feature; SMARTS option /aromaticstrict/  checks 6-electron rule for aromatics
new feature: CALCULATE partialCharge   does MMFF94 charge calculation
 -- all atom types validated
 -- charge values validated to +- 0.001001 over the 761-atom dative validation set
new feature: isosurface CACHE
 -- creates a JVXL version of the surface (possibly outside of Jmol, but that's not implemented yet)
 -- saved by   write JMOL   as a JVXL file "isosurface_ID" 
     (where ID is the original isosurface ID) within the JMOL zip collection
 -- Warning! not saved using   write SPT  
     ***ALWAYS*** use write JMOL or write PNGJ after using the CACHE option, not write SPT
 -- invoked by   isosurface file "cache://isosurface_ID"  
 -- cleared by   reset CACHE
 -- allows rapid recreation of an isosurface across file loads
 -- possibly limited to a subset of surface types
 -- not fully tested

new feature: write ... "http://....."
 -- POSTs JMOL or IMAGE or structure or whatever to a server as application/octet-stream
 -- to be used in Proteopedia for saving a fully self-contained state

new feature: load filter "CENTER" -- centers models on the first model as they are loaded
new feature: load filter "NAME=..." -- loads only those models with a name that contains ...  
new feature:   calculate partialcharge  
	-- works on currently selected set of atoms
	-- uses MMFF94 charge calculation (unverified; most certainly not quite correct)
 -- preliminary only; working on validation

bug fix: x = {"c1": 3}; if(x["c1"]) should return TRUE
code: Simple way to assign MMFF94 atom types and partial charges
-- N,S-containing compounds not validated; CHO-containing compounds partially validated
bug fix: MOL2 reader assuming PDB for non-PDB format files (such as MMFF94-dative.mol2)
bug fix: label %W not working properly for non-PDB files
bug fix: write MOL does not save partial-single bond as type 8 ("ANY")
bug fix: set echo IMAGE fails (since 12.3.20)

code: (applet) JmolCore.js free of need for JSON

=============================================================================

version=12.3.23

new feature: (applet) new interface for Jmol as an HTML object as well as full support on all platforms
             using a ChemDoodle fall-back option for Java/Applet-challenged platforms (iPad,iPhone,Android)

 Note that Jmol.js is no longer required, but not all of the features of Jmol.js are in place yet

 allows Jmol applets to be created on a page with more flexibility and extendability
 possibly using infrastructure of ChemDoodle for multiplatform doodlable structures

 required/optional libraries (preferably in the following order):

		jQuery.min.js   -- required for ChemDoodle or any server-based options
		gl-matrix-min.js -- required for ChemDoodle option
		mousewheel.js   -- required for ChemDoodle option
		ChemDoodleWeb.js -- required for ChemDoodle option
		JmolCore.js     -- required
		JmolApplet.js   -- required
		JmolCD.js       -- required for ChemDoodle option
		JmolApi.js      -- required

 Allows Jmol-like objects to be displayed on Java-challenged (iPad/iPhone)
 or applet-challenged (Android/iPhone) platforms, with automatic switching to 
 whatever is appropriate. You can specify "ChemDoodle-only", "Jmol-only", "Image-only"
 or some combination of those -- and of course, you are free to rewrite the logic below! 

 Allows ChemDoodle-like 3D and 3D-faked 2D canvases that can load files via a privately hosted 
 server that delivers raw data files rather than specialized JSON mol data.
 Access to iChemLabs server is not required for simple file-reading operations and 
 database access. PubChem and image services are provided by a server-side PHP program
 running JmolData.jar with flags -iR (at St. Olaf College). 
 For your installation, you should consider putting JmolData.jar and jmolcd.php 
 on your own server. Nothing more than these two files is needed on the server.

 The NCI and RCSB databases are accessed via direct AJAX if available (xhr2).

new feature: PubChem search for name (which can be a CAS number), cid, or SMILES using ":"
  from pubChemFormat = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/%FILE/SDF?record_type=3d";
  (many thanks to Evan Bolton and Paul Thiessen (NIH) for their assistance on this. 
  load :name:tylenol   #  or  load :tylenol
  load :cas:103-90-2   #  or  load :103-90-2
  load :cid:1983       #  or  load :1983
  load :smiles:C/C=C/C

bug fix: callback functions for modular calls: applet0.readCallback(....)
bug fix: Molden reader problems reading frequencies
bug fix: VASP reader with {n n n} and vibration vectors problem
bug fix: in 2bat, SIA was considered part of the carbohydrate chain because we were not checking bonding

=============================================================================

version=12.3.22

new feature: Jmol extensions to ChemDoodle allow display of Jmol, ChemDoodle-equivalent (simple model only), 
             or just an image with server-side JmolData.jar support. 

    JmolCD.js -- Jmol ChemDoodle extension   author: Bob Hanson, hansonr@stolaf.edu  4/16/2012

    requires ChemDoodleWeb.js and ChemDoodleWeb-libs.js
    prior to JmolCD.js

    allows Jmol applets to be created on a page with more flexibility and extendability
    using much of the infrastructure of ChemDoodle.

    allows Jmol-like objects to be displayed on Java-challenged (iPad/iPhone)
    or applet-challenged (Android/iPhone) platforms, with automatic switching to 
    whatever is appropriate. You can specify "ChemDoodle-only", "Jmol-only", "Image-only"
    or some combination of those -- and of course, you are free to rewrite the logic below! 

    allows ChemDoodle-like 2D and 3D canvases that can load files via a privately hosted 
    server that delivers raw data files rather than specialized JSON mol data.
    access to iChemLabs server is not required for simple file-reading operations and 
    database access. Database and image services are provided by a server-side PHP program
    running JmolData.jar with flags -iR. 

    In this case, the NCI and RCSB databases are accessed via a St. Olaf College server, 
    but for your installation, you should consider putting JmolData.jar and jmolcd.php 
    on your own server. Nothing more than these two files is needed on the server.

new feature: write CD  (simple ChemDoodle JSON format -- atoms and bonds only)
             For example: java -jar JmolData.jar -iRJ "load $tylenol;print write('cd')"
             generates:  {"mol":{"a":[{"x":0.20549999,"y":0.8303,"z":0.3823},{"x":0.6906,"y":-1.4656999,"z":-0.14220001},{"x":1.5485,"y":1.1359,"z":0.2829},{"x":2.0332,"y":-1.1585,"z":-0.24180001},{"x":-3.9799001,"y":-0.1617,"z":0.1295},{"l":"H","x":4.2731,"y":0.35680005,"z":0.7047},{"l":"H","x":-1.8655999,"y":-1.6522,"z":0.6012},{"x":-0.2273,"y":-0.4718,"z":0.17},{"x":2.4650002,"y":0.1425,"z":-0.029099999},{"l":"O","x":-2.1741998,"y":1.1759001,"z":-0.59169996},{"l":"O","x":3.7872,"y":0.4441,"z":-0.1268},{"x":-2.5170999,"y":0.1262,"z":-0.089999996},{"l":"N","x":-1.5898,"y":-0.78279996,"z":0.2712},{"l":"H","x":-0.50740004,"y":1.6029,"z":0.6296},{"l":"H","x":0.35450003,"y":-2.4786,"z":-0.3079},{"l":"H","x":1.8853,"y":2.1487997,"z":0.4477},{"l":"H","x":2.7472,"y":-1.9314001,"z":-0.485},{"l":"H","x":-4.3884,"y":-0.65880007,"z":-0.7504},{"l":"H","x":-4.0964003,"y":-0.8086,"z":0.9991},{"l":"H","x":-4.513,"y":0.7739,"z":0.2986}],"b":[{"b":8,"e":10},{"b":9,"e":11,"o":2},{"b":7,"e":12},{"b":11,"e":12},{"b":0,"e":7,"o":2},{"b":1,"e":7},{"b":0,"e":2},{"b":2,"e":8,"o":2},{"b":3,"e":8},{"b":1,"e":3,"o":2},{"b":4,"e":11},{"b":5,"e":10},{"b":6,"e":12},{"b":0,"e":13},{"b":1,"e":14},{"b":2,"e":15},{"b":3,"e":16},{"b":4,"e":17},{"b":4,"e":18},{"b":4,"e":19}]}}
             (this ended up NOT being used in the Jmol extension to ChemDoodle)
new feature: (JmolData) -iR (silent, restricted) mode sends output from PRINT and ECHO commands to SYSOUT
             and also restricts the application to no local file read/writing

bug fix: "connect;" command in states saved prior to 11.9.24 and then read by versions after that
         The order in which Jmol created bonds changed in 11.9.24. Due to this, Jmol must check for the
         version number of Jmol used to create a state, and if it was before this point, it must
         apply "legacy" autobonding methods. Unfortunately, if that state from pre-11.9.24 versions
         contains the "connect;" command, which it would if someone used the CONNECT command by itself
         to regenerate all bonds in a model PRIOR to saving the state (Proteopedia does this), then
         those scripts will be misread in versions 11.9.24-12.2.21/12.3.21.
bug fix: antialiasDisplay does not show drag-box properly
bug fix: SMARTS syntax [${xxx}n] and [${xxx}m-n] changed to [$n{xxx}] and [$m-n{xxx}] 
         to avoid conflict with specifying isotope 

=============================================================================

version=12.3.21

new feature: app flag -R restricts file access -- no local file reading; no writing, no logging
   // disables WRITE, LOAD file:/, set logFile 
   // command line -g and -w options ARE available for final writing of image
   // for use with headless operation
new feature: app flag -T <seconds> headless timeout delay for "exitJmol"
note: Headless operation with image creation works perfectly using JmolData.jar
    java -Djava.awt.headless=true -Xmx512m -jar "JmolData.jar" -RJ "load $tylenol;" -g1000x1000 -wJPG:t.jpg
    see also: http://leshazlewood.com/2009/08/26/linux-javaawtheadless-and-the-display-environment-variable/
   // determined by GraphicsEnvironment.isHeadless()
   //   from java -Djava.awt.headless=true
   // disables command threading
   // disables DELAY, TIMEOUT, PAUSE, LOOP, GOTO, SPIN <rate>, ANIMATION ON
   // turns SPIN <rate> <end> into just ROTATE <end>
new feature: JSpecView JCamp-MOL files can reference model="$xxxx" -- model retrieved from NCI

bug fix: PDB reader 
    and state scripts created with 12.1.51-12.2.20 and 12.3.0-12.3.20
    state scripts prior to those versions with multiple models
    and also select BOND commands will read the bond indexes incorrectly
    and, in addition, will assign proper CONECT links only to the last model 
bug fix:   if (....) # comment   fails
bug fix: Molden reader hack for bad Molden files with ** instead of atom number in [GTO] 
bug fix: headless creation of JPG fails
bug fix: spin .... 30    takes 30 to be number of degrees, not rate

version=12.3.20 -- skipped

=============================================================================

version=12.3.19

new feature: select baseModel for JSpecView
new feature; model {atomset} -- model of first atom in this set

bug fix: set dragSelected disallows popup menu
bug fix: MOPAC (PUBLIC DOMAIN) output reader can fail on reading vibrations
bug fix: Spartan 10 archives have .gz and .carc files. This fix adds .gz reading;
         work-around is that Spartan 10 allows saving of Archive without carc compression,
         which is a proprietary format. From Wavefunction:
         "If you want all files to use the "text" version, you can go to the
          Options->Preferences->X-Platform pane and make sure "Use Binary Archive" is unchecked."  
bug fix: rotateSelected of models that have had dots at one point retrieved from a state file fails
code: refactored org.jmol.g3d.[Normix3d,Shade3D] --> org.jmol.util.[Normix, Shader]
code: refactored org.jmol.geodesic.Geodesic --> org.jmol.util.Geodesic

bug fix: Jmol defaults not being loaded with startup option -n (no display)
bug fix: UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()
           failed for non-graphics system, and even though it is an exception, it
           isn't trapped by try/catch. 
bug fix: point() function does not accept 3x1 array
bug fix: show x where x is a matrix does not have ',' before tabs, so it can't be clipped directly
           back into Jmol
code: better coding for quaternions

=============================================================================

version=12.3.18

new feature: JSpecView reads and displays 2D spectra very quickly -- all
             tested JCamp-DX 6.0 files readable. -- JSpecView 2.0.10176

bug fix: allow for alternating list/hash entry:
  for example: print getproperty("jspecview","##TITLE")["items"][1]["spectra"][1]["id"]
  instead of:  print ((getproperty("jspecview","##TITLE")["items"][1])["spectra"][1])["id"]
bug fix: GaussianReader not reading "Natural Orbitals" section from  
         B3LYP 6-31g sp gfprint pop(full,NO)
bug fix: Jmol support for ZIP collection of JDX files read properly
bug fix: support for file reading with BOM UTF-8, UTF-16, or UTF-32
bug fix: script processor not recognizing UTF-8 Binary Order Mark at start of script
bug fix: (undocumented) POLYHEDRA {...} to {...} with COLOR or TRANSLUCENT fails
bug fix: POLYHEDRA command or COLOR POLYHEDRA can change selection
bug fix: PDB reader doesn't recognize 16 LINK records at start of file
bug fix: script xxxx(xxx)xxx/xx.xxx fails at "(" due to revision 16201 2011-10-02

=============================================================================

version=12.3.17

new feature: (JspecView 2.0.10033) new script commands (indicated with *)
 UNKNOWN("?"),
 APPLETID("APPLETID"),
 APPLETREADYCALLBACKFUNCTIONNAME("APPLETREADYCALLBACKFUNCTIONNAME"),
 AUTOINTEGRATE("AUTOINTEGRATE", "TF"),
 BACKGROUNDCOLOR("BACKGROUNDCOLOR", "C"),
*CLOSE("CLOSE", "spectrumId or fileName or ALL"),
 COMPOUNDMENUON("COMPOUNDMENUON", "TF"),
 COORDCALLBACKFUNCTIONNAME("COORDCALLBACKFUNCTIONNAME"),
 COORDINATESCOLOR("COORDINATESCOLOR", "C"),
 COORDINATESON("COORDINATESON", "TF"),
*DEBUG("DEBUG", "TF"),
 DISPLAYFONTNAME("DISPLAYFONTNAME", "fontName"),
 ENABLEZOOM("ENABLEZOOM", "TF"),
 ENDINDEX("ENDINDEX"),
*EXPORT("EXPORT", "[JPG,PNG,XY,...] \"filename\""), 
 GETSOLUTIONCOLOR("GETSOLUTIONCOLOR", ""),
 GRIDCOLOR("GRIDCOLOR", "C"),
 GRIDON("GRIDON", "TF"),
*INTEGRATE("INTEGRATE", ""),
 INTEGRALPLOTCOLOR("INTEGRALPLOTCOLOR"),
 INTEGRATIONRATIOS("INTEGRATIONRATIOS"),
 INTERFACE("INTERFACE"),
*IRMODE("IRMODE", "A or T or ?"),
*LABEL("LABEL", "x y [color and/or \"text\"]"),
*LOAD("LOAD", "[APPEND] \"fileName\""),
 MENUON("MENUON"),
 OBSCURE("OBSCURE"),
*OVERLAY("OVERLAY", "spectrumID, spectrumID, ..."),
 PEAKCALLBACKFUNCTIONNAME("PEAKCALLBACKFUNCTIONNAME"),
 PLOTAREACOLOR("PLOTAREACOLOR", "C"),
 PLOTCOLOR("PLOTCOLOR", "C"),
 PLOTCOLORS("PLOTCOLORS"),
 REVERSEPLOT("REVERSEPLOT", "TF"),
 SCALECOLOR("SCALECOLOR", "C"),
 SPECTRUM("SPECTRUM", "spectrumID"),
 SPECTRUMNUMBER("SPECTRUMNUMBER"),
 STARTINDEX("STARTINDEX"),
 SYNCCALLBACKFUNCTIONNAME("SYNCCALLBACKFUNCTIONNAME"),
 SYNCID("SYNCID"),
 TITLEBOLDON("TITLEBOLDON", "TF"),
 TITLECOLOR("TITLECOLOR", "C"),
 TITLEFONTNAME("TITLEFONTNAME", "fontName"),
 UNITSCOLOR("UNITSCOLOR", "C"),
 VERSION("VERSION"),
 XSCALEON("XSCALEON", "TF"),
 XUNITSON("XUNITSON", "TF"),
 YSCALEON("YSCALEON", "TF"),
 YUNITSON("YUNITSON", "TF"),
*ZOOM("ZOOM", "OUT or x1,x2");

new feature: allows simpler color scheme definition
   color property occupancy "myscheme=red green blue"
   Var x = ["red","green","blue"]; color property occupancy @{"myscheme=" + x}

bug fix: JCampDX reader resolving should allow spaces before "##TITLE" 
bug fix: jvxl issue when color PHASE and translucent
 -- upon reading JVXL doesn't handle translucency right
 -- upon writing SPT doesn't preserve colors
bug fix: user variable lower case "x" not cleared by "X = none"
bug fix: draw HELIX fails for residue numbers < 0
code: better Enum structure using name()

=============================================================================

version=12.3.16

new feature: (application) SYNC ON; sync * "JSpecView:..." sends commands to JSpecView
new feature: (JSpecView) accepts commands using public syncScript(script)
 
bug fix: GAMESS-US reader error reading NBOs
bug fix: print [2, 3, 4].mul([3,4,5]) fails
bug fix: missing ANISOU records cause file-read error in PDB files
bug fix: JCAMP-DX reading by JSpecView for tiered BLOCK files 

=============================================================================

version=12.3.15

new feature: JCAMP-DX file reading
 -- reading of ##$MODELS and ##$PEAKS (see http://chemapps.stolaf.edu/jmol/jspecview)
new feature: context menu Spectra submenu
new feature: JSpecView integration into Jmol application 
 -- if model/peak-enhanced JDX file is read, clicking on an atom or switching
    to an IR vibration or MS fragment displays the appropriately highlighted spectrum/fragment
new feature: sync ~ 'Select: xxx'
 -- xxx can include file="xxx" model="xxx" atoms="xxx" select="xxx" script="xxx"
 -- file and model combined as model ID "file#model"
 -- will automatically load the file if the given file#model ID is not found
 -- atoms = list of atom numbers separated by commas: 1,2,3 --> @1 or @2 or @3
 -- select is any valid selection such as THR or 1-30 
 -- automatically adds "visible &" to atoms or select 
 -- requires sync ON
new feature: NFF neutral file format reader (http://paulbourke.net/dataformats/nff/nff1.html)
             for electron microscopy data exported from IMOD
new feature: preliminary JCAMP-DX file reader, where <models></models> is present
new feature: when picking struts or delete bond or measure, distance shows as per usual measurement

bug fix: SLAB unit cell not showing all lines
bug fix: CRYSTAL reader needs to change to MOLECULAR when X(ANGSTROMS) found (fullerene slab)
bug fix: Popup Menu item hbond calculate should not require PDB

=============================================================================

version=12.3.14

bug fix: state after frame RANGE or frame 0 not saved properly (state saves "frame all" instead of "frame 0")
bug fix: frame n  does not work properly after load APPEND
bug fix: measurement units may appear as full word "nanometers" instead of "nm"
bug fix: user bindings do not access _atomPicked
 -- solution is to add _ATOM _BOND _POINT _OBJECT to user binding actions

=============================================================================

version=12.3.13

new feature: isosurface SCALE extends to volume file readers
new feature: zoom $isosurface1 0 -- scales to match isosurface boundbox

bug fix: getProperty("bondinfo",[{13}]) gets info for atom 13 instead of bond 13 
bug fix: isosurface offset does not change boundbox or zoom/center points
note to Bob: jpe needs update of img/blank.js  js/top_buttons.js htm1/quickvs.js,qv_msgs.js molview/JmolAppletSigned.jar

=============================================================================

version=12.3.12

bug fix: symmetry popup submenu not enabled
bug fix: show spacegroup not working
bug fix: lcaocartoon for allene central carbon py incorrect
bug fix: antialiasdisplay (and image writing) not compatible with scaleAngstromsPerInch
bug fix: last group of protein cartoon will not display if it is not helix and not sheet
bug fix: getproperty MENU does not work
bug fix: PDB reader of multiple-bond files with duplicated bonds does not ignore duplicate

=============================================================================

version=12.3.11

new feature: plot ramachandran -- now those points .phi and psi return values
-- load 1crn.pdb;plot ramachandran;print {2.1}.psi
new feature: LOAD .... filter "reverseModels"
 -- does just that
 -- for IRC calculation transition state -> minimum reversal
new feature: measures "2:%VALUE %UNITS//xx" 
 -- where xx is a specified unit such as nm or Angstroms
 -- overrides set measurementUnits
 -- fixes state problem when units or labels are changed after measurements are made
 -- operates on selected measurements only (or all, if no measurements are selected) 

bug fix: frame 0 during animation can cause exception
bug fix: changes in defaultDistanceLabel not always preserved in state correctly
bug fix: parameters can be set to invalid values using xxx = ... instead of set xxx ...
bug fix: (Application) proper Edit...Preferences dialog action

=============================================================================

version=12.3.10

new feature: _animTimeSec
new feature: Application -- press and hold animation next/prev button to continuously run animation
new feature: write PDB adds CONECT records 
 -- for all multiple bonding and all HETATM bonds
 -- uses CONECT i j j  to indicate multiple bonding
new feature: compare {from} {to} FRAME
 -- aligns frames automatically
 -- particularly nice for IRC calculation animations
 -- for example: compare {file=2} {1.1} FRAME
 -- can be followed by quaternion, atom, or SMILES options
 -- for example: compare {file=2} {1.1} FRAME ATOMS @1 @5  @2 @8  @3 @9
    (all of file 2 atoms moved) file 2 atoms 1,2,3 aligned 
     with file 1.1 atoms 5,8,9)
 -- if {to} is a subset of {from}, then FRAME is unnecessary,
    and if ATOMS is included, then just the list of alignment
    atoms is necessary. For example:
       compare {*} {1.1}
       compare {*} {1.1} atoms @1 @2 @3
 -- see http://chemapps.stolaf.edu/jmol/docs/examples-12/mp for more examples

bug fix: script @{x} fails
bug fix: Molecular Playground should allow for set allowGestures OFF to disallow swipe
bug fix: lcaoCartoon dual color p orbitals giving white for one lobe
new feature: set echo myecho SCALE 0.3 -- for image scaling
bug fix: after "ZAP; LOAD append"  show orientation will have incorrect zyz script  
bug fix: function call with @x or @1 in parameters fails
bug fix: PNGJ reading remote fails
bug fix: H5T should not be used as a lead atom ever, because of set showHydrogens FALSE
bug fix: adding H atoms to mol2 file faulty
bug fix: load xxx.png;write PNGJ xxx.png (to same file as loaded) fails 

=============================================================================

version=12.3.9

new feature: FRAME DELAY x.y 
 -- specific delay (in seconds) in animation at a given frame
 -- applies to all currently in-frame models
bug fix: set isKiosk should:
     (a) not be reversible
     (b) not allow file saves other than logging
     (c) not allow prompt dialogs
     (d) not allow console or popup menu or ScriptEditor 
bug fix: background colors saved to state can be off very slightly
bug fix: draw PLANE with three vertices problems after save -- four-atom planes, not three
bug fix: x = file("?") fails on Cancel
bug fix: delay not allowed within try{...}

=============================================================================

version=12.3.8

new feature: MolecularPlayground -- remote status and remote control
 -- see for example http://chemapps.stolaf.edu/jmol/mpstatus.php
 -- set topic, subtopic, delay from a web page
 -- set banner and image for website from Jmol
new feature: load("http://.....?POST?_PNG_") or load("http://....?POST?_PNGJ_")
 -- sends PNG or PNGJ image to server
 -- return value is whatever server is set up to send
 -- used by MolecularPlayground at St. Olaf to send current state to web server
new feature: polyhedra FULLYLIT -- useful for zeolites along with COLLAPSED
new feature: ZMATRIX upgraded to allow all forms of Gaussian input
 http://www.gaussian.com/g_tech/g_ur/c_zmat.htm

bug fix: set picking DRAW does not work on polygon sets
bug fix: set picking DRAW does not report position change
bug fix: MPJmolApp (Molecular Playground) problems when navigation is on
bug fix: CifReader (molecular type, with GEOM_BOND records) adds 
         extra atoms when embedded in JMOL or PNGJ file or part load FILES command
bug fix: PdbReader -- crystallographic non-PDB files not checking special positions

=============================================================================

version=12.3.7

new feature: "Write PNG+JMOL" added to application and signed applet menu
code: dispensing with InputStream in favor of BufferedInputStream
new feature: write PNGJ
 -- creates a PNG file with appended JMOL (zip) data containing
    all necessary files, MANIFEST, and script file.
 -- viewable in directories as an "icon" and readable by image readers
 -- draggable back into Jmol and readable using LOAD 
 -- PNG file includes:
   -- iTXt field "Jmol Type\0PNGJxxxxxxxxx+yyyyyyyyy"
       where xxxxxxxxx is a pointer to the ZIP data
             yyyyyyyyy is the number of ZIP data bytes
   -- iTXt field "Software\0Jmol 12.3.7  2011-10-11 15:30"
   -- iTXt field "Creation Time\0Tue, 24 Nov 2011 19:56:10 -0600"
   -- yyyyyyyyy bytes of .JMOL zip data 
 -- show FILE "xxx.PNG" will show list of contained files.
 -- show state FILE "xxx.PNG" will extract state
 -- show FILE "xxx.PNG|1crn.pdb" for example will extract file
 
new feature: simple Z-Matrix reader 
 -- invoked by ZMATRIX:: or file starting with #ZMATRIX
 -- lines starting with # are comments, which can contain jmolscript:
 -- blank lines are ignored

 #ZMATRIX -- methane
 C
 H   1 1.089000     
 H   1 1.089000  2  109.4710      
 H   1 1.089000  2  109.4710  3  120.0000   
 H   1 1.089000  2  109.4710  3 -120.0000
 
 -- allows bond order specification
 
 #ZMATRIX -- CO2 
 C
 O   1 1.3000                 2     
 O   1 1.3000    2  180       2      
 
 -- any position number may be replaced by a unique atom name, with number:
 
 #ZMATRIX -- CO2
 C1
 O1   C1 1.3000                2     
 O2   C1 1.3000    O1  180     2      
 
 -- allows for dummy atoms Xn, allowing for positioning:
 
 #ZMATRIX -- CO2
 X1
 X2   X1 1.0
 C1   X1 1.0       X2 90
 O1   C1 1.3000    X2 90   X1 0  2     
 O2   C1 1.3000    O1 180  X2 0  2      
 
 -- negative distance indicates that the second angle is a normal angle, not a dihedral
 
 #ZMATRIX -- NH3 (using simple angles only)
 N1 
 H1 N1 1.0
 H2 N1 1.0 H1 107  
 H3 N1 -1.0 H1 107 H2 107
 
 -- negative distance and one negative angle reverses the chirality
 
 #ZMATRIX -- NH3 (using simple angles only; reversed chirality)
 N1 
 H1 N1 1.0
 H2 N1 1.0 H1 107  
 H3 N1 -1.0 H1 -107 H2 107
 
 
 -- symbolics may be used -- they may be listed first or last
 
 #ZMATRIX
 
 dist 1.0
 angle 107
 
 N1 
 H1 N1 dist
 H2 N1 dist H1 angle 
 H3 N1 -dist H1 angle H2 angle
 
 -- If #ZMATRIX is not the start of the file, MOPAC style is assumed.
    The first two lines will be considered to be comments and ignored:
 
  AM1
 Ethane
  
 C
 C     1     r21
 H     2     r32       1     a321
 H     2     r32       1     a321      3  d4213
 H     2     r32       1     a321      3 -d4213
 H     1     r32       2     a321      3   60.
 H     1     r32       2     a321      3  180.
 H     1     r32       2     a321      3  d300
 
 r21        1.5
 r32        1.1
 a321     109.5
 d4213    120.0
 d300     300.0

bug fix: show orientation shows incorrect zyz format if reset uses file-based orientation matrix (smol, Sygress)
bug fix: isosurface plane xy map mep
code: MPJmolApp work
bug fix: user variables should not be rest by INITIALIZE in an spt file
bug fix: x3d/vrml outputting unnecessary spheres
 -- bond caps within opaque atoms removed (not precisely correct to do that)
bug fix: minimization broken
bug fix: contact still not quite right -- setting default to +0.0 instead of +0.25


=============================================================================

version=12.3.6

new feature: load files "xxx.tlsout" "xxxx.pdb"
 -- loads REFMAC-style TLS data into xxxx.pdb 

new feature: contact SASURFACE <radius>
 -- ignores solvent (as does CAP)

bug fix: contact command hbond/clash cutoff not sensitive to H-O/N vs O/N-O/N
 -- set to -1.2 for H-N/O, -1.0 for N/O-N/O
bug fix: contact command default probe radius should be 0.0 except for VDW (0.25) 

bug fix: minimize constraint CLEAR  broken
bug fix: constraints not reported in show minimization
bug fix: set measures off broken
bug fix: contact color density broken
bug fix: contact volume report not correct for color density
bug fix: MO HOMO not set properly when using LUMO = "lowest E > 0" (GAMESS-US reader)
bug fix: zSlab settings not stored properly in parameters; should have default zSlab = 50

=============================================================================

version=12.3.5

new feature: color isosurface PHASE color1 color2
 -- allows post-isosurface creation coloring by phase (atomicOrbitals)
bug fix: isosurface scale 0.5 plane... broken if no atoms present
bug fix: isosurface color density broken
bug fix: set PdbAddHydrogens does not transfer C atomSymmetry to H atoms
bug fix: contact() function not working when typed from console
bug fix: set axesOrientationRasmol not working properly (since 11.5.51)

code: org.jmol.modelsetbio.BioModel localizes more bio-only code into modelsetbio package
code: removal of org.jmol.modelset.Polymer
code: refactoring and organizing RepaintManager and ShapeManager

=============================================================================

version=12.3.4

bug fix: frame x.y - y.z not working 
bug fix: with antialiasDisplay, dragMolecule goes 1/2 speed of cursor
bug fix: nucleic acid residues with HO5' may render last group strangely (since 12.0.RC16, 6/6/2010)
bug fix: workaround for weird Mac Point3i(Point3i pt) class initializer bug
bug fix: array.bin(low,high,binSize) not documented and can cause exception
bug fix: MO readers can fail if inappropriate filter "TLS" is given
bug fix: PDB TLS error reading TLS data missing "NUMBER OF COMPONENTS" line

=============================================================================

version=12.3.3

new feature: ellipsoid SET 1; ellipsoid SET 2;
 -- TLS ellipsoids are dual 
 -- TLS-S is SET 1; TLS-T is SET 2
 -- after issuing this command, further size or color commands affect only that set
 -- needs verification by Ethan Merrit
new feature: load xxx.pdb filter "TLS" -- loads TLS data
new feature: atom property property_tlsGroup
new feature: MolecularPlayground now accepts messages to the banner:
  message banner: xxxxxxx
new feature: MolecularPlayground fully functional. 
             This application (MPJmolApp) is part of a three-part suite 
             that runs on a Mac mini involving:
                "Hub" [name]   for overall control (Mac app; not open source yet)
                MPKinectDriver for obtaining motion events (Mac app; not open source yet)
                MPJmolApp      for displaying the results (source here)
             The Hub and MPJmolApp communicate over local port 31416, sending 
             JSON messages back and forth. (See note in org.jmol.app.jsonkiosk.JsonNioService.java)
             For demonstrations of the installation at St. Olaf College,
             see the following YouTube videos:
                http://www.youtube.com/watch?v=iQRkuku8ry0
                http://www.youtube.com/watch?v=XCRrRZe1j6g
                http://www.youtube.com/watch?v=FTTIVWGtFD0
             For details relating to the original Molecular Playground
             installation at U. Mass.-Amherst, see
                http://molecularPlayground.org
             Note that all of the functionality of the original MP are
             present in MPJmolApp 
new feature: MolecularPLayground can now ignore all Hub requests for
             commands and content changes, thus allowing its own configuration
             script to drive the presentation instead of the Hub's. So the Hub
             can be used simply as an interface to the Kinect driver. This just
             allows a simpler development interface -- a simple three-column Excel file can
             be used to drive a presentation. (see org.jmol.molecularplayground.biophysics.xlsx)
 -- MPJmolApp looks for the file MpJmolAppConfig.spt
 -- This file can override MPJmolApp's default parameters:
         NIOContentPath 
           -- default: System.getProperty("user.dir").replace('\\', '/') 
                           + "/Content-Cache/%ID%/%ID%.json"
           -- ignored if NIOcontentDisabled ends up true (see below)
         NIOterminatorMessage
           -- default: "MP_DONE"
         NIObannerEnabled
           -- default: true
         NIOcontentScript
           -- default: (not present, setting NIOcontentDisabled=false)
         NIOcontentDisabled
           -- default: true if NIOcontentScript is present; false if not
         NIOmotionDisabled
           -- default: false
 -- The script in MpJmolAppConfig.spt is run, along with whatever
     default settings are generated by the above checks.
 -- Parameters are set by querying the Viewer for those Jmol variables. 
 -- If NIOcontentDisabled is true, then all JSON messages from the Hub
     of types "content", "command", and "banner" are ignored. It is still
     important that the running script send "MP_DONE" messages periodically
     (within every 6 minutes) so that the Hub knows that MPJmolApp is still
     alive and does not try to restart it.
 -- If NIOmotionDisabled is true, then all JSON messages from the Hub
     of types "move", "sync", and "touch" are ignored. 
 -- These are checked every time a JSON command is received, so the
     running script can specifically turn off motion detection if that
     or content detection if that is desired.
 -- Note that MPJmolApp has a full console and menu that are available
     on the operator's screen, (which is just mirrored to the projector).
     This allows for parameter setting and adjustments on the fly.

new feature: show NMR
 -- predicted NMR spectrum
 -- uses http://www.nmrdb.org/predictor?smiles=xxxx
 -- requires NCI SMILES due to bug at nmrdb not allowing "." 

bug fix: CRYSTAL reader not properly setting model properties
bug fix: userFunction(x,@y) should operate as per all math 
 -- parens - value of variable pointed to by y
 -- x = myfunc(x, @y) same action as just myfunc(x, @y)
bug fix: userFunction x @y  
 -- no parens - should operate as value of x and value of y
 -- @ is unnecessary but allowed
bug fix: set echo "myecho" [10 10%] not working
bug fix: apiPlatform not correctly accessed in JpegEncoder
bug fix: reading of JVXL files for color density fails to color properly
bug fix: .... vdw 100.0% --- should be OK with float there, even if it rounds.

code: refactored for Molecular Playground and Jmol Android 
 -- several System.out. messages present.
code: refactoring adapter XML readers

=============================================================================

version=12.3.2

new feature: compare("XXX","XXXX","ISOMER") comparison now includes "AMBIGUOUS STEREOCHEMISTRY!"
new feature: show chemical XXXXX  where XXXXX is any NCI Cactus information token:
  stdinchikey			Standard InChIKey	
  stdinchi				Standard InChI	
  smiles					SMILES	
  ficts						FICTS Identifier	
  ficus						FICuS Identifier	
  uuuuu						uuuuu Identifier	
  hashisy					Cactvs HASHISY	
  sdf							SD File	
  names						Names	
  iupac_name			IUPAC Name	
  cas							CAS Registry Number(s)	
  chemspider_id		ChemSpider ID	
  mw							Molecular Weight	
  formula					Chemical Formula	
  h_bond_donor_count	      Number of Hydrogen Bond Donors	
  h_bond_acceptor_count	    Number of Hydrogen Bond Acceptors	
  h_bond_center_count	      Number of Hydrogen Bond Acceptors and Donors	
  rule_of_5_violation_count	Number of Rule of 5 Violations	
  rotor_count	              Number of Freely Rotatable Bonds	
  effective_rotor_count	    Number of Effectively Rotatable Bonds	
  ring_count	              Number of Rings	
  ringsys_count	            Number of Ring Systems	

bug fix: array.bin(low,high,binSize) not documented and can cause exception
new feature: PQR write option
bug fix: load append twice can cause zap to be in wrong place in state file
bug fix: for (x IN {*}) ... makes x a bitset and leads to array[1] for x.atomName
bug fix: for (x IN {*}.bonds) does not work
bug fix: POV-Ray export of cartoons broken
bug fix: script javascript:xxxx()  broken
new feature: set vectorSymmetry -- displays vibration vectors as double-ended arrows.
bug fix: SMILES comparison when the number of stereocenters is not the same is wrong
code: popup/ModelKit refactoring to isolate awt/Swing references
bug fix: connection deletion removes all measurements -- can't imagine why...
code: JmolModelKitInterface part of apiPlatform call
code: JmolPromptInterface replaced with apiPlatform call

=============================================================================

version=12.3.1

new feature: CASTEP reader (take 2)
 -- reads Mulliken files by default, Hirshfield with filter "CHARGE=HIRSH"
 -- reads spins into {*}.property_spin. label is %[property_spin]
 -- reads Born charge tensors as atom ellipsoids

bug fix: H2,H3 connected to terminal N of protein not backbone
bug fix: select PROTEIN selects non-PDB atoms
bug fix: Molden reader does not read "Sym=X" (missing space after '=')
bug fix: Molden reader does not read angstrom units
bug fix: color isosurface {atomset} <color>  does not work if isosurface has not already been mapped.
bug fix: PDB reader not reading Rasmol-style files with multiple bonding
 CONECT   1  2  2
   or
 CONECT   1  2      
 CONECT   1  2 
    means for Rasmol double bond between atoms 1 and 2

code: experimenting with fragmentation of applet core classes into _1b, _1c, _1d, _1e, _1f

version=12.3.0

October 4, 2011


======================================

some feature notes:


bug fix: var firstPARAM  = "p1_b"; x = [FIRSTParam: "p1_a"]; results in lowering of case as [firstparam:....]
bug fix: set drawPicking draw;set drawpicking  does not show handles
bug fix; point group not calculated when the selected atoms are a subset of a model
bug fix: x.find("SMILES") is incorrect for structures that have hypervalent atoms and branches such as inorganic nitrates
bug fix: msCIF reading with two models, and only one has displacement modulation causes "render error" crash
bug fix: msCIF reader failing for Legendre polynomials of order greater than 4
bug fix: DRAW for quadrilateral broken when perspective depth is turned off.
bug fix: SET ECHO IMAGE broken in JavaScript version


feature note: Jmol 14.5.2

FEATURE NOTE: Prior to this version if the MO command was issued after use of 
              rotateSelected, the orbitals were calculated improperly, because the
              basis functions always must be applied for the original file coordinate
              frame, not the rotated frame. In addition, if MOs were calculated prior to
              use of rotateSelected or translateSelected, then they would not "track"
              with the modified atom positions. So MOs and rotate/translateSelected
              were completely incompatible. Jmol 14.4.2 fixes this issue. It should be 
              possible now to produce correct MOs before or after use of rotateSelected.
              Note that ALL atoms in a specified model must be moved in order for this
              tracking of MOs to take place. This functionality was introduced in 
              14.4.1_2016.01.28, but that version (never released) does not properly 
              check to see that ALL the atoms in a model have been involved in the rotation.  
              
FEATURE NOTE: If rotateSelected or translateSelected is used to move all atoms in a
              model, and after that the state is saved, then Jmol 14.4.2 
              will save a state that is not readable in 14.4.1. This is necessary
              because of the added FRAME ORIENTATION command, which is used in the states
              to indicate the relationship of a model to its file coordinates. The MO
              reader requires this so that it can rotate the coordinates back to their 
              original position prior to doing its calculation. 
              
FEATURE NOTE: Jmol 14.5.4 now has a RELATIVELY COMPLETE set of analysis and visualization  
  tools for space group symmetry. All  standard and magnetic space group operations 
  are covered. Features are concentrated in four command options and one function:
  
  LOAD .... SPACEGROUP .... UNITCELL ....
  SHOW SYMOP ....
  DRAW SYMOP ....
  DRAW POINTGROUP SPACEGROUP
  x = symop(....)
  
  With these features, you can:
  
   -- load any model while applying any actual or conceivable space group or subset of a space group
   -- tabulate all space group operations associated with that model
   -- retrieve an associative array indicating all aspects of the operation, including
      point, rotation axis, plane, glide vector, lattice offset vector, and 4x4 matrix
   -- visualize all aspects of an operation, including proper and improper rotations
      inversion centers, mirror planes, glide planes, translations, and magnetic spin time reversal                      
   -- apply any operation to any atom or any point in space
   -- given any combination of two atoms or two points in space, determine and/or 
      depict the operation(s) that relate those to atoms or positions
 


feature note: Jmol 14.3 introduces several very powerful and very different capabilities 
              to Jmol in the area of crystallography. Many of these features are nonexistent
              in other programs.  They involve:
              
  - an extension of SMILES to compare bonding topology irrespective of atom identity. 
    (Are these two atom environments both iscoahedral?)
    
      x = {@1 and 1.1 and connected(@1)}.find("SMILES", "*"}
      y = {2.1}.find("SMARTS", x)
  
  - the generation of polyhedra in crystal structures for which only the central atom
    may be loaded. 
    (What is the atom environment around Au3 in this crystal structure?)
    
      load t.cif  // just the unit cell, maybe just one atom even
      polyhedra 4-12 UNITECELL @1
  
  - the ability to load a given block of space (such as a 10x10x10-Angstrom cube)
    with a crystal structure irrespective of its given unit cell. 
    (Are these two structures that have totally different unit cells really that different?)
    
      load t.cif FILL
      load t.cif FILL 20
      load t.cif FILL {20 10 10}
      load t.cif FILL [{0 0 0} {5.2 5.2 0} {-5.2 5.5 0} {1.3 0 3.3}]
           
  - the ability to show and draw the point group of a polyhedron
  
      load t.cif
      polyhedron 12 unitcell @1
      select @1
      show pointgroup POLYHEDRON
      draw pointgroup POLYHEDRON
      
  - the ability to extract information about polyhedra
  
    print getProperty("shapeInfo.polyhedra[1]").keys

		_ipt
		center
		modelIndex
		planeCount
		polygons
		vertexCount
		vertices

  - the ability to select polyhedra
  
		select polyhedra
		select polyhedra(4)
		
		print polyhedra()
		print polyhedra(4)
		

  - the ability to draw points from derived arrays
  	      
    draw diameter 0.2 points @{getProperty("shapeInfo.polyhedra[1].vertices")}
       

Jmol 14.3.15

new feature: MACRO command
 -- runs predefined script, generally defining new functions of general use
 -- contributions welcome!
 -- will be expanded
 
		$ macro aflow
		running http://aflowlib.mems.duke.edu/users/jmolers/jmol/spt/AFLOW.spt
		aflowLoad(binaryAlloy) loaded
		aflowBinaries loaded
		aflowDualArray(binaryAlloy, a, b) loaded
		aflowDualWrite loaded
		aflowConvexHull(binaryAlloy) loaded
		aflowCheckBinary(binaryAlloy) loaded
		aflowGetPG(binaryAlloy, a, range1, range2,radius) loaded
		$ aflowLoad("AgAu")
		294 models

		$ print aflowConvexHull
		  {
		    "Cb"  :  0.0
		    "Hf_eV_VASP"  :  0.0
		    "modelNumber"  :  2
		   }
		  {
		    "Cb"  :  0.25
		    "Hf_eV_VASP"  :  -0.0472733
		    "modelNumber"  :  26
		   }
		  {
		    "Cb"  :  0.5
		    "Hf_eV_VASP"  :  -0.085589
		    "modelNumber"  :  180
		   }
		  {
		    "Cb"  :  0.75
		    "Hf_eV_VASP"  :  -0.0463823
		    "modelNumber"  :  25
		   }
		  {
		    "Cb"  :  1.0
		    "Hf_eV_VASP"  :  0.0
		    "modelNumber"  :  260
		   }






