| ;(function (root, factory) { | 
|     if (typeof exports === "object") { | 
|         // CommonJS | 
|         module.exports = exports = factory(); | 
|     } | 
|     else if (typeof define === "function" && define.amd) { | 
|         // AMD | 
|         define([], factory); | 
|     } | 
|     else { | 
|         // Global (browser) | 
|         root.CryptoJS = factory(); | 
|     } | 
| }(this, function () { | 
|   | 
|     /*globals window, global, require*/ | 
|   | 
|     /** | 
|      * CryptoJS core components. | 
|      */ | 
|     var CryptoJS = CryptoJS || (function (Math, undefined) { | 
|   | 
|         var crypto; | 
|   | 
|         // Native crypto from window (Browser) | 
|         if (typeof window !== 'undefined' && window.crypto) { | 
|             crypto = window.crypto; | 
|         } | 
|   | 
|         // Native crypto in web worker (Browser) | 
|         if (typeof self !== 'undefined' && self.crypto) { | 
|             crypto = self.crypto; | 
|         } | 
|   | 
|         // Native crypto from worker | 
|         if (typeof globalThis !== 'undefined' && globalThis.crypto) { | 
|             crypto = globalThis.crypto; | 
|         } | 
|   | 
|         // Native (experimental IE 11) crypto from window (Browser) | 
|         if (!crypto && typeof window !== 'undefined' && window.msCrypto) { | 
|             crypto = window.msCrypto; | 
|         } | 
|   | 
|         // Native crypto from global (NodeJS) | 
|         if (!crypto && typeof global !== 'undefined' && global.crypto) { | 
|             crypto = global.crypto; | 
|         } | 
|   | 
|         // Native crypto import via require (NodeJS) | 
|         if (!crypto && typeof require === 'function') { | 
|             try { | 
|                 crypto = require('crypto'); | 
|             } catch (err) {} | 
|         } | 
|   | 
|         /* | 
|          * Cryptographically secure pseudorandom number generator | 
|          * | 
|          * As Math.random() is cryptographically not safe to use | 
|          */ | 
|         var cryptoSecureRandomInt = function () { | 
|             if (crypto) { | 
|                 // Use getRandomValues method (Browser) | 
|                 if (typeof crypto.getRandomValues === 'function') { | 
|                     try { | 
|                         return crypto.getRandomValues(new Uint32Array(1))[0]; | 
|                     } catch (err) {} | 
|                 } | 
|   | 
|                 // Use randomBytes method (NodeJS) | 
|                 if (typeof crypto.randomBytes === 'function') { | 
|                     try { | 
|                         return crypto.randomBytes(4).readInt32LE(); | 
|                     } catch (err) {} | 
|                 } | 
|             } | 
|   | 
|             throw new Error('Native crypto module could not be used to get secure random number.'); | 
|         }; | 
|   | 
|         /* | 
|          * Local polyfill of Object.create | 
|   | 
|          */ | 
|         var create = Object.create || (function () { | 
|             function F() {} | 
|   | 
|             return function (obj) { | 
|                 var subtype; | 
|   | 
|                 F.prototype = obj; | 
|   | 
|                 subtype = new F(); | 
|   | 
|                 F.prototype = null; | 
|   | 
|                 return subtype; | 
|             }; | 
|         }()); | 
|   | 
|         /** | 
|          * CryptoJS namespace. | 
|          */ | 
|         var C = {}; | 
|   | 
|         /** | 
|          * Library namespace. | 
|          */ | 
|         var C_lib = C.lib = {}; | 
|   | 
|         /** | 
|          * Base object for prototypal inheritance. | 
|          */ | 
|         var Base = C_lib.Base = (function () { | 
|   | 
|   | 
|             return { | 
|                 /** | 
|                  * Creates a new object that inherits from this object. | 
|                  * | 
|                  * @param {Object} overrides Properties to copy into the new object. | 
|                  * | 
|                  * @return {Object} The new object. | 
|                  * | 
|                  * @static | 
|                  * | 
|                  * @example | 
|                  * | 
|                  *     var MyType = CryptoJS.lib.Base.extend({ | 
|                  *         field: 'value', | 
|                  * | 
|                  *         method: function () { | 
|                  *         } | 
|                  *     }); | 
|                  */ | 
|                 extend: function (overrides) { | 
|                     // Spawn | 
|                     var subtype = create(this); | 
|   | 
|                     // Augment | 
|                     if (overrides) { | 
|                         subtype.mixIn(overrides); | 
|                     } | 
|   | 
|                     // Create default initializer | 
|                     if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { | 
|                         subtype.init = function () { | 
|                             subtype.$super.init.apply(this, arguments); | 
|                         }; | 
|                     } | 
|   | 
|                     // Initializer's prototype is the subtype object | 
|                     subtype.init.prototype = subtype; | 
|   | 
|                     // Reference supertype | 
|                     subtype.$super = this; | 
|   | 
|                     return subtype; | 
|                 }, | 
|   | 
|                 /** | 
|                  * Extends this object and runs the init method. | 
|                  * Arguments to create() will be passed to init(). | 
|                  * | 
|                  * @return {Object} The new object. | 
|                  * | 
|                  * @static | 
|                  * | 
|                  * @example | 
|                  * | 
|                  *     var instance = MyType.create(); | 
|                  */ | 
|                 create: function () { | 
|                     var instance = this.extend(); | 
|                     instance.init.apply(instance, arguments); | 
|   | 
|                     return instance; | 
|                 }, | 
|   | 
|                 /** | 
|                  * Initializes a newly created object. | 
|                  * Override this method to add some logic when your objects are created. | 
|                  * | 
|                  * @example | 
|                  * | 
|                  *     var MyType = CryptoJS.lib.Base.extend({ | 
|                  *         init: function () { | 
|                  *             // ... | 
|                  *         } | 
|                  *     }); | 
|                  */ | 
|                 init: function () { | 
|                 }, | 
|   | 
|                 /** | 
|                  * Copies properties into this object. | 
|                  * | 
|                  * @param {Object} properties The properties to mix in. | 
|                  * | 
|                  * @example | 
|                  * | 
|                  *     MyType.mixIn({ | 
|                  *         field: 'value' | 
|                  *     }); | 
|                  */ | 
|                 mixIn: function (properties) { | 
|                     for (var propertyName in properties) { | 
|                         if (properties.hasOwnProperty(propertyName)) { | 
|                             this[propertyName] = properties[propertyName]; | 
|                         } | 
|                     } | 
|   | 
|                     // IE won't copy toString using the loop above | 
|                     if (properties.hasOwnProperty('toString')) { | 
|                         this.toString = properties.toString; | 
|                     } | 
|                 }, | 
|   | 
|                 /** | 
|                  * Creates a copy of this object. | 
|                  * | 
|                  * @return {Object} The clone. | 
|                  * | 
|                  * @example | 
|                  * | 
|                  *     var clone = instance.clone(); | 
|                  */ | 
|                 clone: function () { | 
|                     return this.init.prototype.extend(this); | 
|                 } | 
|             }; | 
|         }()); | 
|   | 
|         /** | 
|          * An array of 32-bit words. | 
|          * | 
|          * @property {Array} words The array of 32-bit words. | 
|          * @property {number} sigBytes The number of significant bytes in this word array. | 
|          */ | 
|         var WordArray = C_lib.WordArray = Base.extend({ | 
|             /** | 
|              * Initializes a newly created word array. | 
|              * | 
|              * @param {Array} words (Optional) An array of 32-bit words. | 
|              * @param {number} sigBytes (Optional) The number of significant bytes in the words. | 
|              * | 
|              * @example | 
|              * | 
|              *     var wordArray = CryptoJS.lib.WordArray.create(); | 
|              *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); | 
|              *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); | 
|              */ | 
|             init: function (words, sigBytes) { | 
|                 words = this.words = words || []; | 
|   | 
|                 if (sigBytes != undefined) { | 
|                     this.sigBytes = sigBytes; | 
|                 } else { | 
|                     this.sigBytes = words.length * 4; | 
|                 } | 
|             }, | 
|   | 
|             /** | 
|              * Converts this word array to a string. | 
|              * | 
|              * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex | 
|              * | 
|              * @return {string} The stringified word array. | 
|              * | 
|              * @example | 
|              * | 
|              *     var string = wordArray + ''; | 
|              *     var string = wordArray.toString(); | 
|              *     var string = wordArray.toString(CryptoJS.enc.Utf8); | 
|              */ | 
|             toString: function (encoder) { | 
|                 return (encoder || Hex).stringify(this); | 
|             }, | 
|   | 
|             /** | 
|              * Concatenates a word array to this word array. | 
|              * | 
|              * @param {WordArray} wordArray The word array to append. | 
|              * | 
|              * @return {WordArray} This word array. | 
|              * | 
|              * @example | 
|              * | 
|              *     wordArray1.concat(wordArray2); | 
|              */ | 
|             concat: function (wordArray) { | 
|                 // Shortcuts | 
|                 var thisWords = this.words; | 
|                 var thatWords = wordArray.words; | 
|                 var thisSigBytes = this.sigBytes; | 
|                 var thatSigBytes = wordArray.sigBytes; | 
|   | 
|                 // Clamp excess bits | 
|                 this.clamp(); | 
|   | 
|                 // Concat | 
|                 if (thisSigBytes % 4) { | 
|                     // Copy one byte at a time | 
|                     for (var i = 0; i < thatSigBytes; i++) { | 
|                         var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | 
|                         thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); | 
|                     } | 
|                 } else { | 
|                     // Copy one word at a time | 
|                     for (var j = 0; j < thatSigBytes; j += 4) { | 
|                         thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; | 
|                     } | 
|                 } | 
|                 this.sigBytes += thatSigBytes; | 
|   | 
|                 // Chainable | 
|                 return this; | 
|             }, | 
|   | 
|             /** | 
|              * Removes insignificant bits. | 
|              * | 
|              * @example | 
|              * | 
|              *     wordArray.clamp(); | 
|              */ | 
|             clamp: function () { | 
|                 // Shortcuts | 
|                 var words = this.words; | 
|                 var sigBytes = this.sigBytes; | 
|   | 
|                 // Clamp | 
|                 words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); | 
|                 words.length = Math.ceil(sigBytes / 4); | 
|             }, | 
|   | 
|             /** | 
|              * Creates a copy of this word array. | 
|              * | 
|              * @return {WordArray} The clone. | 
|              * | 
|              * @example | 
|              * | 
|              *     var clone = wordArray.clone(); | 
|              */ | 
|             clone: function () { | 
|                 var clone = Base.clone.call(this); | 
|                 clone.words = this.words.slice(0); | 
|   | 
|                 return clone; | 
|             }, | 
|   | 
|             /** | 
|              * Creates a word array filled with random bytes. | 
|              * | 
|              * @param {number} nBytes The number of random bytes to generate. | 
|              * | 
|              * @return {WordArray} The random word array. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var wordArray = CryptoJS.lib.WordArray.random(16); | 
|              */ | 
|             random: function (nBytes) { | 
|                 var words = []; | 
|   | 
|                 for (var i = 0; i < nBytes; i += 4) { | 
|                     words.push(cryptoSecureRandomInt()); | 
|                 } | 
|   | 
|                 return new WordArray.init(words, nBytes); | 
|             } | 
|         }); | 
|   | 
|         /** | 
|          * Encoder namespace. | 
|          */ | 
|         var C_enc = C.enc = {}; | 
|   | 
|         /** | 
|          * Hex encoding strategy. | 
|          */ | 
|         var Hex = C_enc.Hex = { | 
|             /** | 
|              * Converts a word array to a hex string. | 
|              * | 
|              * @param {WordArray} wordArray The word array. | 
|              * | 
|              * @return {string} The hex string. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var hexString = CryptoJS.enc.Hex.stringify(wordArray); | 
|              */ | 
|             stringify: function (wordArray) { | 
|                 // Shortcuts | 
|                 var words = wordArray.words; | 
|                 var sigBytes = wordArray.sigBytes; | 
|   | 
|                 // Convert | 
|                 var hexChars = []; | 
|                 for (var i = 0; i < sigBytes; i++) { | 
|                     var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | 
|                     hexChars.push((bite >>> 4).toString(16)); | 
|                     hexChars.push((bite & 0x0f).toString(16)); | 
|                 } | 
|   | 
|                 return hexChars.join(''); | 
|             }, | 
|   | 
|             /** | 
|              * Converts a hex string to a word array. | 
|              * | 
|              * @param {string} hexStr The hex string. | 
|              * | 
|              * @return {WordArray} The word array. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var wordArray = CryptoJS.enc.Hex.parse(hexString); | 
|              */ | 
|             parse: function (hexStr) { | 
|                 // Shortcut | 
|                 var hexStrLength = hexStr.length; | 
|   | 
|                 // Convert | 
|                 var words = []; | 
|                 for (var i = 0; i < hexStrLength; i += 2) { | 
|                     words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); | 
|                 } | 
|   | 
|                 return new WordArray.init(words, hexStrLength / 2); | 
|             } | 
|         }; | 
|   | 
|         /** | 
|          * Latin1 encoding strategy. | 
|          */ | 
|         var Latin1 = C_enc.Latin1 = { | 
|             /** | 
|              * Converts a word array to a Latin1 string. | 
|              * | 
|              * @param {WordArray} wordArray The word array. | 
|              * | 
|              * @return {string} The Latin1 string. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); | 
|              */ | 
|             stringify: function (wordArray) { | 
|                 // Shortcuts | 
|                 var words = wordArray.words; | 
|                 var sigBytes = wordArray.sigBytes; | 
|   | 
|                 // Convert | 
|                 var latin1Chars = []; | 
|                 for (var i = 0; i < sigBytes; i++) { | 
|                     var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | 
|                     latin1Chars.push(String.fromCharCode(bite)); | 
|                 } | 
|   | 
|                 return latin1Chars.join(''); | 
|             }, | 
|   | 
|             /** | 
|              * Converts a Latin1 string to a word array. | 
|              * | 
|              * @param {string} latin1Str The Latin1 string. | 
|              * | 
|              * @return {WordArray} The word array. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String); | 
|              */ | 
|             parse: function (latin1Str) { | 
|                 // Shortcut | 
|                 var latin1StrLength = latin1Str.length; | 
|   | 
|                 // Convert | 
|                 var words = []; | 
|                 for (var i = 0; i < latin1StrLength; i++) { | 
|                     words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); | 
|                 } | 
|   | 
|                 return new WordArray.init(words, latin1StrLength); | 
|             } | 
|         }; | 
|   | 
|         /** | 
|          * UTF-8 encoding strategy. | 
|          */ | 
|         var Utf8 = C_enc.Utf8 = { | 
|             /** | 
|              * Converts a word array to a UTF-8 string. | 
|              * | 
|              * @param {WordArray} wordArray The word array. | 
|              * | 
|              * @return {string} The UTF-8 string. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); | 
|              */ | 
|             stringify: function (wordArray) { | 
|                 try { | 
|                     return decodeURIComponent(escape(Latin1.stringify(wordArray))); | 
|                 } catch (e) { | 
|                     throw new Error('Malformed UTF-8 data'); | 
|                 } | 
|             }, | 
|   | 
|             /** | 
|              * Converts a UTF-8 string to a word array. | 
|              * | 
|              * @param {string} utf8Str The UTF-8 string. | 
|              * | 
|              * @return {WordArray} The word array. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String); | 
|              */ | 
|             parse: function (utf8Str) { | 
|                 return Latin1.parse(unescape(encodeURIComponent(utf8Str))); | 
|             } | 
|         }; | 
|   | 
|         /** | 
|          * Abstract buffered block algorithm template. | 
|          * | 
|          * The property blockSize must be implemented in a concrete subtype. | 
|          * | 
|          * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 | 
|          */ | 
|         var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ | 
|             /** | 
|              * Resets this block algorithm's data buffer to its initial state. | 
|              * | 
|              * @example | 
|              * | 
|              *     bufferedBlockAlgorithm.reset(); | 
|              */ | 
|             reset: function () { | 
|                 // Initial values | 
|                 this._data = new WordArray.init(); | 
|                 this._nDataBytes = 0; | 
|             }, | 
|   | 
|             /** | 
|              * Adds new data to this block algorithm's buffer. | 
|              * | 
|              * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. | 
|              * | 
|              * @example | 
|              * | 
|              *     bufferedBlockAlgorithm._append('data'); | 
|              *     bufferedBlockAlgorithm._append(wordArray); | 
|              */ | 
|             _append: function (data) { | 
|                 // Convert string to WordArray, else assume WordArray already | 
|                 if (typeof data == 'string') { | 
|                     data = Utf8.parse(data); | 
|                 } | 
|   | 
|                 // Append | 
|                 this._data.concat(data); | 
|                 this._nDataBytes += data.sigBytes; | 
|             }, | 
|   | 
|             /** | 
|              * Processes available data blocks. | 
|              * | 
|              * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. | 
|              * | 
|              * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. | 
|              * | 
|              * @return {WordArray} The processed data. | 
|              * | 
|              * @example | 
|              * | 
|              *     var processedData = bufferedBlockAlgorithm._process(); | 
|              *     var processedData = bufferedBlockAlgorithm._process(!!'flush'); | 
|              */ | 
|             _process: function (doFlush) { | 
|                 var processedWords; | 
|   | 
|                 // Shortcuts | 
|                 var data = this._data; | 
|                 var dataWords = data.words; | 
|                 var dataSigBytes = data.sigBytes; | 
|                 var blockSize = this.blockSize; | 
|                 var blockSizeBytes = blockSize * 4; | 
|   | 
|                 // Count blocks ready | 
|                 var nBlocksReady = dataSigBytes / blockSizeBytes; | 
|                 if (doFlush) { | 
|                     // Round up to include partial blocks | 
|                     nBlocksReady = Math.ceil(nBlocksReady); | 
|                 } else { | 
|                     // Round down to include only full blocks, | 
|                     // less the number of blocks that must remain in the buffer | 
|                     nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); | 
|                 } | 
|   | 
|                 // Count words ready | 
|                 var nWordsReady = nBlocksReady * blockSize; | 
|   | 
|                 // Count bytes ready | 
|                 var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); | 
|   | 
|                 // Process blocks | 
|                 if (nWordsReady) { | 
|                     for (var offset = 0; offset < nWordsReady; offset += blockSize) { | 
|                         // Perform concrete-algorithm logic | 
|                         this._doProcessBlock(dataWords, offset); | 
|                     } | 
|   | 
|                     // Remove processed words | 
|                     processedWords = dataWords.splice(0, nWordsReady); | 
|                     data.sigBytes -= nBytesReady; | 
|                 } | 
|   | 
|                 // Return processed words | 
|                 return new WordArray.init(processedWords, nBytesReady); | 
|             }, | 
|   | 
|             /** | 
|              * Creates a copy of this object. | 
|              * | 
|              * @return {Object} The clone. | 
|              * | 
|              * @example | 
|              * | 
|              *     var clone = bufferedBlockAlgorithm.clone(); | 
|              */ | 
|             clone: function () { | 
|                 var clone = Base.clone.call(this); | 
|                 clone._data = this._data.clone(); | 
|   | 
|                 return clone; | 
|             }, | 
|   | 
|             _minBufferSize: 0 | 
|         }); | 
|   | 
|         /** | 
|          * Abstract hasher template. | 
|          * | 
|          * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) | 
|          */ | 
|         var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ | 
|             /** | 
|              * Configuration options. | 
|              */ | 
|             cfg: Base.extend(), | 
|   | 
|             /** | 
|              * Initializes a newly created hasher. | 
|              * | 
|              * @param {Object} cfg (Optional) The configuration options to use for this hash computation. | 
|              * | 
|              * @example | 
|              * | 
|              *     var hasher = CryptoJS.algo.SHA256.create(); | 
|              */ | 
|             init: function (cfg) { | 
|                 // Apply config defaults | 
|                 this.cfg = this.cfg.extend(cfg); | 
|   | 
|                 // Set initial values | 
|                 this.reset(); | 
|             }, | 
|   | 
|             /** | 
|              * Resets this hasher to its initial state. | 
|              * | 
|              * @example | 
|              * | 
|              *     hasher.reset(); | 
|              */ | 
|             reset: function () { | 
|                 // Reset data buffer | 
|                 BufferedBlockAlgorithm.reset.call(this); | 
|   | 
|                 // Perform concrete-hasher logic | 
|                 this._doReset(); | 
|             }, | 
|   | 
|             /** | 
|              * Updates this hasher with a message. | 
|              * | 
|              * @param {WordArray|string} messageUpdate The message to append. | 
|              * | 
|              * @return {Hasher} This hasher. | 
|              * | 
|              * @example | 
|              * | 
|              *     hasher.update('message'); | 
|              *     hasher.update(wordArray); | 
|              */ | 
|             update: function (messageUpdate) { | 
|                 // Append | 
|                 this._append(messageUpdate); | 
|   | 
|                 // Update the hash | 
|                 this._process(); | 
|   | 
|                 // Chainable | 
|                 return this; | 
|             }, | 
|   | 
|             /** | 
|              * Finalizes the hash computation. | 
|              * Note that the finalize operation is effectively a destructive, read-once operation. | 
|              * | 
|              * @param {WordArray|string} messageUpdate (Optional) A final message update. | 
|              * | 
|              * @return {WordArray} The hash. | 
|              * | 
|              * @example | 
|              * | 
|              *     var hash = hasher.finalize(); | 
|              *     var hash = hasher.finalize('message'); | 
|              *     var hash = hasher.finalize(wordArray); | 
|              */ | 
|             finalize: function (messageUpdate) { | 
|                 // Final message update | 
|                 if (messageUpdate) { | 
|                     this._append(messageUpdate); | 
|                 } | 
|   | 
|                 // Perform concrete-hasher logic | 
|                 var hash = this._doFinalize(); | 
|   | 
|                 return hash; | 
|             }, | 
|   | 
|             blockSize: 512/32, | 
|   | 
|             /** | 
|              * Creates a shortcut function to a hasher's object interface. | 
|              * | 
|              * @param {Hasher} hasher The hasher to create a helper for. | 
|              * | 
|              * @return {Function} The shortcut function. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); | 
|              */ | 
|             _createHelper: function (hasher) { | 
|                 return function (message, cfg) { | 
|                     return new hasher.init(cfg).finalize(message); | 
|                 }; | 
|             }, | 
|   | 
|             /** | 
|              * Creates a shortcut function to the HMAC's object interface. | 
|              * | 
|              * @param {Hasher} hasher The hasher to use in this HMAC helper. | 
|              * | 
|              * @return {Function} The shortcut function. | 
|              * | 
|              * @static | 
|              * | 
|              * @example | 
|              * | 
|              *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); | 
|              */ | 
|             _createHmacHelper: function (hasher) { | 
|                 return function (message, key) { | 
|                     return new C_algo.HMAC.init(hasher, key).finalize(message); | 
|                 }; | 
|             } | 
|         }); | 
|   | 
|         /** | 
|          * Algorithm namespace. | 
|          */ | 
|         var C_algo = C.algo = {}; | 
|   | 
|         return C; | 
|     }(Math)); | 
|   | 
|   | 
|     return CryptoJS; | 
|   | 
| })); |