Software /
code /
prosody-modules
Comparison
mod_tcpproxy/web/strophe.js @ 1343:7dbde05b48a9
all the things: Remove trailing whitespace
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Tue, 11 Mar 2014 18:44:01 +0100 |
parent | 148:f2f9b965d1ad |
comparison
equal
deleted
inserted
replaced
1342:0ae065453dc9 | 1343:7dbde05b48a9 |
---|---|
13 encode: function (input) { | 13 encode: function (input) { |
14 var output = ""; | 14 var output = ""; |
15 var chr1, chr2, chr3; | 15 var chr1, chr2, chr3; |
16 var enc1, enc2, enc3, enc4; | 16 var enc1, enc2, enc3, enc4; |
17 var i = 0; | 17 var i = 0; |
18 | 18 |
19 do { | 19 do { |
20 chr1 = input.charCodeAt(i++); | 20 chr1 = input.charCodeAt(i++); |
21 chr2 = input.charCodeAt(i++); | 21 chr2 = input.charCodeAt(i++); |
22 chr3 = input.charCodeAt(i++); | 22 chr3 = input.charCodeAt(i++); |
23 | 23 |
24 enc1 = chr1 >> 2; | 24 enc1 = chr1 >> 2; |
25 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | 25 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); |
26 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | 26 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); |
27 enc4 = chr3 & 63; | 27 enc4 = chr3 & 63; |
28 | 28 |
29 if (isNaN(chr2)) { | 29 if (isNaN(chr2)) { |
30 enc3 = enc4 = 64; | 30 enc3 = enc4 = 64; |
31 } else if (isNaN(chr3)) { | 31 } else if (isNaN(chr3)) { |
32 enc4 = 64; | 32 enc4 = 64; |
33 } | 33 } |
34 | 34 |
35 output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + | 35 output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + |
36 keyStr.charAt(enc3) + keyStr.charAt(enc4); | 36 keyStr.charAt(enc3) + keyStr.charAt(enc4); |
37 } while (i < input.length); | 37 } while (i < input.length); |
38 | 38 |
39 return output; | 39 return output; |
40 }, | 40 }, |
41 | 41 |
42 /** | 42 /** |
43 * Decodes a base64 string. | 43 * Decodes a base64 string. |
44 * @param {String} input The string to decode. | 44 * @param {String} input The string to decode. |
45 */ | 45 */ |
46 decode: function (input) { | 46 decode: function (input) { |
47 var output = ""; | 47 var output = ""; |
48 var chr1, chr2, chr3; | 48 var chr1, chr2, chr3; |
49 var enc1, enc2, enc3, enc4; | 49 var enc1, enc2, enc3, enc4; |
50 var i = 0; | 50 var i = 0; |
51 | 51 |
52 // remove all characters that are not A-Z, a-z, 0-9, +, /, or = | 52 // remove all characters that are not A-Z, a-z, 0-9, +, /, or = |
53 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); | 53 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); |
54 | 54 |
55 do { | 55 do { |
56 enc1 = keyStr.indexOf(input.charAt(i++)); | 56 enc1 = keyStr.indexOf(input.charAt(i++)); |
57 enc2 = keyStr.indexOf(input.charAt(i++)); | 57 enc2 = keyStr.indexOf(input.charAt(i++)); |
58 enc3 = keyStr.indexOf(input.charAt(i++)); | 58 enc3 = keyStr.indexOf(input.charAt(i++)); |
59 enc4 = keyStr.indexOf(input.charAt(i++)); | 59 enc4 = keyStr.indexOf(input.charAt(i++)); |
60 | 60 |
61 chr1 = (enc1 << 2) | (enc2 >> 4); | 61 chr1 = (enc1 << 2) | (enc2 >> 4); |
62 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | 62 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); |
63 chr3 = ((enc3 & 3) << 6) | enc4; | 63 chr3 = ((enc3 & 3) << 6) | enc4; |
64 | 64 |
65 output = output + String.fromCharCode(chr1); | 65 output = output + String.fromCharCode(chr1); |
66 | 66 |
67 if (enc3 != 64) { | 67 if (enc3 != 64) { |
68 output = output + String.fromCharCode(chr2); | 68 output = output + String.fromCharCode(chr2); |
69 } | 69 } |
70 if (enc4 != 64) { | 70 if (enc4 != 64) { |
71 output = output + String.fromCharCode(chr3); | 71 output = output + String.fromCharCode(chr3); |
72 } | 72 } |
73 } while (i < input.length); | 73 } while (i < input.length); |
74 | 74 |
75 return output; | 75 return output; |
76 } | 76 } |
77 }; | 77 }; |
78 | 78 |
79 return obj; | 79 return obj; |
195 }; | 195 }; |
196 | 196 |
197 var md5_ii = function (a, b, c, d, x, s, t) { | 197 var md5_ii = function (a, b, c, d, x, s, t) { |
198 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); | 198 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); |
199 }; | 199 }; |
200 | 200 |
201 /* | 201 /* |
202 * Calculate the MD5 of an array of little-endian words, and a bit length | 202 * Calculate the MD5 of an array of little-endian words, and a bit length |
203 */ | 203 */ |
204 var core_md5 = function (x, len) { | 204 var core_md5 = function (x, len) { |
205 /* append padding */ | 205 /* append padding */ |
216 { | 216 { |
217 olda = a; | 217 olda = a; |
218 oldb = b; | 218 oldb = b; |
219 oldc = c; | 219 oldc = c; |
220 oldd = d; | 220 oldd = d; |
221 | 221 |
222 a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); | 222 a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); |
223 d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); | 223 d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); |
224 c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); | 224 c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); |
225 b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); | 225 b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); |
226 a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); | 226 a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); |
233 b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); | 233 b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); |
234 a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); | 234 a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); |
235 d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); | 235 d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); |
236 c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); | 236 c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); |
237 b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); | 237 b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); |
238 | 238 |
239 a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); | 239 a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); |
240 d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); | 240 d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); |
241 c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); | 241 c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); |
242 b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); | 242 b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); |
243 a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); | 243 a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); |
250 b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); | 250 b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); |
251 a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); | 251 a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); |
252 d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); | 252 d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); |
253 c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); | 253 c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); |
254 b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); | 254 b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); |
255 | 255 |
256 a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); | 256 a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); |
257 d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); | 257 d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); |
258 c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); | 258 c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); |
259 b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); | 259 b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); |
260 a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); | 260 a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); |
267 b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); | 267 b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); |
268 a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); | 268 a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); |
269 d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); | 269 d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); |
270 c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); | 270 c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); |
271 b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); | 271 b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); |
272 | 272 |
273 a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); | 273 a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); |
274 d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); | 274 d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); |
275 c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); | 275 c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); |
276 b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); | 276 b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); |
277 a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); | 277 a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); |
284 b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); | 284 b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); |
285 a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); | 285 a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); |
286 d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); | 286 d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); |
287 c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); | 287 c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); |
288 b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); | 288 b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); |
289 | 289 |
290 a = safe_add(a, olda); | 290 a = safe_add(a, olda); |
291 b = safe_add(b, oldb); | 291 b = safe_add(b, oldb); |
292 c = safe_add(c, oldc); | 292 c = safe_add(c, oldc); |
293 d = safe_add(d, oldd); | 293 d = safe_add(d, oldd); |
294 } | 294 } |
300 * Calculate the HMAC-MD5, of a key and some data | 300 * Calculate the HMAC-MD5, of a key and some data |
301 */ | 301 */ |
302 var core_hmac_md5 = function (key, data) { | 302 var core_hmac_md5 = function (key, data) { |
303 var bkey = str2binl(key); | 303 var bkey = str2binl(key); |
304 if(bkey.length > 16) { bkey = core_md5(bkey, key.length * chrsz); } | 304 if(bkey.length > 16) { bkey = core_md5(bkey, key.length * chrsz); } |
305 | 305 |
306 var ipad = new Array(16), opad = new Array(16); | 306 var ipad = new Array(16), opad = new Array(16); |
307 for(var i = 0; i < 16; i++) | 307 for(var i = 0; i < 16; i++) |
308 { | 308 { |
309 ipad[i] = bkey[i] ^ 0x36363636; | 309 ipad[i] = bkey[i] ^ 0x36363636; |
310 opad[i] = bkey[i] ^ 0x5C5C5C5C; | 310 opad[i] = bkey[i] ^ 0x5C5C5C5C; |
311 } | 311 } |
312 | 312 |
313 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); | 313 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); |
314 return core_md5(opad.concat(hash), 512 + 128); | 314 return core_md5(opad.concat(hash), 512 + 128); |
315 }; | 315 }; |
316 | 316 |
317 var obj = { | 317 var obj = { |
577 SESSION: "urn:ietf:params:xml:ns:xmpp-session", | 577 SESSION: "urn:ietf:params:xml:ns:xmpp-session", |
578 VERSION: "jabber:iq:version", | 578 VERSION: "jabber:iq:version", |
579 STANZAS: "urn:ietf:params:xml:ns:xmpp-stanzas" | 579 STANZAS: "urn:ietf:params:xml:ns:xmpp-stanzas" |
580 }, | 580 }, |
581 | 581 |
582 /** Function: addNamespace | 582 /** Function: addNamespace |
583 * This function is used to extend the current namespaces in | 583 * This function is used to extend the current namespaces in |
584 * Strophe.NS. It takes a key and a value with the key being the | 584 * Strophe.NS. It takes a key and a value with the key being the |
585 * name of the new namespace, with its actual value. | 585 * name of the new namespace, with its actual value. |
586 * For example: | 586 * For example: |
587 * Strophe.addNamespace('PUBSUB', "http://jabber.org/protocol/pubsub"); | 587 * Strophe.addNamespace('PUBSUB', "http://jabber.org/protocol/pubsub"); |
588 * | 588 * |
589 * Parameters: | 589 * Parameters: |
590 * (String) name - The name under which the namespace will be | 590 * (String) name - The name under which the namespace will be |
591 * referenced under Strophe.NS | 591 * referenced under Strophe.NS |
592 * (String) value - The actual namespace. | 592 * (String) value - The actual namespace. |
593 */ | 593 */ |
594 addNamespace: function (name, value) | 594 addNamespace: function (name, value) |
595 { | 595 { |
596 Strophe.NS[name] = value; | 596 Strophe.NS[name] = value; |
597 }, | 597 }, |
791 } else if (typeof(arguments[a]) == "object") { | 791 } else if (typeof(arguments[a]) == "object") { |
792 for (k in arguments[a]) { | 792 for (k in arguments[a]) { |
793 if (arguments[a].hasOwnProperty(k)) { | 793 if (arguments[a].hasOwnProperty(k)) { |
794 node.setAttribute(k, arguments[a][k]); | 794 node.setAttribute(k, arguments[a][k]); |
795 } | 795 } |
796 } | 796 } |
797 } | 797 } |
798 } | 798 } |
799 | 799 |
800 return node; | 800 return node; |
801 }, | 801 }, |
807 * (String) text - text to escape. | 807 * (String) text - text to escape. |
808 * | 808 * |
809 * Returns: | 809 * Returns: |
810 * Escaped text. | 810 * Escaped text. |
811 */ | 811 */ |
812 xmlescape: function(text) | 812 xmlescape: function(text) |
813 { | 813 { |
814 text = text.replace(/\&/g, "&"); | 814 text = text.replace(/\&/g, "&"); |
815 text = text.replace(/</g, "<"); | 815 text = text.replace(/</g, "<"); |
816 text = text.replace(/>/g, ">"); | 816 text = text.replace(/>/g, ">"); |
817 return text; | 817 return text; |
818 }, | 818 }, |
819 | 819 |
820 /** Function: xmlTextNode | 820 /** Function: xmlTextNode |
821 * Creates an XML DOM text node. | 821 * Creates an XML DOM text node. |
822 * | 822 * |
1414 this.ns = ns; | 1414 this.ns = ns; |
1415 this.name = name; | 1415 this.name = name; |
1416 this.type = type; | 1416 this.type = type; |
1417 this.id = id; | 1417 this.id = id; |
1418 this.options = options || {matchbare: false}; | 1418 this.options = options || {matchbare: false}; |
1419 | 1419 |
1420 // default matchBare to false if undefined | 1420 // default matchBare to false if undefined |
1421 if (!this.options.matchBare) { | 1421 if (!this.options.matchBare) { |
1422 this.options.matchBare = false; | 1422 this.options.matchBare = false; |
1423 } | 1423 } |
1424 | 1424 |
1444 */ | 1444 */ |
1445 isMatch: function (elem) | 1445 isMatch: function (elem) |
1446 { | 1446 { |
1447 var nsMatch; | 1447 var nsMatch; |
1448 var from = null; | 1448 var from = null; |
1449 | 1449 |
1450 if (this.options.matchBare) { | 1450 if (this.options.matchBare) { |
1451 from = Strophe.getBareJidFromJid(elem.getAttribute('from')); | 1451 from = Strophe.getBareJidFromJid(elem.getAttribute('from')); |
1452 } else { | 1452 } else { |
1453 from = elem.getAttribute('from'); | 1453 from = elem.getAttribute('from'); |
1454 } | 1454 } |
2096 this._idleTimeout = setTimeout(this._onIdle.bind(this), 100); | 2096 this._idleTimeout = setTimeout(this._onIdle.bind(this), 100); |
2097 }, | 2097 }, |
2098 | 2098 |
2099 /** Function: flush | 2099 /** Function: flush |
2100 * Immediately send any pending outgoing data. | 2100 * Immediately send any pending outgoing data. |
2101 * | 2101 * |
2102 * Normally send() queues outgoing data until the next idle period | 2102 * Normally send() queues outgoing data until the next idle period |
2103 * (100ms), which optimizes network use in the common cases when | 2103 * (100ms), which optimizes network use in the common cases when |
2104 * several send()s are called in succession. flush() can be used to | 2104 * several send()s are called in succession. flush() can be used to |
2105 * immediately send all pending data. | 2105 * immediately send all pending data. |
2106 */ | 2106 */ |
2107 flush: function () | 2107 flush: function () |
2108 { | 2108 { |
2109 // cancel the pending idle period and run the idle function | 2109 // cancel the pending idle period and run the idle function |
2116 * Helper function to send IQ stanzas. | 2116 * Helper function to send IQ stanzas. |
2117 * | 2117 * |
2118 * Parameters: | 2118 * Parameters: |
2119 * (XMLElement) elem - The stanza to send. | 2119 * (XMLElement) elem - The stanza to send. |
2120 * (Function) callback - The callback function for a successful request. | 2120 * (Function) callback - The callback function for a successful request. |
2121 * (Function) errback - The callback function for a failed or timed | 2121 * (Function) errback - The callback function for a failed or timed |
2122 * out request. On timeout, the stanza will be null. | 2122 * out request. On timeout, the stanza will be null. |
2123 * (Integer) timeout - The time specified in milliseconds for a | 2123 * (Integer) timeout - The time specified in milliseconds for a |
2124 * timeout to occur. | 2124 * timeout to occur. |
2125 * | 2125 * |
2126 * Returns: | 2126 * Returns: |
2127 * The id used to send the IQ. | 2127 * The id used to send the IQ. |
2128 */ | 2128 */ |
2194 throw { | 2194 throw { |
2195 name: "StropheError", | 2195 name: "StropheError", |
2196 message: "Cannot queue non-DOMElement." | 2196 message: "Cannot queue non-DOMElement." |
2197 }; | 2197 }; |
2198 } | 2198 } |
2199 | 2199 |
2200 this._data.push(element); | 2200 this._data.push(element); |
2201 }, | 2201 }, |
2202 | 2202 |
2203 /** PrivateFunction: _sendRestart | 2203 /** PrivateFunction: _sendRestart |
2204 * Send an xmpp:restart stanza. | 2204 * Send an xmpp:restart stanza. |
2277 * The options argument contains handler matching flags that affect how | 2277 * The options argument contains handler matching flags that affect how |
2278 * matches are determined. Currently the only flag is matchBare (a | 2278 * matches are determined. Currently the only flag is matchBare (a |
2279 * boolean). When matchBare is true, the from parameter and the from | 2279 * boolean). When matchBare is true, the from parameter and the from |
2280 * attribute on the stanza will be matched as bare JIDs instead of | 2280 * attribute on the stanza will be matched as bare JIDs instead of |
2281 * full JIDs. To use this, pass {matchBare: true} as the value of | 2281 * full JIDs. To use this, pass {matchBare: true} as the value of |
2282 * options. The default value for matchBare is false. | 2282 * options. The default value for matchBare is false. |
2283 * | 2283 * |
2284 * The return value should be saved if you wish to remove the handler | 2284 * The return value should be saved if you wish to remove the handler |
2285 * with deleteHandler(). | 2285 * with deleteHandler(). |
2286 * | 2286 * |
2287 * Parameters: | 2287 * Parameters: |
2890 if (wind) { this.window = parseInt(wind, 10); } | 2890 if (wind) { this.window = parseInt(wind, 10); } |
2891 var hold = bodyWrap.getAttribute('hold'); | 2891 var hold = bodyWrap.getAttribute('hold'); |
2892 if (hold) { this.hold = parseInt(hold, 10); } | 2892 if (hold) { this.hold = parseInt(hold, 10); } |
2893 var wait = bodyWrap.getAttribute('wait'); | 2893 var wait = bodyWrap.getAttribute('wait'); |
2894 if (wait) { this.wait = parseInt(wait, 10); } | 2894 if (wait) { this.wait = parseInt(wait, 10); } |
2895 | 2895 |
2896 | 2896 |
2897 var do_sasl_plain = false; | 2897 var do_sasl_plain = false; |
2898 var do_sasl_digest_md5 = false; | 2898 var do_sasl_digest_md5 = false; |
2899 var do_sasl_anonymous = false; | 2899 var do_sasl_anonymous = false; |
2900 | 2900 |
3090 * Returns: | 3090 * Returns: |
3091 * quoted string | 3091 * quoted string |
3092 */ | 3092 */ |
3093 _quote: function (str) | 3093 _quote: function (str) |
3094 { | 3094 { |
3095 return '"' + str.replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"'; | 3095 return '"' + str.replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"'; |
3096 //" end string workaround for emacs | 3096 //" end string workaround for emacs |
3097 }, | 3097 }, |
3098 | 3098 |
3099 | 3099 |
3100 /** PrivateFunction: _sasl_challenge2_cb | 3100 /** PrivateFunction: _sasl_challenge2_cb |