anchor.diff:  
         return result;
       }
  -    catch( any cfcatch )
  -    {
  -      return handleError( cfcatch );
  -    }
  -  }
  -
  -  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -  public any function signXML( required string strToSign )
  -  {
  -    try
  -    {
  -      var XMLSignatureFactory      = createObject( "java", "javax.xml.crypto.dsig.XMLSignatureFactory" );
  -      var DigestMethod             = createObject( "java", "javax.xml.crypto.dsig.DigestMethod" );
  -      var TransformService         = createObject( "java", "javax.xml.crypto.dsig.TransformService" );
  -      var DOMTransform             = createObject( "java", "org.jcp.xml.dsig.internal.dom.DOMTransform" );
  -      var DocumentBuilderFactory   = createObject( "java", "javax.xml.parsers.DocumentBuilderFactory" );
  -      var CanonicalizationMethod   = createObject( "java", "javax.xml.crypto.dsig.CanonicalizationMethod" );
  -      var C14NMethodParameterSpec  = createObject( "java", "javax.xml.crypto.dsig.spec.C14NMethodParameterSpec" );
  -      var InputSource              = createObject( "java", "org.xml.sax.InputSource" );
  -      var StringReader             = createObject( "java", "java.io.StringReader" );
  -      var PKCS8EncodedKeySpec      = createObject( "java", "java.security.spec.PKCS8EncodedKeySpec" );
  -      var KeyFactory               = createObject( "java", "java.security.KeyFactory" ).getInstance( "RSA" );
  -      var DOMSignContext           = createObject( "java", "javax.xml.crypto.dsig.dom.DOMSignContext" );
  -      var DOMSource                = createObject( "java", "javax.xml.transform.dom.DOMSource" );
  -      var TransformerFactory       = createObject( "java", "javax.xml.transform.TransformerFactory" );
  -      var Transformer              = createObject( "java", "javax.xml.transform.Transformer" );
  -      var StringWriter             = createObject( "java", "java.io.StringWriter" ).init();
  -      var StreamResult             = createObject( "java", "javax.xml.transform.stream.StreamResult" );
  -      var DOMStructure             = createObject( "java", "javax.xml.crypto.dom.DOMStructure" );
  -      var KeyStore                 = createObject( "java", "java.security.KeyStore" );
  -      var PasswordProtection       = createObject( "java", "java.security.KeyStore$PasswordProtection" ).init( getKSPassword().toCharArray());
  -      var FileInputStream          = createObject( "java", "java.io.FileInputStream" );
  -
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -      /* ~~ Signature creation: Step 1                                  ~~ */
  -      /* ~~ Is now done in a java file compiled at runtime              ~~ */
  -      /* ~~ idealcrypto.class                                           ~~ */
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -      var facObj = variables.idealcrypto.init();
  -      var fac = facObj.fac;
  -      var signedInfo = facObj.signedInfo;
  -
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -      /* ~~ Signature creation: Step 2                                  ~~ */
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -
  -      /* Load the KeyStore and get the signing key and certificate. */
  -      var ksfile = FileInputStream.init( getKSFile());
  -      var ks = KeyStore.getInstance( "JKS" );
  -      ks.load( ksfile, getKSPassword().toCharArray());
  -      var keyEntry = ks.getEntry( getKSAlias(), PasswordProtection );
  -      var cert = keyEntry.getCertificate();
  -      ksfile.close();
  -
  -      /* Create the KeyInfo containing the X509Data. */
  -      var kif = fac.getKeyInfoFactory();
  -      var keyInfo = kif.newKeyInfo([kif.newKeyName( createSHA1Fingerprint( cert ))]);
  -
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -      /* ~~ Signature creation: Step 3                                  ~~ */
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -
  -      /* Instantiate the document to be signed. */
  -      var dbf_i = DocumentBuilderFactory.newInstance();
  -      dbf_i.setNamespaceAware( true );
  -      var doc = dbf_i.newDocumentBuilder().parse( InputSource.init( StringReader.init( strToSign )));
  -
  -      /* Create a DOMSignContext and specify the RSA PrivateKey and location of
  -            the resulting XMLSignature's parent element. */
  -      var dsc = DOMSignContext.init( keyEntry.getPrivateKey(), doc.getDocumentElement());
  -
  -      /* Create the XMLSignature, but don't sign it yet. */
  -      var signature = fac.newXMLSignature( signedInfo, keyInfo );
  -
  -      /* Marshal, generate, and sign the enveloped signature. */
  -      signature.sign( dsc );
  -
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -      /* ~~ Signature creation: Step 4                                  ~~ */
  -      /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -      /* Output the resulting document. */
  -
  -      var xmlResult = StreamResult.init( StringWriter );
  -      var ds = DOMSource.init( doc );
  -      var tf = TransformerFactory.newInstance();
  -      var trans = tf.newTransformer();
  -      trans.transform( ds, xmlResult );
  -
  -      return StringWriter.toString();
  -    }
  -    catch( any cfcatch )
  -    {
  -      return handleError( cfcatch );
  -    }
  -  }
  -
  -  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -  public string function getFormattedTimestamp()
  -  {
  -    try
  -    {
  -      var timestamp = dateConvert( "local2utc", getTimestamp());
  +    catch( Any cfcatch )
  +    {
  +      return handleError( cfcatch );
  +    }
  +  }
  +
  +  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  +  /**
  +   * @return  String  Returns the timestamp property properly formatted (YYYY-mm-ddTHH:mm:ssZ)
  +   */
  +  private String function getFormattedTimestamp()
  +  {
  +    try
  +    {
  +      var timestamp=dateConvert( "local2utc", getTimestamp());
         return dateFormat( timestamp, "yyyy-mm-dd" ) & "T" & timeFormat( timestamp, "HH:mm:ss.l" ) & "Z";
       }
  -    catch( any cfcatch )
  -    {
  -      return handleError( cfcatch );
  -    }
  -  }
  -
  -  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -  public string function createSHA1Fingerprint( required any cert )
  -  {
  -    try
  -    {
  -      var sha1Md = createObject( "java", "java.security.MessageDigest" ).getInstance( "SHA-1" );
  +    catch( Any cfcatch )
  +    {
  +      return handleError( cfcatch );
  +    }
  +  }
  +
  +  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  +  /**
  +   * @return  String  Returns a SHA-1 fingerprint of the supplied certificate.
  +   */
  +  private String function createSHA1Fingerprint( required Any cert )
  +  {
  +    try
  +    {
  +      var sha1Md=createObject( "java", "java.security.MessageDigest" ).getInstance( "SHA-1" );
         sha1Md.update( cert.getEncoded());
   
         return uCase( binaryEncode( sha1Md.digest(), 'hex' ));
       }
  -    catch( any cfcatch )
  -    {
  -      return handleError( cfcatch );
  -    }
  -  }
  -
  -  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  -  public void function getFingerprint()
  -  {
  -    try
  -    {
  -      var jFileInputStream = createObject( "java", "java.io.FileInputStream" );
  -      var jKeyStore = createObject( "java", "java.security.KeyStore" );
  -      var jPasswordProtection = createObject( "java", "java.security.KeyStore$PasswordProtection" );
  -
  -      var ks = jKeyStore.getInstance( "JKS" );
  -      ks.load( jFileInputStream.init( getKSFile()), getKSPassword().toCharArray());
  -
  -      var keyEntry = ks.getEntry( getKSAlias(), jPasswordProtection.init( getKSPassword().toCharArray()));
  -
  -      return createSHA1Fingerprint( keyEntry.getCertificate());
  -    }
  -    catch( any cfcatch )
  -    {
  -      return handleError( cfcatch );
  -    }
  -  }
  -
  -  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  -   indentXml pretty-prints XML and XML-like markup without requiring valid XML.
  -
  -   @param   xml     XML     string to format. (Required)
  -   @param   indent  String  The string to use for indenting (default is two spaces).
  -   @return  Returns a string.
  -   @author  Barney Boisvert (&#98;&#98;&#111;&#105;&#115;&#118;&#101;&#114;&#116;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;)
  -   @version 2, July 30, 2010
  -  */
  -  public string function indentXml( required string xml, string indent="  " )
  -  {
  -    try
  -    {
  -      var lines = [];
  -      var depth = 0;
  -      var line = "";
  -      var isCDATAStart = false;
  -      var isCDATAEnd = false;
  -      var isEndTag = false;
  -      var isSelfClose = false;
  -
  -      xml = trim( REReplace( xml, "(^|>)\s*(<|$)", "\1#chr(10)#\2", "all" ));
  -      lines = listToArray( xml, chr( 10 ));
  +    catch( Any cfcatch )
  +    {
  +      return handleError( cfcatch );
  +    }
  +  }
  +
  +  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  +  /**
  +   * indentXml pretty-prints XML and XML-like markup without requiring valid XML.
  +   * @param   xml     XML     String to format. (Required)
  +   * @param   indent  String  The String to use for indenting (default is two spaces).
  +   * @return  Returns a String.
  +   * @author  Barney Boisvert
  +   * @version 2, July 30, 2010
  +   * @version 3, April 28, 2015 Mingo Hagen
  +   */
  +  private String function indentXml( required String xml, String indent="  " )
  +  {
  +    try
  +    {
  +      var lines=[];
  +      var depth=0;
  +      var line="";
  +      var isCDATAStart=false;
  +      var isCDATAEnd=false;
  +      var isEndTag=false;
  +      var isSelfClose=false;
  +
  +      xml=trim( REReplace( xml, "(^|>)\s*(<|$)", "\1#chr(10)#\2", "all" ));
  +      lines=listToArray( xml, chr( 10 ));
   
         for( var i=1; i lte arrayLen( lines ); i++ )
         {
  -        line = trim( lines[i]);
  -        isCDATAStart = left( line, 9 ) EQ "<![CDATA[";
  -        isCDATAEnd = right( line, 3 ) EQ "]]>";
  +        line=trim( lines[i]);
  +        isCDATAStart=left( line, 9 ) EQ "<![CDATA[";
  +        isCDATAEnd=right( line, 3 ) EQ "]]>";
   
           if( NOT isCDATAStart AND NOT isCDATAEnd AND left( line, 1 ) EQ "<" AND right( line, 1 ) EQ ">" )
           {
  -          isEndTag = left( line, 2 ) EQ "</";
  -          isSelfClose = right( line, 2 ) EQ "/>" OR REFindNoCase( "<([a-z0-9_-]*).*</\1>", line );
  +          isEndTag=left( line, 2 ) EQ "</";
  +          isSelfClose=right( line, 2 ) EQ "/>" OR REFindNoCase( "<([a-z0-9_-]*).*</\1>", line );
   
             if( isEndTag )
             {
               /* use max for safety against multi-line open tags */
  -            depth = max( 0, depth-1 );
  -          }
  -
  -          lines[i] = repeatString( indent, depth ) & line;
  +            depth=max( 0, depth-1 );
  +          }
  +
  +          lines[i]=repeatString( indent, depth ) & line;
   
             if( NOT isEndTag AND NOT isSelfClose )
             {
  -            depth = depth + 1;
  +            depth=depth + 1;
             }
           }
           else if( isCDATAStart )
  
positive.code:       abort;
      }
  
      writeLog( text = "#error.message#, #error.detail#",
                type = "Error",
                file = getDebugLog());
  
      var mailService = new mail();
          mailService.setTo( getDebugEmail() );
          mailService.setFrom( getDebugEmail() );
          mailService.setType( "HTML" );
  
negative.code:             we don't indent CDATA ends, because that would change the
              content of the CDATA, which isn't desirable
            */
            lines[i]=repeatString( indent, depth ) & line;
          }
        }
  
        return arrayToList( lines, chr( 10 ));
      }
      catch( Any cfcatch )
      {
        return handleError( cfcatch );
      }
  