1
- ! function ( f , a , c ) { var s , l = 256 , p = "random" , d = c . pow ( l , 6 ) , g = c . pow ( 2 , 52 ) , y = 2 * g , h = l - 1 ; function n ( n , t , r ) { function e ( ) { for ( var n = u . g ( 6 ) , t = d , r = 0 ; n < g ; ) n = ( n + r ) * l , t *= l , r = u . g ( 1 ) ; for ( ; y <= n ; ) n /= 2 , t /= 2 , r >>>= 1 ; return ( n + r ) / t } var o = [ ] , i = j ( function n ( t , r ) { var e , o = [ ] , i = typeof t ; if ( r && "object" == i ) for ( e in t ) try { o . push ( n ( t [ e ] , r - 1 ) ) } catch ( n ) { } return o . length ?o :"string" == i ?t :t + "\0" } ( ( t = 1 == t ?{ entropy :! 0 } :t || { } ) . entropy ?[ n , S ( a ) ] :null == n ?function ( ) { try { var n ; return s && ( n = s . randomBytes ) ?n = n ( l ) :( n = new Uint8Array ( l ) , ( f . crypto || f . msCrypto ) . getRandomValues ( n ) ) , S ( n ) } catch ( n ) { var t = f . navigator , r = t && t . plugins ; return [ + new Date , f , r , f . screen , S ( a ) ] } } ( ) :n , 3 ) , o ) , u = new m ( o ) ; return e . int32 = function ( ) { return 0 | u . g ( 4 ) } , e . quick = function ( ) { return u . g ( 4 ) / 4294967296 } , e . double = e , j ( S ( u . S ) , a ) , ( t . pass || r || function ( n , t , r , e ) { return e && ( e . S && v ( e , u ) , n . state = function ( ) { return v ( u , { } ) } ) , r ?( c [ p ] = n , t ) :n } ) ( e , i , "global" in t ?t . global :this == c , t . state ) } function m ( n ) { var t , r = n . length , u = this , e = 0 , o = u . i = u . j = 0 , i = u . S = [ ] ; for ( r || ( n = [ r ++ ] ) ; e < l ; ) i [ e ] = e ++ ; for ( e = 0 ; e < l ; e ++ ) i [ e ] = i [ o = h & o + n [ e % r ] + ( t = i [ e ] ) ] , i [ o ] = t ; ( u . g = function ( n ) { for ( var t , r = 0 , e = u . i , o = u . j , i = u . S ; n -- ; ) t = i [ e = h & e + 1 ] , r = r * l + i [ h & ( i [ e ] = i [ o = h & o + t ] ) + ( i [ o ] = t ) ] ; return u . i = e , u . j = o , r } ) ( l ) } function v ( n , t ) { return t . i = n . i , t . j = n . j , t . S = n . S . slice ( ) , t } function j ( n , t ) { for ( var r , e = n + "" , o = 0 ; o < e . length ; ) t [ h & o ] = h & ( r ^= 19 * t [ h & o ] ) + e . charCodeAt ( o ++ ) ; return S ( t ) } function S ( n ) { return String . fromCharCode . apply ( 0 , n ) } if ( j ( c . random ( ) , a ) , "object" == typeof module && module . exports ) { module . exports = n ; try { s = require ( "crypto" ) } catch ( n ) { } } else "function" == typeof define && define . amd ?define ( function ( ) { return n } ) :c [ "seed" + p ] = n } ( "undefined" != typeof self ?self :this , [ ] , Math ) ;
1
+ /*
2
+ Copyright 2019 David Bau.
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ */
24
+
25
+ ( function ( global , pool , math ) {
26
+ //
27
+ // The following constants are related to IEEE 754 limits.
28
+ //
29
+
30
+ var width = 256 , // each RC4 output is 0 <= x < 256
31
+ chunks = 6 , // at least six RC4 outputs for each double
32
+ digits = 52 , // there are 52 significant digits in a double
33
+ rngname = 'random' , // rngname: name for Math.random and Math.seedrandom
34
+ startdenom = math . pow ( width , chunks ) ,
35
+ significance = math . pow ( 2 , digits ) ,
36
+ overflow = significance * 2 ,
37
+ mask = width - 1 ,
38
+ nodecrypto ; // node.js crypto module, initialized at the bottom.
39
+
40
+ //
41
+ // seedrandom()
42
+ // This is the seedrandom function described above.
43
+ //
44
+ function seedrandom ( seed , options , callback ) {
45
+ var key = [ ] ;
46
+ options = ( options == true ) ? { entropy : true } : ( options || { } ) ;
47
+
48
+ // Flatten the seed string or build one from local entropy if needed.
49
+ var shortseed = mixkey ( flatten (
50
+ options . entropy ? [ seed , tostring ( pool ) ] :
51
+ ( seed == null ) ? autoseed ( ) : seed , 3 ) , key ) ;
52
+
53
+ // Use the seed to initialize an ARC4 generator.
54
+ var arc4 = new ARC4 ( key ) ;
55
+
56
+ // This function returns a random double in [0, 1) that contains
57
+ // randomness in every bit of the mantissa of the IEEE 754 value.
58
+ var prng = function ( ) {
59
+ var n = arc4 . g ( chunks ) , // Start with a numerator n < 2 ^ 48
60
+ d = startdenom , // and denominator d = 2 ^ 48.
61
+ x = 0 ; // and no 'extra last byte'.
62
+ while ( n < significance ) { // Fill up all significant digits by
63
+ n = ( n + x ) * width ; // shifting numerator and
64
+ d *= width ; // denominator and generating a
65
+ x = arc4 . g ( 1 ) ; // new least-significant-byte.
66
+ }
67
+ while ( n >= overflow ) { // To avoid rounding up, before adding
68
+ n /= 2 ; // last byte, shift everything
69
+ d /= 2 ; // right using integer math until
70
+ x >>>= 1 ; // we have exactly the desired bits.
71
+ }
72
+ return ( n + x ) / d ; // Form the number within [0, 1).
73
+ } ;
74
+
75
+ prng . int32 = function ( ) { return arc4 . g ( 4 ) | 0 ; }
76
+ prng . quick = function ( ) { return arc4 . g ( 4 ) / 0x100000000 ; }
77
+ prng . double = prng ;
78
+
79
+ // Mix the randomness into accumulated entropy.
80
+ mixkey ( tostring ( arc4 . S ) , pool ) ;
81
+
82
+ // Calling convention: what to return as a function of prng, seed, is_math.
83
+ return ( options . pass || callback ||
84
+ function ( prng , seed , is_math_call , state ) {
85
+ if ( state ) {
86
+ // Load the arc4 state from the given state if it has an S array.
87
+ if ( state . S ) { copy ( state , arc4 ) ; }
88
+ // Only provide the .state method if requested via options.state.
89
+ prng . state = function ( ) { return copy ( arc4 , { } ) ; }
90
+ }
91
+
92
+ // If called as a method of Math (Math.seedrandom()), mutate
93
+ // Math.random because that is how seedrandom.js has worked since v1.0.
94
+ if ( is_math_call ) { math [ rngname ] = prng ; return seed ; }
95
+
96
+ // Otherwise, it is a newer calling convention, so return the
97
+ // prng directly.
98
+ else return prng ;
99
+ } ) (
100
+ prng ,
101
+ shortseed ,
102
+ 'global' in options ? options . global : ( this == math ) ,
103
+ options . state ) ;
104
+ }
105
+
106
+ //
107
+ // ARC4
108
+ //
109
+ // An ARC4 implementation. The constructor takes a key in the form of
110
+ // an array of at most (width) integers that should be 0 <= x < (width).
111
+ //
112
+ // The g(count) method returns a pseudorandom integer that concatenates
113
+ // the next (count) outputs from ARC4. Its return value is a number x
114
+ // that is in the range 0 <= x < (width ^ count).
115
+ //
116
+ function ARC4 ( key ) {
117
+ var t , keylen = key . length ,
118
+ me = this , i = 0 , j = me . i = me . j = 0 , s = me . S = [ ] ;
119
+
120
+ // The empty key [] is treated as [0].
121
+ if ( ! keylen ) { key = [ keylen ++ ] ; }
122
+
123
+ // Set up S using the standard key scheduling algorithm.
124
+ while ( i < width ) {
125
+ s [ i ] = i ++ ;
126
+ }
127
+ for ( i = 0 ; i < width ; i ++ ) {
128
+ s [ i ] = s [ j = mask & ( j + key [ i % keylen ] + ( t = s [ i ] ) ) ] ;
129
+ s [ j ] = t ;
130
+ }
131
+
132
+ // The "g" method returns the next (count) outputs as one number.
133
+ ( me . g = function ( count ) {
134
+ // Using instance members instead of closure state nearly doubles speed.
135
+ var t , r = 0 ,
136
+ i = me . i , j = me . j , s = me . S ;
137
+ while ( count -- ) {
138
+ t = s [ i = mask & ( i + 1 ) ] ;
139
+ r = r * width + s [ mask & ( ( s [ i ] = s [ j = mask & ( j + t ) ] ) + ( s [ j ] = t ) ) ] ;
140
+ }
141
+ me . i = i ; me . j = j ;
142
+ return r ;
143
+ // For robust unpredictability, the function call below automatically
144
+ // discards an initial batch of values. This is called RC4-drop[256].
145
+ // See http://google.com/search?q=rsa+fluhrer+response&btnI
146
+ } ) ( width ) ;
147
+ }
148
+
149
+ //
150
+ // copy()
151
+ // Copies internal state of ARC4 to or from a plain object.
152
+ //
153
+ function copy ( f , t ) {
154
+ t . i = f . i ;
155
+ t . j = f . j ;
156
+ t . S = f . S . slice ( ) ;
157
+ return t ;
158
+ } ;
159
+
160
+ //
161
+ // flatten()
162
+ // Converts an object tree to nested arrays of strings.
163
+ //
164
+ function flatten ( obj , depth ) {
165
+ var result = [ ] , typ = ( typeof obj ) , prop ;
166
+ if ( depth && typ == 'object' ) {
167
+ for ( prop in obj ) {
168
+ try { result . push ( flatten ( obj [ prop ] , depth - 1 ) ) ; } catch ( e ) { }
169
+ }
170
+ }
171
+ return ( result . length ? result : typ == 'string' ? obj : obj + '\0' ) ;
172
+ }
173
+
174
+ //
175
+ // mixkey()
176
+ // Mixes a string seed into a key that is an array of integers, and
177
+ // returns a shortened string seed that is equivalent to the result key.
178
+ //
179
+ function mixkey ( seed , key ) {
180
+ var stringseed = seed + '' , smear , j = 0 ;
181
+ while ( j < stringseed . length ) {
182
+ key [ mask & j ] =
183
+ mask & ( ( smear ^= key [ mask & j ] * 19 ) + stringseed . charCodeAt ( j ++ ) ) ;
184
+ }
185
+ return tostring ( key ) ;
186
+ }
187
+
188
+ //
189
+ // autoseed()
190
+ // Returns an object for autoseeding, using window.crypto and Node crypto
191
+ // module if available.
192
+ //
193
+ function autoseed ( ) {
194
+ try {
195
+ var out ;
196
+ if ( nodecrypto && ( out = nodecrypto . randomBytes ) ) {
197
+ // The use of 'out' to remember randomBytes makes tight minified code.
198
+ out = out ( width ) ;
199
+ } else {
200
+ out = new Uint8Array ( width ) ;
201
+ ( global . crypto || global . msCrypto ) . getRandomValues ( out ) ;
202
+ }
203
+ return tostring ( out ) ;
204
+ } catch ( e ) {
205
+ var browser = global . navigator ,
206
+ plugins = browser && browser . plugins ;
207
+ return [ + new Date , global , plugins , global . screen , tostring ( pool ) ] ;
208
+ }
209
+ }
210
+
211
+ //
212
+ // tostring()
213
+ // Converts an array of charcodes to a string
214
+ //
215
+ function tostring ( a ) {
216
+ return String . fromCharCode . apply ( 0 , a ) ;
217
+ }
218
+
219
+ //
220
+ // When seedrandom.js is loaded, we immediately mix a few bits
221
+ // from the built-in RNG into the entropy pool. Because we do
222
+ // not want to interfere with deterministic PRNG state later,
223
+ // seedrandom will not call math.random on its own again after
224
+ // initialization.
225
+ //
226
+ mixkey ( math . random ( ) , pool ) ;
227
+
228
+ //
229
+ // Nodejs and AMD support: export the implementation as a module using
230
+ // either convention.
231
+ //
232
+ if ( ( typeof module ) == 'object' && module . exports ) {
233
+ module . exports = seedrandom ;
234
+ // When in node.js, try using crypto package for autoseeding.
235
+ try {
236
+ nodecrypto = require ( 'crypto' ) ;
237
+ } catch ( ex ) { }
238
+ } else if ( ( typeof define ) == 'function' && define . amd ) {
239
+ define ( function ( ) { return seedrandom ; } ) ;
240
+ } else {
241
+ // When included as a plain script, set up Math.seedrandom global.
242
+ math [ 'seed' + rngname ] = seedrandom ;
243
+ }
244
+
245
+
246
+ // End anonymous scope, and pass initial values.
247
+ } ) (
248
+ // global: `self` in browsers (including strict mode and web workers),
249
+ // otherwise `this` in Node and other environments
250
+ ( typeof self !== 'undefined' ) ? self : this ,
251
+ [ ] , // pool: entropy pool starts empty
252
+ Math // math: package containing random, pow, and seedrandom
253
+ ) ;
0 commit comments