@alexberardi/jarvis-admin 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1220 @@
1
+ // GENERATED FILE. DO NOT EDIT.
2
+ (function (global, factory) {
3
+ function preferDefault(exports) {
4
+ return exports.default || exports;
5
+ }
6
+ if (typeof define === "function" && define.amd) {
7
+ define(["crypto"], function (_crypto) {
8
+ var exports = {};
9
+ factory(exports, _crypto);
10
+ return preferDefault(exports);
11
+ });
12
+ } else if (typeof exports === "object") {
13
+ factory(exports, require("crypto"));
14
+ if (typeof module === "object") module.exports = preferDefault(exports);
15
+ } else {
16
+ (function () {
17
+ var exports = {};
18
+ factory(exports, global.crypto);
19
+ global.bcrypt = preferDefault(exports);
20
+ })();
21
+ }
22
+ })(
23
+ typeof globalThis !== "undefined"
24
+ ? globalThis
25
+ : typeof self !== "undefined"
26
+ ? self
27
+ : this,
28
+ function (_exports, _crypto) {
29
+ "use strict";
30
+
31
+ Object.defineProperty(_exports, "__esModule", {
32
+ value: true,
33
+ });
34
+ _exports.compare = compare;
35
+ _exports.compareSync = compareSync;
36
+ _exports.decodeBase64 = decodeBase64;
37
+ _exports.default = void 0;
38
+ _exports.encodeBase64 = encodeBase64;
39
+ _exports.genSalt = genSalt;
40
+ _exports.genSaltSync = genSaltSync;
41
+ _exports.getRounds = getRounds;
42
+ _exports.getSalt = getSalt;
43
+ _exports.hash = hash;
44
+ _exports.hashSync = hashSync;
45
+ _exports.setRandomFallback = setRandomFallback;
46
+ _exports.truncates = truncates;
47
+ _crypto = _interopRequireDefault(_crypto);
48
+ function _interopRequireDefault(e) {
49
+ return e && e.__esModule ? e : { default: e };
50
+ }
51
+ /*
52
+ Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
53
+ Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
54
+ Copyright (c) 2025 Daniel Wirtz <dcode@dcode.io>
55
+
56
+ Redistribution and use in source and binary forms, with or without
57
+ modification, are permitted provided that the following conditions
58
+ are met:
59
+ 1. Redistributions of source code must retain the above copyright
60
+ notice, this list of conditions and the following disclaimer.
61
+ 2. Redistributions in binary form must reproduce the above copyright
62
+ notice, this list of conditions and the following disclaimer in the
63
+ documentation and/or other materials provided with the distribution.
64
+ 3. The name of the author may not be used to endorse or promote products
65
+ derived from this software without specific prior written permission.
66
+
67
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
68
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
69
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
70
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
71
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
72
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
73
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
74
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
75
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
76
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
77
+ */
78
+
79
+ // The Node.js crypto module is used as a fallback for the Web Crypto API. When
80
+ // building for the browser, inclusion of the crypto module should be disabled,
81
+ // which the package hints at in its package.json for bundlers that support it.
82
+
83
+ /**
84
+ * The random implementation to use as a fallback.
85
+ * @type {?function(number):!Array.<number>}
86
+ * @inner
87
+ */
88
+ var randomFallback = null;
89
+
90
+ /**
91
+ * Generates cryptographically secure random bytes.
92
+ * @function
93
+ * @param {number} len Bytes length
94
+ * @returns {!Array.<number>} Random bytes
95
+ * @throws {Error} If no random implementation is available
96
+ * @inner
97
+ */
98
+ function randomBytes(len) {
99
+ // Web Crypto API. Globally available in the browser and in Node.js >=23.
100
+ try {
101
+ return crypto.getRandomValues(new Uint8Array(len));
102
+ } catch {}
103
+ // Node.js crypto module for non-browser environments.
104
+ try {
105
+ return _crypto.default.randomBytes(len);
106
+ } catch {}
107
+ // Custom fallback specified with `setRandomFallback`.
108
+ if (!randomFallback) {
109
+ throw Error(
110
+ "Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative",
111
+ );
112
+ }
113
+ return randomFallback(len);
114
+ }
115
+
116
+ /**
117
+ * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto
118
+ * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it
119
+ * is seeded properly!
120
+ * @param {?function(number):!Array.<number>} random Function taking the number of bytes to generate as its
121
+ * sole argument, returning the corresponding array of cryptographically secure random byte values.
122
+ * @see http://nodejs.org/api/crypto.html
123
+ * @see http://www.w3.org/TR/WebCryptoAPI/
124
+ */
125
+ function setRandomFallback(random) {
126
+ randomFallback = random;
127
+ }
128
+
129
+ /**
130
+ * Synchronously generates a salt.
131
+ * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted
132
+ * @param {number=} seed_length Not supported.
133
+ * @returns {string} Resulting salt
134
+ * @throws {Error} If a random fallback is required but not set
135
+ */
136
+ function genSaltSync(rounds, seed_length) {
137
+ rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS;
138
+ if (typeof rounds !== "number")
139
+ throw Error(
140
+ "Illegal arguments: " + typeof rounds + ", " + typeof seed_length,
141
+ );
142
+ if (rounds < 4) rounds = 4;
143
+ else if (rounds > 31) rounds = 31;
144
+ var salt = [];
145
+ salt.push("$2b$");
146
+ if (rounds < 10) salt.push("0");
147
+ salt.push(rounds.toString());
148
+ salt.push("$");
149
+ salt.push(base64_encode(randomBytes(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw
150
+ return salt.join("");
151
+ }
152
+
153
+ /**
154
+ * Asynchronously generates a salt.
155
+ * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted
156
+ * @param {(number|function(Error, string=))=} seed_length Not supported.
157
+ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt
158
+ * @returns {!Promise} If `callback` has been omitted
159
+ * @throws {Error} If `callback` is present but not a function
160
+ */
161
+ function genSalt(rounds, seed_length, callback) {
162
+ if (typeof seed_length === "function")
163
+ (callback = seed_length), (seed_length = undefined); // Not supported.
164
+ if (typeof rounds === "function")
165
+ (callback = rounds), (rounds = undefined);
166
+ if (typeof rounds === "undefined") rounds = GENSALT_DEFAULT_LOG2_ROUNDS;
167
+ else if (typeof rounds !== "number")
168
+ throw Error("illegal arguments: " + typeof rounds);
169
+ function _async(callback) {
170
+ nextTick(function () {
171
+ // Pretty thin, but salting is fast enough
172
+ try {
173
+ callback(null, genSaltSync(rounds));
174
+ } catch (err) {
175
+ callback(err);
176
+ }
177
+ });
178
+ }
179
+ if (callback) {
180
+ if (typeof callback !== "function")
181
+ throw Error("Illegal callback: " + typeof callback);
182
+ _async(callback);
183
+ } else
184
+ return new Promise(function (resolve, reject) {
185
+ _async(function (err, res) {
186
+ if (err) {
187
+ reject(err);
188
+ return;
189
+ }
190
+ resolve(res);
191
+ });
192
+ });
193
+ }
194
+
195
+ /**
196
+ * Synchronously generates a hash for the given password.
197
+ * @param {string} password Password to hash
198
+ * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10
199
+ * @returns {string} Resulting hash
200
+ */
201
+ function hashSync(password, salt) {
202
+ if (typeof salt === "undefined") salt = GENSALT_DEFAULT_LOG2_ROUNDS;
203
+ if (typeof salt === "number") salt = genSaltSync(salt);
204
+ if (typeof password !== "string" || typeof salt !== "string")
205
+ throw Error(
206
+ "Illegal arguments: " + typeof password + ", " + typeof salt,
207
+ );
208
+ return _hash(password, salt);
209
+ }
210
+
211
+ /**
212
+ * Asynchronously generates a hash for the given password.
213
+ * @param {string} password Password to hash
214
+ * @param {number|string} salt Salt length to generate or salt to use
215
+ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash
216
+ * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
217
+ * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
218
+ * @returns {!Promise} If `callback` has been omitted
219
+ * @throws {Error} If `callback` is present but not a function
220
+ */
221
+ function hash(password, salt, callback, progressCallback) {
222
+ function _async(callback) {
223
+ if (typeof password === "string" && typeof salt === "number")
224
+ genSalt(salt, function (err, salt) {
225
+ _hash(password, salt, callback, progressCallback);
226
+ });
227
+ else if (typeof password === "string" && typeof salt === "string")
228
+ _hash(password, salt, callback, progressCallback);
229
+ else
230
+ nextTick(
231
+ callback.bind(
232
+ this,
233
+ Error(
234
+ "Illegal arguments: " + typeof password + ", " + typeof salt,
235
+ ),
236
+ ),
237
+ );
238
+ }
239
+ if (callback) {
240
+ if (typeof callback !== "function")
241
+ throw Error("Illegal callback: " + typeof callback);
242
+ _async(callback);
243
+ } else
244
+ return new Promise(function (resolve, reject) {
245
+ _async(function (err, res) {
246
+ if (err) {
247
+ reject(err);
248
+ return;
249
+ }
250
+ resolve(res);
251
+ });
252
+ });
253
+ }
254
+
255
+ /**
256
+ * Compares two strings of the same length in constant time.
257
+ * @param {string} known Must be of the correct length
258
+ * @param {string} unknown Must be the same length as `known`
259
+ * @returns {boolean}
260
+ * @inner
261
+ */
262
+ function safeStringCompare(known, unknown) {
263
+ var diff = known.length ^ unknown.length;
264
+ for (var i = 0; i < known.length; ++i) {
265
+ diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i);
266
+ }
267
+ return diff === 0;
268
+ }
269
+
270
+ /**
271
+ * Synchronously tests a password against a hash.
272
+ * @param {string} password Password to compare
273
+ * @param {string} hash Hash to test against
274
+ * @returns {boolean} true if matching, otherwise false
275
+ * @throws {Error} If an argument is illegal
276
+ */
277
+ function compareSync(password, hash) {
278
+ if (typeof password !== "string" || typeof hash !== "string")
279
+ throw Error(
280
+ "Illegal arguments: " + typeof password + ", " + typeof hash,
281
+ );
282
+ if (hash.length !== 60) return false;
283
+ return safeStringCompare(
284
+ hashSync(password, hash.substring(0, hash.length - 31)),
285
+ hash,
286
+ );
287
+ }
288
+
289
+ /**
290
+ * Asynchronously tests a password against a hash.
291
+ * @param {string} password Password to compare
292
+ * @param {string} hashValue Hash to test against
293
+ * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result
294
+ * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
295
+ * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
296
+ * @returns {!Promise} If `callback` has been omitted
297
+ * @throws {Error} If `callback` is present but not a function
298
+ */
299
+ function compare(password, hashValue, callback, progressCallback) {
300
+ function _async(callback) {
301
+ if (typeof password !== "string" || typeof hashValue !== "string") {
302
+ nextTick(
303
+ callback.bind(
304
+ this,
305
+ Error(
306
+ "Illegal arguments: " +
307
+ typeof password +
308
+ ", " +
309
+ typeof hashValue,
310
+ ),
311
+ ),
312
+ );
313
+ return;
314
+ }
315
+ if (hashValue.length !== 60) {
316
+ nextTick(callback.bind(this, null, false));
317
+ return;
318
+ }
319
+ hash(
320
+ password,
321
+ hashValue.substring(0, 29),
322
+ function (err, comp) {
323
+ if (err) callback(err);
324
+ else callback(null, safeStringCompare(comp, hashValue));
325
+ },
326
+ progressCallback,
327
+ );
328
+ }
329
+ if (callback) {
330
+ if (typeof callback !== "function")
331
+ throw Error("Illegal callback: " + typeof callback);
332
+ _async(callback);
333
+ } else
334
+ return new Promise(function (resolve, reject) {
335
+ _async(function (err, res) {
336
+ if (err) {
337
+ reject(err);
338
+ return;
339
+ }
340
+ resolve(res);
341
+ });
342
+ });
343
+ }
344
+
345
+ /**
346
+ * Gets the number of rounds used to encrypt the specified hash.
347
+ * @param {string} hash Hash to extract the used number of rounds from
348
+ * @returns {number} Number of rounds used
349
+ * @throws {Error} If `hash` is not a string
350
+ */
351
+ function getRounds(hash) {
352
+ if (typeof hash !== "string")
353
+ throw Error("Illegal arguments: " + typeof hash);
354
+ return parseInt(hash.split("$")[2], 10);
355
+ }
356
+
357
+ /**
358
+ * Gets the salt portion from a hash. Does not validate the hash.
359
+ * @param {string} hash Hash to extract the salt from
360
+ * @returns {string} Extracted salt part
361
+ * @throws {Error} If `hash` is not a string or otherwise invalid
362
+ */
363
+ function getSalt(hash) {
364
+ if (typeof hash !== "string")
365
+ throw Error("Illegal arguments: " + typeof hash);
366
+ if (hash.length !== 60)
367
+ throw Error("Illegal hash length: " + hash.length + " != 60");
368
+ return hash.substring(0, 29);
369
+ }
370
+
371
+ /**
372
+ * Tests if a password will be truncated when hashed, that is its length is
373
+ * greater than 72 bytes when converted to UTF-8.
374
+ * @param {string} password The password to test
375
+ * @returns {boolean} `true` if truncated, otherwise `false`
376
+ */
377
+ function truncates(password) {
378
+ if (typeof password !== "string")
379
+ throw Error("Illegal arguments: " + typeof password);
380
+ return utf8Length(password) > 72;
381
+ }
382
+
383
+ /**
384
+ * Continues with the callback after yielding to the event loop.
385
+ * @function
386
+ * @param {function(...[*])} callback Callback to execute
387
+ * @inner
388
+ */
389
+ var nextTick =
390
+ typeof setImmediate === "function"
391
+ ? setImmediate
392
+ : typeof scheduler === "object" &&
393
+ typeof scheduler.postTask === "function"
394
+ ? scheduler.postTask.bind(scheduler)
395
+ : setTimeout;
396
+
397
+ /** Calculates the byte length of a string encoded as UTF8. */
398
+ function utf8Length(string) {
399
+ var len = 0,
400
+ c = 0;
401
+ for (var i = 0; i < string.length; ++i) {
402
+ c = string.charCodeAt(i);
403
+ if (c < 128) len += 1;
404
+ else if (c < 2048) len += 2;
405
+ else if (
406
+ (c & 0xfc00) === 0xd800 &&
407
+ (string.charCodeAt(i + 1) & 0xfc00) === 0xdc00
408
+ ) {
409
+ ++i;
410
+ len += 4;
411
+ } else len += 3;
412
+ }
413
+ return len;
414
+ }
415
+
416
+ /** Converts a string to an array of UTF8 bytes. */
417
+ function utf8Array(string) {
418
+ var offset = 0,
419
+ c1,
420
+ c2;
421
+ var buffer = new Array(utf8Length(string));
422
+ for (var i = 0, k = string.length; i < k; ++i) {
423
+ c1 = string.charCodeAt(i);
424
+ if (c1 < 128) {
425
+ buffer[offset++] = c1;
426
+ } else if (c1 < 2048) {
427
+ buffer[offset++] = (c1 >> 6) | 192;
428
+ buffer[offset++] = (c1 & 63) | 128;
429
+ } else if (
430
+ (c1 & 0xfc00) === 0xd800 &&
431
+ ((c2 = string.charCodeAt(i + 1)) & 0xfc00) === 0xdc00
432
+ ) {
433
+ c1 = 0x10000 + ((c1 & 0x03ff) << 10) + (c2 & 0x03ff);
434
+ ++i;
435
+ buffer[offset++] = (c1 >> 18) | 240;
436
+ buffer[offset++] = ((c1 >> 12) & 63) | 128;
437
+ buffer[offset++] = ((c1 >> 6) & 63) | 128;
438
+ buffer[offset++] = (c1 & 63) | 128;
439
+ } else {
440
+ buffer[offset++] = (c1 >> 12) | 224;
441
+ buffer[offset++] = ((c1 >> 6) & 63) | 128;
442
+ buffer[offset++] = (c1 & 63) | 128;
443
+ }
444
+ }
445
+ return buffer;
446
+ }
447
+
448
+ // A base64 implementation for the bcrypt algorithm. This is partly non-standard.
449
+
450
+ /**
451
+ * bcrypt's own non-standard base64 dictionary.
452
+ * @type {!Array.<string>}
453
+ * @const
454
+ * @inner
455
+ **/
456
+ var BASE64_CODE =
457
+ "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(
458
+ "",
459
+ );
460
+
461
+ /**
462
+ * @type {!Array.<number>}
463
+ * @const
464
+ * @inner
465
+ **/
466
+ var BASE64_INDEX = [
467
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
468
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
469
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60,
470
+ 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
471
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
472
+ -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
473
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1,
474
+ ];
475
+
476
+ /**
477
+ * Encodes a byte array to base64 with up to len bytes of input.
478
+ * @param {!Array.<number>} b Byte array
479
+ * @param {number} len Maximum input length
480
+ * @returns {string}
481
+ * @inner
482
+ */
483
+ function base64_encode(b, len) {
484
+ var off = 0,
485
+ rs = [],
486
+ c1,
487
+ c2;
488
+ if (len <= 0 || len > b.length) throw Error("Illegal len: " + len);
489
+ while (off < len) {
490
+ c1 = b[off++] & 0xff;
491
+ rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]);
492
+ c1 = (c1 & 0x03) << 4;
493
+ if (off >= len) {
494
+ rs.push(BASE64_CODE[c1 & 0x3f]);
495
+ break;
496
+ }
497
+ c2 = b[off++] & 0xff;
498
+ c1 |= (c2 >> 4) & 0x0f;
499
+ rs.push(BASE64_CODE[c1 & 0x3f]);
500
+ c1 = (c2 & 0x0f) << 2;
501
+ if (off >= len) {
502
+ rs.push(BASE64_CODE[c1 & 0x3f]);
503
+ break;
504
+ }
505
+ c2 = b[off++] & 0xff;
506
+ c1 |= (c2 >> 6) & 0x03;
507
+ rs.push(BASE64_CODE[c1 & 0x3f]);
508
+ rs.push(BASE64_CODE[c2 & 0x3f]);
509
+ }
510
+ return rs.join("");
511
+ }
512
+
513
+ /**
514
+ * Decodes a base64 encoded string to up to len bytes of output.
515
+ * @param {string} s String to decode
516
+ * @param {number} len Maximum output length
517
+ * @returns {!Array.<number>}
518
+ * @inner
519
+ */
520
+ function base64_decode(s, len) {
521
+ var off = 0,
522
+ slen = s.length,
523
+ olen = 0,
524
+ rs = [],
525
+ c1,
526
+ c2,
527
+ c3,
528
+ c4,
529
+ o,
530
+ code;
531
+ if (len <= 0) throw Error("Illegal len: " + len);
532
+ while (off < slen - 1 && olen < len) {
533
+ code = s.charCodeAt(off++);
534
+ c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
535
+ code = s.charCodeAt(off++);
536
+ c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
537
+ if (c1 == -1 || c2 == -1) break;
538
+ o = (c1 << 2) >>> 0;
539
+ o |= (c2 & 0x30) >> 4;
540
+ rs.push(String.fromCharCode(o));
541
+ if (++olen >= len || off >= slen) break;
542
+ code = s.charCodeAt(off++);
543
+ c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
544
+ if (c3 == -1) break;
545
+ o = ((c2 & 0x0f) << 4) >>> 0;
546
+ o |= (c3 & 0x3c) >> 2;
547
+ rs.push(String.fromCharCode(o));
548
+ if (++olen >= len || off >= slen) break;
549
+ code = s.charCodeAt(off++);
550
+ c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
551
+ o = ((c3 & 0x03) << 6) >>> 0;
552
+ o |= c4;
553
+ rs.push(String.fromCharCode(o));
554
+ ++olen;
555
+ }
556
+ var res = [];
557
+ for (off = 0; off < olen; off++) res.push(rs[off].charCodeAt(0));
558
+ return res;
559
+ }
560
+
561
+ /**
562
+ * @type {number}
563
+ * @const
564
+ * @inner
565
+ */
566
+ var BCRYPT_SALT_LEN = 16;
567
+
568
+ /**
569
+ * @type {number}
570
+ * @const
571
+ * @inner
572
+ */
573
+ var GENSALT_DEFAULT_LOG2_ROUNDS = 10;
574
+
575
+ /**
576
+ * @type {number}
577
+ * @const
578
+ * @inner
579
+ */
580
+ var BLOWFISH_NUM_ROUNDS = 16;
581
+
582
+ /**
583
+ * @type {number}
584
+ * @const
585
+ * @inner
586
+ */
587
+ var MAX_EXECUTION_TIME = 100;
588
+
589
+ /**
590
+ * @type {Array.<number>}
591
+ * @const
592
+ * @inner
593
+ */
594
+ var P_ORIG = [
595
+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
596
+ 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
597
+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b,
598
+ ];
599
+
600
+ /**
601
+ * @type {Array.<number>}
602
+ * @const
603
+ * @inner
604
+ */
605
+ var S_ORIG = [
606
+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
607
+ 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
608
+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
609
+ 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
610
+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
611
+ 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
612
+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
613
+ 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
614
+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
615
+ 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
616
+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
617
+ 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
618
+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
619
+ 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
620
+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
621
+ 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
622
+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
623
+ 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
624
+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
625
+ 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
626
+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
627
+ 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
628
+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
629
+ 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
630
+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
631
+ 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
632
+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
633
+ 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
634
+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
635
+ 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
636
+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
637
+ 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
638
+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
639
+ 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
640
+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
641
+ 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
642
+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
643
+ 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
644
+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
645
+ 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
646
+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
647
+ 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
648
+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944,
649
+ 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
650
+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
651
+ 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
652
+ 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26,
653
+ 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
654
+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c,
655
+ 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
656
+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6,
657
+ 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
658
+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f,
659
+ 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
660
+ 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
661
+ 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
662
+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa,
663
+ 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
664
+ 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55,
665
+ 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
666
+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1,
667
+ 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
668
+ 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78,
669
+ 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
670
+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
671
+ 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
672
+ 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170,
673
+ 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
674
+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7,
675
+ 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
676
+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099,
677
+ 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
678
+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263,
679
+ 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
680
+ 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
681
+ 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
682
+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7,
683
+ 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
684
+ 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d,
685
+ 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
686
+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460,
687
+ 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
688
+ 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484,
689
+ 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
690
+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
691
+ 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
692
+ 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a,
693
+ 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
694
+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785,
695
+ 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
696
+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900,
697
+ 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
698
+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9,
699
+ 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
700
+ 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
701
+ 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
702
+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9,
703
+ 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
704
+ 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f,
705
+ 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
706
+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e,
707
+ 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
708
+ 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd,
709
+ 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
710
+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
711
+ 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
712
+ 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c,
713
+ 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
714
+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b,
715
+ 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
716
+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386,
717
+ 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
718
+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0,
719
+ 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
720
+ 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
721
+ 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
722
+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770,
723
+ 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
724
+ 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c,
725
+ 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
726
+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa,
727
+ 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
728
+ 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63,
729
+ 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
730
+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
731
+ 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
732
+ 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4,
733
+ 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
734
+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
735
+ 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
736
+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
737
+ 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
738
+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
739
+ 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
740
+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
741
+ 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
742
+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
743
+ 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
744
+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
745
+ 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
746
+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
747
+ 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
748
+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
749
+ 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
750
+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
751
+ 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
752
+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
753
+ 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
754
+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
755
+ 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
756
+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
757
+ 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
758
+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
759
+ 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
760
+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
761
+ 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
762
+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
763
+ 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
764
+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
765
+ 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
766
+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
767
+ 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
768
+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
769
+ 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
770
+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
771
+ 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
772
+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
773
+ 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
774
+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
775
+ 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
776
+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
777
+ ];
778
+
779
+ /**
780
+ * @type {Array.<number>}
781
+ * @const
782
+ * @inner
783
+ */
784
+ var C_ORIG = [
785
+ 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274,
786
+ ];
787
+
788
+ /**
789
+ * @param {Array.<number>} lr
790
+ * @param {number} off
791
+ * @param {Array.<number>} P
792
+ * @param {Array.<number>} S
793
+ * @returns {Array.<number>}
794
+ * @inner
795
+ */
796
+ function _encipher(lr, off, P, S) {
797
+ // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt
798
+ var n,
799
+ l = lr[off],
800
+ r = lr[off + 1];
801
+ l ^= P[0];
802
+
803
+ /*
804
+ for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;)
805
+ // Feistel substitution on left word
806
+ n = S[l >>> 24],
807
+ n += S[0x100 | ((l >> 16) & 0xff)],
808
+ n ^= S[0x200 | ((l >> 8) & 0xff)],
809
+ n += S[0x300 | (l & 0xff)],
810
+ r ^= n ^ P[++i],
811
+ // Feistel substitution on right word
812
+ n = S[r >>> 24],
813
+ n += S[0x100 | ((r >> 16) & 0xff)],
814
+ n ^= S[0x200 | ((r >> 8) & 0xff)],
815
+ n += S[0x300 | (r & 0xff)],
816
+ l ^= n ^ P[++i];
817
+ */
818
+
819
+ //The following is an unrolled version of the above loop.
820
+ //Iteration 0
821
+ n = S[l >>> 24];
822
+ n += S[0x100 | ((l >> 16) & 0xff)];
823
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
824
+ n += S[0x300 | (l & 0xff)];
825
+ r ^= n ^ P[1];
826
+ n = S[r >>> 24];
827
+ n += S[0x100 | ((r >> 16) & 0xff)];
828
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
829
+ n += S[0x300 | (r & 0xff)];
830
+ l ^= n ^ P[2];
831
+ //Iteration 1
832
+ n = S[l >>> 24];
833
+ n += S[0x100 | ((l >> 16) & 0xff)];
834
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
835
+ n += S[0x300 | (l & 0xff)];
836
+ r ^= n ^ P[3];
837
+ n = S[r >>> 24];
838
+ n += S[0x100 | ((r >> 16) & 0xff)];
839
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
840
+ n += S[0x300 | (r & 0xff)];
841
+ l ^= n ^ P[4];
842
+ //Iteration 2
843
+ n = S[l >>> 24];
844
+ n += S[0x100 | ((l >> 16) & 0xff)];
845
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
846
+ n += S[0x300 | (l & 0xff)];
847
+ r ^= n ^ P[5];
848
+ n = S[r >>> 24];
849
+ n += S[0x100 | ((r >> 16) & 0xff)];
850
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
851
+ n += S[0x300 | (r & 0xff)];
852
+ l ^= n ^ P[6];
853
+ //Iteration 3
854
+ n = S[l >>> 24];
855
+ n += S[0x100 | ((l >> 16) & 0xff)];
856
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
857
+ n += S[0x300 | (l & 0xff)];
858
+ r ^= n ^ P[7];
859
+ n = S[r >>> 24];
860
+ n += S[0x100 | ((r >> 16) & 0xff)];
861
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
862
+ n += S[0x300 | (r & 0xff)];
863
+ l ^= n ^ P[8];
864
+ //Iteration 4
865
+ n = S[l >>> 24];
866
+ n += S[0x100 | ((l >> 16) & 0xff)];
867
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
868
+ n += S[0x300 | (l & 0xff)];
869
+ r ^= n ^ P[9];
870
+ n = S[r >>> 24];
871
+ n += S[0x100 | ((r >> 16) & 0xff)];
872
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
873
+ n += S[0x300 | (r & 0xff)];
874
+ l ^= n ^ P[10];
875
+ //Iteration 5
876
+ n = S[l >>> 24];
877
+ n += S[0x100 | ((l >> 16) & 0xff)];
878
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
879
+ n += S[0x300 | (l & 0xff)];
880
+ r ^= n ^ P[11];
881
+ n = S[r >>> 24];
882
+ n += S[0x100 | ((r >> 16) & 0xff)];
883
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
884
+ n += S[0x300 | (r & 0xff)];
885
+ l ^= n ^ P[12];
886
+ //Iteration 6
887
+ n = S[l >>> 24];
888
+ n += S[0x100 | ((l >> 16) & 0xff)];
889
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
890
+ n += S[0x300 | (l & 0xff)];
891
+ r ^= n ^ P[13];
892
+ n = S[r >>> 24];
893
+ n += S[0x100 | ((r >> 16) & 0xff)];
894
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
895
+ n += S[0x300 | (r & 0xff)];
896
+ l ^= n ^ P[14];
897
+ //Iteration 7
898
+ n = S[l >>> 24];
899
+ n += S[0x100 | ((l >> 16) & 0xff)];
900
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
901
+ n += S[0x300 | (l & 0xff)];
902
+ r ^= n ^ P[15];
903
+ n = S[r >>> 24];
904
+ n += S[0x100 | ((r >> 16) & 0xff)];
905
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
906
+ n += S[0x300 | (r & 0xff)];
907
+ l ^= n ^ P[16];
908
+ lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
909
+ lr[off + 1] = l;
910
+ return lr;
911
+ }
912
+
913
+ /**
914
+ * @param {Array.<number>} data
915
+ * @param {number} offp
916
+ * @returns {{key: number, offp: number}}
917
+ * @inner
918
+ */
919
+ function _streamtoword(data, offp) {
920
+ for (var i = 0, word = 0; i < 4; ++i)
921
+ (word = (word << 8) | (data[offp] & 0xff)),
922
+ (offp = (offp + 1) % data.length);
923
+ return {
924
+ key: word,
925
+ offp: offp,
926
+ };
927
+ }
928
+
929
+ /**
930
+ * @param {Array.<number>} key
931
+ * @param {Array.<number>} P
932
+ * @param {Array.<number>} S
933
+ * @inner
934
+ */
935
+ function _key(key, P, S) {
936
+ var offset = 0,
937
+ lr = [0, 0],
938
+ plen = P.length,
939
+ slen = S.length,
940
+ sw;
941
+ for (var i = 0; i < plen; i++)
942
+ (sw = _streamtoword(key, offset)),
943
+ (offset = sw.offp),
944
+ (P[i] = P[i] ^ sw.key);
945
+ for (i = 0; i < plen; i += 2)
946
+ (lr = _encipher(lr, 0, P, S)), (P[i] = lr[0]), (P[i + 1] = lr[1]);
947
+ for (i = 0; i < slen; i += 2)
948
+ (lr = _encipher(lr, 0, P, S)), (S[i] = lr[0]), (S[i + 1] = lr[1]);
949
+ }
950
+
951
+ /**
952
+ * Expensive key schedule Blowfish.
953
+ * @param {Array.<number>} data
954
+ * @param {Array.<number>} key
955
+ * @param {Array.<number>} P
956
+ * @param {Array.<number>} S
957
+ * @inner
958
+ */
959
+ function _ekskey(data, key, P, S) {
960
+ var offp = 0,
961
+ lr = [0, 0],
962
+ plen = P.length,
963
+ slen = S.length,
964
+ sw;
965
+ for (var i = 0; i < plen; i++)
966
+ (sw = _streamtoword(key, offp)),
967
+ (offp = sw.offp),
968
+ (P[i] = P[i] ^ sw.key);
969
+ offp = 0;
970
+ for (i = 0; i < plen; i += 2)
971
+ (sw = _streamtoword(data, offp)),
972
+ (offp = sw.offp),
973
+ (lr[0] ^= sw.key),
974
+ (sw = _streamtoword(data, offp)),
975
+ (offp = sw.offp),
976
+ (lr[1] ^= sw.key),
977
+ (lr = _encipher(lr, 0, P, S)),
978
+ (P[i] = lr[0]),
979
+ (P[i + 1] = lr[1]);
980
+ for (i = 0; i < slen; i += 2)
981
+ (sw = _streamtoword(data, offp)),
982
+ (offp = sw.offp),
983
+ (lr[0] ^= sw.key),
984
+ (sw = _streamtoword(data, offp)),
985
+ (offp = sw.offp),
986
+ (lr[1] ^= sw.key),
987
+ (lr = _encipher(lr, 0, P, S)),
988
+ (S[i] = lr[0]),
989
+ (S[i + 1] = lr[1]);
990
+ }
991
+
992
+ /**
993
+ * Internaly crypts a string.
994
+ * @param {Array.<number>} b Bytes to crypt
995
+ * @param {Array.<number>} salt Salt bytes to use
996
+ * @param {number} rounds Number of rounds
997
+ * @param {function(Error, Array.<number>=)=} callback Callback receiving the error, if any, and the resulting bytes. If
998
+ * omitted, the operation will be performed synchronously.
999
+ * @param {function(number)=} progressCallback Callback called with the current progress
1000
+ * @returns {!Array.<number>|undefined} Resulting bytes if callback has been omitted, otherwise `undefined`
1001
+ * @inner
1002
+ */
1003
+ function _crypt(b, salt, rounds, callback, progressCallback) {
1004
+ var cdata = C_ORIG.slice(),
1005
+ clen = cdata.length,
1006
+ err;
1007
+
1008
+ // Validate
1009
+ if (rounds < 4 || rounds > 31) {
1010
+ err = Error("Illegal number of rounds (4-31): " + rounds);
1011
+ if (callback) {
1012
+ nextTick(callback.bind(this, err));
1013
+ return;
1014
+ } else throw err;
1015
+ }
1016
+ if (salt.length !== BCRYPT_SALT_LEN) {
1017
+ err = Error(
1018
+ "Illegal salt length: " + salt.length + " != " + BCRYPT_SALT_LEN,
1019
+ );
1020
+ if (callback) {
1021
+ nextTick(callback.bind(this, err));
1022
+ return;
1023
+ } else throw err;
1024
+ }
1025
+ rounds = (1 << rounds) >>> 0;
1026
+ var P,
1027
+ S,
1028
+ i = 0,
1029
+ j;
1030
+
1031
+ //Use typed arrays when available - huge speedup!
1032
+ if (typeof Int32Array === "function") {
1033
+ P = new Int32Array(P_ORIG);
1034
+ S = new Int32Array(S_ORIG);
1035
+ } else {
1036
+ P = P_ORIG.slice();
1037
+ S = S_ORIG.slice();
1038
+ }
1039
+ _ekskey(salt, b, P, S);
1040
+
1041
+ /**
1042
+ * Calcualtes the next round.
1043
+ * @returns {Array.<number>|undefined} Resulting array if callback has been omitted, otherwise `undefined`
1044
+ * @inner
1045
+ */
1046
+ function next() {
1047
+ if (progressCallback) progressCallback(i / rounds);
1048
+ if (i < rounds) {
1049
+ var start = Date.now();
1050
+ for (; i < rounds; ) {
1051
+ i = i + 1;
1052
+ _key(b, P, S);
1053
+ _key(salt, P, S);
1054
+ if (Date.now() - start > MAX_EXECUTION_TIME) break;
1055
+ }
1056
+ } else {
1057
+ for (i = 0; i < 64; i++)
1058
+ for (j = 0; j < clen >> 1; j++) _encipher(cdata, j << 1, P, S);
1059
+ var ret = [];
1060
+ for (i = 0; i < clen; i++)
1061
+ ret.push(((cdata[i] >> 24) & 0xff) >>> 0),
1062
+ ret.push(((cdata[i] >> 16) & 0xff) >>> 0),
1063
+ ret.push(((cdata[i] >> 8) & 0xff) >>> 0),
1064
+ ret.push((cdata[i] & 0xff) >>> 0);
1065
+ if (callback) {
1066
+ callback(null, ret);
1067
+ return;
1068
+ } else return ret;
1069
+ }
1070
+ if (callback) nextTick(next);
1071
+ }
1072
+
1073
+ // Async
1074
+ if (typeof callback !== "undefined") {
1075
+ next();
1076
+
1077
+ // Sync
1078
+ } else {
1079
+ var res;
1080
+ while (true)
1081
+ if (typeof (res = next()) !== "undefined") return res || [];
1082
+ }
1083
+ }
1084
+
1085
+ /**
1086
+ * Internally hashes a password.
1087
+ * @param {string} password Password to hash
1088
+ * @param {?string} salt Salt to use, actually never null
1089
+ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted,
1090
+ * hashing is performed synchronously.
1091
+ * @param {function(number)=} progressCallback Callback called with the current progress
1092
+ * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined`
1093
+ * @inner
1094
+ */
1095
+ function _hash(password, salt, callback, progressCallback) {
1096
+ var err;
1097
+ if (typeof password !== "string" || typeof salt !== "string") {
1098
+ err = Error("Invalid string / salt: Not a string");
1099
+ if (callback) {
1100
+ nextTick(callback.bind(this, err));
1101
+ return;
1102
+ } else throw err;
1103
+ }
1104
+
1105
+ // Validate the salt
1106
+ var minor, offset;
1107
+ if (salt.charAt(0) !== "$" || salt.charAt(1) !== "2") {
1108
+ err = Error("Invalid salt version: " + salt.substring(0, 2));
1109
+ if (callback) {
1110
+ nextTick(callback.bind(this, err));
1111
+ return;
1112
+ } else throw err;
1113
+ }
1114
+ if (salt.charAt(2) === "$")
1115
+ (minor = String.fromCharCode(0)), (offset = 3);
1116
+ else {
1117
+ minor = salt.charAt(2);
1118
+ if (
1119
+ (minor !== "a" && minor !== "b" && minor !== "y") ||
1120
+ salt.charAt(3) !== "$"
1121
+ ) {
1122
+ err = Error("Invalid salt revision: " + salt.substring(2, 4));
1123
+ if (callback) {
1124
+ nextTick(callback.bind(this, err));
1125
+ return;
1126
+ } else throw err;
1127
+ }
1128
+ offset = 4;
1129
+ }
1130
+
1131
+ // Extract number of rounds
1132
+ if (salt.charAt(offset + 2) > "$") {
1133
+ err = Error("Missing salt rounds");
1134
+ if (callback) {
1135
+ nextTick(callback.bind(this, err));
1136
+ return;
1137
+ } else throw err;
1138
+ }
1139
+ var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10,
1140
+ r2 = parseInt(salt.substring(offset + 1, offset + 2), 10),
1141
+ rounds = r1 + r2,
1142
+ real_salt = salt.substring(offset + 3, offset + 25);
1143
+ password += minor >= "a" ? "\x00" : "";
1144
+ var passwordb = utf8Array(password),
1145
+ saltb = base64_decode(real_salt, BCRYPT_SALT_LEN);
1146
+
1147
+ /**
1148
+ * Finishes hashing.
1149
+ * @param {Array.<number>} bytes Byte array
1150
+ * @returns {string}
1151
+ * @inner
1152
+ */
1153
+ function finish(bytes) {
1154
+ var res = [];
1155
+ res.push("$2");
1156
+ if (minor >= "a") res.push(minor);
1157
+ res.push("$");
1158
+ if (rounds < 10) res.push("0");
1159
+ res.push(rounds.toString());
1160
+ res.push("$");
1161
+ res.push(base64_encode(saltb, saltb.length));
1162
+ res.push(base64_encode(bytes, C_ORIG.length * 4 - 1));
1163
+ return res.join("");
1164
+ }
1165
+
1166
+ // Sync
1167
+ if (typeof callback == "undefined")
1168
+ return finish(_crypt(passwordb, saltb, rounds));
1169
+ // Async
1170
+ else {
1171
+ _crypt(
1172
+ passwordb,
1173
+ saltb,
1174
+ rounds,
1175
+ function (err, bytes) {
1176
+ if (err) callback(err, null);
1177
+ else callback(null, finish(bytes));
1178
+ },
1179
+ progressCallback,
1180
+ );
1181
+ }
1182
+ }
1183
+
1184
+ /**
1185
+ * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet.
1186
+ * @function
1187
+ * @param {!Array.<number>} bytes Byte array
1188
+ * @param {number} length Maximum input length
1189
+ * @returns {string}
1190
+ */
1191
+ function encodeBase64(bytes, length) {
1192
+ return base64_encode(bytes, length);
1193
+ }
1194
+
1195
+ /**
1196
+ * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet.
1197
+ * @function
1198
+ * @param {string} string String to decode
1199
+ * @param {number} length Maximum output length
1200
+ * @returns {!Array.<number>}
1201
+ */
1202
+ function decodeBase64(string, length) {
1203
+ return base64_decode(string, length);
1204
+ }
1205
+ var _default = (_exports.default = {
1206
+ setRandomFallback,
1207
+ genSaltSync,
1208
+ genSalt,
1209
+ hashSync,
1210
+ hash,
1211
+ compareSync,
1212
+ compare,
1213
+ getRounds,
1214
+ getSalt,
1215
+ truncates,
1216
+ encodeBase64,
1217
+ decodeBase64,
1218
+ });
1219
+ },
1220
+ );