forked from Eureka/chaz-wedding
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.txt
1244 lines (1244 loc) · 676 KB
/
test.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
./public/vendor/hide-address-bar/hide-address-bar.js: data-url="/users/set_protocol?protocol_selector=http&protocol_type=clone">
./public/vendor/hide-address-bar/hide-address-bar.js: data-url="/users/set_protocol?protocol_selector=subversion&protocol_type=clone">
./public/vendor/hide-address-bar/hide-address-bar.js: <h2 class="facebox-header">Users who have contributed to this file</h2>
./node_modules/jade/jade.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/jade/Readme_zh-cn.md:Jade 在内部会把这些语句转换成原生的 JavaScript 语句,就像使用 `users.forEach(function(user){`, 词法作用域和嵌套会像在普通的 JavaScript 中一样:
./node_modules/jade/Readme_zh-cn.md:each user in users
./node_modules/jade/Readme_zh-cn.md:for user in users
./node_modules/jade/Readme_zh-cn.md:for user in users
./node_modules/jade/Readme_zh-cn.md:for user in users
./node_modules/jade/Readme_zh-cn.md:for user in users
./node_modules/jade/Readme_zh-cn.md: a(href='/users/' + user.id)= user.name
./node_modules/jade/Readme_zh-cn.md:接着,当我们迭代users的时候,只需简单地加上`include user`。因为在循环中`user`变量已经被定义了,被包含的模板可以访问它。
./node_modules/jade/Readme_zh-cn.md:users = [{ name: 'Tobi', occupation: 'Ferret' }]
./node_modules/jade/Readme_zh-cn.md:each user in users
./node_modules/jade/Readme_zh-cn.md:each person in users
./node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js: "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/",
./node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js: "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/",
./node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js: "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/",
./node_modules/jade/jade-language.md:JavaScript loops such as `users.forEach(function(user){`,
./node_modules/jade/jade-language.md:each user in users
./node_modules/jade/jade-language.md:for user in users
./node_modules/jade/jade-language.md:for user in users
./node_modules/jade/jade-language.md:for user in users
./node_modules/jade/jade-language.md:for user in users
./node_modules/jade/jade-language.md: a(href='/users/' + user.id)= user.name
./node_modules/jade/jade-language.md:We could then simply `include user` while iterating users, and since the `user` variable is already defined within the loop the included template will have access to it.
./node_modules/jade/jade-language.md:users = [{ name: 'Tobi', occupation: 'Ferret' }]
./node_modules/jade/jade-language.md:each user in users
./node_modules/jade/jade-language.md:each person in users
./node_modules/jade/jade.md: - users.forEach(function(user){
./node_modules/jade/jade.md: for user in users
./node_modules/jade/jade.md: each user in users
./node_modules/jade/jade.md: for user, i in users
./node_modules/.bin/express: * Routes users template.
./node_modules/.bin/express:var users = [
./node_modules/.bin/express: , ' * GET users listing.'
./node_modules/.bin/express: , 'app.get(\'/users\', user.list);'
./node_modules/.bin/express: write(path + '/routes/user.js', users);
./node_modules/express/lib/request.js: * for example "Range: users=0-3" should respond
./node_modules/express/lib/request.js: * with 4 users when available, not 3.
./node_modules/express/lib/response.js: * next: 'http://api.example.com/users?page=2',
./node_modules/express/lib/response.js: * last: 'http://api.example.com/users?page=5'
./node_modules/express/bin/express: * Routes users template.
./node_modules/express/bin/express:var users = [
./node_modules/express/bin/express: , ' * GET users listing.'
./node_modules/express/bin/express: , 'app.get(\'/users\', user.list);'
./node_modules/express/bin/express: write(path + '/routes/user.js', users);
./node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js: "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/",
./node_modules/request/package.json: "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n<pre>\n npm install request\n</pre>\n\nOr from source:\n\n<pre>\n git clone git://github.com/mikeal/request.git \n cd request\n npm link\n</pre>\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## HTTP Authentication\n\n```javascript\nrequest.get('http://some.server.com/').auth('username', 'password', false);\n// or\nrequest.get('http://some.server.com/', {\n 'auth': {\n 'user': 'username',\n 'pass': 'password',\n 'sendImmediately': false\n }\n});\n```\n\nIf passed as an option, `auth` should be a hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional). The method form takes parameters `auth(username, password, sendImmediately)`.\n\n`sendImmediately` defaults to true, which will cause a basic authentication header to be sent. If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a 401 response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).\n\nDigest authentication is supported, but it only works with `sendImmediately` set to `false` (otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail).\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Ideally, you would take the body in the response\n // and construct a URL that a user clicks on (like a sign in button).\n // The verifier is only available in the response after a user has \n // verified with twitter that they are authorizing your app.\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: access_token.oauth_verifier\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for PATCH, POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `auth` - A hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional). See documentation above.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `true` if you want cookies to be remembered for future use, or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n* `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.\n* `localAddress` - Local interface to bind for network connections.\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second is an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.patch\n\nSame as request() but defaults to `method: \"PATCH\"`.\n\n```javascript\nrequest.patch(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are disabled by default (else, they would be used in subsequent requests). To enable cookies set jar to true (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: true})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n",
./node_modules/request/node_modules/form-data/node_modules/async/package.json: "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, each…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n\nasync.parallel([\n function(){ ... },\n function(){ ... }\n], callback);\n\nasync.series([\n function(){ ... },\n function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n squareExponent: 2,\n square: function(number, callback){ \n var result = Math.pow(number, this.squareExponent);\n setTimeout(function(){\n callback(null, result);\n }, 200);\n }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n // result is [NaN, NaN, NaN]\n // This fails because the `this.squareExponent` expression in the square\n // function is not evaluated in the context of AsyncSquaringLibrary, and is\n // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n // result is [1, 4, 9]\n // With the help of bind we can attach a context to the iterator before\n // passing it to async. Now the square function will be executed in its \n // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback(err, reduction) which accepts an optional error as its first \n argument, and the state of the reduction as the second. If an error is \n passed to the callback, the reduction is stopped and the main callback is \n immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n}, function(err, result){\n // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, sortValue) which must be called once it\n has completed with an error (which can be null) and a value to use as the sort\n criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n}, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, results) which must be called once it \n has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results){\n // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n }\n],\n// optional callback\nfunction(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback(err) which must be called once it has completed with an \n optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n callback(err, result1, result2, ...) it must call on completion. The first\n argument is an error (which can be null) and any further arguments will be \n passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n], function (err, result) {\n // result now equals 'done' \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n setTimeout(function () {\n callback(null, n + 1);\n }, 10);\n}\n\nfunction mul3(n, callback) {\n setTimeout(function () {\n callback(null, n * 3);\n }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n buckets,\n async.applyEach([enableSearch, updateSchema]),\n callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task, which must call its callback(err) argument when finished, with an \n optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n queued tasks, which must call its callback(err) argument when finished, with \n an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n process per round. This property can be changed after a cargo is created to\n alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n for(var i=0; i<tasks.length; i++){\n console.log('hello ' + tasks[i].name);\n }\n callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n readData: function(cb, results){\n fs.readFile('data.txt', 'utf-8', cb);\n }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The \n function receives two arguments: (1) a callback(err, result) which must be \n called when finished, passing an error (which can be null) and the result of \n the function's execution, and (2) a results object, containing the results of\n the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n \n\n__Example__\n\n```js\nasync.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n],\nfunction(err, results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n callback(null, {\n id: 'user' + id\n })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n createUser(n, function(err, user) {\n next(err, user)\n })\n}, function(err, users) {\n // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
./node_modules/request/node_modules/form-data/node_modules/async/README.md:// generate 5 users
./node_modules/request/node_modules/form-data/node_modules/async/README.md:}, function(err, users) {
./node_modules/request/node_modules/form-data/node_modules/async/README.md: // we should now have 5 users
./node_modules/request/node_modules/hawk/node_modules/hoek/package.json: "readme": "<a href=\"https://github.com/spumko\"><img src=\"https://raw.github.com/spumko/spumko/master/images/from.png\" align=\"right\" /></a>\r\n![hoek Logo](https://raw.github.com/spumko/hoek/master/images/hoek.png)\r\n\r\nGeneral purpose node utilities\r\n\r\n[![Build Status](https://secure.travis-ci.org/spumko/hoek.png)](http://travis-ci.org/spumko/hoek)\r\n\r\n# Table of Contents\r\n\r\n* [Introduction](#introduction \"Introduction\")\r\n* [Object](#object \"Object\")\r\n * [clone](#cloneobj \"clone\")\r\n * [merge](#mergetarget-source-isnulloverride-ismergearrays \"merge\")\r\n * [applyToDefaults](#applytodefaultsdefaults-options \"applyToDefaults\")\r\n * [unique](#uniquearray-key \"unique\")\r\n * [mapToObject](#maptoobjectarray-key \"mapToObject\")\r\n * [intersect](#intersectarray1-array2 \"intersect\")\r\n * [matchKeys](#matchkeysobj-keys \"matchKeys\")\r\n * [flatten](#flattenarray-target \"flatten\")\r\n * [removeKeys](#removekeysobject-keys \"removeKeys\")\r\n * [reach](#reachobj-chain \"reach\")\r\n * [inheritAsync](#inheritasyncself-obj-keys \"inheritAsync\")\r\n * [rename](#renameobj-from-to \"rename\")\r\n* [Timer](#timer \"Timer\")\r\n* [Binary Encoding/Decoding](#binary \"Binary Encoding/Decoding\")\r\n * [base64urlEncode](#binary64urlEncodevalue \"binary64urlEncode\")\r\n * [base64urlDecode](#binary64urlDecodevalue \"binary64urlDecode\")\r\n* [Escaping Characters](#escaped \"Escaping Characters\")\r\n * [escapeHtml](#escapeHtmlstring \"escapeHtml\")\r\n * [escapeHeaderAttribute](#escapeHeaderAttributeattribute \"escapeHeaderAttribute\")\r\n * [escapeRegex](#escapeRegexstring \"escapeRegex\")\r\n* [Errors](#errors \"Errors\")\r\n * [assert](#assertmessage \"assert\")\r\n * [abort](#abortmessage \"abort\")\r\n * [displayStack](#displayStackslice \"displayStack\")\r\n * [callStack](#callStackslice \"callStack\")\r\n * [toss](#tosscondition \"toss\")\r\n* [Load files](#load-files \"Load Files\")\r\n * [loadPackage](#loadPackagedir \"loadpackage\")\r\n * [loadDirModules](#loadDirModulespath-excludefiles-target \"loaddirmodules\")\r\n\r\n\r\n\r\n# Introduction\r\n\r\nThe *Hoek* general purpose node utilities library is used to aid in a variety of manners. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. \r\n\r\nFor example, to use Hoek to set configuration with default options:\r\n```javascript\r\nvar Hoek = require('hoek');\r\n\r\nvar default = {url : \"www.github.com\", port : \"8000\", debug : true}\r\n\r\nvar config = Hoek.applyToDefaults(default, {port : \"3000\", admin : true});\r\n\r\n// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\r\n```\r\n\r\nUnder each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the var Hoek = require('hoek') is omitted for brevity.\r\n\r\n## Object\r\n\r\nHoek provides several helpful methods for objects and arrays.\r\n\r\n### clone(obj)\r\n\r\nThis method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). \r\n\r\n```javascript\r\n\r\nvar nestedObj = {\r\n w: /^something$/ig,\r\n x: {\r\n a: [1, 2, 3],\r\n b: 123456,\r\n c: new Date()\r\n },\r\n y: 'y',\r\n z: new Date()\r\n };\r\n\r\nvar copy = Hoek.clone(nestedObj);\r\n\r\ncopy.x.b = 100;\r\n\r\nconsole.log(copy.y) // results in 'y'\r\nconsole.log(nestedObj.x.b) // results in 123456\r\nconsole.log(copy.x.b) // results in 100\r\n```\r\n\r\n### merge(target, source, isNullOverride, isMergeArrays)\r\nisNullOverride, isMergeArrays default to true\r\n\r\nMerge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r\n\r\n\r\n```javascript\r\n\r\nvar target = {a: 1, b : 2}\r\nvar source = {a: 0, c: 5}\r\nvar source2 = {a: null, c: 5}\r\n\r\nvar targetArray = [1, 2, 3];\r\nvar sourceArray = [4, 5];\r\n\r\nvar newTarget = Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\r\n\r\nnewTarget = Hoek.merge(targetArray, sourceArray) // results in [1, 2, 3, 4, 5]\r\nnewTarget = Hoek.merge(targetArray, sourceArray, true, false) // results in [4, 5]\r\n\r\n\r\n\r\n\r\n```\r\n\r\n### applyToDefaults(defaults, options)\r\n\r\nApply options to a copy of the defaults\r\n\r\n```javascript\r\n\r\nvar defaults = {host: \"localhost\", port: 8000};\r\nvar options = {port: 8080};\r\n\r\nvar config = Hoek.applyToDefaults(defaults, options); // results in {host: \"localhost\", port: 8080};\r\n\r\n\r\n```\r\n\r\n### unique(array, key)\r\n\r\nRemove duplicate items from Array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 2, 3, 3, 4, 5, 6];\r\n\r\nvar newArray = Hoek.unique(array); // results in [1,2,3,4,5,6];\r\n\r\narray = [{id: 1}, {id: 1}, {id: 2}];\r\n\r\nnewArray = Hoek.unique(array, \"id\") // results in [{id: 1}, {id: 2}]\r\n\r\n```\r\n\r\n### mapToObject(array, key)\r\n\r\nConvert an Array into an Object\r\n\r\n```javascript\r\n\r\nvar array = [1,2,3];\r\nvar newObject = Hoek.mapToObject(array); // results in [{\"1\": true}, {\"2\": true}, {\"3\": true}]\r\n\r\narray = [{id: 1}, {id: 2}];\r\nnewObject = Hoek.mapToObject(array, \"id\") // results in [{\"id\": 1}, {\"id\": 2}]\r\n\r\n```\r\n### intersect(array1, array2)\r\n\r\nFind the common unique items in two arrays\r\n\r\n```javascript\r\n\r\nvar array1 = [1, 2, 3];\r\nvar array2 = [1, 4, 5];\r\n\r\nvar newArray = Hoek.intersect(array1, array2) // results in [1]\r\n\r\n```\r\n\r\n### matchKeys(obj, keys) \r\n\r\nFind which keys are present\r\n\r\n```javascript\r\n\r\nvar obj = {a: 1, b: 2, c: 3};\r\nvar keys = [\"a\", \"e\"];\r\n\r\nHoek.matchKeys(obj, keys) // returns [\"a\"]\r\n\r\n```\r\n\r\n### flatten(array, target)\r\n\r\nFlatten an array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 3];\r\nvar target = [4, 5]; \r\n\r\nvar flattenedArray = Hoek.flatten(array, target) // results in [4, 5, 1, 2, 3];\r\n\r\n```\r\n\r\n### removeKeys(object, keys)\r\n\r\nRemove keys\r\n\r\n```javascript\r\n\r\nvar object = {a: 1, b: 2, c: 3, d: 4};\r\n\r\nvar keys = [\"a\", \"b\"];\r\n\r\nHoek.removeKeys(object, keys) // object is now {c: 3, d: 4}\r\n\r\n```\r\n\r\n### reach(obj, chain)\r\n\r\nConverts an object key chain string to reference\r\n\r\n```javascript\r\n\r\nvar chain = 'a.b.c';\r\nvar obj = {a : {b : { c : 1}}};\r\n\r\nHoek.reach(obj, chain) // returns 1\r\n\r\n```\r\n\r\n### inheritAsync(self, obj, keys) \r\n\r\nInherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r\n\r\n```javascript\r\n\r\nvar targetFunc = function () { };\r\n\r\nvar proto = {\r\n a: function () {\r\n return 'a!';\r\n },\r\n b: function () {\r\n return 'b!';\r\n },\r\n c: function () {\r\n throw new Error('c!');\r\n }\r\n };\r\n\r\nvar keys = ['a', 'c'];\r\n\r\nHoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r\n\r\nvar target = new targetFunc();\r\n\r\ntarget.a(function(err, result){console.log(result)} // returns 'a!' \r\n\r\ntarget.c(function(err, result){console.log(result)} // returns undefined\r\n\r\ntarget.b(function(err, result){console.log(result)} // gives error: Object [object Object] has no method 'b'\r\n\r\n```\r\n\r\n### rename(obj, from, to)\r\n\r\nRename a key of an object\r\n\r\n```javascript\r\n\r\nvar obj = {a : 1, b : 2};\r\n\r\nHoek.rename(obj, \"a\", \"c\"); // obj is now {c : 1, b : 2}\r\n\r\n```\r\n\r\n\r\n# Timer\r\n\r\nA Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\r\n\r\n```javascript\r\n\r\n\r\nexample : \r\n\r\n\r\nvar timerObj = new Hoek.Timer();\r\nconsole.log(\"Time is now: \" + timerObj.ts)\r\nconsole.log(\"Elapsed time from initialization: \" + timerObj.elapsed() + 'milliseconds')\r\n\r\n```\r\n\r\n# Binary Encoding/Decoding\r\n\r\n### base64urlEncode(value)\r\n\r\nEncodes value in Base64 or URL encoding\r\n\r\n### base64urlDecode(value)\r\n\r\nDecodes data in Base64 or URL encoding.\r\n# Escaping Characters\r\n\r\nHoek provides convenient methods for escaping html characters. The escaped characters are as followed:\r\n\r\n```javascript\r\n\r\ninternals.htmlEscaped = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '`': '`'\r\n};\r\n\r\n```\r\n\r\n### escapeHtml(string)\r\n\r\n```javascript\r\n\r\nvar string = '<html> hey </html>';\r\nvar escapedString = Hoek.escapeHtml(string); // returns <html> hey </html>\r\n\r\n```\r\n\r\n### escapeHeaderAttribute(attribute)\r\n\r\nEscape attribute value for use in HTTP header\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeHeaderAttribute('I said \"go w\\\\o me\"'); //returns I said \\\"go w\\\\o me\\\"\r\n\r\n\r\n```\r\n\r\n\r\n### escapeRegex(string)\r\n\r\nEscape string for Regex construction\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\\\/`\"(>)[<]d{}s,'); // returns 4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`\"\\(>\\)\\[<\\]d\\{\\}s\\,\r\n\r\n\r\n\r\n```\r\n\r\n# Errors\r\n\r\n### assert(message)\r\n\r\n```javascript\r\n\r\nvar a = 1, b =2;\r\n\r\nHoek.assert(a === b, 'a should equal b'); // ABORT: a should equal b\r\n\r\n```\r\n\r\n### abort(message)\r\n\r\nFirst checks if process.env.NODE_ENV === 'test', and if so, throws error message. Otherwise,\r\ndisplays most recent stack and then exits process.\r\n\r\n\r\n\r\n### displayStack(slice)\r\n\r\nDisplays the trace stack\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.displayStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\r\n 'Module._compile (module.js:449:26)',\r\n 'Module._extensions..js (module.js:467:10)',\r\n 'Module.load (module.js:356:32)',\r\n 'Module._load (module.js:312:12)',\r\n 'Module.runMain (module.js:492:10)',\r\n 'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\r\n\r\n```\r\n\r\n### callStack(slice)\r\n\r\nReturns a trace stack array.\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.callStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\r\n [ 'module.js', 449, 26, 'Module._compile', false ],\r\n [ 'module.js', 467, 10, 'Module._extensions..js', false ],\r\n [ 'module.js', 356, 32, 'Module.load', false ],\r\n [ 'module.js', 312, 12, 'Module._load', false ],\r\n [ 'module.js', 492, 10, 'Module.runMain', false ],\r\n [ 'node.js',\r\n 244,\r\n 9,\r\n 'startup.processNextTick.process._tickCallback',\r\n false ] ]\r\n\r\n\r\n```\r\n\r\n### toss(condition)\r\n\r\ntoss(condition /*, [message], callback */)\r\n\r\nReturn an error as first argument of a callback\r\n\r\n\r\n# Load Files\r\n\r\n### loadPackage(dir)\r\n\r\nLoad and parse package.json process root or given directory\r\n\r\n```javascript\r\n\r\nvar pack = Hoek.loadPackage(); // pack.name === 'hoek'\r\n\r\n```\r\n\r\n### loadDirModules(path, excludeFiles, target) \r\n\r\nLoads modules from a given path; option to exclude files (array).\r\n\r\n\r\n\r\n\r\n",
./node_modules/request/node_modules/hawk/node_modules/hoek/README.md:[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
./node_modules/request/node_modules/hawk/node_modules/hoek/README.md:[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
./node_modules/request/README.md: , url = 'https://api.twitter.com/1/users/show.json?'
./node_modules/async/package.json: "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, each…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n});\n\nasync.parallel([\n function(){ ... },\n function(){ ... }\n], callback);\n\nasync.series([\n function(){ ... },\n function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n squareExponent: 2,\n square: function(number, callback){ \n var result = Math.pow(number, this.squareExponent);\n setTimeout(function(){\n callback(null, result);\n }, 200);\n }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n // result is [NaN, NaN, NaN]\n // This fails because the `this.squareExponent` expression in the square\n // function is not evaluated in the context of AsyncSquaringLibrary, and is\n // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n // result is [1, 4, 9]\n // With the help of bind we can attach a context to the iterator before\n // passing it to async. Now the square function will be executed in its \n // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback(err, reduction) which accepts an optional error as its first \n argument, and the state of the reduction as the second. If an error is \n passed to the callback, the reduction is stopped and the main callback is \n immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n}, function(err, result){\n // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], path.exists, function(result){\n // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, sortValue) which must be called once it\n has completed with an error (which can be null) and a value to use as the sort\n criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n}, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], path.exists, function(result){\n // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], path.exists, function(result){\n // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, results) which must be called once it \n has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results){\n // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n }\n],\n// optional callback\nfunction(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback(err) which must be called once it has completed with an \n optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n callback(err, result1, result2, ...) it must call on completion. The first\n argument is an error (which can be null) and any further arguments will be \n passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n], function (err, result) {\n // result now equals 'done' \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n setTimeout(function () {\n callback(null, n + 1);\n }, 10);\n}\n\nfunction mul3(n, callback) {\n setTimeout(function () {\n callback(null, n * 3);\n }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n buckets,\n async.applyEach([enableSearch, updateSchema]),\n callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task, which must call its callback(err) argument when finished, with an \n optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n queued tasks, which must call its callback(err) argument when finished, with \n an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n process per round. This property can be changed after a cargo is created to\n alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n for(var i=0; i<tasks.length; i++){\n console.log('hello ' + tasks[i].name);\n }\n callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n readData: function(cb, results){\n fs.readFile('data.txt', 'utf-8', cb);\n }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The \n function receives two arguments: (1) a callback(err, result) which must be \n called when finished, passing an error (which can be null) and the result of \n the function's execution, and (2) a results object, containing the results of\n the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n \n\n__Example__\n\n```js\nasync.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n],\nfunction(err, results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n callback(null, {\n id: 'user' + id\n })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n createUser(n, function(err, user) {\n next(err, user)\n })\n}, function(err, users) {\n // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
./node_modules/async/README.md:// generate 5 users
./node_modules/async/README.md:}, function(err, users) {
./node_modules/async/README.md: // we should now have 5 users
./node_modules/glob/package.json: "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array<String>} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array<String>} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array<String>} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n",
./node_modules/glob/README.md:## Attention: node-glob users!
./node_modules/glob/README.md:Users are thus advised not to use a glob result as a guarantee of
./node_modules/sntp/node_modules/hoek/package.json: "readme": "<a href=\"https://github.com/spumko\"><img src=\"https://raw.github.com/spumko/spumko/master/images/from.png\" align=\"right\" /></a>\r\n![hoek Logo](https://raw.github.com/spumko/hoek/master/images/hoek.png)\r\n\r\nGeneral purpose node utilities\r\n\r\n[![Build Status](https://secure.travis-ci.org/spumko/hoek.png)](http://travis-ci.org/spumko/hoek)\r\n\r\n# Table of Contents\r\n\r\n* [Introduction](#introduction \"Introduction\")\r\n* [Object](#object \"Object\")\r\n * [clone](#cloneobj \"clone\")\r\n * [merge](#mergetarget-source-isnulloverride-ismergearrays \"merge\")\r\n * [applyToDefaults](#applytodefaultsdefaults-options \"applyToDefaults\")\r\n * [unique](#uniquearray-key \"unique\")\r\n * [mapToObject](#maptoobjectarray-key \"mapToObject\")\r\n * [intersect](#intersectarray1-array2 \"intersect\")\r\n * [matchKeys](#matchkeysobj-keys \"matchKeys\")\r\n * [flatten](#flattenarray-target \"flatten\")\r\n * [removeKeys](#removekeysobject-keys \"removeKeys\")\r\n * [reach](#reachobj-chain \"reach\")\r\n * [inheritAsync](#inheritasyncself-obj-keys \"inheritAsync\")\r\n * [rename](#renameobj-from-to \"rename\")\r\n* [Timer](#timer \"Timer\")\r\n* [Binary Encoding/Decoding](#binary \"Binary Encoding/Decoding\")\r\n * [base64urlEncode](#binary64urlEncodevalue \"binary64urlEncode\")\r\n * [base64urlDecode](#binary64urlDecodevalue \"binary64urlDecode\")\r\n* [Escaping Characters](#escaped \"Escaping Characters\")\r\n * [escapeHtml](#escapeHtmlstring \"escapeHtml\")\r\n * [escapeHeaderAttribute](#escapeHeaderAttributeattribute \"escapeHeaderAttribute\")\r\n * [escapeRegex](#escapeRegexstring \"escapeRegex\")\r\n* [Errors](#errors \"Errors\")\r\n * [assert](#assertmessage \"assert\")\r\n * [abort](#abortmessage \"abort\")\r\n * [displayStack](#displayStackslice \"displayStack\")\r\n * [callStack](#callStackslice \"callStack\")\r\n * [toss](#tosscondition \"toss\")\r\n* [Load files](#load-files \"Load Files\")\r\n * [loadPackage](#loadPackagedir \"loadpackage\")\r\n * [loadDirModules](#loadDirModulespath-excludefiles-target \"loaddirmodules\")\r\n\r\n\r\n\r\n# Introduction\r\n\r\nThe *Hoek* general purpose node utilities library is used to aid in a variety of manners. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. \r\n\r\nFor example, to use Hoek to set configuration with default options:\r\n```javascript\r\nvar Hoek = require('hoek');\r\n\r\nvar default = {url : \"www.github.com\", port : \"8000\", debug : true}\r\n\r\nvar config = Hoek.applyToDefaults(default, {port : \"3000\", admin : true});\r\n\r\n// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\r\n```\r\n\r\nUnder each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the var Hoek = require('hoek') is omitted for brevity.\r\n\r\n## Object\r\n\r\nHoek provides several helpful methods for objects and arrays.\r\n\r\n### clone(obj)\r\n\r\nThis method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). \r\n\r\n```javascript\r\n\r\nvar nestedObj = {\r\n w: /^something$/ig,\r\n x: {\r\n a: [1, 2, 3],\r\n b: 123456,\r\n c: new Date()\r\n },\r\n y: 'y',\r\n z: new Date()\r\n };\r\n\r\nvar copy = Hoek.clone(nestedObj);\r\n\r\ncopy.x.b = 100;\r\n\r\nconsole.log(copy.y) // results in 'y'\r\nconsole.log(nestedObj.x.b) // results in 123456\r\nconsole.log(copy.x.b) // results in 100\r\n```\r\n\r\n### merge(target, source, isNullOverride, isMergeArrays)\r\nisNullOverride, isMergeArrays default to true\r\n\r\nMerge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r\n\r\n\r\n```javascript\r\n\r\nvar target = {a: 1, b : 2}\r\nvar source = {a: 0, c: 5}\r\nvar source2 = {a: null, c: 5}\r\n\r\nvar targetArray = [1, 2, 3];\r\nvar sourceArray = [4, 5];\r\n\r\nvar newTarget = Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\r\n\r\nnewTarget = Hoek.merge(targetArray, sourceArray) // results in [1, 2, 3, 4, 5]\r\nnewTarget = Hoek.merge(targetArray, sourceArray, true, false) // results in [4, 5]\r\n\r\n\r\n\r\n\r\n```\r\n\r\n### applyToDefaults(defaults, options)\r\n\r\nApply options to a copy of the defaults\r\n\r\n```javascript\r\n\r\nvar defaults = {host: \"localhost\", port: 8000};\r\nvar options = {port: 8080};\r\n\r\nvar config = Hoek.applyToDefaults(defaults, options); // results in {host: \"localhost\", port: 8080};\r\n\r\n\r\n```\r\n\r\n### unique(array, key)\r\n\r\nRemove duplicate items from Array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 2, 3, 3, 4, 5, 6];\r\n\r\nvar newArray = Hoek.unique(array); // results in [1,2,3,4,5,6];\r\n\r\narray = [{id: 1}, {id: 1}, {id: 2}];\r\n\r\nnewArray = Hoek.unique(array, \"id\") // results in [{id: 1}, {id: 2}]\r\n\r\n```\r\n\r\n### mapToObject(array, key)\r\n\r\nConvert an Array into an Object\r\n\r\n```javascript\r\n\r\nvar array = [1,2,3];\r\nvar newObject = Hoek.mapToObject(array); // results in [{\"1\": true}, {\"2\": true}, {\"3\": true}]\r\n\r\narray = [{id: 1}, {id: 2}];\r\nnewObject = Hoek.mapToObject(array, \"id\") // results in [{\"id\": 1}, {\"id\": 2}]\r\n\r\n```\r\n### intersect(array1, array2)\r\n\r\nFind the common unique items in two arrays\r\n\r\n```javascript\r\n\r\nvar array1 = [1, 2, 3];\r\nvar array2 = [1, 4, 5];\r\n\r\nvar newArray = Hoek.intersect(array1, array2) // results in [1]\r\n\r\n```\r\n\r\n### matchKeys(obj, keys) \r\n\r\nFind which keys are present\r\n\r\n```javascript\r\n\r\nvar obj = {a: 1, b: 2, c: 3};\r\nvar keys = [\"a\", \"e\"];\r\n\r\nHoek.matchKeys(obj, keys) // returns [\"a\"]\r\n\r\n```\r\n\r\n### flatten(array, target)\r\n\r\nFlatten an array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 3];\r\nvar target = [4, 5]; \r\n\r\nvar flattenedArray = Hoek.flatten(array, target) // results in [4, 5, 1, 2, 3];\r\n\r\n```\r\n\r\n### removeKeys(object, keys)\r\n\r\nRemove keys\r\n\r\n```javascript\r\n\r\nvar object = {a: 1, b: 2, c: 3, d: 4};\r\n\r\nvar keys = [\"a\", \"b\"];\r\n\r\nHoek.removeKeys(object, keys) // object is now {c: 3, d: 4}\r\n\r\n```\r\n\r\n### reach(obj, chain)\r\n\r\nConverts an object key chain string to reference\r\n\r\n```javascript\r\n\r\nvar chain = 'a.b.c';\r\nvar obj = {a : {b : { c : 1}}};\r\n\r\nHoek.reach(obj, chain) // returns 1\r\n\r\n```\r\n\r\n### inheritAsync(self, obj, keys) \r\n\r\nInherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r\n\r\n```javascript\r\n\r\nvar targetFunc = function () { };\r\n\r\nvar proto = {\r\n a: function () {\r\n return 'a!';\r\n },\r\n b: function () {\r\n return 'b!';\r\n },\r\n c: function () {\r\n throw new Error('c!');\r\n }\r\n };\r\n\r\nvar keys = ['a', 'c'];\r\n\r\nHoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r\n\r\nvar target = new targetFunc();\r\n\r\ntarget.a(function(err, result){console.log(result)} // returns 'a!' \r\n\r\ntarget.c(function(err, result){console.log(result)} // returns undefined\r\n\r\ntarget.b(function(err, result){console.log(result)} // gives error: Object [object Object] has no method 'b'\r\n\r\n```\r\n\r\n### rename(obj, from, to)\r\n\r\nRename a key of an object\r\n\r\n```javascript\r\n\r\nvar obj = {a : 1, b : 2};\r\n\r\nHoek.rename(obj, \"a\", \"c\"); // obj is now {c : 1, b : 2}\r\n\r\n```\r\n\r\n\r\n# Timer\r\n\r\nA Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\r\n\r\n```javascript\r\n\r\n\r\nexample : \r\n\r\n\r\nvar timerObj = new Hoek.Timer();\r\nconsole.log(\"Time is now: \" + timerObj.ts)\r\nconsole.log(\"Elapsed time from initialization: \" + timerObj.elapsed() + 'milliseconds')\r\n\r\n```\r\n\r\n# Binary Encoding/Decoding\r\n\r\n### base64urlEncode(value)\r\n\r\nEncodes value in Base64 or URL encoding\r\n\r\n### base64urlDecode(value)\r\n\r\nDecodes data in Base64 or URL encoding.\r\n# Escaping Characters\r\n\r\nHoek provides convenient methods for escaping html characters. The escaped characters are as followed:\r\n\r\n```javascript\r\n\r\ninternals.htmlEscaped = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '`': '`'\r\n};\r\n\r\n```\r\n\r\n### escapeHtml(string)\r\n\r\n```javascript\r\n\r\nvar string = '<html> hey </html>';\r\nvar escapedString = Hoek.escapeHtml(string); // returns <html> hey </html>\r\n\r\n```\r\n\r\n### escapeHeaderAttribute(attribute)\r\n\r\nEscape attribute value for use in HTTP header\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeHeaderAttribute('I said \"go w\\\\o me\"'); //returns I said \\\"go w\\\\o me\\\"\r\n\r\n\r\n```\r\n\r\n\r\n### escapeRegex(string)\r\n\r\nEscape string for Regex construction\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\\\/`\"(>)[<]d{}s,'); // returns 4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`\"\\(>\\)\\[<\\]d\\{\\}s\\,\r\n\r\n\r\n\r\n```\r\n\r\n# Errors\r\n\r\n### assert(message)\r\n\r\n```javascript\r\n\r\nvar a = 1, b =2;\r\n\r\nHoek.assert(a === b, 'a should equal b'); // ABORT: a should equal b\r\n\r\n```\r\n\r\n### abort(message)\r\n\r\nFirst checks if process.env.NODE_ENV === 'test', and if so, throws error message. Otherwise,\r\ndisplays most recent stack and then exits process.\r\n\r\n\r\n\r\n### displayStack(slice)\r\n\r\nDisplays the trace stack\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.displayStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\r\n 'Module._compile (module.js:449:26)',\r\n 'Module._extensions..js (module.js:467:10)',\r\n 'Module.load (module.js:356:32)',\r\n 'Module._load (module.js:312:12)',\r\n 'Module.runMain (module.js:492:10)',\r\n 'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\r\n\r\n```\r\n\r\n### callStack(slice)\r\n\r\nReturns a trace stack array.\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.callStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\r\n [ 'module.js', 449, 26, 'Module._compile', false ],\r\n [ 'module.js', 467, 10, 'Module._extensions..js', false ],\r\n [ 'module.js', 356, 32, 'Module.load', false ],\r\n [ 'module.js', 312, 12, 'Module._load', false ],\r\n [ 'module.js', 492, 10, 'Module.runMain', false ],\r\n [ 'node.js',\r\n 244,\r\n 9,\r\n 'startup.processNextTick.process._tickCallback',\r\n false ] ]\r\n\r\n\r\n```\r\n\r\n### toss(condition)\r\n\r\ntoss(condition /*, [message], callback */)\r\n\r\nReturn an error as first argument of a callback\r\n\r\n\r\n# Load Files\r\n\r\n### loadPackage(dir)\r\n\r\nLoad and parse package.json process root or given directory\r\n\r\n```javascript\r\n\r\nvar pack = Hoek.loadPackage(); // pack.name === 'hoek'\r\n\r\n```\r\n\r\n### loadDirModules(path, excludeFiles, target) \r\n\r\nLoads modules from a given path; option to exclude files (array).\r\n\r\n\r\n\r\n\r\n",
./node_modules/sntp/node_modules/hoek/README.md:[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
./node_modules/sntp/node_modules/hoek/README.md:[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
./node_modules/heroku/node_modules/jasmine-node/node_modules/.bin/r.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/heroku/node_modules/jasmine-node/node_modules/jasmine-reporters/ext/env.rhino.1.2.js: * should allow users to follow such citation links.
./node_modules/heroku/node_modules/jasmine-node/node_modules/requirejs/bin/r.js: // many users. We can help them out when they expect file:// URIs to
./node_modules/bower/lib/core/Project.js: // The reason behind it is that users can likely use this component
./node_modules/bower/package.json: "readme": "# BOWER [![Build Status](https://secure.travis-ci.org/bower/bower.png?branch=master)](http://travis-ci.org/bower/bower)\n\nBower is a package manager for the web. It offers a generic, unopinionated\nsolution to the problem of **front-end package management**, while exposing the\npackage dependency model via an API that can be consumed by a more opinionated\nbuild stack. There are no system wide dependencies, no dependencies are shared\nbetween different apps, and the dependency tree is flat.\n\nBower runs over Git, and is package-agnostic. A packaged component can be made\nup of any type of asset, and use any type of transport (e.g., AMD, CommonJS,\netc.).\n\n[View all packages available through Bower's registry](http://sindresorhus.com/bower-components/).\n\n\n## Installing Bower\n\nBower depends on [Node](http://nodejs.org/) and [npm](http://npmjs.org/). It's\ninstalled globally using npm:\n\n```\nnpm install -g bower\n```\n\nAlso make sure that [git](http://git-scm.com/) is installed as some bower\npackages require it to be fetched and installed.\n\n\n## Usage\n\nMuch more information is available via `bower help` once it's installed. This\nis just enough to get you started.\n\n#### Warning\n\nOn `prezto` or `oh-my-zsh`, do not forget to `alias bower='noglob bower'` or `bower install jquery\\#1.9.1`\n\n#### Running commands with sudo\n\nBower is a user command, there is no need to execute it with superuser permissions.\nHowever, if you still want to run commands with sudo, use `--allow-root` option.\n\n### Installing packages and dependencies\n\nBower offers several ways to install packages:\n\n```\n# Using the dependencies listed in the current directory's bower.json\nbower install\n# Using a local or remote package\nbower install <package>\n# Using a specific version of a package\nbower install <package>#<version>\n# Using a different name and a specific version of a package\nbower install <name>=<package>#<version>\n```\n\nWhere `<package>` can be any one of the following:\n\n* A name that maps to a package registered with Bower, e.g, `jquery`. ‡\n* A remote Git endpoint, e.g., `git://github.com/someone/some-package.git`. Can be\n public or private. ‡\n* A local endpoint, i.e., a folder that's a Git repository. ‡\n* A shorthand endpoint, e.g., `someone/some-package` (defaults to GitHub). ‡\n* A URL to a file, including `zip` and `tar` files. Its contents will be\n extracted.\n\n‡ These types of `<package>` might have versions available. You can specify a\n[semver](http://semver.org/) compatible version to fetch a specific release, and lock the\npackage to that version. You can also use ranges to specify a range of versions.\n\nAll package contents are installed in the `bower_components` directory by default.\nYou should **never** directly modify the contents of this directory.\n\nUsing `bower list` will show all the packages that are installed locally.\n\n**N.B.** If you aren't authoring a package that is intended to be consumed by\nothers (e.g., you're building a web app), you should always check installed\npackages into source control.\n\n### Finding packages\n\nTo search for packages registered with Bower:\n\n```\nbower search [<name>]\n```\n\nUsing just `bower search` will list all packages in the registry.\n\n### Using packages\n\nThe easiest approach is to use Bower statically, just reference the package's\ninstalled components manually using a `script` tag:\n\n```html\n<script src=\"/bower_components/jquery/index.js\"></script>\n```\n\nFor more complex projects, you'll probably want to concatenate your scripts or\nuse a module loader. Bower is just a package manager, but there are plenty of\nother tools -- such as [Sprockets](https://github.com/sstephenson/sprockets)\nand [RequireJS](http://requirejs.org/) -- that will help you do this.\n\n### Registering packages\n\nTo register a new package:\n\n* There **must** be a valid manifest JSON in the current working directory.\n* Your package should use [semver](http://semver.org/) Git tags.\n* Your package **must** be available at a Git endpoint (e.g., GitHub); remember\n to push your Git tags!\n\nThen use the following command:\n\n```\nbower register <my-package-name> <git-endpoint>\n```\n\nThe Bower registry does not have authentication or user management at this point\nin time. It's on a first come, first served basis. Think of it like a URL\nshortener. Now anyone can run `bower install <my-package-name>`, and get your\nlibrary installed.\n\nThere is no direct way to unregister a package yet. For now, you can [request a\npackage be unregistered](https://github.com/bower/bower/issues/120).\n\n### Uninstalling packages\n\nTo uninstall a locally installed package:\n\n```\nbower uninstall <package-name>\n```\n\n\n## Configuration\n\nBower can be configured using JSON in a `.bowerrc` file.\n\nThe current spec can be read\n[here](https://docs.google.com/document/d/1APq7oA9tNao1UYWyOm8dKqlRP2blVkROYLZ2fLIjtWc/edit#heading=h.4pzytc1f9j8k)\nin the `Configuration` section.\n\n\n## Defining a package\n\nYou must create a `bower.json` in your project's root, and specify all of its\ndependencies. This is similar to Node's `package.json`, or Ruby's `Gemfile`,\nand is useful for locking down a project's dependencies.\n\n*NOTE:* In versions of Bower before 0.9.0 the package metadata file was called\n`component.json` rather than `bower.json`. This has changed to avoid a name\nclash with another tool. You can still use `component.json` for now but it is\ndeprecated and the automatic fallback is likely to be removed in an upcoming\nrelease.\n\nYou can interactively create a `bower.json` with the following command:\n\n```\nbower init\n```\n\nThe `bower.json` defines several options:\n\n* `name` (required): The name of your package.\n* `version`: A semantic version number (see [semver](http://semver.org/)).\n* `main` [string|array]: The primary endpoints of your package.\n* `ignore` [array]: An array of paths not needed in production that you want\n Bower to ignore when installing your package.\n* `dependencies` [hash]: Packages your package depends upon in production.\n* `devDependencies` [hash]: Development dependencies.\n* `private` [boolean]: Set to true if you want to keep the package private and \n do not want to register the package in future.\n\n```json\n{\n \"name\": \"my-project\",\n \"version\": \"1.0.0\",\n \"main\": \"path/to/main.css\",\n \"ignore\": [\n \".jshintrc\",\n \"**/*.txt\"\n ],\n \"dependencies\": {\n \"<name>\": \"<version>\",\n \"<name>\": \"<folder>\",\n \"<name>\": \"<package>\"\n },\n \"devDependencies\": {\n \"<test-framework-name>\": \"<version>\"\n }\n}\n```\n\n\n## Consuming a package\n\nBower also makes available a source mapping. This can be used by build tools to\neasily consume Bower packages.\n\nIf you pass the `--paths` option to Bower's `list` command, you will get a\nsimple path-to-name mapping:\n\n```json\n{\n \"backbone\": \"bower_components/backbone/index.js\",\n \"jquery\": \"bower_components/jquery/index.js\",\n \"underscore\": \"bower_components/underscore/index.js\"\n}\n```\n\nAlternatively, every command supports the `--json` option that makes bower\noutput JSON. Command result is outputted to `stdout` and error/logs to\n`stderr`.\n\n\n## Programmatic API\n\nBower provides a powerful, programmatic API. All commands can be accessed\nthrough the `bower.commands` object.\n\n```js\nvar bower = require('bower');\n\nbower.commands\n.install(['jquery'], { save: true }, { /* custom config */ })\n.on('end', function (installed) {\n console.log(installed);\n});\n\nbower.commands\n.search('jquery', {})\n.on('end', function (results) {\n console.log(results);\n});\n```\n\nCommands emit four types of events: `log`, `prompt`, `end`, `error`.\n\n* `log` is emitted to report the state/progress of the command.\n* `prompt` is emitted whenever the user needs to be prompted.\n* `error` will only be emitted if something goes wrong.\n* `end` is emitted when the command successfully ends.\n\nFor a better of idea how this works, you may want to check out [our bin\nfile](https://github.com/bower/bower/blob/master/bin/bower).\n\nWhen using bower programmatically, prompting is disabled by default. Though you can enable it when calling commands with `interactive: true` in the config.\nThis requires you to listen for the `prompt` event and handle the prompting yourself. The easiest way is to use the [inquirer](https://npmjs.org/package/inquirer) npm module like so:\n\n```js\nvar inquirer = require('inquirer');\n\nbower.commands\n.install(['jquery'], { save: true }, { interactive: true })\n// ..\n.on('prompt', function (prompts, callback) {\n inquirer.prompt(prompts, callback);\n});\n```\n\n\n## Completion (experimental)\n\n_NOTE_: Completion is still not implemented for the 1.0.0 release\n\nBower now has an experimental `completion` command that is based on, and works\nsimilarly to the [npm completion](https://npmjs.org/doc/completion.html). It is\nnot available for Windows users.\n\nThis command will output a Bash / ZSH script to put into your `~/.bashrc`,\n`~/.bash_profile`, or `~/.zshrc` file.\n\n```\nbower completion >> ~/.bash_profile\n```\n\n\n## A note for Windows users\n\nTo use Bower on Windows, you must install\n[msysgit](http://code.google.com/p/msysgit/) correctly. Be sure to check the\noption shown below:\n\n![msysgit](http://f.cl.ly/items/2V2O3i1p3R2F1r2v0a12/mysgit.png)\n\nNote that if you use TortoiseGit and if Bower keeps asking for your SSH\npassword, you should add the following environment variable: `GIT_SSH -\nC:\\Program Files\\TortoiseGit\\bin\\TortoisePlink.exe`. Adjust the `TortoisePlink`\npath if needed.\n\n\n## Contact\n\nHave a question?\n\n* [StackOverflow](http://stackoverflow.com/questions/tagged/bower)\n* [Mailinglist](http://groups.google.com/group/twitter-bower) - [email protected]\n* [\\#bower](http://webchat.freenode.net/?channels=bower) on Freenode\n\n\n## Contributing to this project\n\nAnyone and everyone is welcome to contribute. Please take a moment to\nreview the [guidelines for contributing](CONTRIBUTING.md).\n\n* [Bug reports](CONTRIBUTING.md#bugs)\n* [Feature requests](CONTRIBUTING.md#features)\n* [Pull requests](CONTRIBUTING.md#pull-requests)\n\n\n## Authors\n\n* [@fat](https://github.com/fat)\n* [@maccman](https://github.com/maccman)\n* [@satazor](https://github.com/satazor)\n\nThanks for assistance and contributions:\n\n[@addyosmani](https://github.com/addyosmani),\n[@angus-c](https://github.com/angus-c),\n[@borismus](https://github.com/borismus),\n[@carsonmcdonald](https://github.com/carsonmcdonald),\n[@chriseppstein](https://github.com/chriseppstein),\n[@danwrong](https://github.com/danwrong),\n[@davidmaxwaterman](https://github.com/davidmaxwaterman),\n[@desandro](https://github.com/desandro),\n[@hemanth](https://github.com/hemanth),\n[@isaacs](https://github.com/isaacs),\n[@josh](https://github.com/josh),\n[@jrburke](https://github.com/jrburke),\n[@marcelombc](https://github.com/marcelombc),\n[@marcooliveira](https://github.com/marcooliveira),\n[@mklabs](https://github.com/mklabs),\n[@MrDHat](https://github.com/MrDHat),\n[@necolas](https://github.com/necolas),\n[@paulirish](https://github.com/paulirish),\n[@richo](https://github.com/richo),\n[@rvagg](https://github.com/rvagg),\n[@sindresorhus](https://github.com/sindresorhus),\n[@SlexAxton](https://github.com/SlexAxton),\n[@sstephenson](https://github.com/sstephenson),\n[@svnlto](https://github.com/svnlto),\n[@tomdale](https://github.com/tomdale),\n[@uzquiano](https://github.com/uzquiano),\n[@visionmedia](https://github.com/visionmedia),\n[@wagenet](https://github.com/wagenet),\n[@wibblymat](https://github.com/wibblymat),\n[@wycats](https://github.com/wycats)\n\n\n## License\n\nCopyright 2012 Twitter, Inc.\n\nLicensed under the MIT License\n",
./node_modules/bower/CHANGELOG.md:Users upgrading from `bower-canary` and `bower@~0.x.x` should do a `bower cache clean`.
./node_modules/bower/CHANGELOG.md:_NOTE_: The `components` folder will still be used if already created, making it easier for users to upgrade.
./node_modules/bower/CHANGELOG.md:- Emergency fix for `node 0.8.x` users to make `zip` extraction work again
./node_modules/bower/node_modules/mout/doc/collection.md:var users = [
./node_modules/bower/node_modules/mout/doc/collection.md:pluck(users, 'name'); // ["John", "Jane"]
./node_modules/bower/node_modules/mout/doc/collection.md:pluck(users, 'age'); // [21, 27]
./node_modules/bower/node_modules/mout/doc/collection.md:users = {
./node_modules/bower/node_modules/mout/doc/collection.md:pluck(users, 'name'); // ['John', 'Mary']
./node_modules/bower/node_modules/mout/doc/function.md:var names = map(users, func('getName'));
./node_modules/bower/node_modules/mout/doc/function.md:var users = [{name:"John", age:21}, {name:"Jane", age:25}];
./node_modules/bower/node_modules/mout/doc/function.md:var names = map(users, prop('name'));
./node_modules/bower/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/mout/doc/array.md:var users = [{name : 'John', age: 21}, {name: 'Jane', age : 27}];
./node_modules/bower/node_modules/mout/doc/array.md:var names = pluck(users, 'name'); // ["John", "Jane"]
./node_modules/bower/node_modules/mout/doc/array.md:var ages = pluck(users, 'age'); // [21, 27]
./node_modules/bower/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/mout/doc/object.md:var users = {
./node_modules/bower/node_modules/mout/doc/object.md:pluck(users, 'name'); // {first: 'John', second: 'Mary'} );
./node_modules/bower/node_modules/mout/doc/object.md:pluck(users, 'age'); // {first: 21, second: 25} );
./node_modules/bower/node_modules/osenv/test/windows.js:process.env.USERPROFILE = 'C:\\Users\\sirUser'
./node_modules/bower/node_modules/osenv/test/windows.js: t.equal(osenv.tmpdir(), 'C:\\Users\\sirUser\\temp')
./node_modules/bower/node_modules/sudo-block/package.json: "description": "Block users from running your tool with root permissions",
./node_modules/bower/node_modules/sudo-block/package.json: "readme": "# sudo-block [![Build Status](https://secure.travis-ci.org/sindresorhus/sudo-block.png?branch=master)](http://travis-ci.org/sindresorhus/sudo-block)\n\nBlock users from running your tool with root permissions.\n\n\n## Install\n\nInstall with [npm](https://npmjs.org): `npm install --save sudo-block`\n\n\n## Example\n\n```js\nvar sudoBlock = require('sudo-block');\nsudoBlock('my-module');\n```\n\nWhen the above file is ran with root permissions it will exit and show an error message telling the user how to fix the problem so they don't have to run it with `sudo`.\n\n\n## API\n\n### sudoBlock(options)\n\nOptions is either a string specifying the *package name* or an object with these\nkeys:\n\n- `packageName`: name of the package the error message is printed for\n- `message`: a custom error message\n\n\n### sudoBlock.isRoot\n\nBoolean indicating whether the current user is `root`.\n\n\n## License\n\nMIT License • © [Sindre Sorhus](http://sindresorhus.com)\n",
./node_modules/bower/node_modules/sudo-block/readme.md:Block users from running your tool with root permissions.
./node_modules/bower/node_modules/request/package.json: "readme": "# Request -- Simplified HTTP client\n\n[![NPM](https://nodei.co/npm/request.png)](https://nodei.co/npm/request/)\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n }\n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## HTTP Authentication\n\n```javascript\nrequest.get('http://some.server.com/').auth('username', 'password', false);\n// or\nrequest.get('http://some.server.com/', {\n 'auth': {\n 'user': 'username',\n 'pass': 'password',\n 'sendImmediately': false\n }\n});\n```\n\nIf passed as an option, `auth` should be a hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional). The method form takes parameters `auth(username, password, sendImmediately)`.\n\n`sendImmediately` defaults to true, which will cause a basic authentication header to be sent. If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a 401 response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).\n\nDigest authentication is supported, but it only works with `sendImmediately` set to `false` (otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail).\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Ideally, you would take the body in the response\n // and construct a URL that a user clicks on (like a sign in button).\n // The verifier is only available in the response after a user has\n // verified with twitter that they are authorizing your app.\n var access_token = qs.parse(body)\n , oauth =\n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: access_token.oauth_verifier\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth =\n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params =\n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for PATCH, POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `auth` - A hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional). See documentation above.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `true` if you want cookies to be remembered for future use, or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n* `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.\n* `localAddress` - Local interface to bind for network connections.\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second is an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options)\n\nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.patch\n\nSame as request() but defaults to `method: \"PATCH\"`.\n\n```javascript\nrequest.patch(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart:\n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ]\n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are disabled by default (else, they would be used in subsequent requests). To enable cookies set jar to true (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: true})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n",
./node_modules/bower/node_modules/request/node_modules/form-data/node_modules/async/package.json: "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, each…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n\nasync.parallel([\n function(){ ... },\n function(){ ... }\n], callback);\n\nasync.series([\n function(){ ... },\n function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n squareExponent: 2,\n square: function(number, callback){ \n var result = Math.pow(number, this.squareExponent);\n setTimeout(function(){\n callback(null, result);\n }, 200);\n }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n // result is [NaN, NaN, NaN]\n // This fails because the `this.squareExponent` expression in the square\n // function is not evaluated in the context of AsyncSquaringLibrary, and is\n // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n // result is [1, 4, 9]\n // With the help of bind we can attach a context to the iterator before\n // passing it to async. Now the square function will be executed in its \n // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback(err, reduction) which accepts an optional error as its first \n argument, and the state of the reduction as the second. If an error is \n passed to the callback, the reduction is stopped and the main callback is \n immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n}, function(err, result){\n // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, sortValue) which must be called once it\n has completed with an error (which can be null) and a value to use as the sort\n criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n}, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, results) which must be called once it \n has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results){\n // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n }\n],\n// optional callback\nfunction(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback(err) which must be called once it has completed with an \n optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n callback(err, result1, result2, ...) it must call on completion. The first\n argument is an error (which can be null) and any further arguments will be \n passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n], function (err, result) {\n // result now equals 'done' \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n setTimeout(function () {\n callback(null, n + 1);\n }, 10);\n}\n\nfunction mul3(n, callback) {\n setTimeout(function () {\n callback(null, n * 3);\n }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n buckets,\n async.applyEach([enableSearch, updateSchema]),\n callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task, which must call its callback(err) argument when finished, with an \n optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n queued tasks, which must call its callback(err) argument when finished, with \n an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n process per round. This property can be changed after a cargo is created to\n alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n for(var i=0; i<tasks.length; i++){\n console.log('hello ' + tasks[i].name);\n }\n callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n readData: function(cb, results){\n fs.readFile('data.txt', 'utf-8', cb);\n }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The \n function receives two arguments: (1) a callback(err, result) which must be \n called when finished, passing an error (which can be null) and the result of \n the function's execution, and (2) a results object, containing the results of\n the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n \n\n__Example__\n\n```js\nasync.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n],\nfunction(err, results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n callback(null, {\n id: 'user' + id\n })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n createUser(n, function(err, user) {\n next(err, user)\n })\n}, function(err, users) {\n // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
./node_modules/bower/node_modules/request/node_modules/form-data/node_modules/async/README.md:// generate 5 users
./node_modules/bower/node_modules/request/node_modules/form-data/node_modules/async/README.md:}, function(err, users) {
./node_modules/bower/node_modules/request/node_modules/form-data/node_modules/async/README.md: // we should now have 5 users
./node_modules/bower/node_modules/request/node_modules/hawk/node_modules/hoek/package.json: "readme": "<a href=\"https://github.com/spumko\"><img src=\"https://raw.github.com/spumko/spumko/master/images/from.png\" align=\"right\" /></a>\r\n![hoek Logo](https://raw.github.com/spumko/hoek/master/images/hoek.png)\r\n\r\nGeneral purpose node utilities\r\n\r\n[![Build Status](https://secure.travis-ci.org/spumko/hoek.png)](http://travis-ci.org/spumko/hoek)\r\n\r\n# Table of Contents\r\n\r\n* [Introduction](#introduction \"Introduction\")\r\n* [Object](#object \"Object\")\r\n * [clone](#cloneobj \"clone\")\r\n * [merge](#mergetarget-source-isnulloverride-ismergearrays \"merge\")\r\n * [applyToDefaults](#applytodefaultsdefaults-options \"applyToDefaults\")\r\n * [unique](#uniquearray-key \"unique\")\r\n * [mapToObject](#maptoobjectarray-key \"mapToObject\")\r\n * [intersect](#intersectarray1-array2 \"intersect\")\r\n * [matchKeys](#matchkeysobj-keys \"matchKeys\")\r\n * [flatten](#flattenarray-target \"flatten\")\r\n * [removeKeys](#removekeysobject-keys \"removeKeys\")\r\n * [reach](#reachobj-chain \"reach\")\r\n * [inheritAsync](#inheritasyncself-obj-keys \"inheritAsync\")\r\n * [rename](#renameobj-from-to \"rename\")\r\n* [Timer](#timer \"Timer\")\r\n* [Binary Encoding/Decoding](#binary \"Binary Encoding/Decoding\")\r\n * [base64urlEncode](#binary64urlEncodevalue \"binary64urlEncode\")\r\n * [base64urlDecode](#binary64urlDecodevalue \"binary64urlDecode\")\r\n* [Escaping Characters](#escaped \"Escaping Characters\")\r\n * [escapeHtml](#escapeHtmlstring \"escapeHtml\")\r\n * [escapeHeaderAttribute](#escapeHeaderAttributeattribute \"escapeHeaderAttribute\")\r\n * [escapeRegex](#escapeRegexstring \"escapeRegex\")\r\n* [Errors](#errors \"Errors\")\r\n * [assert](#assertmessage \"assert\")\r\n * [abort](#abortmessage \"abort\")\r\n * [displayStack](#displayStackslice \"displayStack\")\r\n * [callStack](#callStackslice \"callStack\")\r\n * [toss](#tosscondition \"toss\")\r\n* [Load files](#load-files \"Load Files\")\r\n * [loadPackage](#loadPackagedir \"loadpackage\")\r\n * [loadDirModules](#loadDirModulespath-excludefiles-target \"loaddirmodules\")\r\n\r\n\r\n\r\n# Introduction\r\n\r\nThe *Hoek* general purpose node utilities library is used to aid in a variety of manners. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. \r\n\r\nFor example, to use Hoek to set configuration with default options:\r\n```javascript\r\nvar Hoek = require('hoek');\r\n\r\nvar default = {url : \"www.github.com\", port : \"8000\", debug : true}\r\n\r\nvar config = Hoek.applyToDefaults(default, {port : \"3000\", admin : true});\r\n\r\n// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\r\n```\r\n\r\nUnder each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the var Hoek = require('hoek') is omitted for brevity.\r\n\r\n## Object\r\n\r\nHoek provides several helpful methods for objects and arrays.\r\n\r\n### clone(obj)\r\n\r\nThis method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). \r\n\r\n```javascript\r\n\r\nvar nestedObj = {\r\n w: /^something$/ig,\r\n x: {\r\n a: [1, 2, 3],\r\n b: 123456,\r\n c: new Date()\r\n },\r\n y: 'y',\r\n z: new Date()\r\n };\r\n\r\nvar copy = Hoek.clone(nestedObj);\r\n\r\ncopy.x.b = 100;\r\n\r\nconsole.log(copy.y) // results in 'y'\r\nconsole.log(nestedObj.x.b) // results in 123456\r\nconsole.log(copy.x.b) // results in 100\r\n```\r\n\r\n### merge(target, source, isNullOverride, isMergeArrays)\r\nisNullOverride, isMergeArrays default to true\r\n\r\nMerge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r\n\r\n\r\n```javascript\r\n\r\nvar target = {a: 1, b : 2}\r\nvar source = {a: 0, c: 5}\r\nvar source2 = {a: null, c: 5}\r\n\r\nvar targetArray = [1, 2, 3];\r\nvar sourceArray = [4, 5];\r\n\r\nvar newTarget = Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\r\n\r\nnewTarget = Hoek.merge(targetArray, sourceArray) // results in [1, 2, 3, 4, 5]\r\nnewTarget = Hoek.merge(targetArray, sourceArray, true, false) // results in [4, 5]\r\n\r\n\r\n\r\n\r\n```\r\n\r\n### applyToDefaults(defaults, options)\r\n\r\nApply options to a copy of the defaults\r\n\r\n```javascript\r\n\r\nvar defaults = {host: \"localhost\", port: 8000};\r\nvar options = {port: 8080};\r\n\r\nvar config = Hoek.applyToDefaults(defaults, options); // results in {host: \"localhost\", port: 8080};\r\n\r\n\r\n```\r\n\r\n### unique(array, key)\r\n\r\nRemove duplicate items from Array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 2, 3, 3, 4, 5, 6];\r\n\r\nvar newArray = Hoek.unique(array); // results in [1,2,3,4,5,6];\r\n\r\narray = [{id: 1}, {id: 1}, {id: 2}];\r\n\r\nnewArray = Hoek.unique(array, \"id\") // results in [{id: 1}, {id: 2}]\r\n\r\n```\r\n\r\n### mapToObject(array, key)\r\n\r\nConvert an Array into an Object\r\n\r\n```javascript\r\n\r\nvar array = [1,2,3];\r\nvar newObject = Hoek.mapToObject(array); // results in [{\"1\": true}, {\"2\": true}, {\"3\": true}]\r\n\r\narray = [{id: 1}, {id: 2}];\r\nnewObject = Hoek.mapToObject(array, \"id\") // results in [{\"id\": 1}, {\"id\": 2}]\r\n\r\n```\r\n### intersect(array1, array2)\r\n\r\nFind the common unique items in two arrays\r\n\r\n```javascript\r\n\r\nvar array1 = [1, 2, 3];\r\nvar array2 = [1, 4, 5];\r\n\r\nvar newArray = Hoek.intersect(array1, array2) // results in [1]\r\n\r\n```\r\n\r\n### matchKeys(obj, keys) \r\n\r\nFind which keys are present\r\n\r\n```javascript\r\n\r\nvar obj = {a: 1, b: 2, c: 3};\r\nvar keys = [\"a\", \"e\"];\r\n\r\nHoek.matchKeys(obj, keys) // returns [\"a\"]\r\n\r\n```\r\n\r\n### flatten(array, target)\r\n\r\nFlatten an array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 3];\r\nvar target = [4, 5]; \r\n\r\nvar flattenedArray = Hoek.flatten(array, target) // results in [4, 5, 1, 2, 3];\r\n\r\n```\r\n\r\n### removeKeys(object, keys)\r\n\r\nRemove keys\r\n\r\n```javascript\r\n\r\nvar object = {a: 1, b: 2, c: 3, d: 4};\r\n\r\nvar keys = [\"a\", \"b\"];\r\n\r\nHoek.removeKeys(object, keys) // object is now {c: 3, d: 4}\r\n\r\n```\r\n\r\n### reach(obj, chain)\r\n\r\nConverts an object key chain string to reference\r\n\r\n```javascript\r\n\r\nvar chain = 'a.b.c';\r\nvar obj = {a : {b : { c : 1}}};\r\n\r\nHoek.reach(obj, chain) // returns 1\r\n\r\n```\r\n\r\n### inheritAsync(self, obj, keys) \r\n\r\nInherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r\n\r\n```javascript\r\n\r\nvar targetFunc = function () { };\r\n\r\nvar proto = {\r\n a: function () {\r\n return 'a!';\r\n },\r\n b: function () {\r\n return 'b!';\r\n },\r\n c: function () {\r\n throw new Error('c!');\r\n }\r\n };\r\n\r\nvar keys = ['a', 'c'];\r\n\r\nHoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r\n\r\nvar target = new targetFunc();\r\n\r\ntarget.a(function(err, result){console.log(result)} // returns 'a!' \r\n\r\ntarget.c(function(err, result){console.log(result)} // returns undefined\r\n\r\ntarget.b(function(err, result){console.log(result)} // gives error: Object [object Object] has no method 'b'\r\n\r\n```\r\n\r\n### rename(obj, from, to)\r\n\r\nRename a key of an object\r\n\r\n```javascript\r\n\r\nvar obj = {a : 1, b : 2};\r\n\r\nHoek.rename(obj, \"a\", \"c\"); // obj is now {c : 1, b : 2}\r\n\r\n```\r\n\r\n\r\n# Timer\r\n\r\nA Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\r\n\r\n```javascript\r\n\r\n\r\nexample : \r\n\r\n\r\nvar timerObj = new Hoek.Timer();\r\nconsole.log(\"Time is now: \" + timerObj.ts)\r\nconsole.log(\"Elapsed time from initialization: \" + timerObj.elapsed() + 'milliseconds')\r\n\r\n```\r\n\r\n# Binary Encoding/Decoding\r\n\r\n### base64urlEncode(value)\r\n\r\nEncodes value in Base64 or URL encoding\r\n\r\n### base64urlDecode(value)\r\n\r\nDecodes data in Base64 or URL encoding.\r\n# Escaping Characters\r\n\r\nHoek provides convenient methods for escaping html characters. The escaped characters are as followed:\r\n\r\n```javascript\r\n\r\ninternals.htmlEscaped = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '`': '`'\r\n};\r\n\r\n```\r\n\r\n### escapeHtml(string)\r\n\r\n```javascript\r\n\r\nvar string = '<html> hey </html>';\r\nvar escapedString = Hoek.escapeHtml(string); // returns <html> hey </html>\r\n\r\n```\r\n\r\n### escapeHeaderAttribute(attribute)\r\n\r\nEscape attribute value for use in HTTP header\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeHeaderAttribute('I said \"go w\\\\o me\"'); //returns I said \\\"go w\\\\o me\\\"\r\n\r\n\r\n```\r\n\r\n\r\n### escapeRegex(string)\r\n\r\nEscape string for Regex construction\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\\\/`\"(>)[<]d{}s,'); // returns 4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`\"\\(>\\)\\[<\\]d\\{\\}s\\,\r\n\r\n\r\n\r\n```\r\n\r\n# Errors\r\n\r\n### assert(message)\r\n\r\n```javascript\r\n\r\nvar a = 1, b =2;\r\n\r\nHoek.assert(a === b, 'a should equal b'); // ABORT: a should equal b\r\n\r\n```\r\n\r\n### abort(message)\r\n\r\nFirst checks if process.env.NODE_ENV === 'test', and if so, throws error message. Otherwise,\r\ndisplays most recent stack and then exits process.\r\n\r\n\r\n\r\n### displayStack(slice)\r\n\r\nDisplays the trace stack\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.displayStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\r\n 'Module._compile (module.js:449:26)',\r\n 'Module._extensions..js (module.js:467:10)',\r\n 'Module.load (module.js:356:32)',\r\n 'Module._load (module.js:312:12)',\r\n 'Module.runMain (module.js:492:10)',\r\n 'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\r\n\r\n```\r\n\r\n### callStack(slice)\r\n\r\nReturns a trace stack array.\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.callStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\r\n [ 'module.js', 449, 26, 'Module._compile', false ],\r\n [ 'module.js', 467, 10, 'Module._extensions..js', false ],\r\n [ 'module.js', 356, 32, 'Module.load', false ],\r\n [ 'module.js', 312, 12, 'Module._load', false ],\r\n [ 'module.js', 492, 10, 'Module.runMain', false ],\r\n [ 'node.js',\r\n 244,\r\n 9,\r\n 'startup.processNextTick.process._tickCallback',\r\n false ] ]\r\n\r\n\r\n```\r\n\r\n### toss(condition)\r\n\r\ntoss(condition /*, [message], callback */)\r\n\r\nReturn an error as first argument of a callback\r\n\r\n\r\n# Load Files\r\n\r\n### loadPackage(dir)\r\n\r\nLoad and parse package.json process root or given directory\r\n\r\n```javascript\r\n\r\nvar pack = Hoek.loadPackage(); // pack.name === 'hoek'\r\n\r\n```\r\n\r\n### loadDirModules(path, excludeFiles, target) \r\n\r\nLoads modules from a given path; option to exclude files (array).\r\n\r\n\r\n\r\n\r\n",
./node_modules/bower/node_modules/request/node_modules/hawk/node_modules/hoek/README.md:[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
./node_modules/bower/node_modules/request/node_modules/hawk/node_modules/hoek/README.md:[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
./node_modules/bower/node_modules/request/README.md: , url = 'https://api.twitter.com/1/users/show.json?'
./node_modules/bower/node_modules/inquirer/Inquirerjs.sublime-workspace: "/C/Users/Simon.Boudrias/AppData/Roaming/FileZilla/sitemanager.xml",
./node_modules/bower/node_modules/inquirer/Inquirerjs.sublime-workspace: "/C/Users/Simon.Boudrias/Downloads/test/index.html",
./node_modules/bower/node_modules/inquirer/Inquirerjs.sublime-workspace: "/C/Users/Simon.Boudrias/AppData/Roaming/Sublime Text 2/Packages/User/Preferences.sublime-settings",
./node_modules/bower/node_modules/inquirer/Inquirerjs.sublime-workspace: "/C/Users/Simon.Boudrias/pc_config.sublime-project"
./node_modules/bower/node_modules/inquirer/node_modules/cli-color/node_modules/memoizee/package.json: "readme": "# Memoize – Complete memoize/cache solution for JavaScript\n\n_Originally derived from [es5-ext](https://github.com/medikoo/es5-ext) package._\n\nMemoization is best technique to save on memory or CPU cycles when we deal with repeated operations. For detailed insight see: http://en.wikipedia.org/wiki/Memoization\n\n## Features\n\n* Works with any type of function arguments – __no serialization is needed__\n* Works with [__any length of function arguments__](#arguments-length). Length can be set as fixed or dynamic.\n* One of the [__fastest__](#benchmarks) available solutions.\n* Support for [__asynchronous functions__](#memoizing-asynchronous-functions)\n* [__Primitive mode__](#primitive-mode) which assures fast performance when arguments are conversible to strings.\n* Can be configured [__for methods__](#memoizing-a-method) (when `this` counts in)\n* Cache [__can be cleared manually__](#manual-clean-up) or [__after specified timeout__](#expire-cache-after-given-period-of-time)\n* Cache size can be __[limited on LRU basis](#limiting-cache-size)__\n* Optionally [__accepts resolvers__](#resolvers) that normalize function arguments before passing them to underlying function.\n* Optional [__reference counter mode__](#reference-counter), that allows more sophisticated cache management\n* [__Profile tool__](#profiling--statistics) that provides valuable usage statistics\n* Covered by [__over 500 unit tests__](#tests-)\n\n## Usage\n\n```javascript\nvar memoize = require('memoizee');\n\nvar fn = function (one, two, three) { /* ... */ };\n\nmemoized = memoize(fn);\n\nmemoized('foo', 3, 'bar');\nmemoized('foo', 3, 'bar'); // Cache hit\n```\n\n## Installation\n### NPM\n\nIn your project path:\n\n```\n$ npm install memoizee\n```\n\n### Browser\n\nBrowser bundle can be easily created with help of [modules-webmake](https://github.com/medikoo/modules-webmake). Assuming that you have latest [Node.js](http://nodejs.org/) and [Git](http://git-scm.com/) installed, following will work in command shell of any system (Linux/MacOS/Windows):\n\n```\n$ npm install -g webmake\n$ git clone git://github.com/medikoo/memoize.git\n$ cd memoize\n$ npm install\n$ cd ..\n$ webmake --name=memoize memoize/lib/index.js memoize.js\n```\n\nLast command bundles memoize with all it's functionalities, but you may need just a subset, you can have that by addressing specific modules directly, e.g. with following you will build just primitive mode with support for asynchronous functions:\n\n```\n$ webmake --name=memoize --include=memoize/lib/ext/async.js memoize/lib/primitive.js memoize.js\n```\n\nIf you work with AMD modules, add _amd_ option, so generated bundle is one:\n\n```\n$ webmake --name=memoize --amd memoize/lib/index.js memoize.js\n```\n\n_Mind that memoize relies on some EcmaScript5 features, so for older browsers you need to load as well [es5-shim](https://github.com/kriskowal/es5-shim)_\n\n## Configuration\n\nAll below options can be applied in any combination\n\n### Arguments length\n\nBy default fixed number of arguments that function take is assumed (it's read from function's `length` property) this can be overridden:\n\n```javascript\nmemoized = memoize(fn, { length: 2 });\n\nmemoized('foo'); // Assumed: 'foo', undefined\nmemoized('foo', undefined); // Cache hit\n\nmemoized('foo', 3, {}); // Third argument is ignored (but passed to underlying function)\nmemoized('foo', 3, 13); // Cache hit\n```\n\nDynamic _length_ behavior can be forced by setting _length_ to `false`, that means memoize will work with any number of arguments.\n\n```javascript\nmemoized = memoize(fn, { length: false });\n\nmemoized('foo');\nmemoized('foo'); // Cache hit\nmemoized('foo', undefined);\nmemoized('foo', undefined); // Cache hit\n\nmemoized('foo', 3, {});\nmemoized('foo', 3, 13);\nmemoized('foo', 3, 13); // Cache hit\n```\n\n### Primitive mode\n\nIf we work with large result sets, or memoize hot functions, default mode may not perform as fast as we expect. In that case it's good to run memoization in _primitive_ mode. To provide fast access, results are saved in hash instead of an array. Generated hash ids are result of arguments to string convertion. __Mind that this mode will work correctly only if stringified arguments produce unique strings.__\n\n```javascript\nmemoized = memoize(fn, { primitive: true });\n\nmemoized('/path/one');\nmemoized('/path/one'); // Cache hit\n```\n\n### Resolvers\n\nWhen not working in _primitive_ mode but expecting arguments of certain type it's good to coerce them before doing memoization. We can do that by passing additional resolvers array:\n\n```javascript\nmemoized = memoize(fn, { length: 2, resolvers: [String, Boolean] });\n\nmemoized(12, [1,2,3].length);\nmemoized(\"12\", true); // Cache hit\nmemoized({ toString: function () { return \"12\"; } }, {}); // Cache hit\n```\n\n__Note. If your arguments are collections (arrays or hashes) that you want to memoize by content (not by self objects), you need to cast them to strings__, for that just use [primitive mode](#primitive-mode). Arrays have standard string representation and work with primitive mode out of a box, for hashes you need to define `toString` method, that will produce unique string descriptions.\n\nSimilarly __if you want to memoize functions by their code representation not by their objects, you should use primitive mode__.\n\n### Memoizing asynchronous functions\n\nWith _async_ option we indicate that we memoize asynchronous function. \nOperations that result with an error are not cached.\n\n```javascript\nafn = function (a, b, cb) {\n setTimeout(function () {\n cb(null, a + b);\n }, 200);\n};\nmemoized = memoize(afn, { async: true });\n\nmemoized(3, 7, function (err, res) {\n memoized(3, 7, function (err, res) {\n // Cache hit\n });\n});\n\nmemoized(3, 7, function (err, res) {\n // Cache hit\n});\n```\n\n### Memoizing a method\n\nWhen we are defining a prototype, we may want to define method that will memoize it's results in relation to each instance. Basic way to obtain that would be:\n\n```javascript\nvar Foo = function () {\n this.bar = memoize(this.bar.bind(this));\n // ... constructor logic\n};\nFoo.prototype.bar = function () {\n // ... method logic\n};\n```\n\nWith _method_ option we can configure memoization directly on prototype:\n\n```javascript\nvar Foo = function () {\n // ... constructor logic\n};\nFoo.prototype.bar = memoize(function () {\n // ... method logic\n}, { method: 'bar' });\n```\n\nAdditionally we may provide descriptor which would be used for defining method on instance object:\n\n```javascript\nvar Foo = function () {\n // ... constructor logic\n};\nFoo.prototype.bar = memoize(function () {\n // ... method logic\n}, { method: { name: 'bar', descriptor: { configurable: true } } });\n```\n\n### Cache handling\n\n#### Manual clean up:\n\nClear data for particular call.\n\n```javascript\nmemoized.clear('foo', true);\n```\n\nArguments passed to `clear` are treated with same rules as input arguments passed to function\n\nClear all cached data:\n\n```javascript\nmemoized.clearAll();\n```\n\n#### Expire cache after given period of time\n\nWith _maxAge_ option we can ensure that cache for given call is cleared after predefined period of time\n\n```javascript\nmemoized = memoize(fn, { maxAge: 1000 });\n\nmemoized('foo', 3);\nmemoized('foo', 3); // Cache hit\nsetTimeout(function () {\n memoized('foo', 3); // No longer in cache, re-executed\n memoized('foo', 3); // Cache hit\n}, 2000);\n```\n\nAdditionally we may ask to _pre-fetch_ in a background a value that is about to expire. _Pre-fetch_ is invoked only if value is accessed close to its expiry date. By default it needs to be within at least 33% of _maxAge_ timespan before expire:\n\n```javascript\nmemoized = memoize(fn, { maxAge: 1000, preFetch: true }); // Defaults to 0.33\n\nmemoized('foo', 3);\nmemoized('foo', 3); // Cache hit\n\nsetTimeout(function () {\n memoized('foo', 3); // Cache hit\n}, 500);\n\nsetTimeout(function () {\n memoized('foo', 3); // Cache hit, silently pre-fetched in next tick\n}, 800);\n\nsetTimeout(function () {\n memoized('foo', 3); // Cache hit\n}, 1300);\n```\n\n_Pre-fetch_ timespan can be customized:\n\n```javascript\nmemoized = memoize(fn, { maxAge: 1000, preFetch: 0.6 });\n\nmemoized('foo', 3);\nmemoized('foo', 3); // Cache hit\n\nsetTimeout(function () {\n memoized('foo', 3); // Cache hit, silently pre-fetched in next tick\n}, 500);\n\nsetTimeout(function () {\n memoized('foo', 3); // Cache hit\n}, 1300);\n```\n\n_Thanks [@puzrin](https://github.com/puzrin) for helpful suggestions concerning this functionality_\n\n#### Reference counter\n\nWe can track number of references returned from cache, and manually clear them. When last reference is cleared, cache is purged automatically:\n\n```javascript\nmemoized = memoize(fn, { refCounter: true });\n\nmemoized('foo', 3); // refs: 1\nmemoized('foo', 3); // Cache hit, refs: 2\nmemoized('foo', 3); // Cache hit, refs: 3\nmemoized.clearRef('foo', 3); // refs: 2\nmemoized.clearRef('foo', 3); // refs: 1\nmemoized.clearRef('foo', 3); // refs: 0, Cache purged for 'foo', 3\nmemoized('foo', 3); // Re-executed, refs: 1\n```\n\n#### Limiting cache size\n\nWith _max_ option you can limit cache size, it's backed with [LRU algorithm](http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used)\n\n```javascript\nmemoized = memoize(fn, { max: 2 });\n\nmemoized('foo', 3);\nmemoized('bar', 7);\nmemoized('foo', 3); // Cache hit\nmemoized('bar', 7); // Cache hit\nmemoized('lorem', 11); // Cache cleared for 'foo', 3\nmemoized('bar', 7); // Cache hit\nmemoized('foo', 3); // Re-executed, Cache cleared for 'lorem', 11\nmemoized('lorem', 11); // Re-executed, Cache cleared for 'bar', 7\nmemoized('foo', 3); // Cache hit\nmemoized('bar', 7); // Re-executed, Cache cleared for 'lorem', 11\n```\n\n#### Registering dispose callback\nYou can register callback that is called on each value being removed from cache:\n\n```javascript\nmemoized = memoize(fn, { dispose: function (value) { /*…*/ } });\n\nvar foo3 = memoized('foo', 3);\nvar bar7 = memoized('bar', 7);\nmemoized.clear('foo', 3); // Dispose called with foo3 value\nmemoized.clear('bar', 7); // Dispose called with bar7 value\n```\n\n## Benchmarks\n\nSimple benchmark tests can be found in _benchmark_ folder. Currently it's just plain simple calculation of fibonacci sequences. To run it you need to install other test candidates:\n\n\t$ npm install underscore lodash lru-cache\n\nExample output taken under Node v0.8.9 on 2008 MBP Pro:\n\n```\nFibonacci 3000 x10:\n\n1: 21ms Memoizee (primitive mode)\n1: 21ms Lo-dash\n3: 23ms Underscore\n4: 88ms Memoizee (primitive mode) LRU (max: 1000)\n5: 178ms Memoizee (object mode)\n6: 234ms Memoizee (object mode) LRU (max: 1000)\n7: 2852ms lru-cache LRU (max: 1000)\n```\n\n## Profiling & Statistics\n\nIf you want to make sure how much you benefit from memoization or just check if memoization works as expected, loading profile module will give access to all valuable information.\n\n__Module needs to be imported before any memoization (that we want to track) is configured. Mind also that running profile module affects performance, it's best not to use it in production environment__\n\n```javascript\nvar memProfile = require('memoizee/lib/ext/profile');\n```\n\nAccess statistics at any time:\n\n```javascript\nmemProfile.statistics; // Statistcs accessible for programmatical use\nconsole.log(memProfile.log()); // Output statistics data in readable form\n```\n\nExample console output:\n\n```\n------------------------------------------------------------\nMemoize statistics:\n\n Init Cache %Cache Source location\n11604 35682 75.46 (all)\n 2112 19901 90.41 at /Users/medikoo/Projects/_packages/next/lib/fs/is-ignored.js:276:12\n 2108 9087 81.17 at /Users/medikoo/Projects/_packages/next/lib/fs/is-ignored.js:293:10\n 6687 2772 29.31 at /Users/medikoo/Projects/_packages/next/lib/fs/watch.js:125:9\n 697 3922 84.91 at /Users/medikoo/Projects/_packages/next/lib/fs/is-ignored.js:277:15\n------------------------------------------------------------\n```\n\n* _Init_ – Initial hits\n* _Cache_ – Cache hits\n* _%Cache_ – What's the percentage of cache hits (of all function calls)\n* _Source location_ – Where in the source code given memoization was initialized\n\n## Tests [![Build Status](https://secure.travis-ci.org/medikoo/memoize.png?branch=master)](https://secure.travis-ci.org/medikoo/memoize)\n\n\t$ npm test\n\n## Contributors\n\n* [@puzrin](https://github.com/puzrin) (Vitaly Puzrin)\n * Proposal and help with coining right _pre-fetch_ logic for [_maxAge_](https://github.com/medikoo/memoize#expire-cache-after-given-period-of-time) variant\n",
./node_modules/bower/node_modules/inquirer/node_modules/cli-color/node_modules/memoizee/README.md: 2112 19901 90.41 at /Users/medikoo/Projects/_packages/next/lib/fs/is-ignored.js:276:12
./node_modules/bower/node_modules/inquirer/node_modules/cli-color/node_modules/memoizee/README.md: 2108 9087 81.17 at /Users/medikoo/Projects/_packages/next/lib/fs/is-ignored.js:293:10
./node_modules/bower/node_modules/inquirer/node_modules/cli-color/node_modules/memoizee/README.md: 6687 2772 29.31 at /Users/medikoo/Projects/_packages/next/lib/fs/watch.js:125:9
./node_modules/bower/node_modules/inquirer/node_modules/cli-color/node_modules/memoizee/README.md: 697 3922 84.91 at /Users/medikoo/Projects/_packages/next/lib/fs/is-ignored.js:277:15
./node_modules/bower/node_modules/inquirer/node_modules/async/package.json: "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, each…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n\nasync.parallel([\n function(){ ... },\n function(){ ... }\n], callback);\n\nasync.series([\n function(){ ... },\n function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n squareExponent: 2,\n square: function(number, callback){ \n var result = Math.pow(number, this.squareExponent);\n setTimeout(function(){\n callback(null, result);\n }, 200);\n }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n // result is [NaN, NaN, NaN]\n // This fails because the `this.squareExponent` expression in the square\n // function is not evaluated in the context of AsyncSquaringLibrary, and is\n // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n // result is [1, 4, 9]\n // With the help of bind we can attach a context to the iterator before\n // passing it to async. Now the square function will be executed in its \n // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback(err, reduction) which accepts an optional error as its first \n argument, and the state of the reduction as the second. If an error is \n passed to the callback, the reduction is stopped and the main callback is \n immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n}, function(err, result){\n // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, sortValue) which must be called once it\n has completed with an error (which can be null) and a value to use as the sort\n criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n}, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, results) which must be called once it \n has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results){\n // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n }\n],\n// optional callback\nfunction(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback(err) which must be called once it has completed with an \n optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n callback(err, result1, result2, ...) it must call on completion. The first\n argument is an error (which can be null) and any further arguments will be \n passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n], function (err, result) {\n // result now equals 'done' \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n setTimeout(function () {\n callback(null, n + 1);\n }, 10);\n}\n\nfunction mul3(n, callback) {\n setTimeout(function () {\n callback(null, n * 3);\n }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n buckets,\n async.applyEach([enableSearch, updateSchema]),\n callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task, which must call its callback(err) argument when finished, with an \n optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n queued tasks, which must call its callback(err) argument when finished, with \n an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n process per round. This property can be changed after a cargo is created to\n alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n for(var i=0; i<tasks.length; i++){\n console.log('hello ' + tasks[i].name);\n }\n callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n readData: function(cb, results){\n fs.readFile('data.txt', 'utf-8', cb);\n }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The \n function receives two arguments: (1) a callback(err, result) which must be \n called when finished, passing an error (which can be null) and the result of \n the function's execution, and (2) a results object, containing the results of\n the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n \n\n__Example__\n\n```js\nasync.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n],\nfunction(err, results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n callback(null, {\n id: 'user' + id\n })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n createUser(n, function(err, user) {\n next(err, user)\n })\n}, function(err, users) {\n // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
./node_modules/bower/node_modules/inquirer/node_modules/async/README.md:// generate 5 users
./node_modules/bower/node_modules/inquirer/node_modules/async/README.md:}, function(err, users) {
./node_modules/bower/node_modules/inquirer/node_modules/async/README.md: // we should now have 5 users
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/collection.md:var users = [
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/collection.md:pluck(users, 'name'); // ["John", "Jane"]
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/collection.md:pluck(users, 'age'); // [21, 27]
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/collection.md:users = {
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/collection.md:pluck(users, 'name'); // ['John', 'Mary']
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/function.md:var names = map(users, func('getName'));
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/function.md:var users = [{name:"John", age:21}, {name:"Jane", age:25}];
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/function.md:var names = map(users, prop('name'));
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [{name : 'John', age: 21}, {name: 'Jane', age : 27}];
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/array.md:var names = pluck(users, 'name'); // ["John", "Jane"]
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/array.md:var ages = pluck(users, 'age'); // [21, 27]
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/object.md:var users = {
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/object.md:pluck(users, 'name'); // {first: 'John', second: 'Mary'} );
./node_modules/bower/node_modules/bower-config/node_modules/mout/doc/object.md:pluck(users, 'age'); // {first: 21, second: 25} );
./node_modules/bower/node_modules/tar/package.json: "readme": "# node-tar\n\nTar for Node.js.\n\n## Goals of this project\n\n1. Be able to parse and reasonably extract the contents of any tar file\n created by any program that creates tar files, period.\n\n At least, this includes every version of:\n\n * bsdtar\n * gnutar\n * solaris posix tar\n * Joerg Schilling's star (\"Schilly tar\")\n\n2. Create tar files that can be extracted by any of the following tar programs:\n\n * bsdtar/libarchive version 2.6.2\n * gnutar 1.15 and above\n * SunOS Posix tar\n * Joerg Schilling's star (\"Schilly tar\")\n\n3. 100% test coverage. Speed is important. Correctness is slightly more important.\n\n4. Create the kind of tar interface that Node users would want to use.\n\n5. Satisfy npm's needs for a portable tar implementation with a JavaScript interface.\n\n6. No excuses. No complaining. No tolerance for failure.\n\n## But isn't there already a tar.js?\n\nYes, there are a few. This one is going to be better, and it will be\nfanatically maintained, because npm will depend on it.\n\nThat's why I need to write it from scratch. Creating and extracting\ntarballs is such a large part of what npm does, I simply can't have it\nbe a black box any longer.\n\n## Didn't you have something already? Where'd it go?\n\nIt's in the \"old\" folder. It's not functional. Don't use it.\n\nIt was a useful exploration to learn the issues involved, but like most\nsoftware of any reasonable complexity, node-tar won't be useful until\nit's been written at least 3 times.\n",
./node_modules/bower/node_modules/tar/README.md:4. Create the kind of tar interface that Node users would want to use.
./node_modules/bower/node_modules/update-notifier/package.json: "readme": "# update-notifier [![Build Status](https://secure.travis-ci.org/yeoman/update-notifier.png?branch=master)](http://travis-ci.org/yeoman/update-notifier)\n\n##### Update notifier for your Node.js NPM package\n\n![screenshot](https://raw.github.com/yeoman/update-notifier/master/screenshot.png)\n\nInform your package users of updates in a non-intrusive way. Mainly targets global CLI apps.\n\nWhenever you initiate the update notifier and it's not within the interval threshold, it will asynchronously check with NPM in the background for available updates, then persist the result. The next time the notifier is initiated the result will be loaded into the `.update` property. This prevents any impact on your package startup performance.\nThe check process is done with [fork](http://nodejs.org/api/child_process.html#child_process_child_fork). This means that if you call `process.exit`, the check will still be performed in its own process.\n\n\n## About\n\nThe idea for this module came from the desire to apply the browser update strategy to CLI tools, where everyone is always on the latest version. We first tried automatic updating, which we discovered wasn't popular. This is the second iteration of that idea, but limited to just update notifications.\n\nThere are a few projects using it:\n\n- [Yeoman](http://yeoman.io) - modern workflows for modern webapps\n\n- [Bower](http://bower.io) - a package manager for the web\n\n- [Automaton](https://github.com/IndigoUnited/automaton) - task automation tool\n\n- [Spoon.js CLI](https://npmjs.org/package/spoonjs)\n\n- [Node GH](http://nodegh.io) - GitHub command line tool\n\n- [Hoodie CLI](http://hood.ie) - Hoodie command line tool\n\n## Example usage\n\n```js\nvar updateNotifier = require('update-notifier');\n\n// Checks for available update and returns an instance\nvar notifier = updateNotifier();\n\nif (notifier.update) {\n\t// Notify using the built-in convenience method\n\tnotifier.notify();\n}\n\n// `notifier.update` contains some useful info about the update\nconsole.log(notifier.update);\n/*\n{\n\tlatest: '0.9.5',\n\tcurrent: '0.9.3',\n\ttype: 'patch', // possible values: latest, major, minor, patch\n\tdate: '2012-11-05T14:32:37.603Z',\n\tname: 'yeoman'\n}\n*/\n```\n\n## Example with settings and custom message\n\n```js\nvar notifier = updateNotifier({\n\tupdateCheckInterval: 1000 * 60 * 60 * 24 * 7 // 1 week\n});\n\nif (notifier.update) {\n\tnotifier.notify('Update available: ' + notifier.update.latest);\n}\n```\n\n\n## Documentation\n\n\n### updateNotifier([settings])\n\nChecks if there is an available update. Accepts settings defined below. Returns an object with update info if there is an available update, otherwise `undefined`.\n\n### updateNotifier.notify([message || defer])\n\nA convenience method that will inform the user about an available update (see screenshot). By default it will display the message right away. However, if you supply a custom message or `true` it will be displayed right before the process exits.\n\n\n### Settings\n\n\n#### callback\n\nType: `function` \nDefault: `null`\n\nIf provided, a callback function will be called,\npassed `(error[, update])`\n\n`update` is equal to `notifier.update`\n\n\n#### packagePath\n\nType: `string` \nDefault: `'package.json'`\n\nRelative path to your module `package.json`.\n\n\n#### packageName\n\nType: `string` \nDefault: Inferred from `packageFile`\n\nUsed instead of inferring it from `packageFile`. \nRequires you to also specify `packageVersion`.\n\n\n#### packageVersion\n\nType: `string` \nDefault: Inferred from `packageFile`\n\nUsed instead of inferring it from `packageFile`. \nRequires you to also specify `packageName`.\n\n\n#### updateCheckInterval\n\nType: `number` \nDefault: `1000 * 60 * 60 * 24` (1 day)\n\nHow often it should check for updates.\n\n\n#### updateCheckTimeout\n\nType: `number` \nDefault: `20000` (20 secs)\n\nHow long the update can take. \nIf it takes longer than the timeout, it will be aborted.\n\n#### registryUrl\n\nType: `string` \nDefault: `'http://registry.npmjs.org/%s'`\n\nAlternative registry mirrors:\n\n- `http://85.10.209.91/%s`\n- `http://165.225.128.50:8000/%s`\n\n\n### Proxy settings\n\nIf you are behind a proxy server the `process.env` property is used to take the proxy server value from `HTTP_PROXY` or `HTTPS_PROXY` in order to make the call to the server. This means that you need to [set](https://github.com/sindresorhus/guides/blob/master/set-environment-variables.md) those properties as environment variables.\n\n\n### User settings\n\nUsers of your module have the ability to opt-out of the update notifier by changing the `optOut` property to `true` in `~/.config/configstore/update-notifier-[your-module-name].yml`. The path is available in `notifier.config.path`.\n\nYou could also let the user opt-out on a per run basis:\n\n```js\nif (process.argv.indexOf('--no-update-notifier') === -1) {\n\t// run updateNotifier()\n}\n```\n\n\n## License\n\n[BSD license](http://opensource.org/licenses/bsd-license.php) and copyright Google\n",
./node_modules/bower/node_modules/update-notifier/node_modules/configstore/package.json: "readme": "# configstore [![Build Status](https://secure.travis-ci.org/yeoman/configstore.png?branch=master)](http://travis-ci.org/yeoman/configstore)\n\nEasily load and persist config without having to think about where and how.\n\nConfig is stored in a YAML file to make it simple for users to edit the config directly themselves. The file is located in `$XDG_CONFIG_HOME` or `~/.config`. Eg: `~/.config/configstore/id-of-your-choosing.yml`\n\n\n## Example usage\n\n```js\nvar Configstore = require('configstore');\nvar packageName = require('./package').name;\n\n// Init a Configstore instance with an unique ID eg. package name\n// and optionally some default values\nvar conf = new Configstore(packageName, { foo: 'bar' });\n\nconf.set('awesome', true);\nconsole.log(conf.get('awesome')); // true\nconsole.log(conf.get('foo')); // bar\n\nconf.del('awesome');\nconsole.log(conf.get('awesome')); // undefined\n```\n\n\n## Documentation\n\n### Methods\n\n#### .set(key, val)\n\nSet an item\n\n#### .get(key)\n\nGet an item\n\n#### .del(key)\n\nDelete an item\n\n### Properties\n\n#### .all\n\nGet all items as an object or replace the current config with an object:\n\n```js\nconf.all = {\n\thello: 'world'\n};\n```\n\n#### .size\n\nGet the item count\n\n#### .path\n\nGet the path to the config file. Can be used to show the user where the config file is located or even better open it for them.\n\n\n## License\n\n[BSD license](http://opensource.org/licenses/bsd-license.php) \nCopyright Google\n",
./node_modules/bower/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/vendor/jquery.js: // Users should not attempt to inspect the internal events object using jQuery.data,
./node_modules/bower/node_modules/update-notifier/node_modules/configstore/readme.md:Config is stored in a YAML file to make it simple for users to edit the config directly themselves. The file is located in `$XDG_CONFIG_HOME` or `~/.config`. Eg: `~/.config/configstore/id-of-your-choosing.yml`
./node_modules/bower/node_modules/update-notifier/node_modules/request/package.json: "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n<pre>\n npm install request\n</pre>\n\nOr from source:\n\n<pre>\n git clone git://github.com/mikeal/request.git \n cd request\n npm link\n</pre>\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## HTTP Authentication\n\n```javascript\nrequest.get('http://some.server.com/').auth('username', 'password', false);\n// or\nrequest.get('http://some.server.com/', {\n 'auth': {\n 'user': 'username',\n 'pass': 'password',\n 'sendImmediately': false\n }\n});\n```\n\nIf passed as an option, `auth` should be a hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional). The method form takes parameters `auth(username, password, sendImmediately)`.\n\n`sendImmediately` defaults to true, which will cause a basic authentication header to be sent. If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a 401 response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).\n\nDigest authentication is supported, but it only works with `sendImmediately` set to `false` (otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail).\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Ideally, you would take the body in the response\n // and construct a URL that a user clicks on (like a sign in button).\n // The verifier is only available in the response after a user has \n // verified with twitter that they are authorizing your app.\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: access_token.oauth_verifier\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for PATCH, POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `auth` - A hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional). See documentation above.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n* `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.\n* `localAddress` - Local interface to bind for network connections.\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.patch\n\nSame as request() but defaults to `method: \"PATCH\"`.\n\n```javascript\nrequest.patch(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node_modules/async/package.json: "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, each…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n\nasync.parallel([\n function(){ ... },\n function(){ ... }\n], callback);\n\nasync.series([\n function(){ ... },\n function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n squareExponent: 2,\n square: function(number, callback){ \n var result = Math.pow(number, this.squareExponent);\n setTimeout(function(){\n callback(null, result);\n }, 200);\n }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n // result is [NaN, NaN, NaN]\n // This fails because the `this.squareExponent` expression in the square\n // function is not evaluated in the context of AsyncSquaringLibrary, and is\n // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n // result is [1, 4, 9]\n // With the help of bind we can attach a context to the iterator before\n // passing it to async. Now the square function will be executed in its \n // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback(err, reduction) which accepts an optional error as its first \n argument, and the state of the reduction as the second. If an error is \n passed to the callback, the reduction is stopped and the main callback is \n immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n}, function(err, result){\n // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, sortValue) which must be called once it\n has completed with an error (which can be null) and a value to use as the sort\n criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n}, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, results) which must be called once it \n has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results){\n // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n }\n],\n// optional callback\nfunction(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback(err) which must be called once it has completed with an \n optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n callback(err, result1, result2, ...) it must call on completion. The first\n argument is an error (which can be null) and any further arguments will be \n passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n], function (err, result) {\n // result now equals 'done' \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n setTimeout(function () {\n callback(null, n + 1);\n }, 10);\n}\n\nfunction mul3(n, callback) {\n setTimeout(function () {\n callback(null, n * 3);\n }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n buckets,\n async.applyEach([enableSearch, updateSchema]),\n callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task, which must call its callback(err) argument when finished, with an \n optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n queued tasks, which must call its callback(err) argument when finished, with \n an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n process per round. This property can be changed after a cargo is created to\n alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n for(var i=0; i<tasks.length; i++){\n console.log('hello ' + tasks[i].name);\n }\n callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n readData: function(cb, results){\n fs.readFile('data.txt', 'utf-8', cb);\n }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The \n function receives two arguments: (1) a callback(err, result) which must be \n called when finished, passing an error (which can be null) and the result of \n the function's execution, and (2) a results object, containing the results of\n the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n \n\n__Example__\n\n```js\nasync.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n],\nfunction(err, results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n callback(null, {\n id: 'user' + id\n })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n createUser(n, function(err, user) {\n next(err, user)\n })\n}, function(err, users) {\n // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node_modules/async/README.md:// generate 5 users
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node_modules/async/README.md:}, function(err, users) {
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node_modules/async/README.md: // we should now have 5 users
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/node-form-data/test/integration/test-http-respone.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/node-form-data/test/run.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/sftp-config-alt.json",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Desktop/test/file.txt",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Desktop/stuff/kodak/web.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Desktop/test/test1.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Desktop/test/spdy.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/bin/echo.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/static/test.html",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/bin/passthrough_stream.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/request/main.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/request/tests/test-pipes.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/static/a/main.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/flickr/lib/flickr.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/socket.io/lib/socket.io.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/flickr/node_modules/oauth/lib/oauth.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/flickr/index.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/node_modules/socket.io/index.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/sftp-config.json",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/libereco.ia.gs/public/index.html",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Desktop/kodak/dns.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/500.ia.gs/htdocs/s/fonts.css",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/ia.gs/sftp-config.json",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Downloads/fabric_plaid.png",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Library/Application Support/Sublime Text 2/Packages/Default/Global.sublime-settings",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/ia.gs/node_modules/director/lib/director/router.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/ia.gs/web/e/404.html",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/ia.gs/web/e/500.html",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Dropbox/Projects/ia.gs/node_modules/director/lib/director/http/index.js",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Library/Application Support/Sublime Text 2/Packages/SFTP/SFTP.sublime-settings",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Library/Application Support/Sublime Text 2/Packages/SFTP/Default (OSX).sublime-keymap",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Sites/new/sftp-config.json",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Sites/new/polarbear.css",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Library/Application Support/Sublime Text 2/Packages/User/Base File.sublime-settings",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Library/Application Support/Sublime Text 2/Packages/Default/Base File.sublime-settings",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace: "/Users/alexi/Sites/new/include/Controllers/Home/HomepageController.php"
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/form-data/node-form-data.sublime-project: "path": "/Users/alexi/Dropbox/Projects/node-form-data"
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/hawk/node_modules/hoek/package.json: "readme": "<a href=\"https://github.com/spumko\"><img src=\"https://raw.github.com/spumko/spumko/master/images/from.png\" align=\"right\" /></a>\r\n![hoek Logo](https://raw.github.com/spumko/hoek/master/images/hoek.png)\r\n\r\nGeneral purpose node utilities\r\n\r\n[![Build Status](https://secure.travis-ci.org/spumko/hoek.png)](http://travis-ci.org/spumko/hoek)\r\n\r\n# Table of Contents\r\n\r\n* [Introduction](#introduction \"Introduction\")\r\n* [Object](#object \"Object\")\r\n * [clone](#cloneobj \"clone\")\r\n * [merge](#mergetarget-source-isnulloverride-ismergearrays \"merge\")\r\n * [applyToDefaults](#applytodefaultsdefaults-options \"applyToDefaults\")\r\n * [unique](#uniquearray-key \"unique\")\r\n * [mapToObject](#maptoobjectarray-key \"mapToObject\")\r\n * [intersect](#intersectarray1-array2 \"intersect\")\r\n * [matchKeys](#matchkeysobj-keys \"matchKeys\")\r\n * [flatten](#flattenarray-target \"flatten\")\r\n * [removeKeys](#removekeysobject-keys \"removeKeys\")\r\n * [reach](#reachobj-chain \"reach\")\r\n * [inheritAsync](#inheritasyncself-obj-keys \"inheritAsync\")\r\n * [rename](#renameobj-from-to \"rename\")\r\n* [Timer](#timer \"Timer\")\r\n* [Binary Encoding/Decoding](#binary \"Binary Encoding/Decoding\")\r\n * [base64urlEncode](#binary64urlEncodevalue \"binary64urlEncode\")\r\n * [base64urlDecode](#binary64urlDecodevalue \"binary64urlDecode\")\r\n* [Escaping Characters](#escaped \"Escaping Characters\")\r\n * [escapeHtml](#escapeHtmlstring \"escapeHtml\")\r\n * [escapeHeaderAttribute](#escapeHeaderAttributeattribute \"escapeHeaderAttribute\")\r\n * [escapeRegex](#escapeRegexstring \"escapeRegex\")\r\n* [Errors](#errors \"Errors\")\r\n * [assert](#assertmessage \"assert\")\r\n * [abort](#abortmessage \"abort\")\r\n * [displayStack](#displayStackslice \"displayStack\")\r\n * [callStack](#callStackslice \"callStack\")\r\n * [toss](#tosscondition \"toss\")\r\n* [Load files](#load-files \"Load Files\")\r\n * [loadPackage](#loadPackagedir \"loadpackage\")\r\n * [loadDirModules](#loadDirModulespath-excludefiles-target \"loaddirmodules\")\r\n\r\n\r\n\r\n# Introduction\r\n\r\nThe *Hoek* general purpose node utilities library is used to aid in a variety of manners. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. \r\n\r\nFor example, to use Hoek to set configuration with default options:\r\n```javascript\r\nvar Hoek = require('hoek');\r\n\r\nvar default = {url : \"www.github.com\", port : \"8000\", debug : true}\r\n\r\nvar config = Hoek.applyToDefaults(default, {port : \"3000\", admin : true});\r\n\r\n// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\r\n```\r\n\r\nUnder each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the var Hoek = require('hoek') is omitted for brevity.\r\n\r\n## Object\r\n\r\nHoek provides several helpful methods for objects and arrays.\r\n\r\n### clone(obj)\r\n\r\nThis method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). \r\n\r\n```javascript\r\n\r\nvar nestedObj = {\r\n w: /^something$/ig,\r\n x: {\r\n a: [1, 2, 3],\r\n b: 123456,\r\n c: new Date()\r\n },\r\n y: 'y',\r\n z: new Date()\r\n };\r\n\r\nvar copy = Hoek.clone(nestedObj);\r\n\r\ncopy.x.b = 100;\r\n\r\nconsole.log(copy.y) // results in 'y'\r\nconsole.log(nestedObj.x.b) // results in 123456\r\nconsole.log(copy.x.b) // results in 100\r\n```\r\n\r\n### merge(target, source, isNullOverride, isMergeArrays)\r\nisNullOverride, isMergeArrays default to true\r\n\r\nMerge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r\n\r\n\r\n```javascript\r\n\r\nvar target = {a: 1, b : 2}\r\nvar source = {a: 0, c: 5}\r\nvar source2 = {a: null, c: 5}\r\n\r\nvar targetArray = [1, 2, 3];\r\nvar sourceArray = [4, 5];\r\n\r\nvar newTarget = Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\r\n\r\nnewTarget = Hoek.merge(targetArray, sourceArray) // results in [1, 2, 3, 4, 5]\r\nnewTarget = Hoek.merge(targetArray, sourceArray, true, false) // results in [4, 5]\r\n\r\n\r\n\r\n\r\n```\r\n\r\n### applyToDefaults(defaults, options)\r\n\r\nApply options to a copy of the defaults\r\n\r\n```javascript\r\n\r\nvar defaults = {host: \"localhost\", port: 8000};\r\nvar options = {port: 8080};\r\n\r\nvar config = Hoek.applyToDefaults(defaults, options); // results in {host: \"localhost\", port: 8080};\r\n\r\n\r\n```\r\n\r\n### unique(array, key)\r\n\r\nRemove duplicate items from Array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 2, 3, 3, 4, 5, 6];\r\n\r\nvar newArray = Hoek.unique(array); // results in [1,2,3,4,5,6];\r\n\r\narray = [{id: 1}, {id: 1}, {id: 2}];\r\n\r\nnewArray = Hoek.unique(array, \"id\") // results in [{id: 1}, {id: 2}]\r\n\r\n```\r\n\r\n### mapToObject(array, key)\r\n\r\nConvert an Array into an Object\r\n\r\n```javascript\r\n\r\nvar array = [1,2,3];\r\nvar newObject = Hoek.mapToObject(array); // results in [{\"1\": true}, {\"2\": true}, {\"3\": true}]\r\n\r\narray = [{id: 1}, {id: 2}];\r\nnewObject = Hoek.mapToObject(array, \"id\") // results in [{\"id\": 1}, {\"id\": 2}]\r\n\r\n```\r\n### intersect(array1, array2)\r\n\r\nFind the common unique items in two arrays\r\n\r\n```javascript\r\n\r\nvar array1 = [1, 2, 3];\r\nvar array2 = [1, 4, 5];\r\n\r\nvar newArray = Hoek.intersect(array1, array2) // results in [1]\r\n\r\n```\r\n\r\n### matchKeys(obj, keys) \r\n\r\nFind which keys are present\r\n\r\n```javascript\r\n\r\nvar obj = {a: 1, b: 2, c: 3};\r\nvar keys = [\"a\", \"e\"];\r\n\r\nHoek.matchKeys(obj, keys) // returns [\"a\"]\r\n\r\n```\r\n\r\n### flatten(array, target)\r\n\r\nFlatten an array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 3];\r\nvar target = [4, 5]; \r\n\r\nvar flattenedArray = Hoek.flatten(array, target) // results in [4, 5, 1, 2, 3];\r\n\r\n```\r\n\r\n### removeKeys(object, keys)\r\n\r\nRemove keys\r\n\r\n```javascript\r\n\r\nvar object = {a: 1, b: 2, c: 3, d: 4};\r\n\r\nvar keys = [\"a\", \"b\"];\r\n\r\nHoek.removeKeys(object, keys) // object is now {c: 3, d: 4}\r\n\r\n```\r\n\r\n### reach(obj, chain)\r\n\r\nConverts an object key chain string to reference\r\n\r\n```javascript\r\n\r\nvar chain = 'a.b.c';\r\nvar obj = {a : {b : { c : 1}}};\r\n\r\nHoek.reach(obj, chain) // returns 1\r\n\r\n```\r\n\r\n### inheritAsync(self, obj, keys) \r\n\r\nInherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r\n\r\n```javascript\r\n\r\nvar targetFunc = function () { };\r\n\r\nvar proto = {\r\n a: function () {\r\n return 'a!';\r\n },\r\n b: function () {\r\n return 'b!';\r\n },\r\n c: function () {\r\n throw new Error('c!');\r\n }\r\n };\r\n\r\nvar keys = ['a', 'c'];\r\n\r\nHoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r\n\r\nvar target = new targetFunc();\r\n\r\ntarget.a(function(err, result){console.log(result)} // returns 'a!' \r\n\r\ntarget.c(function(err, result){console.log(result)} // returns undefined\r\n\r\ntarget.b(function(err, result){console.log(result)} // gives error: Object [object Object] has no method 'b'\r\n\r\n```\r\n\r\n### rename(obj, from, to)\r\n\r\nRename a key of an object\r\n\r\n```javascript\r\n\r\nvar obj = {a : 1, b : 2};\r\n\r\nHoek.rename(obj, \"a\", \"c\"); // obj is now {c : 1, b : 2}\r\n\r\n```\r\n\r\n\r\n# Timer\r\n\r\nA Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\r\n\r\n```javascript\r\n\r\n\r\nexample : \r\n\r\n\r\nvar timerObj = new Hoek.Timer();\r\nconsole.log(\"Time is now: \" + timerObj.ts)\r\nconsole.log(\"Elapsed time from initialization: \" + timerObj.elapsed() + 'milliseconds')\r\n\r\n```\r\n\r\n# Binary Encoding/Decoding\r\n\r\n### base64urlEncode(value)\r\n\r\nEncodes value in Base64 or URL encoding\r\n\r\n### base64urlDecode(value)\r\n\r\nDecodes data in Base64 or URL encoding.\r\n# Escaping Characters\r\n\r\nHoek provides convenient methods for escaping html characters. The escaped characters are as followed:\r\n\r\n```javascript\r\n\r\ninternals.htmlEscaped = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '`': '`'\r\n};\r\n\r\n```\r\n\r\n### escapeHtml(string)\r\n\r\n```javascript\r\n\r\nvar string = '<html> hey </html>';\r\nvar escapedString = Hoek.escapeHtml(string); // returns <html> hey </html>\r\n\r\n```\r\n\r\n### escapeHeaderAttribute(attribute)\r\n\r\nEscape attribute value for use in HTTP header\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeHeaderAttribute('I said \"go w\\\\o me\"'); //returns I said \\\"go w\\\\o me\\\"\r\n\r\n\r\n```\r\n\r\n\r\n### escapeRegex(string)\r\n\r\nEscape string for Regex construction\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\\\/`\"(>)[<]d{}s,'); // returns 4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`\"\\(>\\)\\[<\\]d\\{\\}s\\,\r\n\r\n\r\n\r\n```\r\n\r\n# Errors\r\n\r\n### assert(message)\r\n\r\n```javascript\r\n\r\nvar a = 1, b =2;\r\n\r\nHoek.assert(a === b, 'a should equal b'); // ABORT: a should equal b\r\n\r\n```\r\n\r\n### abort(message)\r\n\r\nFirst checks if process.env.NODE_ENV === 'test', and if so, throws error message. Otherwise,\r\ndisplays most recent stack and then exits process.\r\n\r\n\r\n\r\n### displayStack(slice)\r\n\r\nDisplays the trace stack\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.displayStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\r\n 'Module._compile (module.js:449:26)',\r\n 'Module._extensions..js (module.js:467:10)',\r\n 'Module.load (module.js:356:32)',\r\n 'Module._load (module.js:312:12)',\r\n 'Module.runMain (module.js:492:10)',\r\n 'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\r\n\r\n```\r\n\r\n### callStack(slice)\r\n\r\nReturns a trace stack array.\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.callStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\r\n [ 'module.js', 449, 26, 'Module._compile', false ],\r\n [ 'module.js', 467, 10, 'Module._extensions..js', false ],\r\n [ 'module.js', 356, 32, 'Module.load', false ],\r\n [ 'module.js', 312, 12, 'Module._load', false ],\r\n [ 'module.js', 492, 10, 'Module.runMain', false ],\r\n [ 'node.js',\r\n 244,\r\n 9,\r\n 'startup.processNextTick.process._tickCallback',\r\n false ] ]\r\n\r\n\r\n```\r\n\r\n### toss(condition)\r\n\r\ntoss(condition /*, [message], callback */)\r\n\r\nReturn an error as first argument of a callback\r\n\r\n\r\n# Load Files\r\n\r\n### loadPackage(dir)\r\n\r\nLoad and parse package.json process root or given directory\r\n\r\n```javascript\r\n\r\nvar pack = Hoek.loadPackage(); // pack.name === 'hoek'\r\n\r\n```\r\n\r\n### loadDirModules(path, excludeFiles, target) \r\n\r\nLoads modules from a given path; option to exclude files (array).\r\n\r\n\r\n\r\n\r\n",
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/hawk/node_modules/hoek/README.md:[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
./node_modules/bower/node_modules/update-notifier/node_modules/request/node_modules/hawk/node_modules/hoek/README.md:[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
./node_modules/bower/node_modules/update-notifier/node_modules/request/README.md: , url = 'https://api.twitter.com/1/users/show.json?'
./node_modules/bower/node_modules/update-notifier/readme.md:Inform your package users of updates in a non-intrusive way. Mainly targets global CLI apps.
./node_modules/bower/node_modules/update-notifier/readme.md:Users of your module have the ability to opt-out of the update notifier by changing the `optOut` property to `true` in `~/.config/configstore/update-notifier-[your-module-name].yml`. The path is available in `notifier.config.path`.
./node_modules/bower/node_modules/nopt/package.json: "readme": "If you want to write an option parser, and have it be good, there are\ntwo ways to do it. The Right Way, and the Wrong Way.\n\nThe Wrong Way is to sit down and write an option parser. We've all done\nthat.\n\nThe Right Way is to write some complex configurable program with so many\noptions that you go half-insane just trying to manage them all, and put\nit off with duct-tape solutions until you see exactly to the core of the\nproblem, and finally snap and write an awesome option parser.\n\nIf you want to write an option parser, don't write an option parser.\nWrite a package manager, or a source control system, or a service\nrestarter, or an operating system. You probably won't end up with a\ngood one of those, but if you don't give up, and you are relentless and\ndiligent enough in your procrastination, you may just end up with a very\nnice option parser.\n\n## USAGE\n\n // my-program.js\n var nopt = require(\"nopt\")\n , Stream = require(\"stream\").Stream\n , path = require(\"path\")\n , knownOpts = { \"foo\" : [String, null]\n , \"bar\" : [Stream, Number]\n , \"baz\" : path\n , \"bloo\" : [ \"big\", \"medium\", \"small\" ]\n , \"flag\" : Boolean\n , \"pick\" : Boolean\n , \"many\" : [String, Array]\n }\n , shortHands = { \"foofoo\" : [\"--foo\", \"Mr. Foo\"]\n , \"b7\" : [\"--bar\", \"7\"]\n , \"m\" : [\"--bloo\", \"medium\"]\n , \"p\" : [\"--pick\"]\n , \"f\" : [\"--flag\"]\n }\n // everything is optional.\n // knownOpts and shorthands default to {}\n // arg list defaults to process.argv\n // slice defaults to 2\n , parsed = nopt(knownOpts, shortHands, process.argv, 2)\n console.log(parsed)\n\nThis would give you support for any of the following:\n\n```bash\n$ node my-program.js --foo \"blerp\" --no-flag\n{ \"foo\" : \"blerp\", \"flag\" : false }\n\n$ node my-program.js ---bar 7 --foo \"Mr. Hand\" --flag\n{ bar: 7, foo: \"Mr. Hand\", flag: true }\n\n$ node my-program.js --foo \"blerp\" -f -----p\n{ foo: \"blerp\", flag: true, pick: true }\n\n$ node my-program.js -fp --foofoo\n{ foo: \"Mr. Foo\", flag: true, pick: true }\n\n$ node my-program.js --foofoo -- -fp # -- stops the flag parsing.\n{ foo: \"Mr. Foo\", argv: { remain: [\"-fp\"] } }\n\n$ node my-program.js --blatzk 1000 -fp # unknown opts are ok.\n{ blatzk: 1000, flag: true, pick: true }\n\n$ node my-program.js --blatzk true -fp # but they need a value\n{ blatzk: true, flag: true, pick: true }\n\n$ node my-program.js --no-blatzk -fp # unless they start with \"no-\"\n{ blatzk: false, flag: true, pick: true }\n\n$ node my-program.js --baz b/a/z # known paths are resolved.\n{ baz: \"/Users/isaacs/b/a/z\" }\n\n# if Array is one of the types, then it can take many\n# values, and will always be an array. The other types provided\n# specify what types are allowed in the list.\n\n$ node my-program.js --many 1 --many null --many foo\n{ many: [\"1\", \"null\", \"foo\"] }\n\n$ node my-program.js --many foo\n{ many: [\"foo\"] }\n```\n\nRead the tests at the bottom of `lib/nopt.js` for more examples of\nwhat this puppy can do.\n\n## Types\n\nThe following types are supported, and defined on `nopt.typeDefs`\n\n* String: A normal string. No parsing is done.\n* path: A file system path. Gets resolved against cwd if not absolute.\n* url: A url. If it doesn't parse, it isn't accepted.\n* Number: Must be numeric.\n* Date: Must parse as a date. If it does, and `Date` is one of the options,\n then it will return a Date object, not a string.\n* Boolean: Must be either `true` or `false`. If an option is a boolean,\n then it does not need a value, and its presence will imply `true` as\n the value. To negate boolean flags, do `--no-whatever` or `--whatever\n false`\n* NaN: Means that the option is strictly not allowed. Any value will\n fail.\n* Stream: An object matching the \"Stream\" class in node. Valuable\n for use when validating programmatically. (npm uses this to let you\n supply any WriteStream on the `outfd` and `logfd` config options.)\n* Array: If `Array` is specified as one of the types, then the value\n will be parsed as a list of options. This means that multiple values\n can be specified, and that the value will always be an array.\n\nIf a type is an array of values not on this list, then those are\nconsidered valid values. For instance, in the example above, the\n`--bloo` option can only be one of `\"big\"`, `\"medium\"`, or `\"small\"`,\nand any other value will be rejected.\n\nWhen parsing unknown fields, `\"true\"`, `\"false\"`, and `\"null\"` will be\ninterpreted as their JavaScript equivalents, and numeric values will be\ninterpreted as a number.\n\nYou can also mix types and values, or multiple types, in a list. For\ninstance `{ blah: [Number, null] }` would allow a value to be set to\neither a Number or null. When types are ordered, this implies a\npreference, and the first type that can be used to properly interpret\nthe value will be used.\n\nTo define a new type, add it to `nopt.typeDefs`. Each item in that\nhash is an object with a `type` member and a `validate` method. The\n`type` member is an object that matches what goes in the type list. The\n`validate` method is a function that gets called with `validate(data,\nkey, val)`. Validate methods should assign `data[key]` to the valid\nvalue of `val` if it can be handled properly, or return boolean\n`false` if it cannot.\n\nYou can also call `nopt.clean(data, types, typeDefs)` to clean up a\nconfig object and remove its invalid properties.\n\n## Error Handling\n\nBy default, nopt outputs a warning to standard error when invalid\noptions are found. You can change this behavior by assigning a method\nto `nopt.invalidHandler`. This method will be called with\nthe offending `nopt.invalidHandler(key, val, types)`.\n\nIf no `nopt.invalidHandler` is assigned, then it will console.error\nits whining. If it is assigned to boolean `false` then the warning is\nsuppressed.\n\n## Abbreviations\n\nYes, they are supported. If you define options like this:\n\n```javascript\n{ \"foolhardyelephants\" : Boolean\n, \"pileofmonkeys\" : Boolean }\n```\n\nThen this will work:\n\n```bash\nnode program.js --foolhar --pil\nnode program.js --no-f --pileofmon\n# etc.\n```\n\n## Shorthands\n\nShorthands are a hash of shorter option names to a snippet of args that\nthey expand to.\n\nIf multiple one-character shorthands are all combined, and the\ncombination does not unambiguously match any other option or shorthand,\nthen they will be broken up into their constituent parts. For example:\n\n```json\n{ \"s\" : [\"--loglevel\", \"silent\"]\n, \"g\" : \"--global\"\n, \"f\" : \"--force\"\n, \"p\" : \"--parseable\"\n, \"l\" : \"--long\"\n}\n```\n\n```bash\nnpm ls -sgflp\n# just like doing this:\nnpm ls --loglevel silent --global --force --long --parseable\n```\n\n## The Rest of the args\n\nThe config object returned by nopt is given a special member called\n`argv`, which is an object with the following fields:\n\n* `remain`: The remaining args after all the parsing has occurred.\n* `original`: The args as they originally appeared.\n* `cooked`: The args after flags and shorthands are expanded.\n\n## Slicing\n\nNode programs are called with more or less the exact argv as it appears\nin C land, after the v8 and node-specific options have been plucked off.\nAs such, `argv[0]` is always `node` and `argv[1]` is always the\nJavaScript program being run.\n\nThat's usually not very useful to you. So they're sliced off by\ndefault. If you want them, then you can pass in `0` as the last\nargument, or any other number that you'd like to slice off the start of\nthe list.\n",
./node_modules/bower/node_modules/nopt/README.md:{ baz: "/Users/isaacs/b/a/z" }
./node_modules/bower/node_modules/q/package.json: "readme": "[![Build Status](https://secure.travis-ci.org/kriskowal/q.png?branch=master)](http://travis-ci.org/kriskowal/q)\n\n<a href=\"http://promises-aplus.github.com/promises-spec\">\n <img src=\"http://promises-aplus.github.com/promises-spec/assets/logo-small.png\"\n align=\"right\" alt=\"Promises/A+ logo\" />\n</a>\n\nIf a function cannot return a value or throw an exception without\nblocking, it can return a promise instead. A promise is an object\nthat represents the return value or the thrown exception that the\nfunction may eventually provide. A promise can also be used as a\nproxy for a [remote object][Q-Connection] to overcome latency.\n\n[Q-Connection]: https://github.com/kriskowal/q-connection\n\nOn the first pass, promises can mitigate the “[Pyramid of\nDoom][POD]”: the situation where code marches to the right faster\nthan it marches forward.\n\n[POD]: http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/\n\n```javascript\nstep1(function (value1) {\n step2(value1, function(value2) {\n step3(value2, function(value3) {\n step4(value3, function(value4) {\n // Do something with value4\n });\n });\n });\n});\n```\n\nWith a promise library, you can flatten the pyramid.\n\n```javascript\nQ.fcall(promisedStep1)\n.then(promisedStep2)\n.then(promisedStep3)\n.then(promisedStep4)\n.then(function (value4) {\n // Do something with value4\n})\n.catch(function (error) {\n // Handle any error from all above steps\n})\n.done();\n```\n\nWith this approach, you also get implicit error propagation, just like `try`,\n`catch`, and `finally`. An error in `promisedStep1` will flow all the way to\nthe `catch` function, where it’s caught and handled. (Here `promisedStepN` is\na version of `stepN` that returns a promise.)\n\nThe callback approach is called an “inversion of control”.\nA function that accepts a callback instead of a return value\nis saying, “Don’t call me, I’ll call you.”. Promises\n[un-invert][IOC] the inversion, cleanly separating the input\narguments from control flow arguments. This simplifies the\nuse and creation of API’s, particularly variadic,\nrest and spread arguments.\n\n[IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript\n\n\n## Getting Started\n\nThe Q module can be loaded as:\n\n- A ``<script>`` tag (creating a ``Q`` global variable): ~2.5 KB minified and\n gzipped.\n- A Node.js and CommonJS module, available in [npm](https://npmjs.org/) as\n the [q](https://npmjs.org/package/q) package\n- An AMD module\n- A [component](https://github.com/component/component) as ``microjs/q``\n- Using [bower](http://bower.io/) as ``q``\n- Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)\n\nQ can exchange promises with jQuery, Dojo, When.js, WinJS, and more.\n\n## Resources\n\nOur [wiki][] contains a number of useful resources, including:\n\n- A method-by-method [Q API reference][reference].\n- A growing [examples gallery][examples], showing how Q can be used to make\n everything better. From XHR to database access to accessing the Flickr API,\n Q is there for you.\n- There are many libraries that produce and consume Q promises for everything\n from file system/database access or RPC to templating. For a list of some of\n the more popular ones, see [Libraries][].\n- If you want materials that introduce the promise concept generally, and the\n below tutorial isn't doing it for you, check out our collection of\n [presentations, blog posts, and podcasts][resources].\n- A guide for those [coming from jQuery's `$.Deferred`][jquery].\n\nWe'd also love to have you join the Q-Continuum [mailing list][].\n\n[wiki]: https://github.com/kriskowal/q/wiki\n[reference]: https://github.com/kriskowal/q/wiki/API-Reference\n[examples]: https://github.com/kriskowal/q/wiki/Examples-Gallery\n[Libraries]: https://github.com/kriskowal/q/wiki/Libraries\n[resources]: https://github.com/kriskowal/q/wiki/General-Promise-Resources\n[jquery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery\n[mailing list]: https://groups.google.com/forum/#!forum/q-continuum\n\n\n## Tutorial\n\nPromises have a ``then`` method, which you can use to get the eventual\nreturn value (fulfillment) or thrown exception (rejection).\n\n```javascript\npromiseMeSomething()\n.then(function (value) {\n}, function (reason) {\n});\n```\n\nIf ``promiseMeSomething`` returns a promise that gets fulfilled later\nwith a return value, the first function (the fulfillment handler) will be\ncalled with the value. However, if the ``promiseMeSomething`` function\ngets rejected later by a thrown exception, the second function (the\nrejection handler) will be called with the exception.\n\nNote that resolution of a promise is always asynchronous: that is, the\nfulfillment or rejection handler will always be called in the next turn of the\nevent loop (i.e. `process.nextTick` in Node). This gives you a nice\nguarantee when mentally tracing the flow of your code, namely that\n``then`` will always return before either handler is executed.\n\nIn this tutorial, we begin with how to consume and work with promises. We'll\ntalk about how to create them, and thus create functions like\n`promiseMeSomething` that return promises, [below](#the-beginning).\n\n\n### Propagation\n\nThe ``then`` method returns a promise, which in this example, I’m\nassigning to ``outputPromise``.\n\n```javascript\nvar outputPromise = getInputPromise()\n.then(function (input) {\n}, function (reason) {\n});\n```\n\nThe ``outputPromise`` variable becomes a new promise for the return\nvalue of either handler. Since a function can only either return a\nvalue or throw an exception, only one handler will ever be called and it\nwill be responsible for resolving ``outputPromise``.\n\n- If you return a value in a handler, ``outputPromise`` will get\n fulfilled.\n\n- If you throw an exception in a handler, ``outputPromise`` will get\n rejected.\n\n- If you return a **promise** in a handler, ``outputPromise`` will\n “become” that promise. Being able to become a new promise is useful\n for managing delays, combining results, or recovering from errors.\n\nIf the ``getInputPromise()`` promise gets rejected and you omit the\nrejection handler, the **error** will go to ``outputPromise``:\n\n```javascript\nvar outputPromise = getInputPromise()\n.then(function (value) {\n});\n```\n\nIf the input promise gets fulfilled and you omit the fulfillment handler, the\n**value** will go to ``outputPromise``:\n\n```javascript\nvar outputPromise = getInputPromise()\n.then(null, function (error) {\n});\n```\n\nQ promises provide a ``fail`` shorthand for ``then`` when you are only\ninterested in handling the error:\n\n```javascript\nvar outputPromise = getInputPromise()\n.fail(function (error) {\n});\n```\n\nIf you are writing JavaScript for modern engines only or using\nCoffeeScript, you may use `catch` instead of `fail`.\n\nPromises also have a ``fin`` function that is like a ``finally`` clause.\nThe final handler gets called, with no arguments, when the promise\nreturned by ``getInputPromise()`` either returns a value or throws an\nerror. The value returned or error thrown by ``getInputPromise()``\npasses directly to ``outputPromise`` unless the final handler fails, and\nmay be delayed if the final handler returns a promise.\n\n```javascript\nvar outputPromise = getInputPromise()\n.fin(function () {\n // close files, database connections, stop servers, conclude tests\n});\n```\n\n- If the handler returns a value, the value is ignored\n- If the handler throws an error, the error passes to ``outputPromise``\n- If the handler returns a promise, ``outputPromise`` gets postponed. The\n eventual value or error has the same effect as an immediate return\n value or thrown error: a value would be ignored, an error would be\n forwarded.\n\nIf you are writing JavaScript for modern engines only or using\nCoffeeScript, you may use `finally` instead of `fin`.\n\n### Chaining\n\nThere are two ways to chain promises. You can chain promises either\ninside or outside handlers. The next two examples are equivalent.\n\n```javascript\nreturn getUsername()\n.then(function (username) {\n return getUser(username)\n .then(function (user) {\n // if we get here without an error,\n // the value returned here\n // or the exception thrown here\n // resolves the promise returned\n // by the first line\n })\n});\n```\n\n```javascript\nreturn getUsername()\n.then(function (username) {\n return getUser(username);\n})\n.then(function (user) {\n // if we get here without an error,\n // the value returned here\n // or the exception thrown here\n // resolves the promise returned\n // by the first line\n});\n```\n\nThe only difference is nesting. It’s useful to nest handlers if you\nneed to capture multiple input values in your closure.\n\n```javascript\nfunction authenticate() {\n return getUsername()\n .then(function (username) {\n return getUser(username);\n })\n // chained because we will not need the user name in the next event\n .then(function (user) {\n return getPassword()\n // nested because we need both user and password next\n .then(function (password) {\n if (user.passwordHash !== hash(password)) {\n throw new Error(\"Can't authenticate\");\n }\n });\n });\n}\n```\n\n\n### Combination\n\nYou can turn an array of promises into a promise for the whole,\nfulfilled array using ``all``.\n\n```javascript\nreturn Q.all([\n eventualAdd(2, 2),\n eventualAdd(10, 20)\n]);\n```\n\nIf you have a promise for an array, you can use ``spread`` as a\nreplacement for ``then``. The ``spread`` function “spreads” the\nvalues over the arguments of the fulfillment handler. The rejection handler\nwill get called at the first sign of failure. That is, whichever of\nthe recived promises fails first gets handled by the rejection handler.\n\n```javascript\nfunction eventualAdd(a, b) {\n return Q.spread([a, b], function (a, b) {\n return a + b;\n })\n}\n```\n\nBut ``spread`` calls ``all`` initially, so you can skip it in chains.\n\n```javascript\nreturn getUsername()\n.then(function (username) {\n return [username, getUser(username)];\n})\n.spread(function (username, user) {\n});\n```\n\nThe ``all`` function returns a promise for an array of values. When this\npromise is fulfilled, the array contains the fulfillment values of the original\npromises, in the same order as those promises. If one of the given promises\nis rejected, the returned promise is immediately rejected, not waiting for the\nrest of the batch. If you want to wait for all of the promises to either be\nfulfilled or rejected, you can use ``allSettled``.\n\n```javascript\nQ.allSettled(promises)\n.then(function (results) {\n results.forEach(function (result) {\n if (result.state === \"fulfilled\") {\n var value = result.value;\n } else {\n var reason = result.reason;\n }\n });\n});\n```\n\n\n### Sequences\n\nIf you have a number of promise-producing functions that need\nto be run sequentially, you can of course do so manually:\n\n```javascript\nreturn foo(initialVal).then(bar).then(baz).then(qux);\n```\n\nHowever, if you want to run a dynamically constructed sequence of\nfunctions, you'll want something like this:\n\n```javascript\nvar funcs = [foo, bar, baz, qux];\n\nvar result = Q(initialVal);\nfuncs.forEach(function (f) {\n result = result.then(f);\n});\nreturn result;\n```\n\nYou can make this slightly more compact using `reduce`:\n\n```javascript\nreturn funcs.reduce(function (soFar, f) {\n return soFar.then(f);\n}, Q(initialVal));\n```\n\nOr, you could use th ultra-compact version:\n\n```javascript\nreturn funcs.reduce(Q.when, Q());\n```\n\n### Handling Errors\n\nOne sometimes-unintuive aspect of promises is that if you throw an\nexception in the fulfillment handler, it will not be be caught by the error\nhandler.\n\n```javascript\nreturn foo()\n.then(function (value) {\n throw new Error(\"Can't bar.\");\n}, function (error) {\n // We only get here if \"foo\" fails\n});\n```\n\nTo see why this is, consider the parallel between promises and\n``try``/``catch``. We are ``try``-ing to execute ``foo()``: the error\nhandler represents a ``catch`` for ``foo()``, while the fulfillment handler\nrepresents code that happens *after* the ``try``/``catch`` block.\nThat code then needs its own ``try``/``catch`` block.\n\nIn terms of promises, this means chaining your rejection handler:\n\n```javascript\nreturn foo()\n.then(function (value) {\n throw new Error(\"Can't bar.\");\n})\n.fail(function (error) {\n // We get here with either foo's error or bar's error\n});\n```\n\n### Progress Notification\n\nIt's possible for promises to report their progress, e.g. for tasks that take a\nlong time like a file upload. Not all promises will implement progress\nnotifications, but for those that do, you can consume the progress values using\na third parameter to ``then``:\n\n```javascript\nreturn uploadFile()\n.then(function () {\n // Success uploading the file\n}, function (err) {\n // There was an error, and we get the reason for error\n}, function (progress) {\n // We get notified of the upload's progress as it is executed\n});\n```\n\nLike `fail`, Q also provides a shorthand for progress callbacks\ncalled `progress`:\n\n```javascript\nreturn uploadFile().progress(function (progress) {\n // We get notified of the upload's progress\n});\n```\n\n### The End\n\nWhen you get to the end of a chain of promises, you should either\nreturn the last promise or end the chain. Since handlers catch\nerrors, it’s an unfortunate pattern that the exceptions can go\nunobserved.\n\nSo, either return it,\n\n```javascript\nreturn foo()\n.then(function () {\n return \"bar\";\n});\n```\n\nOr, end it.\n\n```javascript\nfoo()\n.then(function () {\n return \"bar\";\n})\n.done();\n```\n\nEnding a promise chain makes sure that, if an error doesn’t get\nhandled before the end, it will get rethrown and reported.\n\nThis is a stopgap. We are exploring ways to make unhandled errors\nvisible without any explicit handling.\n\n\n### The Beginning\n\nEverything above assumes you get a promise from somewhere else. This\nis the common case. Every once in a while, you will need to create a\npromise from scratch.\n\n#### Using ``Q.fcall``\n\nYou can create a promise from a value using ``Q.fcall``. This returns a\npromise for 10.\n\n```javascript\nreturn Q.fcall(function () {\n return 10;\n});\n```\n\nYou can also use ``fcall`` to get a promise for an exception.\n\n```javascript\nreturn Q.fcall(function () {\n throw new Error(\"Can't do it\");\n});\n```\n\nAs the name implies, ``fcall`` can call functions, or even promised\nfunctions. This uses the ``eventualAdd`` function above to add two\nnumbers.\n\n```javascript\nreturn Q.fcall(eventualAdd, 2, 2);\n```\n\n\n#### Using Deferreds\n\nIf you have to interface with asynchronous functions that are callback-based\ninstead of promise-based, Q provides a few shortcuts (like ``Q.nfcall`` and\nfriends). But much of the time, the solution will be to use *deferreds*.\n\n```javascript\nvar deferred = Q.defer();\nFS.readFile(\"foo.txt\", \"utf-8\", function (error, text) {\n if (error) {\n deferred.reject(new Error(error));\n } else {\n deferred.resolve(text);\n }\n});\nreturn deferred.promise;\n```\n\nNote that a deferred can be resolved with a value or a promise. The\n``reject`` function is a shorthand for resolving with a rejected\npromise.\n\n```javascript\n// this:\ndeferred.reject(new Error(\"Can't do it\"));\n\n// is shorthand for:\nvar rejection = Q.fcall(function () {\n throw new Error(\"Can't do it\");\n});\ndeferred.resolve(rejection);\n```\n\nThis is a simplified implementation of ``Q.delay``.\n\n```javascript\nfunction delay(ms) {\n var deferred = Q.defer();\n setTimeout(deferred.resolve, ms);\n return deferred.promise;\n}\n```\n\nThis is a simplified implementation of ``Q.timeout``\n\n```javascript\nfunction timeout(promise, ms) {\n var deferred = Q.defer();\n Q.when(promise, deferred.resolve);\n delay(ms).then(function () {\n deferred.reject(new Error(\"Timed out\"));\n });\n return deferred.promise;\n}\n```\n\nFinally, you can send a progress notification to the promise with\n``deferred.notify``.\n\nFor illustration, this is a wrapper for XML HTTP requests in the browser. Note\nthat a more [thorough][XHR] implementation would be in order in practice.\n\n[XHR]: https://github.com/montagejs/mr/blob/71e8df99bb4f0584985accd6f2801ef3015b9763/browser.js#L29-L73\n\n```javascript\nfunction requestOkText(url) {\n var request = new XMLHttpRequest();\n var deferred = Q.defer();\n\n request.open(\"GET\", url, true);\n request.onload = onload;\n request.onerror = onerror;\n request.onprogress = onprogress;\n request.send();\n\n function onload() {\n if (request.status === 200) {\n deferred.resolve(request.responseText);\n } else {\n deferred.reject(new Error(\"Status code was \" + request.status));\n }\n }\n\n function onerror() {\n deferred.reject(new Error(\"Can't XHR \" + JSON.stringify(url)));\n }\n\n function onprogress(event) {\n deferred.notify(event.loaded / event.total);\n }\n\n return deferred.promise;\n}\n```\n\nBelow is an example of how to use this ``requestOkText`` function:\n\n```javascript\nrequestOkText(\"http://localhost:3000\")\n.then(function (responseText) {\n // If the HTTP response returns 200 OK, log the response text.\n console.log(responseText);\n}, function (error) {\n // If there's an error or a non-200 status code, log the error.\n console.error(error);\n}, function (progress) {\n // Log the progress as it comes in.\n console.log(\"Request progress: \" + Math.round(progress * 100) + \"%\");\n});\n```\n\n### The Middle\n\nIf you are using a function that may return a promise, but just might\nreturn a value if it doesn’t need to defer, you can use the “static”\nmethods of the Q library.\n\nThe ``when`` function is the static equivalent for ``then``.\n\n```javascript\nreturn Q.when(valueOrPromise, function (value) {\n}, function (error) {\n});\n```\n\nAll of the other methods on a promise have static analogs with the\nsame name.\n\nThe following are equivalent:\n\n```javascript\nreturn Q.all([a, b]);\n```\n\n```javascript\nreturn Q.fcall(function () {\n return [a, b];\n})\n.all();\n```\n\nWhen working with promises provided by other libraries, you should\nconvert it to a Q promise. Not all promise libraries make the same\nguarantees as Q and certainly don’t provide all of the same methods.\nMost libraries only provide a partially functional ``then`` method.\nThis thankfully is all we need to turn them into vibrant Q promises.\n\n```javascript\nreturn Q($.ajax(...))\n.then(function () {\n});\n```\n\nIf there is any chance that the promise you receive is not a Q promise\nas provided by your library, you should wrap it using a Q function.\nYou can even use ``Q.invoke`` as a shorthand.\n\n```javascript\nreturn Q.invoke($, 'ajax', ...)\n.then(function () {\n});\n```\n\n\n### Over the Wire\n\nA promise can serve as a proxy for another object, even a remote\nobject. There are methods that allow you to optimistically manipulate\nproperties or call functions. All of these interactions return\npromises, so they can be chained.\n\n```\ndirect manipulation using a promise as a proxy\n-------------------------- -------------------------------\nvalue.foo promise.get(\"foo\")\nvalue.foo = value promise.put(\"foo\", value)\ndelete value.foo promise.del(\"foo\")\nvalue.foo(...args) promise.post(\"foo\", [args])\nvalue.foo(...args) promise.invoke(\"foo\", ...args)\nvalue(...args) promise.fapply([args])\nvalue(...args) promise.fcall(...args)\n```\n\nIf the promise is a proxy for a remote object, you can shave\nround-trips by using these functions instead of ``then``. To take\nadvantage of promises for remote objects, check out [Q-Connection][].\n\n[Q-Connection]: https://github.com/kriskowal/q-connection\n\nEven in the case of non-remote objects, these methods can be used as\nshorthand for particularly-simple fulfillment handlers. For example, you\ncan replace\n\n```javascript\nreturn Q.fcall(function () {\n return [{ foo: \"bar\" }, { foo: \"baz\" }];\n})\n.then(function (value) {\n return value[0].foo;\n});\n```\n\nwith\n\n```javascript\nreturn Q.fcall(function () {\n return [{ foo: \"bar\" }, { foo: \"baz\" }];\n})\n.get(0)\n.get(\"foo\");\n```\n\n\n### Adapting Node\n\nIf you're working with functions that make use of the Node.js callback pattern,\nwhere callbacks are in the form of `function(err, result)`, Q provides a few\nuseful utility functions for converting between them. The most straightforward\nare probably `Q.nfcall` and `Q.nfapply` (\"Node function call/apply\") for calling\nNode.js-style functions and getting back a promise:\n\n```javascript\nreturn Q.nfcall(FS.readFile, \"foo.txt\", \"utf-8\");\nreturn Q.nfapply(FS.readFile, [\"foo.txt\", \"utf-8\"]);\n```\n\nIf you are working with methods, instead of simple functions, you can easily\nrun in to the usual problems where passing a method to another function—like\n`Q.nfcall`—\"un-binds\" the method from its owner. To avoid this, you can either\nuse `Function.prototype.bind` or some nice shortcut methods we provide:\n\n```javascript\nreturn Q.ninvoke(redisClient, \"get\", \"user:1:id\");\nreturn Q.npost(redisClient, \"get\", [\"user:1:id\"]);\n```\n\nYou can also create reusable wrappers with `Q.denodeify` or `Q.nbind`:\n\n```javascript\nvar readFile = Q.denodeify(FS.readFile);\nreturn readFile(\"foo.txt\", \"utf-8\");\n\nvar redisClientGet = Q.nbind(redisClient.get, redisClient);\nreturn redisClientGet(\"user:1:id\");\n```\n\nFinally, if you're working with raw deferred objects, there is a\n`makeNodeResolver` method on deferreds that can be handy:\n\n```javascript\nvar deferred = Q.defer();\nFS.readFile(\"foo.txt\", \"utf-8\", deferred.makeNodeResolver());\nreturn deferred.promise;\n```\n\n### Long Stack Traces\n\nQ comes with optional support for “long stack traces,” wherein the `stack`\nproperty of `Error` rejection reasons is rewritten to be traced along\nasynchronous jumps instead of stopping at the most recent one. As an example:\n\n```js\nfunction theDepthsOfMyProgram() {\n Q.delay(100).done(function explode() {\n throw new Error(\"boo!\");\n });\n}\n\ntheDepthsOfMyProgram();\n```\n\nusually would give a rather unhelpful stack trace looking something like\n\n```\nError: boo!\n at explode (/path/to/test.js:3:11)\n at _fulfilled (/path/to/test.js:q:54)\n at resolvedValue.promiseDispatch.done (/path/to/q.js:823:30)\n at makePromise.promise.promiseDispatch (/path/to/q.js:496:13)\n at pending (/path/to/q.js:397:39)\n at process.startup.processNextTick.process._tickCallback (node.js:244:9)\n```\n\nBut, if you turn this feature on by setting\n\n```js\nQ.longStackSupport = true;\n```\n\nthen the above code gives a nice stack trace to the tune of\n\n```\nError: boo!\n at explode (/path/to/test.js:3:11)\nFrom previous event:\n at theDepthsOfMyProgram (/path/to/test.js:2:16)\n at Object.<anonymous> (/path/to/test.js:7:1)\n```\n\nNote how you can see the the function that triggered the async operation in the\nstack trace! This is very helpful for debugging, as otherwise you end up getting\nonly the first line, plus a bunch of Q internals, with no sign of where the\noperation started.\n\nThis feature does come with somewhat-serious performance and memory overhead,\nhowever. If you're working with lots of promises, or trying to scale a server\nto many users, you should probably keep it off. But in development, go for it!\n\n## Tests\n\nYou can view the results of the Q test suite [in your browser][tests]!\n\n[tests]: https://rawgithub.com/kriskowal/q/master/spec/q-spec.html\n\n## License\n\nCopyright 2009–2013 Kristopher Michael Kowal\nMIT License (enclosed)\n\n",
./node_modules/bower/node_modules/q/README.md:to many users, you should probably keep it off. But in development, go for it!
./node_modules/bower/node_modules/bower-registry-client/node_modules/async/package.json: "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, each…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n\nasync.parallel([\n function(){ ... },\n function(){ ... }\n], callback);\n\nasync.series([\n function(){ ... },\n function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n squareExponent: 2,\n square: function(number, callback){ \n var result = Math.pow(number, this.squareExponent);\n setTimeout(function(){\n callback(null, result);\n }, 200);\n }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n // result is [NaN, NaN, NaN]\n // This fails because the `this.squareExponent` expression in the square\n // function is not evaluated in the context of AsyncSquaringLibrary, and is\n // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n // result is [1, 4, 9]\n // With the help of bind we can attach a context to the iterator before\n // passing it to async. Now the square function will be executed in its \n // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err) which must be called once it has \n completed. If no error has occured, the callback should be run without \n arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, transformed) which must be called once \n it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback(err, reduction) which accepts an optional error as its first \n argument, and the state of the reduction as the second. If an error is \n passed to the callback, the reduction is stopped and the main callback is \n immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n}, function(err, result){\n // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, sortValue) which must be called once it\n has completed with an error (which can be null) and a value to use as the sort\n criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n}, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback(truthValue) which must be called with a \n boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback(err, results) which must be called once it \n has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results){\n // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n }\n],\n// optional callback\nfunction(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n }\n},\nfunction(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n a callback(err, result) it must call on completion with an error (which can\n be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets a results array (or object) containing all \n the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback(err) which must be called once it has completed with an \n optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n callback(err, result1, result2, ...) it must call on completion. The first\n argument is an error (which can be null) and any further arguments will be \n passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n], function (err, result) {\n // result now equals 'done' \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n setTimeout(function () {\n callback(null, n + 1);\n }, 10);\n}\n\nfunction mul3(n, callback) {\n setTimeout(function () {\n callback(null, n * 3);\n }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n buckets,\n async.applyEach([enableSearch, updateSchema]),\n callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task, which must call its callback(err) argument when finished, with an \n optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n queued tasks, which must call its callback(err) argument when finished, with \n an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n process per round. This property can be changed after a cargo is created to\n alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n for(var i=0; i<tasks.length; i++){\n console.log('hello ' + tasks[i].name);\n }\n callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n readData: function(cb, results){\n fs.readFile('data.txt', 'utf-8', cb);\n }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The \n function receives two arguments: (1) a callback(err, result) which must be \n called when finished, passing an error (which can be null) and the result of \n the function's execution, and (2) a results object, containing the results of\n the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n \n\n__Example__\n\n```js\nasync.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n],\nfunction(err, results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n callback(null, {\n id: 'user' + id\n })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n createUser(n, function(err, user) {\n next(err, user)\n })\n}, function(err, users) {\n // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
./node_modules/bower/node_modules/bower-registry-client/node_modules/async/README.md:// generate 5 users
./node_modules/bower/node_modules/bower-registry-client/node_modules/async/README.md:}, function(err, users) {
./node_modules/bower/node_modules/bower-registry-client/node_modules/async/README.md: // we should now have 5 users
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/collection.md:var users = [
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/collection.md:pluck(users, 'name'); // ["John", "Jane"]
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/collection.md:pluck(users, 'age'); // [21, 27]
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/collection.md:users = {
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/collection.md:pluck(users, 'name'); // ['John', 'Mary']
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/function.md:var names = map(users, func('getName'));
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/function.md:var users = [{name:"John", age:21}, {name:"Jane", age:25}];
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/function.md:var names = map(users, prop('name'));
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [{name : 'John', age: 21}, {name: 'Jane', age : 27}];
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/array.md:var names = pluck(users, 'name'); // ["John", "Jane"]
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/array.md:var ages = pluck(users, 'age'); // [21, 27]
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/array.md:var users = [
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/object.md:var users = {
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/object.md:pluck(users, 'name'); // {first: 'John', second: 'Mary'} );
./node_modules/bower/node_modules/bower-registry-client/node_modules/bower-config/node_modules/mout/doc/object.md:pluck(users, 'age'); // {first: 21, second: 25} );
./node_modules/bower/node_modules/unzip/node_modules/readable-stream/fs.js: // users might have refernces to slices on it.
./node_modules/bower/node_modules/unzip/node_modules/readable-stream/package.json: "readme": "# readable-stream\n\nA new class of streams for Node.js\n\nThis module provides the new Stream base classes introduced in Node\nv0.10, for use in Node v0.8. You can use it to have programs that\nhave to work with node v0.8, while being forward-compatible for v0.10\nand beyond. When you drop support for v0.8, you can remove this\nmodule, and only use the native streams.\n\nThis is almost exactly the same codebase as appears in Node v0.10.\nHowever:\n\n1. The exported object is actually the Readable class. Decorating the\n native `stream` module would be global pollution.\n2. In v0.10, you can safely use `base64` as an argument to\n `setEncoding` in Readable streams. However, in v0.8, the\n StringDecoder class has no `end()` method, which is problematic for\n Base64. So, don't use that, because it'll break and be weird.\n\nOther than that, the API is the same as `require('stream')` in v0.10,\nso the API docs are reproduced below.\n\n----------\n\n Stability: 2 - Unstable\n\nA stream is an abstract interface implemented by various objects in\nNode. For example a request to an HTTP server is a stream, as is\nstdout. Streams are readable, writable, or both. All streams are\ninstances of [EventEmitter][]\n\nYou can load the Stream base classes by doing `require('stream')`.\nThere are base classes provided for Readable streams, Writable\nstreams, Duplex streams, and Transform streams.\n\n## Compatibility\n\nIn earlier versions of Node, the Readable stream interface was\nsimpler, but also less powerful and less useful.\n\n* Rather than waiting for you to call the `read()` method, `'data'`\n events would start emitting immediately. If you needed to do some\n I/O to decide how to handle data, then you had to store the chunks\n in some kind of buffer so that they would not be lost.\n* The `pause()` method was advisory, rather than guaranteed. This\n meant that you still had to be prepared to receive `'data'` events\n even when the stream was in a paused state.\n\nIn Node v0.10, the Readable class described below was added. For\nbackwards compatibility with older Node programs, Readable streams\nswitch into \"old mode\" when a `'data'` event handler is added, or when\nthe `pause()` or `resume()` methods are called. The effect is that,\neven if you are not using the new `read()` method and `'readable'`\nevent, you no longer have to worry about losing `'data'` chunks.\n\nMost programs will continue to function normally. However, this\nintroduces an edge case in the following conditions:\n\n* No `'data'` event handler is added.\n* The `pause()` and `resume()` methods are never called.\n\nFor example, consider the following code:\n\n```javascript\n// WARNING! BROKEN!\nnet.createServer(function(socket) {\n\n // we add an 'end' method, but never consume the data\n socket.on('end', function() {\n // It will never get here.\n socket.end('I got your message (but didnt read it)\\n');\n });\n\n}).listen(1337);\n```\n\nIn versions of node prior to v0.10, the incoming message data would be\nsimply discarded. However, in Node v0.10 and beyond, the socket will\nremain paused forever.\n\nThe workaround in this situation is to call the `resume()` method to\ntrigger \"old mode\" behavior:\n\n```javascript\n// Workaround\nnet.createServer(function(socket) {\n\n socket.on('end', function() {\n socket.end('I got your message (but didnt read it)\\n');\n });\n\n // start the flow of data, discarding it.\n socket.resume();\n\n}).listen(1337);\n```\n\nIn addition to new Readable streams switching into old-mode, pre-v0.10\nstyle streams can be wrapped in a Readable class using the `wrap()`\nmethod.\n\n## Class: stream.Readable\n\n<!--type=class-->\n\nA `Readable Stream` has the following methods, members, and events.\n\nNote that `stream.Readable` is an abstract class designed to be\nextended with an underlying implementation of the `_read(size)`\nmethod. (See below.)\n\n### new stream.Readable([options])\n\n* `options` {Object}\n * `highWaterMark` {Number} The maximum number of bytes to store in\n the internal buffer before ceasing to read from the underlying\n resource. Default=16kb\n * `encoding` {String} If specified, then buffers will be decoded to\n strings using the specified encoding. Default=null\n * `objectMode` {Boolean} Whether this stream should behave\n as a stream of objects. Meaning that stream.read(n) returns\n a single value instead of a Buffer of size n\n\nIn classes that extend the Readable class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n### readable.\\_read(size)\n\n* `size` {Number} Number of bytes to read asynchronously\n\nNote: **This function should NOT be called directly.** It should be\nimplemented by child classes, and called by the internal Readable\nclass methods only.\n\nAll Readable stream implementations must provide a `_read` method\nto fetch data from the underlying resource.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\nWhen data is available, put it into the read queue by calling\n`readable.push(chunk)`. If `push` returns false, then you should stop\nreading. When `_read` is called again, you should start pushing more\ndata.\n\nThe `size` argument is advisory. Implementations where a \"read\" is a\nsingle call that returns data can use this to know how much data to\nfetch. Implementations where that is not relevant, such as TCP or\nTLS, may ignore this argument, and simply provide data whenever it\nbecomes available. There is no need, for example to \"wait\" until\n`size` bytes are available before calling `stream.push(chunk)`.\n\n### readable.push(chunk)\n\n* `chunk` {Buffer | null | String} Chunk of data to push into the read queue\n* return {Boolean} Whether or not more pushes should be performed\n\nNote: **This function should be called by Readable implementors, NOT\nby consumers of Readable subclasses.** The `_read()` function will not\nbe called again until at least one `push(chunk)` call is made. If no\ndata is available, then you MAY call `push('')` (an empty string) to\nallow a future `_read` call, without adding any data to the queue.\n\nThe `Readable` class works by putting data into a read queue to be\npulled out later by calling the `read()` method when the `'readable'`\nevent fires.\n\nThe `push()` method will explicitly insert some data into the read\nqueue. If it is called with `null` then it will signal the end of the\ndata.\n\nIn some cases, you may be wrapping a lower-level source which has some\nsort of pause/resume mechanism, and a data callback. In those cases,\nyou could wrap the low-level source object by doing something like\nthis:\n\n```javascript\n// source is an object with readStop() and readStart() methods,\n// and an `ondata` member that gets called when it has data, and\n// an `onend` member that gets called when the data is over.\n\nvar stream = new Readable();\n\nsource.ondata = function(chunk) {\n // if push() returns false, then we need to stop reading from source\n if (!stream.push(chunk))\n source.readStop();\n};\n\nsource.onend = function() {\n stream.push(null);\n};\n\n// _read will be called when the stream wants to pull more data in\n// the advisory size argument is ignored in this case.\nstream._read = function(n) {\n source.readStart();\n};\n```\n\n### readable.unshift(chunk)\n\n* `chunk` {Buffer | null | String} Chunk of data to unshift onto the read queue\n* return {Boolean} Whether or not more pushes should be performed\n\nThis is the corollary of `readable.push(chunk)`. Rather than putting\nthe data at the *end* of the read queue, it puts it at the *front* of\nthe read queue.\n\nThis is useful in certain use-cases where a stream is being consumed\nby a parser, which needs to \"un-consume\" some data that it has\noptimistically pulled out of the source.\n\n```javascript\n// A parser for a simple data protocol.\n// The \"header\" is a JSON object, followed by 2 \\n characters, and\n// then a message body.\n//\n// Note: This can be done more simply as a Transform stream. See below.\n\nfunction SimpleProtocol(source, options) {\n if (!(this instanceof SimpleProtocol))\n return new SimpleProtocol(options);\n\n Readable.call(this, options);\n this._inBody = false;\n this._sawFirstCr = false;\n\n // source is a readable stream, such as a socket or file\n this._source = source;\n\n var self = this;\n source.on('end', function() {\n self.push(null);\n });\n\n // give it a kick whenever the source is readable\n // read(0) will not consume any bytes\n source.on('readable', function() {\n self.read(0);\n });\n\n this._rawHeader = [];\n this.header = null;\n}\n\nSimpleProtocol.prototype = Object.create(\n Readable.prototype, { constructor: { value: SimpleProtocol }});\n\nSimpleProtocol.prototype._read = function(n) {\n if (!this._inBody) {\n var chunk = this._source.read();\n\n // if the source doesn't have data, we don't have data yet.\n if (chunk === null)\n return this.push('');\n\n // check if the chunk has a \\n\\n\n var split = -1;\n for (var i = 0; i < chunk.length; i++) {\n if (chunk[i] === 10) { // '\\n'\n if (this._sawFirstCr) {\n split = i;\n break;\n } else {\n this._sawFirstCr = true;\n }\n } else {\n this._sawFirstCr = false;\n }\n }\n\n if (split === -1) {\n // still waiting for the \\n\\n\n // stash the chunk, and try again.\n this._rawHeader.push(chunk);\n this.push('');\n } else {\n this._inBody = true;\n var h = chunk.slice(0, split);\n this._rawHeader.push(h);\n var header = Buffer.concat(this._rawHeader).toString();\n try {\n this.header = JSON.parse(header);\n } catch (er) {\n this.emit('error', new Error('invalid simple protocol data'));\n return;\n }\n // now, because we got some extra data, unshift the rest\n // back into the read queue so that our consumer will see it.\n var b = chunk.slice(split);\n this.unshift(b);\n\n // and let them know that we are done parsing the header.\n this.emit('header', this.header);\n }\n } else {\n // from there on, just provide the data to our consumer.\n // careful not to push(null), since that would indicate EOF.\n var chunk = this._source.read();\n if (chunk) this.push(chunk);\n }\n};\n\n// Usage:\nvar parser = new SimpleProtocol(source);\n// Now parser is a readable stream that will emit 'header'\n// with the parsed header data.\n```\n\n### readable.wrap(stream)\n\n* `stream` {Stream} An \"old style\" readable stream\n\nIf you are using an older Node library that emits `'data'` events and\nhas a `pause()` method that is advisory only, then you can use the\n`wrap()` method to create a Readable stream that uses the old stream\nas its data source.\n\nFor example:\n\n```javascript\nvar OldReader = require('./old-api-module.js').OldReader;\nvar oreader = new OldReader;\nvar Readable = require('stream').Readable;\nvar myReader = new Readable().wrap(oreader);\n\nmyReader.on('readable', function() {\n myReader.read(); // etc.\n});\n```\n\n### Event: 'readable'\n\nWhen there is data ready to be consumed, this event will fire.\n\nWhen this event emits, call the `read()` method to consume the data.\n\n### Event: 'end'\n\nEmitted when the stream has received an EOF (FIN in TCP terminology).\nIndicates that no more `'data'` events will happen. If the stream is\nalso writable, it may be possible to continue writing.\n\n### Event: 'data'\n\nThe `'data'` event emits either a `Buffer` (by default) or a string if\n`setEncoding()` was used.\n\nNote that adding a `'data'` event listener will switch the Readable\nstream into \"old mode\", where data is emitted as soon as it is\navailable, rather than waiting for you to call `read()` to consume it.\n\n### Event: 'error'\n\nEmitted if there was an error receiving data.\n\n### Event: 'close'\n\nEmitted when the underlying resource (for example, the backing file\ndescriptor) has been closed. Not all streams will emit this.\n\n### readable.setEncoding(encoding)\n\nMakes the `'data'` event emit a string instead of a `Buffer`. `encoding`\ncan be `'utf8'`, `'utf16le'` (`'ucs2'`), `'ascii'`, or `'hex'`.\n\nThe encoding can also be set by specifying an `encoding` field to the\nconstructor.\n\n### readable.read([size])\n\n* `size` {Number | null} Optional number of bytes to read.\n* Return: {Buffer | String | null}\n\nNote: **This function SHOULD be called by Readable stream users.**\n\nCall this method to consume data once the `'readable'` event is\nemitted.\n\nThe `size` argument will set a minimum number of bytes that you are\ninterested in. If not set, then the entire content of the internal\nbuffer is returned.\n\nIf there is no data to consume, or if there are fewer bytes in the\ninternal buffer than the `size` argument, then `null` is returned, and\na future `'readable'` event will be emitted when more is available.\n\nCalling `stream.read(0)` will always return `null`, and will trigger a\nrefresh of the internal buffer, but otherwise be a no-op.\n\n### readable.pipe(destination, [options])\n\n* `destination` {Writable Stream}\n* `options` {Object} Optional\n * `end` {Boolean} Default=true\n\nConnects this readable stream to `destination` WriteStream. Incoming\ndata on this stream gets written to `destination`. Properly manages\nback-pressure so that a slow destination will not be overwhelmed by a\nfast readable stream.\n\nThis function returns the `destination` stream.\n\nFor example, emulating the Unix `cat` command:\n\n process.stdin.pipe(process.stdout);\n\nBy default `end()` is called on the destination when the source stream\nemits `end`, so that `destination` is no longer writable. Pass `{ end:\nfalse }` as `options` to keep the destination stream open.\n\nThis keeps `writer` open so that \"Goodbye\" can be written at the\nend.\n\n reader.pipe(writer, { end: false });\n reader.on(\"end\", function() {\n writer.end(\"Goodbye\\n\");\n });\n\nNote that `process.stderr` and `process.stdout` are never closed until\nthe process exits, regardless of the specified options.\n\n### readable.unpipe([destination])\n\n* `destination` {Writable Stream} Optional\n\nUndo a previously established `pipe()`. If no destination is\nprovided, then all previously established pipes are removed.\n\n### readable.pause()\n\nSwitches the readable stream into \"old mode\", where data is emitted\nusing a `'data'` event rather than being buffered for consumption via\nthe `read()` method.\n\nCeases the flow of data. No `'data'` events are emitted while the\nstream is in a paused state.\n\n### readable.resume()\n\nSwitches the readable stream into \"old mode\", where data is emitted\nusing a `'data'` event rather than being buffered for consumption via\nthe `read()` method.\n\nResumes the incoming `'data'` events after a `pause()`.\n\n\n## Class: stream.Writable\n\n<!--type=class-->\n\nA `Writable` Stream has the following methods, members, and events.\n\nNote that `stream.Writable` is an abstract class designed to be\nextended with an underlying implementation of the\n`_write(chunk, encoding, cb)` method. (See below.)\n\n### new stream.Writable([options])\n\n* `options` {Object}\n * `highWaterMark` {Number} Buffer level when `write()` starts\n returning false. Default=16kb\n * `decodeStrings` {Boolean} Whether or not to decode strings into\n Buffers before passing them to `_write()`. Default=true\n\nIn classes that extend the Writable class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n### writable.\\_write(chunk, encoding, callback)\n\n* `chunk` {Buffer | String} The chunk to be written. Will always\n be a buffer unless the `decodeStrings` option was set to `false`.\n* `encoding` {String} If the chunk is a string, then this is the\n encoding type. Ignore chunk is a buffer. Note that chunk will\n **always** be a buffer unless the `decodeStrings` option is\n explicitly set to `false`.\n* `callback` {Function} Call this function (optionally with an error\n argument) when you are done processing the supplied chunk.\n\nAll Writable stream implementations must provide a `_write` method to\nsend data to the underlying resource.\n\nNote: **This function MUST NOT be called directly.** It should be\nimplemented by child classes, and called by the internal Writable\nclass methods only.\n\nCall the callback using the standard `callback(error)` pattern to\nsignal that the write completed successfully or with an error.\n\nIf the `decodeStrings` flag is set in the constructor options, then\n`chunk` may be a string rather than a Buffer, and `encoding` will\nindicate the sort of string that it is. This is to support\nimplementations that have an optimized handling for certain string\ndata encodings. If you do not explicitly set the `decodeStrings`\noption to `false`, then you can safely ignore the `encoding` argument,\nand assume that `chunk` will always be a Buffer.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\n\n### writable.write(chunk, [encoding], [callback])\n\n* `chunk` {Buffer | String} Data to be written\n* `encoding` {String} Optional. If `chunk` is a string, then encoding\n defaults to `'utf8'`\n* `callback` {Function} Optional. Called when this chunk is\n successfully written.\n* Returns {Boolean}\n\nWrites `chunk` to the stream. Returns `true` if the data has been\nflushed to the underlying resource. Returns `false` to indicate that\nthe buffer is full, and the data will be sent out in the future. The\n`'drain'` event will indicate when the buffer is empty again.\n\nThe specifics of when `write()` will return false, is determined by\nthe `highWaterMark` option provided to the constructor.\n\n### writable.end([chunk], [encoding], [callback])\n\n* `chunk` {Buffer | String} Optional final data to be written\n* `encoding` {String} Optional. If `chunk` is a string, then encoding\n defaults to `'utf8'`\n* `callback` {Function} Optional. Called when the final chunk is\n successfully written.\n\nCall this method to signal the end of the data being written to the\nstream.\n\n### Event: 'drain'\n\nEmitted when the stream's write queue empties and it's safe to write\nwithout buffering again. Listen for it when `stream.write()` returns\n`false`.\n\n### Event: 'close'\n\nEmitted when the underlying resource (for example, the backing file\ndescriptor) has been closed. Not all streams will emit this.\n\n### Event: 'finish'\n\nWhen `end()` is called and there are no more chunks to write, this\nevent is emitted.\n\n### Event: 'pipe'\n\n* `source` {Readable Stream}\n\nEmitted when the stream is passed to a readable stream's pipe method.\n\n### Event 'unpipe'\n\n* `source` {Readable Stream}\n\nEmitted when a previously established `pipe()` is removed using the\nsource Readable stream's `unpipe()` method.\n\n## Class: stream.Duplex\n\n<!--type=class-->\n\nA \"duplex\" stream is one that is both Readable and Writable, such as a\nTCP socket connection.\n\nNote that `stream.Duplex` is an abstract class designed to be\nextended with an underlying implementation of the `_read(size)`\nand `_write(chunk, encoding, callback)` methods as you would with a Readable or\nWritable stream class.\n\nSince JavaScript doesn't have multiple prototypal inheritance, this\nclass prototypally inherits from Readable, and then parasitically from\nWritable. It is thus up to the user to implement both the lowlevel\n`_read(n)` method as well as the lowlevel `_write(chunk, encoding, cb)` method\non extension duplex classes.\n\n### new stream.Duplex(options)\n\n* `options` {Object} Passed to both Writable and Readable\n constructors. Also has the following fields:\n * `allowHalfOpen` {Boolean} Default=true. If set to `false`, then\n the stream will automatically end the readable side when the\n writable side ends and vice versa.\n\nIn classes that extend the Duplex class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n## Class: stream.Transform\n\nA \"transform\" stream is a duplex stream where the output is causally\nconnected in some way to the input, such as a zlib stream or a crypto\nstream.\n\nThere is no requirement that the output be the same size as the input,\nthe same number of chunks, or arrive at the same time. For example, a\nHash stream will only ever have a single chunk of output which is\nprovided when the input is ended. A zlib stream will either produce\nmuch smaller or much larger than its input.\n\nRather than implement the `_read()` and `_write()` methods, Transform\nclasses must implement the `_transform()` method, and may optionally\nalso implement the `_flush()` method. (See below.)\n\n### new stream.Transform([options])\n\n* `options` {Object} Passed to both Writable and Readable\n constructors.\n\nIn classes that extend the Transform class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n### transform.\\_transform(chunk, encoding, callback)\n\n* `chunk` {Buffer | String} The chunk to be transformed. Will always\n be a buffer unless the `decodeStrings` option was set to `false`.\n* `encoding` {String} If the chunk is a string, then this is the\n encoding type. (Ignore if `decodeStrings` chunk is a buffer.)\n* `callback` {Function} Call this function (optionally with an error\n argument) when you are done processing the supplied chunk.\n\nNote: **This function MUST NOT be called directly.** It should be\nimplemented by child classes, and called by the internal Transform\nclass methods only.\n\nAll Transform stream implementations must provide a `_transform`\nmethod to accept input and produce output.\n\n`_transform` should do whatever has to be done in this specific\nTransform class, to handle the bytes being written, and pass them off\nto the readable portion of the interface. Do asynchronous I/O,\nprocess things, and so on.\n\nCall `transform.push(outputChunk)` 0 or more times to generate output\nfrom this input chunk, depending on how much data you want to output\nas a result of this chunk.\n\nCall the callback function only when the current chunk is completely\nconsumed. Note that there may or may not be output as a result of any\nparticular input chunk.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\n### transform.\\_flush(callback)\n\n* `callback` {Function} Call this function (optionally with an error\n argument) when you are done flushing any remaining data.\n\nNote: **This function MUST NOT be called directly.** It MAY be implemented\nby child classes, and if so, will be called by the internal Transform\nclass methods only.\n\nIn some cases, your transform operation may need to emit a bit more\ndata at the end of the stream. For example, a `Zlib` compression\nstream will store up some internal state so that it can optimally\ncompress the output. At the end, however, it needs to do the best it\ncan with what is left, so that the data will be complete.\n\nIn those cases, you can implement a `_flush` method, which will be\ncalled at the very end, after all the written data is consumed, but\nbefore emitting `end` to signal the end of the readable side. Just\nlike with `_transform`, call `transform.push(chunk)` zero or more\ntimes, as appropriate, and call `callback` when the flush operation is\ncomplete.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\n### Example: `SimpleProtocol` parser\n\nThe example above of a simple protocol parser can be implemented much\nmore simply by using the higher level `Transform` stream class.\n\nIn this example, rather than providing the input as an argument, it\nwould be piped into the parser, which is a more idiomatic Node stream\napproach.\n\n```javascript\nfunction SimpleProtocol(options) {\n if (!(this instanceof SimpleProtocol))\n return new SimpleProtocol(options);\n\n Transform.call(this, options);\n this._inBody = false;\n this._sawFirstCr = false;\n this._rawHeader = [];\n this.header = null;\n}\n\nSimpleProtocol.prototype = Object.create(\n Transform.prototype, { constructor: { value: SimpleProtocol }});\n\nSimpleProtocol.prototype._transform = function(chunk, encoding, done) {\n if (!this._inBody) {\n // check if the chunk has a \\n\\n\n var split = -1;\n for (var i = 0; i < chunk.length; i++) {\n if (chunk[i] === 10) { // '\\n'\n if (this._sawFirstCr) {\n split = i;\n break;\n } else {\n this._sawFirstCr = true;\n }\n } else {\n this._sawFirstCr = false;\n }\n }\n\n if (split === -1) {\n // still waiting for the \\n\\n\n // stash the chunk, and try again.\n this._rawHeader.push(chunk);\n } else {\n this._inBody = true;\n var h = chunk.slice(0, split);\n this._rawHeader.push(h);\n var header = Buffer.concat(this._rawHeader).toString();\n try {\n this.header = JSON.parse(header);\n } catch (er) {\n this.emit('error', new Error('invalid simple protocol data'));\n return;\n }\n // and let them know that we are done parsing the header.\n this.emit('header', this.header);\n\n // now, because we got some extra data, emit this first.\n this.push(b);\n }\n } else {\n // from there on, just provide the data to our consumer as-is.\n this.push(b);\n }\n done();\n};\n\nvar parser = new SimpleProtocol();\nsource.pipe(parser)\n\n// Now parser is a readable stream that will emit 'header'\n// with the parsed header data.\n```\n\n\n## Class: stream.PassThrough\n\nThis is a trivial implementation of a `Transform` stream that simply\npasses the input bytes across to the output. Its purpose is mainly\nfor examples and testing, but there are occasionally use cases where\nit can come in handy.\n\n\n[EventEmitter]: events.html#events_class_events_eventemitter\n",
./node_modules/bower/node_modules/unzip/node_modules/readable-stream/README.md:Note: **This function SHOULD be called by Readable stream users.**
./node_modules/bower/README.md:not available for Windows users.
./node_modules/bower/README.md:## A note for Windows users
./node_modules/boom/node_modules/hoek/package.json: "readme": "<a href=\"https://github.com/spumko\"><img src=\"https://raw.github.com/spumko/spumko/master/images/from.png\" align=\"right\" /></a>\r\n![hoek Logo](https://raw.github.com/spumko/hoek/master/images/hoek.png)\r\n\r\nGeneral purpose node utilities\r\n\r\n[![Build Status](https://secure.travis-ci.org/spumko/hoek.png)](http://travis-ci.org/spumko/hoek)\r\n\r\n# Table of Contents\r\n\r\n* [Introduction](#introduction \"Introduction\")\r\n* [Object](#object \"Object\")\r\n * [clone](#cloneobj \"clone\")\r\n * [merge](#mergetarget-source-isnulloverride-ismergearrays \"merge\")\r\n * [applyToDefaults](#applytodefaultsdefaults-options \"applyToDefaults\")\r\n * [unique](#uniquearray-key \"unique\")\r\n * [mapToObject](#maptoobjectarray-key \"mapToObject\")\r\n * [intersect](#intersectarray1-array2 \"intersect\")\r\n * [matchKeys](#matchkeysobj-keys \"matchKeys\")\r\n * [flatten](#flattenarray-target \"flatten\")\r\n * [removeKeys](#removekeysobject-keys \"removeKeys\")\r\n * [reach](#reachobj-chain \"reach\")\r\n * [inheritAsync](#inheritasyncself-obj-keys \"inheritAsync\")\r\n * [rename](#renameobj-from-to \"rename\")\r\n* [Timer](#timer \"Timer\")\r\n* [Binary Encoding/Decoding](#binary \"Binary Encoding/Decoding\")\r\n * [base64urlEncode](#binary64urlEncodevalue \"binary64urlEncode\")\r\n * [base64urlDecode](#binary64urlDecodevalue \"binary64urlDecode\")\r\n* [Escaping Characters](#escaped \"Escaping Characters\")\r\n * [escapeHtml](#escapeHtmlstring \"escapeHtml\")\r\n * [escapeHeaderAttribute](#escapeHeaderAttributeattribute \"escapeHeaderAttribute\")\r\n * [escapeRegex](#escapeRegexstring \"escapeRegex\")\r\n* [Errors](#errors \"Errors\")\r\n * [assert](#assertmessage \"assert\")\r\n * [abort](#abortmessage \"abort\")\r\n * [displayStack](#displayStackslice \"displayStack\")\r\n * [callStack](#callStackslice \"callStack\")\r\n * [toss](#tosscondition \"toss\")\r\n* [Load files](#load-files \"Load Files\")\r\n * [loadPackage](#loadPackagedir \"loadpackage\")\r\n * [loadDirModules](#loadDirModulespath-excludefiles-target \"loaddirmodules\")\r\n\r\n\r\n\r\n# Introduction\r\n\r\nThe *Hoek* general purpose node utilities library is used to aid in a variety of manners. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. \r\n\r\nFor example, to use Hoek to set configuration with default options:\r\n```javascript\r\nvar Hoek = require('hoek');\r\n\r\nvar default = {url : \"www.github.com\", port : \"8000\", debug : true}\r\n\r\nvar config = Hoek.applyToDefaults(default, {port : \"3000\", admin : true});\r\n\r\n// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\r\n```\r\n\r\nUnder each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the var Hoek = require('hoek') is omitted for brevity.\r\n\r\n## Object\r\n\r\nHoek provides several helpful methods for objects and arrays.\r\n\r\n### clone(obj)\r\n\r\nThis method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). \r\n\r\n```javascript\r\n\r\nvar nestedObj = {\r\n w: /^something$/ig,\r\n x: {\r\n a: [1, 2, 3],\r\n b: 123456,\r\n c: new Date()\r\n },\r\n y: 'y',\r\n z: new Date()\r\n };\r\n\r\nvar copy = Hoek.clone(nestedObj);\r\n\r\ncopy.x.b = 100;\r\n\r\nconsole.log(copy.y) // results in 'y'\r\nconsole.log(nestedObj.x.b) // results in 123456\r\nconsole.log(copy.x.b) // results in 100\r\n```\r\n\r\n### merge(target, source, isNullOverride, isMergeArrays)\r\nisNullOverride, isMergeArrays default to true\r\n\r\nMerge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r\n\r\n\r\n```javascript\r\n\r\nvar target = {a: 1, b : 2}\r\nvar source = {a: 0, c: 5}\r\nvar source2 = {a: null, c: 5}\r\n\r\nvar targetArray = [1, 2, 3];\r\nvar sourceArray = [4, 5];\r\n\r\nvar newTarget = Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5}\r\nnewTarget = Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\r\n\r\nnewTarget = Hoek.merge(targetArray, sourceArray) // results in [1, 2, 3, 4, 5]\r\nnewTarget = Hoek.merge(targetArray, sourceArray, true, false) // results in [4, 5]\r\n\r\n\r\n\r\n\r\n```\r\n\r\n### applyToDefaults(defaults, options)\r\n\r\nApply options to a copy of the defaults\r\n\r\n```javascript\r\n\r\nvar defaults = {host: \"localhost\", port: 8000};\r\nvar options = {port: 8080};\r\n\r\nvar config = Hoek.applyToDefaults(defaults, options); // results in {host: \"localhost\", port: 8080};\r\n\r\n\r\n```\r\n\r\n### unique(array, key)\r\n\r\nRemove duplicate items from Array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 2, 3, 3, 4, 5, 6];\r\n\r\nvar newArray = Hoek.unique(array); // results in [1,2,3,4,5,6];\r\n\r\narray = [{id: 1}, {id: 1}, {id: 2}];\r\n\r\nnewArray = Hoek.unique(array, \"id\") // results in [{id: 1}, {id: 2}]\r\n\r\n```\r\n\r\n### mapToObject(array, key)\r\n\r\nConvert an Array into an Object\r\n\r\n```javascript\r\n\r\nvar array = [1,2,3];\r\nvar newObject = Hoek.mapToObject(array); // results in [{\"1\": true}, {\"2\": true}, {\"3\": true}]\r\n\r\narray = [{id: 1}, {id: 2}];\r\nnewObject = Hoek.mapToObject(array, \"id\") // results in [{\"id\": 1}, {\"id\": 2}]\r\n\r\n```\r\n### intersect(array1, array2)\r\n\r\nFind the common unique items in two arrays\r\n\r\n```javascript\r\n\r\nvar array1 = [1, 2, 3];\r\nvar array2 = [1, 4, 5];\r\n\r\nvar newArray = Hoek.intersect(array1, array2) // results in [1]\r\n\r\n```\r\n\r\n### matchKeys(obj, keys) \r\n\r\nFind which keys are present\r\n\r\n```javascript\r\n\r\nvar obj = {a: 1, b: 2, c: 3};\r\nvar keys = [\"a\", \"e\"];\r\n\r\nHoek.matchKeys(obj, keys) // returns [\"a\"]\r\n\r\n```\r\n\r\n### flatten(array, target)\r\n\r\nFlatten an array\r\n\r\n```javascript\r\n\r\nvar array = [1, 2, 3];\r\nvar target = [4, 5]; \r\n\r\nvar flattenedArray = Hoek.flatten(array, target) // results in [4, 5, 1, 2, 3];\r\n\r\n```\r\n\r\n### removeKeys(object, keys)\r\n\r\nRemove keys\r\n\r\n```javascript\r\n\r\nvar object = {a: 1, b: 2, c: 3, d: 4};\r\n\r\nvar keys = [\"a\", \"b\"];\r\n\r\nHoek.removeKeys(object, keys) // object is now {c: 3, d: 4}\r\n\r\n```\r\n\r\n### reach(obj, chain)\r\n\r\nConverts an object key chain string to reference\r\n\r\n```javascript\r\n\r\nvar chain = 'a.b.c';\r\nvar obj = {a : {b : { c : 1}}};\r\n\r\nHoek.reach(obj, chain) // returns 1\r\n\r\n```\r\n\r\n### inheritAsync(self, obj, keys) \r\n\r\nInherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r\n\r\n```javascript\r\n\r\nvar targetFunc = function () { };\r\n\r\nvar proto = {\r\n a: function () {\r\n return 'a!';\r\n },\r\n b: function () {\r\n return 'b!';\r\n },\r\n c: function () {\r\n throw new Error('c!');\r\n }\r\n };\r\n\r\nvar keys = ['a', 'c'];\r\n\r\nHoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r\n\r\nvar target = new targetFunc();\r\n\r\ntarget.a(function(err, result){console.log(result)} // returns 'a!' \r\n\r\ntarget.c(function(err, result){console.log(result)} // returns undefined\r\n\r\ntarget.b(function(err, result){console.log(result)} // gives error: Object [object Object] has no method 'b'\r\n\r\n```\r\n\r\n### rename(obj, from, to)\r\n\r\nRename a key of an object\r\n\r\n```javascript\r\n\r\nvar obj = {a : 1, b : 2};\r\n\r\nHoek.rename(obj, \"a\", \"c\"); // obj is now {c : 1, b : 2}\r\n\r\n```\r\n\r\n\r\n# Timer\r\n\r\nA Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\r\n\r\n```javascript\r\n\r\n\r\nexample : \r\n\r\n\r\nvar timerObj = new Hoek.Timer();\r\nconsole.log(\"Time is now: \" + timerObj.ts)\r\nconsole.log(\"Elapsed time from initialization: \" + timerObj.elapsed() + 'milliseconds')\r\n\r\n```\r\n\r\n# Binary Encoding/Decoding\r\n\r\n### base64urlEncode(value)\r\n\r\nEncodes value in Base64 or URL encoding\r\n\r\n### base64urlDecode(value)\r\n\r\nDecodes data in Base64 or URL encoding.\r\n# Escaping Characters\r\n\r\nHoek provides convenient methods for escaping html characters. The escaped characters are as followed:\r\n\r\n```javascript\r\n\r\ninternals.htmlEscaped = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '`': '`'\r\n};\r\n\r\n```\r\n\r\n### escapeHtml(string)\r\n\r\n```javascript\r\n\r\nvar string = '<html> hey </html>';\r\nvar escapedString = Hoek.escapeHtml(string); // returns <html> hey </html>\r\n\r\n```\r\n\r\n### escapeHeaderAttribute(attribute)\r\n\r\nEscape attribute value for use in HTTP header\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeHeaderAttribute('I said \"go w\\\\o me\"'); //returns I said \\\"go w\\\\o me\\\"\r\n\r\n\r\n```\r\n\r\n\r\n### escapeRegex(string)\r\n\r\nEscape string for Regex construction\r\n\r\n```javascript\r\n\r\nvar a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\\\/`\"(>)[<]d{}s,'); // returns 4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`\"\\(>\\)\\[<\\]d\\{\\}s\\,\r\n\r\n\r\n\r\n```\r\n\r\n# Errors\r\n\r\n### assert(message)\r\n\r\n```javascript\r\n\r\nvar a = 1, b =2;\r\n\r\nHoek.assert(a === b, 'a should equal b'); // ABORT: a should equal b\r\n\r\n```\r\n\r\n### abort(message)\r\n\r\nFirst checks if process.env.NODE_ENV === 'test', and if so, throws error message. Otherwise,\r\ndisplays most recent stack and then exits process.\r\n\r\n\r\n\r\n### displayStack(slice)\r\n\r\nDisplays the trace stack\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.displayStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\r\n 'Module._compile (module.js:449:26)',\r\n 'Module._extensions..js (module.js:467:10)',\r\n 'Module.load (module.js:356:32)',\r\n 'Module._load (module.js:312:12)',\r\n 'Module.runMain (module.js:492:10)',\r\n 'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\r\n\r\n```\r\n\r\n### callStack(slice)\r\n\r\nReturns a trace stack array.\r\n\r\n```javascript\r\n\r\nvar stack = Hoek.callStack();\r\nconsole.log(stack) // returns something like:\r\n\r\n[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\r\n [ 'module.js', 449, 26, 'Module._compile', false ],\r\n [ 'module.js', 467, 10, 'Module._extensions..js', false ],\r\n [ 'module.js', 356, 32, 'Module.load', false ],\r\n [ 'module.js', 312, 12, 'Module._load', false ],\r\n [ 'module.js', 492, 10, 'Module.runMain', false ],\r\n [ 'node.js',\r\n 244,\r\n 9,\r\n 'startup.processNextTick.process._tickCallback',\r\n false ] ]\r\n\r\n\r\n```\r\n\r\n### toss(condition)\r\n\r\ntoss(condition /*, [message], callback */)\r\n\r\nReturn an error as first argument of a callback\r\n\r\n\r\n# Load Files\r\n\r\n### loadPackage(dir)\r\n\r\nLoad and parse package.json process root or given directory\r\n\r\n```javascript\r\n\r\nvar pack = Hoek.loadPackage(); // pack.name === 'hoek'\r\n\r\n```\r\n\r\n### loadDirModules(path, excludeFiles, target) \r\n\r\nLoads modules from a given path; option to exclude files (array).\r\n\r\n\r\n\r\n\r\n",
./node_modules/boom/node_modules/hoek/README.md:[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
./node_modules/boom/node_modules/hoek/README.md:[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
./node_modules/sequelize/lib/dao-validator.js: * Expose validator.js to allow users to extend
./node_modules/sequelize/lib/associations/helpers.js: // FK constraints are opt-in: users must either rset `foreignKeyConstraints`
./node_modules/sequelize/node_modules/bluebird/package.json: "readme": "[![Build Status](https://travis-ci.org/petkaantonov/bluebird.png?branch=master)](https://travis-ci.org/petkaantonov/bluebird)\r\n\r\n<a href=\"http://promisesaplus.com/\">\r\n <img src=\"http://promisesaplus.com/assets/logo-small.png\" alt=\"Promises/A+ logo\"\r\n title=\"Promises/A+ 1.0 compliant\" align=\"right\" />\r\n</a>\r\n\r\n#Introduction\r\n\r\nBluebird is a fully featured [promise](#what-are-promises-and-why-should-i-use-them) library with focus on innovative features and performance\r\n\r\n#Topics\r\n\r\n- [Features](#features)\r\n- [Quick start](#quick-start)\r\n- [API Reference and examples](https://github.com/petkaantonov/bluebird/blob/master/API.md)\r\n- [What are promises and why should I use them?](#what-are-promises-and-why-should-i-use-them)\r\n- [Questions and issues](#questions-and-issues)\r\n- [Error handling](#error-handling)\r\n- [Development](#development)\r\n - [Testing](#testing)\r\n - [Benchmarking](#benchmarks)\r\n - [Custom builds](#custom-builds)\r\n - [For library authors](#for-library-authors)\r\n- [What is the sync build?](#what-is-the-sync-build)\r\n- [License](#license)\r\n- [Snippets for common problems](https://github.com/petkaantonov/bluebird/wiki/Snippets)\r\n- [Promise anti-patterns](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)\r\n- [Changelog](https://github.com/petkaantonov/bluebird/blob/master/changelog.md)\r\n- [Optimization guide](#optimization-guide)\r\n\r\n#Features:\r\n\r\n- [Promises A+ 2.0.2](http://promisesaplus.com)\r\n- [Cancellation](https://github.com/promises-aplus)\r\n- [Progression](https://github.com/promises-aplus/progress-spec)\r\n- [Synchronous inspection](https://github.com/promises-aplus/synchronous-inspection-spec)\r\n- [`.bind`](https://github.com/petkaantonov/bluebird/blob/master/API.md#binddynamic-thisarg---promise)\r\n- [Complete parallel for C# 5.0 async and await](https://github.com/petkaantonov/bluebird/blob/master/API.md#promisecoroutinegeneratorfunction-generatorfunction---function)\r\n- [Collection methods](https://github.com/petkaantonov/bluebird/blob/master/API.md#collections) such as All, any, some, settle, map, filter, reduce, spread, join, race...\r\n- [Practical debugging solutions](#error-handling) such as unhandled rejection reporting, typed catches, catching only what you expect and very long, relevant stack traces without losing perf\r\n- [Sick performance](https://github.com/petkaantonov/bluebird/tree/master/benchmark/stats)\r\n\r\nPasses [AP2](https://github.com/petkaantonov/bluebird/tree/master/test/mocha), [AP3](https://github.com/petkaantonov/bluebird/tree/master/test/mocha), [Cancellation](https://github.com/petkaantonov/bluebird/blob/master/test/mocha/cancel.js), [Progress](https://github.com/petkaantonov/bluebird/blob/master/test/mocha/q_progress.js) tests and more. See [testing](#testing).\r\n\r\n<hr>\r\n\r\n#Quick start\r\n\r\n##Node.js\r\n\r\n npm install bluebird\r\n\r\nThen:\r\n\r\n```js\r\nvar Promise = require(\"bluebird\");\r\n```\r\n\r\n##Browsers\r\n\r\nDownload the [bluebird.js](https://github.com/petkaantonov/bluebird/tree/master/js/browser) file. And then use a script tag:\r\n\r\n```html\r\n<script type=\"text/javascript\" src=\"/scripts/bluebird.js\"></script>\r\n```\r\n\r\nThe global variable `Promise` becomes available after the above script tag.\r\n\r\n####Browser support\r\n\r\nBrowsers that [implement ECMA-262, edition 3](http://en.wikipedia.org/wiki/Ecmascript#Implementations) and later are supported.\r\n\r\n[![Selenium Test Status](https://saucelabs.com/browser-matrix/petka_antonov.svg)](https://saucelabs.com/u/petka_antonov)\r\n\r\n**Note** that in ECMA-262, edition 3 (IE7, IE8 etc) it is not possible to use methods that have keyword names like `.catch` and `.finally`. The [API documentation](https://github.com/petkaantonov/bluebird/blob/master/API.md) always lists a compatible alternative name that you can use if you need to support these browsers. For example `.catch` is replaced with `.caught` and `.finally` with `.lastly`.\r\n\r\nAlso, [long stack trace](https://github.com/petkaantonov/bluebird/blob/master/API.md#promiselongstacktraces---void) support is only available in Chrome and Firefox.\r\n\r\n<sub>Previously bluebird required es5-shim.js and es5-sham.js to support Edition 3 - these are **no longer required** as of **0.10.4**.</sub>\r\n\r\nAfter quick start, see [API Reference and examples](https://github.com/petkaantonov/bluebird/blob/master/API.md)\r\n\r\n<hr>\r\n\r\n#What are promises and why should I use them?\r\n\r\nYou should use promises to turn this:\r\n\r\n```js\r\nreadFile(\"file.json\", function(err, val) {\r\n if( err ) {\r\n console.error(\"unable to read file\");\r\n }\r\n else {\r\n try {\r\n val = JSON.parse(val);\r\n console.log(val.success);\r\n }\r\n catch( e ) {\r\n console.error(\"invalid json in file\");\r\n }\r\n }\r\n});\r\n```\r\n\r\nInto this:\r\n\r\n```js\r\nreadFile(\"file.json\").then(JSON.parse).then(function(val) {\r\n console.log(val.success);\r\n})\r\n.catch(SyntaxError, function(e) {\r\n console.error(\"invalid json in file\");\r\n})\r\n.catch(function(e){\r\n console.error(\"unable to read file\")\r\n});\r\n```\r\n\r\nActually you might notice the latter has a lot in common with code that would do the same using synchronous I/O:\r\n\r\n```js\r\ntry {\r\n var val = JSON.parse(readFile(\"file.json\"));\r\n console.log(val.success);\r\n}\r\n//Syntax actually not supported in JS but drives the point\r\ncatch(SyntaxError e) {\r\n console.error(\"invalid json in file\");\r\n}\r\ncatch(Error e) {\r\n console.error(\"unable to read file\")\r\n}\r\n```\r\n\r\nAnd that is the point - being able to have something that is a lot like `return` and `throw` in synchronous code.\r\n\r\nYou can also use promises to improve code that was written with callback helpers:\r\n\r\n\r\n```js\r\n//Copyright Plato http://stackoverflow.com/a/19385911/995876\r\n//CC BY-SA 2.5\r\nmapSeries(URLs, function (URL, done) {\r\n var options = {};\r\n needle.get(URL, options, function (error, response, body) {\r\n if (error) {\r\n return done(error)\r\n }\r\n try {\r\n var ret = JSON.parse(body);\r\n return done(null, ret);\r\n }\r\n catch (e) {\r\n done(e);\r\n }\r\n });\r\n}, function (err, results) {\r\n if (err) {\r\n console.log(err)\r\n } else {\r\n console.log('All Needle requests successful');\r\n // results is a 1 to 1 mapping in order of URLs > needle.body\r\n processAndSaveAllInDB(results, function (err) {\r\n if (err) {\r\n return done(err)\r\n }\r\n console.log('All Needle requests saved');\r\n done(null);\r\n });\r\n }\r\n});\r\n```\r\n\r\nIs more pleasing to the eye when done with promises:\r\n\r\n```js\r\nPromise.promisifyAll(needle);\r\nvar options = {};\r\n\r\nvar current = Promise.resolve();\r\nPromise.map(URLs, function(URL) {\r\n current = current.then(function () {\r\n return needle.getAsync(URL, options);\r\n });\r\n return current;\r\n}).map(function(responseAndBody){\r\n return JSON.parse(responseAndBody[1]);\r\n}).then(function (results) {\r\n return processAndSaveAllInDB(results);\r\n}).then(function(){\r\n console.log('All Needle requests saved');\r\n}).catch(function (e) {\r\n console.log(e);\r\n});\r\n```\r\n\r\nAlso promises don't just give you correspondences for synchronous features but can also be used as limited event emitters or callback aggregators.\r\n\r\nMore reading:\r\n\r\n - [Promise nuggets](http://spion.github.io/promise-nuggets/)\r\n - [Why I am switching to promises](http://spion.github.io/posts/why-i-am-switching-to-promises.html)\r\n - [What is the the point of promises](http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/#toc_1)\r\n - [Snippets for common problems](https://github.com/petkaantonov/bluebird/wiki/Snippets)\r\n - [Promise anti-patterns](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)\r\n\r\n#Questions and issues\r\n\r\nIf you find a bug in bluebird or have a feature request, file an issue in the [github issue tracker](https://github.com/petkaantonov/bluebird/issues). Anything else, such as questions for help in using the library, should be posted in [StackOverflow](http://stackoverflow.com/questions/tagged/bluebird) under tags `promise` and `bluebird`.\r\n\r\n#Error handling\r\n\r\nThis is a problem every promise library needs to handle in some way. Unhandled rejections/exceptions don't really have a good agreed-on asynchronous correspondence. The problem is that it is impossible to predict the future and know if a rejected promise will eventually be handled.\r\n\r\nThere are two common pragmatic attempts at solving the problem that promise libraries do.\r\n\r\nThe more popular one is to have the user explicitly communicate that they are done and any unhandled rejections should be thrown, like so:\r\n\r\n```js\r\ndownload().then(...).then(...).done();\r\n```\r\n\r\nFor handling this problem, in my opinion, this is completely unacceptable and pointless. The user must remember to explicitly call `.done` and that cannot be justified when the problem is forgetting to create an error handler in the first place.\r\n\r\nThe second approach, which is what bluebird by default takes, is to call a registered handler if a rejection is unhandled by the start of a second turn. The default handler is to write the stack trace to stderr or `console.error` in browsers. This is close to what happens with synchronous code - your code doens't work as expected and you open console and see a stack trace. Nice.\r\n\r\nOf course this is not perfect, if your code for some reason needs to swoop in and attach error handler to some promise after the promise has been hanging around a while then you will see annoying messages. In that case you can use the `.done()` method to signal that any hanging exceptions should be thrown.\r\n\r\nIf you want to override the default handler for these possibly unhandled rejections, you can pass yours like so:\r\n\r\n```js\r\nPromise.onPossiblyUnhandledRejection(function(error){\r\n throw error;\r\n});\r\n```\r\n\r\nIf you want to also enable long stack traces, call:\r\n\r\n```js\r\nPromise.longStackTraces();\r\n```\r\n\r\nright after the library is loaded.\r\n\r\nIn node.js use the environment flag `BLUEBIRD_DEBUG`:\r\n\r\n```\r\nBLUEBIRD_DEBUG=1 node server.js\r\n```\r\n\r\nto enable long stack traces in all instances of bluebird.\r\n\r\nLong stack traces cannot be disabled after being enabled, and cannot be enabled after promises have alread been created. Long stack traces imply a substantial performance penalty, even after using every trick to optimize them.\r\n\r\nLong stack traces are enabled by default in the debug build.\r\n\r\n####Expected and unexpected errors\r\n\r\nA practical problem with Promises/A+ is that it models Javascript `try-catch` too closely for its own good. Therefore by default promises inherit `try-catch` warts such as the inability to specify the error types that the catch block is eligible for. It is an anti-pattern in every other language to use catch-all handlers because they swallow exceptions that you might not know about.\r\n\r\nNow, Javascript does have a perfectly fine and working way of creating error type hierarchies. It is still quite awkward to use them with the built-in `try-catch` however:\r\n\r\n```js\r\ntry {\r\n //code\r\n}\r\ncatch(e) {\r\n if( e instanceof WhatIWantError) {\r\n //handle\r\n }\r\n else {\r\n throw e;\r\n }\r\n}\r\n```\r\n\r\nWithout such checking, unexpected errors would be silently swallowed. However, with promises, bluebird brings the future (hopefully) here now and extends the `.catch` to [accept potential error type eligibility](https://github.com/petkaantonov/bluebird/blob/master/API.md#catchfunction-errorclass-function-handler---promise).\r\n\r\nFor instance here it is expected that some evil or incompetent entity will try to crash our server from `SyntaxError` by providing syntactically invalid JSON:\r\n\r\n```js\r\ngetJSONFromSomewhere().then(function(jsonString) {\r\n return JSON.parse(jsonString);\r\n}).then(function(object) {\r\n console.log(\"it was valid json: \", object);\r\n}).catch(SyntaxError, function(e){\r\n console.log(\"don't be evil\");\r\n});\r\n```\r\n\r\nHere any kind of unexpected error will automatically reported on stderr along with a stack trace because we only register a handler for the expected `SyntaxError`.\r\n\r\nOk, so, that's pretty neat. But actually not many libraries define error types and it is in fact a complete ghetto out there with ad hoc strings being attached as some arbitrary property name like `.name`, `.type`, `.code`, not having any property at all or even throwing strings as errors and so on. So how can we still listen for expected errors?\r\n\r\nBluebird defines a special error type `RejectionError` (you can get a reference from `Promise.RejectionError`). This type of error is given as rejection reason by promisified methods when\r\ntheir underlying library gives an untyped, but expected error. Primitives such as strings, and error objects that are directly created like `new Error(\"database didn't respond\")` are considered untyped.\r\n\r\nExample of such library is the node core library `fs`. So if we promisify it, we can catch just the errors we want pretty easily and have programmer errors be redirected to unhandled rejection handler so that we notice them:\r\n\r\n```js\r\n//Read more about promisification in the API Reference:\r\n//https://github.com/petkaantonov/bluebird/blob/master/API.md\r\nvar fs = Promise.promisifyAll(require(\"fs\"));\r\n\r\nfs.readFileAsync(\"myfile.json\").then(JSON.parse).then(function (json) {\r\n console.log(\"Successful json\")\r\n}).catch(SyntaxError, function (e) {\r\n console.error(\"file contains invalid json\");\r\n}).catch(Promise.RejectionError, function (e) {\r\n console.error(\"unable to read file, because: \", e.message);\r\n});\r\n```\r\n\r\nThe last `catch` handler is only invoked when the `fs` module explicitly used the `err` argument convention of async callbacks to inform of an expected error. The `RejectionError` instance will contain the original error in its `.cause` property but it does have a direct copy of the `.message` and `.stack` too. In this code any unexpected error - be it in our code or the `fs` module - would not be caught by these handlers and therefore not swallowed.\r\n\r\nSince a `catch` handler typed to `Promise.RejectionError` is expected to be used very often, it has a neat shorthand:\r\n\r\n```js\r\n.error(function (e) {\r\n console.error(\"unable to read file, because: \", e.message);\r\n});\r\n```\r\n\r\nSee [API documentation for `.error()`](https://github.com/petkaantonov/bluebird/blob/master/API.md#error-rejectedhandler----promise)\r\n\r\nFinally, Bluebird also supports predicate-based filters. If you pass a\r\npredicate function instead of an error type, the predicate will receive\r\nthe error as an argument. The return result will be used determine whether\r\nthe error handler should be called.\r\n\r\nPredicates should allow for very fine grained control over caught errors:\r\npattern matching, error typesets with set operations and many other techniques\r\ncan be implemented on top of them.\r\n\r\nExample of using a predicate-based filter:\r\n\r\n```js\r\nvar Promise = require(\"bluebird\");\r\nvar request = Promise.promisify(require(\"request\"));\r\n\r\nfunction clientError(e) {\r\n return e.code >= 400 && e.code < 500;\r\n}\r\n\r\nrequest(\"http://www.google.com\").then(function(contents){\r\n console.log(contents);\r\n}).catch(clientError, function(e){\r\n //A client error like 400 Bad Request happened\r\n});\r\n```\r\n\r\n**Danger:** The JavaScript language allows throwing primitive values like strings. Throwing primitives can lead to worse or no stack traces. Primitives [are not exceptions](http://www.devthought.com/2011/12/22/a-string-is-not-an-error/). You should consider always throwing Error objects when handling exceptions.\r\n\r\n<hr>\r\n\r\n####How do long stack traces differ from e.g. Q?\r\n\r\nBluebird attempts to have more elaborate traces. Consider:\r\n\r\n```js\r\nError.stackTraceLimit = 25;\r\nQ.longStackSupport = true;\r\nQ().then(function outer() {\r\n return Q().then(function inner() {\r\n return Q().then(function evenMoreInner() {\r\n a.b.c.d();\r\n }).catch(function catcher(e){\r\n console.error(e.stack);\r\n });\r\n })\r\n});\r\n```\r\n\r\nYou will see\r\n\r\n ReferenceError: a is not defined\r\n at evenMoreInner (<anonymous>:7:13)\r\n From previous event:\r\n at inner (<anonymous>:6:20)\r\n\r\nCompare to:\r\n\r\n```js\r\nError.stackTraceLimit = 25;\r\nPromise.longStackTraces();\r\nPromise.resolve().then(function outer() {\r\n return Promise.resolve().then(function inner() {\r\n return Promise.resolve().then(function evenMoreInner() {\r\n a.b.c.d()\r\n }).catch(function catcher(e){\r\n console.error(e.stack);\r\n });\r\n });\r\n});\r\n```\r\n\r\n ReferenceError: a is not defined\r\n at evenMoreInner (<anonymous>:7:13)\r\n From previous event:\r\n at inner (<anonymous>:6:36)\r\n From previous event:\r\n at outer (<anonymous>:5:32)\r\n From previous event:\r\n at <anonymous>:4:21\r\n at Object.InjectedScript._evaluateOn (<anonymous>:572:39)\r\n at Object.InjectedScript._evaluateAndWrap (<anonymous>:531:52)\r\n at Object.InjectedScript.evaluate (<anonymous>:450:21)\r\n\r\n\r\nA better and more practical example of the differences can be seen in gorgikosev's [debuggability competition](https://github.com/spion/async-compare#debuggability).\r\n\r\n<hr>\r\n\r\n####Can I use long stack traces in production?\r\n\r\nProbably yes. Bluebird uses multiple innovative techniques to optimize long stack traces. Even with long stack traces, it is still way faster than similarly featured implementations that don't have long stack traces enabled and about same speed as minimal implementations. A slowdown of 4-5x is expected, not 50x.\r\n\r\nWhat techniques are used?\r\n\r\n#####V8 API second argument\r\n\r\nThis technique utilizes the [slightly under-documented](https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi#Stack_trace_collection_for_custom_exceptions) second argument of V8 `Error.captureStackTrace`. It turns out that the second argument can actually be used to make V8 skip all library internal stack frames [for free](https://github.com/v8/v8/blob/b5fabb9225e1eb1c20fd527b037e3f877296e52a/src/isolate.cc#L665). It only requires propagation of callers manually in library internals but this is not visible to you as user at all.\r\n\r\nWithout this technique, every promise (well not every, see second technique) created would have to waste time creating and collecting library internal frames which will just be thrown away anyway. It also allows one to use smaller stack trace limits because skipped frames are not counted towards the limit whereas with collecting everything upfront and filtering afterwards would likely have to use higher limits to get more user stack frames in.\r\n\r\n#####Sharing stack traces\r\n\r\nConsider:\r\n\r\n```js\r\nfunction getSomethingAsync(fileName) {\r\n return readFileAsync(fileName).then(function(){\r\n //...\r\n }).then(function() {\r\n //...\r\n }).then(function() {\r\n //...\r\n });\r\n}\r\n```\r\n\r\nEverytime you call this function it creates 4 promises and in a straight-forward long stack traces implementation it would collect 4 almost identical stack traces. Bluebird has a light weight internal data-structure (kcnown as context stack in the source code) to help tracking when traces can be re-used and this example would only collect one trace.\r\n\r\n#####Lazy formatting\r\n\r\nAfter a stack trace has been collected on an object, one must be careful not to reference the `.stack` property until necessary. Referencing the property causes\r\nan expensive format call and the stack property is turned into a string which uses much more memory.\r\n\r\nWhat about [Q #111](https://github.com/kriskowal/q/issues/111)?\r\n\r\nLong stack traces is not inherently the problem. For example with latest Q with stack traces disabled:\r\n\r\n```js\r\nvar Q = require(\"q\");\r\n\r\n\r\nfunction test(i){\r\n if (i <= 0){\r\n return Q.when('done')\r\n } else {\r\n return Q.when(i-1).then(test)\r\n }\r\n}\r\ntest(1000000000).then(function(output){console.log(output) });\r\n```\r\n\r\nAfter 2 minutes of running this, it will give:\r\n\r\n```js\r\nFATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory\r\n```\r\n\r\nSo the problem with this is how much absolute memory is used per promise - not whether long traces are enabled or not.\r\n\r\nFor some purpose, let's say 100000 parallel pending promises in memory at the same time is the maximum. You would then roughly use 100MB for them instead of 10MB with stack traces disabled.For comparison, just creating 100000 functions alone will use 14MB if they're closures. All numbers can be halved for 32-bit node.\r\n\r\n<hr>\r\n\r\n#Development\r\n\r\nFor development tasks such as running benchmarks or testing, you need to clone the repository and install dev-dependencies.\r\n\r\nInstall [node](http://nodejs.org/), [npm](https://npmjs.org/), and [grunt](http://gruntjs.com/).\r\n\r\n git clone [email protected]:petkaantonov/bluebird.git\r\n cd bluebird\r\n npm install\r\n\r\n##Testing\r\n\r\nTo run all tests, run `grunt test`. Note that 10 processes are created to run the tests in parallel. The stdout of tests is ignored by default and everything will stop at the first failure.\r\n\r\nIndividual files can be run with `grunt test --run=filename` where `filename` is a test file name in `/test` folder or `/test/mocha` folder. The `.js` prefix is not needed. The dots for AP compliance tests are not needed, so to run `/test/mocha/2.3.3.js` for instance:\r\n\r\n grunt test --run=233\r\n\r\nWhen trying to get a test to pass, run only that individual test file with `--verbose` to see the output from that test:\r\n\r\n grunt test --run=233 --verbose\r\n\r\nThe reason for the unusual way of testing is because the majority of tests are from different libraries using different testing frameworks and because it takes forever to test sequentially.\r\n\r\n\r\n###Testing in browsers\r\n\r\nTo test in browsers:\r\n\r\n cd browser\r\n setup\r\n\r\nThen open the `index.html` in your browser. Requires bash (on windows the mingw32 that comes with git works fine too).\r\n\r\nYou may also [visit the github hosted page](http://petkaantonov.github.io/bluebird/browser/).\r\n\r\nKeep the test tab active because some tests are timing-sensitive and will fail if the browser is throttling timeouts. Chrome will do this for example when the tab is not active.\r\n\r\n##Benchmarks\r\n\r\nTo run a benchmark, run the given command for a benchmark while on the project root. Requires bash (on windows the mingw32 that comes with git works fine too).\r\n\r\nNode 0.11.2+ is required to run the generator examples.\r\n\r\n###1\\. DoxBee sequential\r\n\r\nCurrently the most relevant benchmark is @gorkikosev's benchmark in the article [Analysis of generators and other async patterns in node](http://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html). The benchmark emulates a situation where n amount of users are making a request in parallel to execute some mixed async/sync action. The benchmark has been modified to include a warm-up phase to minimize any JITing during timed sections.\r\n\r\nCommand: `bench doxbee`\r\n\r\n###2\\. Made-up parallel\r\n\r\nThis made-up scenario runs 15 shimmed queries in parallel.\r\n\r\nCommand: `bench parallel`\r\n\r\n##Custom builds\r\n\r\nCustom builds for browsers are supported through a command-line utility.\r\n\r\n\r\n\r\n\r\n<table>\r\n <caption>The following features can be disabled</caption>\r\n <thead>\r\n <tr>\r\n <th>Feature(s)</th>\r\n <th>Command line identifier</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#any---promise\"><code>.any</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promiseanyarraydynamicpromise-values---promise\"><code>Promise.any</code></a></td><td><code>any</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#race---promise\"><code>.race</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promiseracearraypromise-promises---promise\"><code>Promise.race</code></a></td><td><code>race</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#callstring-propertyname--dynamic-arg---promise\"><code>.call</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#getstring-propertyname---promise\"><code>.get</code></a></td><td><code>call_get</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#filterfunction-filterer---promise\"><code>.filter</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisefilterarraydynamicpromise-values-function-filterer---promise\"><code>Promise.filter</code></a></td><td><code>filter</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#mapfunction-mapper---promise\"><code>.map</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisemaparraydynamicpromise-values-function-mapper---promise\"><code>Promise.map</code></a></td><td><code>map</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#reducefunction-reducer--dynamic-initialvalue---promise\"><code>.reduce</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisereducearraydynamicpromise-values-function-reducer--dynamic-initialvalue---promise\"><code>Promise.reduce</code></a></td><td><code>reduce</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#props---promise\"><code>.props</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisepropsobjectpromise-object---promise\"><code>Promise.props</code></a></td><td><code>props</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#settle---promise\"><code>.settle</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisesettlearraydynamicpromise-values---promise\"><code>Promise.settle</code></a></td><td><code>settle</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#someint-count---promise\"><code>.some</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisesomearraydynamicpromise-values-int-count---promise\"><code>Promise.some</code></a></td><td><code>some</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#nodeifyfunction-callback---promise\"><code>.nodeify</code></a></td><td><code>nodeify</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisecoroutinegeneratorfunction-generatorfunction---function\"><code>Promise.coroutine</code></a> and <a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisespawngeneratorfunction-generatorfunction---promise\"><code>Promise.spawn</code></a></td><td><code>generators</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#progression\">Progression</a></td><td><code>progress</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification\">Promisification</a></td><td><code>promisify</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#cancellation\">Cancellation</a></td><td><code>cancel</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#synchronous-inspection\">Synchronous inspection</a></td><td><code>synchronous_inspection</code></td></tr>\r\n <tr><td><a href=\"https://github.com/petkaantonov/bluebird/blob/master/API.md#timers\">Timers</a></td><td><code>timers</code></td></tr>\r\n\r\n </tbody>\r\n</table>\r\n\r\n\r\nMake sure you have cloned the repo somewhere and did `npm install` successfully.\r\n\r\nAfter that you can run:\r\n\r\n grunt build --features=\"core\"\r\n\r\n\r\nThe above builds the most minimal build you can get. You can add more features separated by spaces from the above list:\r\n\r\n grunt build --features=\"core filter map reduce\"\r\n\r\nThe custom build file will be found from `/js/browser/bluebird.js`. It will have a comment that lists the disabled and enabled features.\r\n\r\nNote that the build leaves the `/js/main` etc folders with same features so if you use the folder for node.js at the same time, don't forget to build\r\na full version afterwards (after having taken a copy of the bluebird.js somewhere):\r\n\r\n grunt build\r\n\r\n<hr>\r\n\r\n##For library authors\r\n\r\nBuilding a library that depends on bluebird? You should know about a few features.\r\n\r\nIf your library needs to do something obtrusive like adding or modifying methods on the `Promise` prototype, uses long stack traces or uses a custom unhandled rejection handler then... that's totally ok as long as you don't use `require(\"bluebird\")`. Instead you should create a file\r\nthat creates an isolated copy. For example, creating a file called `bluebird-extended.js` that contains:\r\n\r\n```js\r\n //NOTE the function call right after\r\nmodule.exports = require(\"bluebird/js/main/promise\")();\r\n```\r\n\r\nYour library can then use `var Promise = require(\"bluebird-extended\");` and do whatever it wants with it. Then if the application or other library uses their own bluebird promises they will all play well together because of Promises/A+ thenable assimilation magic.\r\n\r\nYou should also know about [`.nodeify()`](https://github.com/petkaantonov/bluebird/blob/master/API.md#nodeifyfunction-callback---promise) which makes it easy to provide a dual callback/promise API.\r\n\r\n<hr>\r\n\r\n##What is the sync build?\r\n\r\nYou may now use sync build by:\r\n\r\n var Promise = require(\"bluebird/zalgo\");\r\n\r\nThe sync build is provided to see how forced asynchronity affects benchmarks. It should not be used in real code due to the implied hazards.\r\n\r\nThe normal async build gives Promises/A+ guarantees about asynchronous resolution of promises. Some people think this affects performance or just plain love their code having a possibility\r\nof stack overflow errors and non-deterministic behavior.\r\n\r\nThe sync build skips the async call trampoline completely, e.g code like:\r\n\r\n async.invoke( this.fn, this, val );\r\n\r\nAppears as this in the sync build:\r\n\r\n this.fn(val);\r\n\r\nThis should pressure the CPU slightly less and thus the sync build should perform better. Indeed it does, but only marginally. The biggest performance boosts are from writing efficient Javascript, not from compromising determinism.\r\n\r\nNote that while some benchmarks are waiting for the next event tick, the CPU is actually not in use during that time. So the resulting benchmark result is not completely accurate because on node.js you only care about how much the CPU is taxed. Any time spent on CPU is time the whole process (or server) is paralyzed. And it is not graceful like it would be with threads.\r\n\r\n\r\n```js\r\nvar cache = new Map(); //ES6 Map or DataStructures/Map or whatever...\r\nfunction getResult(url) {\r\n var resolver = Promise.pending();\r\n if (cache.has(url)) {\r\n resolver.resolve(cache.get(url));\r\n }\r\n else {\r\n http.get(url, function(err, content) {\r\n if (err) resolver.reject(err);\r\n else {\r\n cache.set(url, content);\r\n resolver.resolve(content);\r\n }\r\n });\r\n }\r\n return resolver.promise;\r\n}\r\n\r\n\r\n\r\n//The result of console.log is truly random without async guarantees\r\nfunction guessWhatItPrints( url ) {\r\n var i = 3;\r\n getResult(url).then(function(){\r\n i = 4;\r\n });\r\n console.log(i);\r\n}\r\n```\r\n\r\n#Optimization guide\r\n\r\nArticles about optimization will be periodically posted in [the wiki section](https://github.com/petkaantonov/bluebird/wiki), polishing edits are welcome.\r\n\r\nA single cohesive guide compiled from the articles will probably be done eventually.\r\n\r\n#License\r\n\r\nCopyright (c) 2014 Petka Antonov\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:</p>\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n",
./node_modules/sequelize/node_modules/bluebird/README.md:Currently the most relevant benchmark is @gorkikosev's benchmark in the article [Analysis of generators and other async patterns in node](http://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html). The benchmark emulates a situation where n amount of users are making a request in parallel to execute some mixed async/sync action. The benchmark has been modified to include a warm-up phase to minimize any JITing during timed sections.
./node_modules/sequelize/node_modules/underscore.string/test/test_underscore/vendor/jquery.js: // Users should not attempt to inspect the internal events object using jQuery.data,
./node_modules/sequelize/node_modules/sql/test/index-tests.js: var query = sql.select(user.id).from(user).where(user.email.equals('[email protected]')).toNamedQuery('users');
./node_modules/sequelize/node_modules/sql/test/index-tests.js: assert.equal(query.name, 'users');
./node_modules/sequelize/node_modules/validator/package.json: "readme": "**validator.js** is a library of string validators and sanitizers.\n\n![tests][travis]\n\n### Server-side usage\n\nInstall the library with `npm install validator`\n\n```javascript\nvar validator = require('validator');\n\nvalidator.isEmail('[email protected]'); //=> true\n```\n\n### Client-side usage\n\nThe library can be loaded as a script and supports [AMD][amd]\n\n```html\n<script type=\"text/javascript\" src=\"validator.min.js\"></script>\n<script type=\"text/javascript\">\n validator.isEmail('[email protected]'); //=> true\n</script>\n```\n\nThe library can also be installed through [bower][bower]\n\n```bash\n$ bower install [email protected]:chriso/validator.js.git\n```\n\n### Validators\n\n- **equals(str, comparison)** - check if the string matches the comparison.\n- **contains(str, seed)** - check if the string contains the seed.\n- **matches(str, pattern [, modifiers])** - check if string matches the pattern. Either `matches('foo', /foo/i)` or `matches('foo', 'foo', 'i')`.\n- **isEmail(str)** - check if the string is an email.\n- **isURL(str)** - check if the string is an URL.\n- **isIP(str [, version])** - check if the string is an IP (version 4 or 6).\n- **isAlpha(str)** - check if the string contains only letters (a-zA-Z).\n- **isNumeric(str)** - check if the string contains only numbers.\n- **isAlphanumeric(str)** - check if the string contains only letters and numbers.\n- **isHexadecimal(str)** - check if the string is a hexadecimal number.\n- **isHexColor(str)** - check if the string is a hexadecimal color.\n- **isLowercase(str)** - check if the string is lowercase.\n- **isUppercase(str)** - check if the string is uppercase.\n- **isInt(str)** - check if the string is an integer.\n- **isFloat(str)** - check if the string is a float.\n- **isDivisibleBy(str, number)** - check if the string is a number that's divisible by another.\n- **isNull(str)** - check if the string is null.\n- **isLength(str, min [, max])** - check if the string's length falls in a range.\n- **isUUID(str [, version])** - check if the string is a UUID (version 3, 4 or 5).\n- **isDate(str)** - check if the string is a date.\n- **isAfter(str [, date])** - check if the string is a date that's after the specified date (defaults to now).\n- **isBefore(str [, date])** - check if the string is a date that's before the specified date.\n- **isIn(str, values)** - check if the string is in a array of allowed values.\n- **isCreditCard(str)** - check if the string is a credit card.\n- **isISBN(str [, version])** - check if the string is an ISBN (version 10 or 13).\n\n### Sanitizers\n\n- **toString(input)** - convert the input to a string.\n- **toDate(input)** - convert the input to a date, or `null` if the input is not a date.\n- **toFloat(input)** - convert the input to a float, or `NaN` if the input is not a float.\n- **toInt(input [, radix])** - convert the input to an integer, or `NaN` if the input is not an integer.\n- **toBoolean(input [, strict)** - convert the input to a boolean. Everything except for `'0'`, `'false'` and `''` returns `true`. In strict mode only `'1'` and `'true'` return `true`.\n- **trim(input [, chars])** - trim characters (whitespace by default) from both sides of the input.\n- **ltrim(input [, chars])** - trim characters from the left-side of the input.\n- **rtrim(input [, chars])** - trim characters from the right-side of the input.\n- **escape(input)** - replace `<`, `>`, `&` and `\"` with HTML entities.\n- **whitelist(input, chars)** - remove characters that do not appear in the whitelist.\n- **blacklist(input, chars)** - remove characters that appear in the blacklist.\n\n### Strings only\n\nThis library validates and sanitizes **strings** only. All input will be coerced to a string using the following rules\n\n- Call the `toString` property if available.\n- Replace `null`, `undefined` or `NaN` with an empty string.\n- Everything else is coerced with `input + ''`.\n\n### Extensions\n\nYou can add your own validators using `validator.extend(name, fn)`\n\n```javascript\nvalidator.extend('isFinite', function (str) {\n return isFinite(str);\n});\n```\n\nNote that the first argument will be automatically coerced to a string.\n\n### Deprecations\n\nVersion 3 of the library deprecated some functionality\n\n- **XSS sanitizer**: Here's [why][remove-xss]. Use [Google Caja][caja] instead.\n- **Entity encoding**: Use [fb55/entities][entities] or [substack/node-ent][node-ent].\n- **Validator chaining**: The API was too unintuitive. I'd prefer to let users create their own higher-level patterns from the provided building blocks.\n\n### Tests\n\n- `make test` - run the test suite.\n- `make test V=1` - run the test suite with added verbosity.\n- `make test TEST=pattern` - run tests that match a pattern.\n- `make coverage` - run a coverage analysis tool.\n- `make lint` - run a lint tool.\n\n### License (MIT)\n\nCopyright (c) 2014 Chris O'Hara <[email protected]>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[travis]: https://api.travis-ci.org/chriso/validator.js.png?branch=master\n[amd]: http://requirejs.org/docs/whyamd.html\n[bower]: http://bower.io/\n[remove-xss]: https://github.com/chriso/validator.js/commit/2d5d6999541add350fb396ef02dc42ca3215049e\n[caja]: https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/html-sanitizer.js\n[entities]: https://github.com/fb55/node-entities\n[node-ent]: https://github.com/substack/node-ent\n",
./node_modules/sequelize/node_modules/validator/README.md:- **Validator chaining**: The API was too unintuitive. I'd prefer to let users create their own higher-level patterns from the provided building blocks.
./node_modules/sequelize/node_modules/lingo/lib/inflection.js: * // => "users"
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab83c0,776,"doLoops /Users/bmc/src/node-postgres/benchmark/index.js:5",0x25e3e81828f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaadf60,416," /Users/bmc/src/node-postgres/benchmark/index.js:42",0x25e3e8182990,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa650c0,872,"/Users/bmc/src/node-postgres/benchmark/index.js",0x25e3e8182c00,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa65440,244,"/Users/bmc/src/node-postgres/benchmark/index.js",0x25e3e8182cf8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaadae0,716,"async.eachSeries /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:115",0x742a246e430,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7d800,296,"doParallel /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:196",0x742a246e610,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7d940,296,"doSeries /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:208",0x742a246e750,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7da80,296,"_console_fn /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:848",0x742a246f830,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7bd00,5472," /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:2",0x742a246ff58,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7d260,328,"/Users/bmc/src/node-postgres/node_modules/async/lib/async.js",0x742a24700a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7d3c0,244,"/Users/bmc/src/node-postgres/node_modules/async/lib/async.js",0x742a2470198,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa67a0,304," /Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js:47",0x742a2471498,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7de20,1844,"/Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js",0x742a24716c8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7e560,244,"/Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js",0x742a24717c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9a620,1096,"Client /Users/bmc/src/node-postgres/lib/client.js:12",0x742a2471ac0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa68e0,1268,"Client.connect /Users/bmc/src/node-postgres/lib/client.js:38",0x742a2471b60,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaab040,556,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x742a2471ca0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7e8e0,2136,"/Users/bmc/src/node-postgres/lib/client.js",0x742a24722b0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7f140,244,"/Users/bmc/src/node-postgres/lib/client.js",0x742a24723a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa98c00,352,"val /Users/bmc/src/node-postgres/lib/connection-parameters.js:6",0x742a247e070,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa987e0,1044,"ConnectionParameters /Users/bmc/src/node-postgres/lib/connection-parameters.js:32",0x742a247e1b0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa82040,984,"/Users/bmc/src/node-postgres/lib/connection-parameters.js",0x742a247e4c8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa82420,244,"/Users/bmc/src/node-postgres/lib/connection-parameters.js",0x742a247e5c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa83260,384,"/Users/bmc/src/node-postgres/lib/defaults.js",0x742a247f208,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa833e0,244,"/Users/bmc/src/node-postgres/lib/defaults.js",0x742a247f300,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86580,1988,"/Users/bmc/src/node-postgres/lib/query.js",0x742a2482b98,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86d60,244,"/Users/bmc/src/node-postgres/lib/query.js",0x742a2482c90,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86e60,708,"/Users/bmc/src/node-postgres/lib/result.js",0x742a2483140,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87140,244,"/Users/bmc/src/node-postgres/lib/result.js",0x742a2483238,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8ac80,324,"binaryParsers.init.typeParsers.binary.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:32",0x742a2483d68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8b280,220,"module.exports.getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:38",0x742a2483e08,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87be0,728,"/Users/bmc/src/node-postgres/lib/types/index.js",0x742a2483f90,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87ec0,244,"/Users/bmc/src/node-postgres/lib/types/index.js",0x742a2484088,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa89be0,228," /Users/bmc/src/node-postgres/lib/types/textParsers.js:100",0x742a2484988,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8a760,1304,"init /Users/bmc/src/node-postgres/lib/types/textParsers.js:162",0x742a2484c08,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa884a0,1512,"/Users/bmc/src/node-postgres/lib/types/textParsers.js",0x742a2484e18,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa88aa0,244,"/Users/bmc/src/node-postgres/lib/types/textParsers.js",0x742a2484f10,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa88fc0,784,"/Users/bmc/src/node-postgres/lib/types/arrayParser.js",0x742a24adf80,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa892e0,244,"/Users/bmc/src/node-postgres/lib/types/arrayParser.js",0x742a24ae078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8ae80,1024,"init /Users/bmc/src/node-postgres/lib/types/binaryParsers.js:241",0x742a24aef30,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8a140,1312,"/Users/bmc/src/node-postgres/lib/types/binaryParsers.js",0x742a24af110,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8a660,244,"/Users/bmc/src/node-postgres/lib/types/binaryParsers.js",0x742a24af208,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8b580,788,"/Users/bmc/src/node-postgres/lib/utils.js",0x742a24b0228,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8b8a0,244,"/Users/bmc/src/node-postgres/lib/utils.js",0x742a24b0320,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9bc40,744,"Connection /Users/bmc/src/node-postgres/lib/connection.js:11",0x742a24b0b60,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa6de0,988,"Connection.connect /Users/bmc/src/node-postgres/lib/connection.js:29",0x742a24b0c00,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa7ea0,304,"Connection.attachListeners /Users/bmc/src/node-postgres/lib/connection.js:93",0x742a24b0ca0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8bb20,4364,"/Users/bmc/src/node-postgres/lib/connection.js",0x742a24b25e0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8cc40,244,"/Users/bmc/src/node-postgres/lib/connection.js",0x742a24b26d8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c100,360,"module.exports /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:4",0x742a24b29e8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8cd40,1488,"/Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js",0x742a24b33d8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8d320,244,"/Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js",0x742a24b34d0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8dac0,1952,"/Users/bmc/src/node-postgres/lib/copystream.js",0x742a24b5460,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8e260,244,"/Users/bmc/src/node-postgres/lib/copystream.js",0x742a24b5558,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa30c0,328,"buffers.readyForQuery /Users/bmc/src/node-postgres/test/test-buffers.js:5",0x742a24b5fe8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2f80,296,"buffers.commandComplete /Users/bmc/src/node-postgres/test/test-buffers.js:44",0x742a24b63a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c280,488,"buffers.rowDescription /Users/bmc/src/node-postgres/test/test-buffers.js:50",0x742a24b6448,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2120,488,"buffers.dataRow /Users/bmc/src/node-postgres/test/test-buffers.js:66",0x742a24b64e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3020,272,"buffers.parseComplete /Users/bmc/src/node-postgres/test/test-buffers.js:100",0x742a24b6768,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3140,272,"buffers.bindComplete /Users/bmc/src/node-postgres/test/test-buffers.js:104",0x742a24b6808,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3260,272,"buffers.portalSuspended /Users/bmc/src/node-postgres/test/test-buffers.js:120",0x742a24b69e8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8e4e0,1436,"/Users/bmc/src/node-postgres/test/test-buffers.js",0x742a24b6b38,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8ea80,244,"/Users/bmc/src/node-postgres/test/test-buffers.js",0x742a24b6c30,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa4e60,728,"expect /Users/bmc/src/node-postgres/test/test-helper.js:134",0x742a24b7520,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8eca0,2520,"/Users/bmc/src/node-postgres/test/test-helper.js",0x742a24b7a50,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8f680,244,"/Users/bmc/src/node-postgres/test/test-helper.js",0x742a24b7b48,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa9c480,228,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x742a24b7ed0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9cca0,280,"p.add /Users/bmc/src/node-postgres/test/buffer-list.js:6",0x742a24b7f70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c580,404,"p.addInt16 /Users/bmc/src/node-postgres/test/buffer-list.js:11",0x742a24b8010,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9ffa0,272,"p.getByteLength /Users/bmc/src/node-postgres/test/buffer-list.js:15",0x742a24b80b0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9e140,480,"p.addInt32 /Users/bmc/src/node-postgres/test/buffer-list.js:21",0x742a24b8150,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9d100,372,"p.addCString /Users/bmc/src/node-postgres/test/buffer-list.js:30",0x742a24b81f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa1100,252,"p.addChar /Users/bmc/src/node-postgres/test/buffer-list.js:38",0x742a24b8290,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9fd20,628,"p.join /Users/bmc/src/node-postgres/test/buffer-list.js:42",0x742a24b8330,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8f900,856,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x742a24b84f0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8fc60,244,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x742a24b85e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa94740,412,"PG /Users/bmc/src/node-postgres/lib/index.js:9",0x742a24b8c90,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8ffc0,1584,"/Users/bmc/src/node-postgres/lib/index.js",0x742a24b9158,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa90600,244,"/Users/bmc/src/node-postgres/lib/index.js",0x742a24b9250,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa93d80,812,"/Users/bmc/src/node-postgres/lib/pool.js",0x742a24bac28,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa940c0,244,"/Users/bmc/src/node-postgres/lib/pool.js",0x742a24bad20,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa941c0,360,"/Users/bmc/src/node-postgres/node_modules/generic-pool/lib/generic-pool.js",0x742a24bb300,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa94340,244,"/Users/bmc/src/node-postgres/node_modules/generic-pool/lib/generic-pool.js",0x742a24bb3f8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa98380,860,"/Users/bmc/src/node-postgres/test/cli.js",0x742a24bc9a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa986e0,244,"/Users/bmc/src/node-postgres/test/cli.js",0x742a24bca98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9a2a0,256,"MemoryStream /Users/bmc/src/node-postgres/test/unit/test-helper.js:4",0x742a24cd1d8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa99e40,848,"/Users/bmc/src/node-postgres/test/unit/test-helper.js",0x742a24cd4a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa9a1a0,244,"/Users/bmc/src/node-postgres/test/unit/test-helper.js",0x742a24cd598,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9cea0,592," /Users/bmc/src/node-postgres/test/test-buffers.js:54",0x742a24cdac8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa1460,308," /Users/bmc/src/node-postgres/test/buffer-list.js:54",0x742a24ce0d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa08c0,216," /Users/bmc/src/node-postgres/test/buffer-list.js:16",0x742a24ce1f8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2480,424," /Users/bmc/src/node-postgres/test/test-buffers.js:70",0x742a24ce5e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa44e0,748,"module.exports /Users/bmc/src/node-buffer-slice/index.js:3",0x742a24cec38,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaa4240,256,"/Users/bmc/src/node-buffer-slice/index.js",0x742a24ced58,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaa4340,244,"/Users/bmc/src/node-buffer-slice/index.js",0x742a24cee50,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa9ba0,568," /Users/bmc/src/node-postgres/test/test-helper.js:141",0x742a24cf1f8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa9300,840," /Users/bmc/src/node-postgres/lib/client.js:87",0x742a24cfcf0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaaee0,352," /Users/bmc/src/node-postgres/lib/client.js:145",0x742a24cfd90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaddc0,408,"iterate /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:121",0x742a24d1620,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab4ba0,304," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:61",0x742a24d1e88,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaae100,2088,"/Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js",0x742a24d20d0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaae940,244,"/Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js",0x742a24d21c8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab7380,232,"module.exports /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:63",0x742a24d29f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90700,436,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa908c0,416," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90a60,448,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90c20,944,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b360,476,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b600,316,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b800,304,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b940,520,"Query.requiresPreparation /Users/bmc/src/node-postgres/lib/query.js:37",0x14a48366bb08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa175e0,1248,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa17b80,276,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab86e0,784,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8a00,552,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8c40,456,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9160,212,"writeString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:38",0x14a48368f060,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9240,460,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9420,428,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9680,544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab99e0,716,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9e20,532,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaba700,1272,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabacc0,420,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb4c0,340,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb9e0,344,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabbcc0,536,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc240,260,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc360,360,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc4e0,248,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc5e0,336,"Writer.join /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:115",0x14a48368f600,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc740,248,"Writer.clear /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:91",0x14a48368f4c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc840,224,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcc40,400," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcde0,516,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabd180,2524,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabdce0,320,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabfd80,524,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabffa0,320,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0520,708,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0800,532,"Connection.parseCString /Users/bmc/src/node-postgres/lib/connection.js:608",0x14a48368e910,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1c00,228," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1d00,676,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac23a0,292,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2ce0,756,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2fe0,316,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac35c0,228," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac36c0,776,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac39e0,256,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3ae0,224,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3bc0,212,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3e00,224,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac4560,232," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5b00,232,"Connection.parseC /Users/bmc/src/node-postgres/lib/connection.js:465",0x14a48368e0f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ca0,304," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5de0,224,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ec0,648,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6e40,304,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6f80,232,"Connection.parseZ /Users/bmc/src/node-postgres/lib/connection.js:470",0x14a48368e190,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7080,212,"Connection.readChar /Users/bmc/src/node-postgres/lib/connection.js:584",0x14a48368e5f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7200,404,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac73a0,304," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:65",0x14a4836bc370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7640,212," /Users/bmc/src/node-postgres/benchmark/index.js:30",0x14a4836bc218,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad16e0,320,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad1820,508,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad2660,316,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad27a0,560,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad2c40,456,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad2e20,888,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad31a0,320,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad32e0,508,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4040,212,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4120,276,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4240,716,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4520,2106,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad6520,428,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad66e0,739,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad69e0,544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad80a0,1544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9760,516,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9980,1224,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9e60,2524,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefada840,232,"Connection.parseC /Users/bmc/src/node-postgres/lib/connection.js:465",0x14a48368e0f0,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefada940,532,"Connection.parseCString /Users/bmc/src/node-postgres/lib/connection.js:608",0x14a48368e910,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefadab60,232,"Connection.parseZ /Users/bmc/src/node-postgres/lib/connection.js:470",0x14a48368e190,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefadac60,212,"Connection.readChar /Users/bmc/src/node-postgres/lib/connection.js:584",0x14a48368e5f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadc700,4223,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadd780,228," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadd880,278," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadd9a0,256,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddaa0,369,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddc20,224,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddd00,288,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadde20,224,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddf00,264,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefade960,248,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefadea60,336,"Writer.join /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:115",0x14a48368f600,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefadebc0,248,"Writer.clear /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:91",0x14a48368f4c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadf700,2078,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadff20,360,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae00a0,1399,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0620,224,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0700,264,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0820,552,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefae0a60,212,"writeString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:38",0x14a48368f060,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0b40,1360,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae10a0,460,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1280,1034,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae16a0,344,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1800,1044,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1c20,536,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae28c0,1496,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae2ea0,260,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae2fc0,962,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae33a0,708,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae40e0,4092,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae50e0,292,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5220,396,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae53c0,232," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae54c0,282," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae57c0,556,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5a00,1202,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab83c0,776,"doLoops /Users/bmc/src/node-postgres/benchmark/index.js:5",0x25e3e81828f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaadf60,416," /Users/bmc/src/node-postgres/benchmark/index.js:42",0x25e3e8182990,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa650c0,872,"/Users/bmc/src/node-postgres/benchmark/index.js",0x25e3e8182c00,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa65440,244,"/Users/bmc/src/node-postgres/benchmark/index.js",0x25e3e8182cf8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaadae0,716,"async.eachSeries /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:115",0x14a4836588f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7d800,296,"doParallel /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:196",0x14a483658ad0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7d940,296,"doSeries /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:208",0x14a483658c10,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7da80,296,"_console_fn /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:848",0x14a483659cf0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7bd00,5472," /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:2",0x14a48365a418,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7d260,328,"/Users/bmc/src/node-postgres/node_modules/async/lib/async.js",0x14a48365a560,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7d3c0,244,"/Users/bmc/src/node-postgres/node_modules/async/lib/async.js",0x14a48365a658,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa67a0,304," /Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js:47",0x14a48365b790,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7de20,1844,"/Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js",0x14a48365b9c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7e560,244,"/Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js",0x14a48365bab8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9a620,1096,"Client /Users/bmc/src/node-postgres/lib/client.js:12",0x14a48365bbd0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa68e0,1268,"Client.connect /Users/bmc/src/node-postgres/lib/client.js:38",0x14a48365bc70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaab040,556,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90a60,448,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7e8e0,2136,"/Users/bmc/src/node-postgres/lib/client.js",0x14a48365c3c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7f140,244,"/Users/bmc/src/node-postgres/lib/client.js",0x14a48365c4b8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa98c00,352,"val /Users/bmc/src/node-postgres/lib/connection-parameters.js:6",0x14a483667f68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa987e0,1044,"ConnectionParameters /Users/bmc/src/node-postgres/lib/connection-parameters.js:32",0x14a4836680a8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa82040,984,"/Users/bmc/src/node-postgres/lib/connection-parameters.js",0x14a4836683c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa82420,244,"/Users/bmc/src/node-postgres/lib/connection-parameters.js",0x14a4836684b8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa83260,384,"/Users/bmc/src/node-postgres/lib/defaults.js",0x14a483668f98,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa833e0,244,"/Users/bmc/src/node-postgres/lib/defaults.js",0x14a483669090,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90c20,944,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b940,520,"Query.requiresPreparation /Users/bmc/src/node-postgres/lib/query.js:37",0x14a48366bb08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1d00,676,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac36c0,776,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5de0,224,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7200,404,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b800,304,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa17b80,276,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb9e0,344,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa175e0,1248,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86580,1988,"/Users/bmc/src/node-postgres/lib/query.js",0x14a48366c470,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86d60,244,"/Users/bmc/src/node-postgres/lib/query.js",0x14a48366c568,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b600,316,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ec0,648,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3e00,224,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86e60,708,"/Users/bmc/src/node-postgres/lib/result.js",0x14a48366c8f0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87140,244,"/Users/bmc/src/node-postgres/lib/result.js",0x14a48366c9e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3bc0,212,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac23a0,292,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8ac80,324,"binaryParsers.init.typeParsers.binary.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:32",0x14a48366d318,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8b280,220,"module.exports.getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:38",0x14a48366d3b8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87be0,728,"/Users/bmc/src/node-postgres/lib/types/index.js",0x14a48366d540,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87ec0,244,"/Users/bmc/src/node-postgres/lib/types/index.js",0x14a48366d638,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa89be0,228," /Users/bmc/src/node-postgres/lib/types/textParsers.js:100",0x14a48366ddb0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3ae0,224,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8a760,1304,"init /Users/bmc/src/node-postgres/lib/types/textParsers.js:162",0x14a48366e030,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa884a0,1512,"/Users/bmc/src/node-postgres/lib/types/textParsers.js",0x14a48366e240,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa88aa0,244,"/Users/bmc/src/node-postgres/lib/types/textParsers.js",0x14a48366e338,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa88fc0,784,"/Users/bmc/src/node-postgres/lib/types/arrayParser.js",0x14a48368aae8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa892e0,244,"/Users/bmc/src/node-postgres/lib/types/arrayParser.js",0x14a48368abe0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8ae80,1024,"init /Users/bmc/src/node-postgres/lib/types/binaryParsers.js:241",0x14a48368b900,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8a140,1312,"/Users/bmc/src/node-postgres/lib/types/binaryParsers.js",0x14a48368bae0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8a660,244,"/Users/bmc/src/node-postgres/lib/types/binaryParsers.js",0x14a48368bbd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac39e0,256,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b360,476,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9e20,532,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8b580,788,"/Users/bmc/src/node-postgres/lib/utils.js",0x14a48368caa0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8b8a0,244,"/Users/bmc/src/node-postgres/lib/utils.js",0x14a48368cb98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9bc40,744,"Connection /Users/bmc/src/node-postgres/lib/connection.js:11",0x14a48368d150,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa6de0,988,"Connection.connect /Users/bmc/src/node-postgres/lib/connection.js:29",0x14a48368d1f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa7ea0,304,"Connection.attachListeners /Users/bmc/src/node-postgres/lib/connection.js:93",0x14a48368d290,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9420,428,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab86e0,784,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaba700,1272,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabbcc0,536,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc240,260,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6e40,304,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb4c0,340,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcde0,516,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabd180,2524,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5b00,232,"Connection.parseC /Users/bmc/src/node-postgres/lib/connection.js:465",0x14a48368e0f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6f80,232,"Connection.parseZ /Users/bmc/src/node-postgres/lib/connection.js:470",0x14a48368e190,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabfd80,524,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0520,708,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2ce0,756,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7080,212,"Connection.readChar /Users/bmc/src/node-postgres/lib/connection.js:584",0x14a48368e5f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabdce0,320,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabffa0,320,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2fe0,316,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0800,532,"Connection.parseCString /Users/bmc/src/node-postgres/lib/connection.js:608",0x14a48368e910,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8bb20,4364,"/Users/bmc/src/node-postgres/lib/connection.js",0x14a48368ebd0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8cc40,244,"/Users/bmc/src/node-postgres/lib/connection.js",0x14a48368ecc8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c100,360,"module.exports /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:4",0x14a48368ede0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8c40,456,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab99e0,716,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9240,460,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9160,212,"writeString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:38",0x14a48368f060,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8a00,552,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabacc0,420,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc360,360,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc740,248,"Writer.clear /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:91",0x14a48368f4c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9680,544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc5e0,336,"Writer.join /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:115",0x14a48368f600,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc4e0,248,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8cd40,1488,"/Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js",0x14a48368f7d0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8d320,244,"/Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js",0x14a48368f8c8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8dac0,1952,"/Users/bmc/src/node-postgres/lib/copystream.js",0x14a483691750,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8e260,244,"/Users/bmc/src/node-postgres/lib/copystream.js",0x14a483691848,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa30c0,328,"buffers.readyForQuery /Users/bmc/src/node-postgres/test/test-buffers.js:5",0x14a4836920d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2f80,296,"buffers.commandComplete /Users/bmc/src/node-postgres/test/test-buffers.js:44",0x14a483692490,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c280,488,"buffers.rowDescription /Users/bmc/src/node-postgres/test/test-buffers.js:50",0x14a483692530,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2120,488,"buffers.dataRow /Users/bmc/src/node-postgres/test/test-buffers.js:66",0x14a4836925d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3020,272,"buffers.parseComplete /Users/bmc/src/node-postgres/test/test-buffers.js:100",0x14a483692850,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3140,272,"buffers.bindComplete /Users/bmc/src/node-postgres/test/test-buffers.js:104",0x14a4836928f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3260,272,"buffers.portalSuspended /Users/bmc/src/node-postgres/test/test-buffers.js:120",0x14a483692ad0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8e4e0,1436,"/Users/bmc/src/node-postgres/test/test-buffers.js",0x14a483692c20,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8ea80,244,"/Users/bmc/src/node-postgres/test/test-buffers.js",0x14a483692d18,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa4e60,728,"expect /Users/bmc/src/node-postgres/test/test-helper.js:134",0x14a4836934e0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8eca0,2520,"/Users/bmc/src/node-postgres/test/test-helper.js",0x14a483693a10,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8f680,244,"/Users/bmc/src/node-postgres/test/test-helper.js",0x14a483693b08,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa9c480,228,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x14a483693cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9cca0,280,"p.add /Users/bmc/src/node-postgres/test/buffer-list.js:6",0x14a483693d58,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c580,404,"p.addInt16 /Users/bmc/src/node-postgres/test/buffer-list.js:11",0x14a483693df8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9ffa0,272,"p.getByteLength /Users/bmc/src/node-postgres/test/buffer-list.js:15",0x14a483693e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9e140,480,"p.addInt32 /Users/bmc/src/node-postgres/test/buffer-list.js:21",0x14a483693f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9d100,372,"p.addCString /Users/bmc/src/node-postgres/test/buffer-list.js:30",0x14a483693fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa1100,252,"p.addChar /Users/bmc/src/node-postgres/test/buffer-list.js:38",0x14a483694078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9fd20,628,"p.join /Users/bmc/src/node-postgres/test/buffer-list.js:42",0x14a483694118,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8f900,856,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x14a4836942d8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8fc60,244,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x14a4836943d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa94740,412,"PG /Users/bmc/src/node-postgres/lib/index.js:9",0x14a4836948a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8ffc0,1584,"/Users/bmc/src/node-postgres/lib/index.js",0x14a483694d68,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa90600,244,"/Users/bmc/src/node-postgres/lib/index.js",0x14a483694e60,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa93d80,812,"/Users/bmc/src/node-postgres/lib/pool.js",0x14a483696558,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa940c0,244,"/Users/bmc/src/node-postgres/lib/pool.js",0x14a483696650,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa941c0,360,"/Users/bmc/src/node-postgres/node_modules/generic-pool/lib/generic-pool.js",0x14a483696930,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa94340,244,"/Users/bmc/src/node-postgres/node_modules/generic-pool/lib/generic-pool.js",0x14a483696a28,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa98380,860,"/Users/bmc/src/node-postgres/test/cli.js",0x14a483697dc8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa986e0,244,"/Users/bmc/src/node-postgres/test/cli.js",0x14a483697ec0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9a2a0,256,"MemoryStream /Users/bmc/src/node-postgres/test/unit/test-helper.js:4",0x14a4836a3f08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc840,224,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa99e40,848,"/Users/bmc/src/node-postgres/test/unit/test-helper.js",0x14a4836a41d0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa9a1a0,244,"/Users/bmc/src/node-postgres/test/unit/test-helper.js",0x14a4836a42c8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9cea0,592," /Users/bmc/src/node-postgres/test/test-buffers.js:54",0x14a4836a4600,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa1460,308," /Users/bmc/src/node-postgres/test/buffer-list.js:54",0x14a4836a4b90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa08c0,216," /Users/bmc/src/node-postgres/test/buffer-list.js:16",0x14a4836a4cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2480,424," /Users/bmc/src/node-postgres/test/test-buffers.js:70",0x14a4836a50a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa44e0,748,"module.exports /Users/bmc/src/node-buffer-slice/index.js:3",0x14a4836a54e0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaa4240,256,"/Users/bmc/src/node-buffer-slice/index.js",0x14a4836a5600,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaa4340,244,"/Users/bmc/src/node-buffer-slice/index.js",0x14a4836a56f8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa9ba0,568," /Users/bmc/src/node-postgres/test/test-helper.js:141",0x14a4836a5a58,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa9300,840," /Users/bmc/src/node-postgres/lib/client.js:87",0x14a4836a6490,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaaee0,352," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcc40,400," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1c00,228," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac35c0,228," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac4560,232," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ca0,304," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaddc0,408,"iterate /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:121",0x14a4836a7a50,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab4ba0,304," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:61",0x14a4836a81c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaae100,2088,"/Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js",0x14a4836a8408,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaae940,244,"/Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js",0x14a4836a8500,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab7380,232,"module.exports /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:63",0x14a4836a8770,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa908c0,416," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaecfa0,808,"done /Users/bmc/src/node-postgres/benchmark/index.js:9",0x14a4836a8bd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90700,436,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7640,212," /Users/bmc/src/node-postgres/benchmark/index.js:30",0x14a4836bc218,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac73a0,304," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:65",0x14a4836bc370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf00c0,256," /Users/bmc/src/node-postgres/benchmark/index.js:19",0x14a4836d0ed8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5a00,1202,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae54c0,282," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5220,396,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae40e0,4092,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae2fc0,962,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae28c0,1496,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1800,1044,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1280,1034,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0b40,1360,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0700,264,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae00a0,1399,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadf700,2078,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddf00,264,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddd00,288,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddaa0,369,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadd880,278," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadc700,4223,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9980,1224,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad80a0,1544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad66e0,739,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4520,2106,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4120,276,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad32e0,508,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad2e20,888,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad27a0,560,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad1820,508,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9e60,756,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefada160,2281,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf0400,776,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf0720,1478,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf39e0,352," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf3b40,621," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf84c0,436,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf8780,579,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf89e0,416," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf8b80,948," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf8f40,448,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9100,1657,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9780,476,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9960,896,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9de0,316,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9f20,1048,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafa4c0,304,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,~
./node_modules/pg/v8.log:code-creation,Function,0x3f2aefafa600,520,"Query.requiresPreparation /Users/bmc/src/node-postgres/lib/query.js:37",0x14a48366bb08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafa820,946,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafabe0,276,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafad00,368,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafae80,532,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafb0a0,818,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafb780,420,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafb940,1508,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafbf40,340,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc0a0,1241,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc580,228," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc680,382," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc800,304," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc940,681," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafcc00,224,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafcce0,364,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafce60,648,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafdb20,1822,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe240,304,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe380,1137,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe800,404,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe9a0,638,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09160,400," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09300,1007," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09700,1647,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09d80,1484,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc0b6a0,944,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc0e760,4562,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc12d00,676,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc139e0,1308,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab83c0,776,"doLoops /Users/bmc/src/node-postgres/benchmark/index.js:5",0x25e3e81828f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaadf60,416," /Users/bmc/src/node-postgres/benchmark/index.js:42",0x25e3e8182990,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa650c0,872,"/Users/bmc/src/node-postgres/benchmark/index.js",0x25e3e8182c00,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaadae0,716,"async.eachSeries /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:115",0x14a4836588f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7d800,296,"doParallel /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:196",0x14a483658ad0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7d940,296,"doSeries /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:208",0x14a483658c10,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7da80,296,"_console_fn /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:848",0x14a483659cf0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa7bd00,5472," /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:2",0x14a48365a418,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7d260,328,"/Users/bmc/src/node-postgres/node_modules/async/lib/async.js",0x14a48365a560,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa67a0,304," /Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js:47",0x14a48365b790,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7de20,1844,"/Users/bmc/src/node-postgres/benchmark/simple-query-parsing.js",0x14a48365b9c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9a620,1096,"Client /Users/bmc/src/node-postgres/lib/client.js:12",0x14a48365bbd0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa68e0,1268,"Client.connect /Users/bmc/src/node-postgres/lib/client.js:38",0x14a48365bc70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaab040,556,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90a60,448,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa7e8e0,2136,"/Users/bmc/src/node-postgres/lib/client.js",0x14a48365c3c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa98c00,352,"val /Users/bmc/src/node-postgres/lib/connection-parameters.js:6",0x14a483667f68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa987e0,1044,"ConnectionParameters /Users/bmc/src/node-postgres/lib/connection-parameters.js:32",0x14a4836680a8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa82040,984,"/Users/bmc/src/node-postgres/lib/connection-parameters.js",0x14a4836683c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90c20,944,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b940,520,"Query.requiresPreparation /Users/bmc/src/node-postgres/lib/query.js:37",0x14a48366bb08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1d00,676,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac36c0,776,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5de0,224,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7200,404,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b800,304,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa17b80,276,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb9e0,344,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa175e0,1248,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86580,1988,"/Users/bmc/src/node-postgres/lib/query.js",0x14a48366c470,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b600,316,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ec0,648,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3e00,224,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa86e60,708,"/Users/bmc/src/node-postgres/lib/result.js",0x14a48366c8f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3bc0,212,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac23a0,292,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8ac80,324,"binaryParsers.init.typeParsers.binary.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:32",0x14a48366d318,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8b280,220,"module.exports.getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:38",0x14a48366d3b8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa87be0,728,"/Users/bmc/src/node-postgres/lib/types/index.js",0x14a48366d540,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa89be0,228," /Users/bmc/src/node-postgres/lib/types/textParsers.js:100",0x14a48366ddb0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3ae0,224,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8a760,1304,"init /Users/bmc/src/node-postgres/lib/types/textParsers.js:162",0x14a48366e030,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa884a0,1512,"/Users/bmc/src/node-postgres/lib/types/textParsers.js",0x14a48366e240,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa88fc0,784,"/Users/bmc/src/node-postgres/lib/types/arrayParser.js",0x14a48368aae8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa8ae80,1024,"init /Users/bmc/src/node-postgres/lib/types/binaryParsers.js:241",0x14a48368b900,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8a140,1312,"/Users/bmc/src/node-postgres/lib/types/binaryParsers.js",0x14a48368bae0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac39e0,256,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b360,476,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9e20,532,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8b580,788,"/Users/bmc/src/node-postgres/lib/utils.js",0x14a48368caa0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9bc40,744,"Connection /Users/bmc/src/node-postgres/lib/connection.js:11",0x14a48368d150,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa6de0,988,"Connection.connect /Users/bmc/src/node-postgres/lib/connection.js:29",0x14a48368d1f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa7ea0,304,"Connection.attachListeners /Users/bmc/src/node-postgres/lib/connection.js:93",0x14a48368d290,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9420,428,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab86e0,784,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaba700,1272,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabbcc0,536,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc240,260,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6e40,304,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb4c0,340,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcde0,516,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabd180,2524,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5b00,232,"Connection.parseC /Users/bmc/src/node-postgres/lib/connection.js:465",0x14a48368e0f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6f80,232,"Connection.parseZ /Users/bmc/src/node-postgres/lib/connection.js:470",0x14a48368e190,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabfd80,524,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0520,708,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2ce0,756,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7080,212,"Connection.readChar /Users/bmc/src/node-postgres/lib/connection.js:584",0x14a48368e5f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabdce0,320,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabffa0,320,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2fe0,316,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0800,532,"Connection.parseCString /Users/bmc/src/node-postgres/lib/connection.js:608",0x14a48368e910,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8bb20,4364,"/Users/bmc/src/node-postgres/lib/connection.js",0x14a48368ebd0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c100,360,"module.exports /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:4",0x14a48368ede0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8c40,456,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab99e0,716,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9240,460,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9160,212,"writeString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:38",0x14a48368f060,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8a00,552,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabacc0,420,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc360,360,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc740,248,"Writer.clear /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:91",0x14a48368f4c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9680,544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc5e0,336,"Writer.join /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:115",0x14a48368f600,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc4e0,248,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8cd40,1488,"/Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js",0x14a48368f7d0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8dac0,1952,"/Users/bmc/src/node-postgres/lib/copystream.js",0x14a483691750,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa30c0,328,"buffers.readyForQuery /Users/bmc/src/node-postgres/test/test-buffers.js:5",0x14a4836920d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2f80,296,"buffers.commandComplete /Users/bmc/src/node-postgres/test/test-buffers.js:44",0x14a483692490,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c280,488,"buffers.rowDescription /Users/bmc/src/node-postgres/test/test-buffers.js:50",0x14a483692530,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2120,488,"buffers.dataRow /Users/bmc/src/node-postgres/test/test-buffers.js:66",0x14a4836925d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3020,272,"buffers.parseComplete /Users/bmc/src/node-postgres/test/test-buffers.js:100",0x14a483692850,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3140,272,"buffers.bindComplete /Users/bmc/src/node-postgres/test/test-buffers.js:104",0x14a4836928f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab3260,272,"buffers.portalSuspended /Users/bmc/src/node-postgres/test/test-buffers.js:120",0x14a483692ad0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8e4e0,1436,"/Users/bmc/src/node-postgres/test/test-buffers.js",0x14a483692c20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa4e60,728,"expect /Users/bmc/src/node-postgres/test/test-helper.js:134",0x14a4836934e0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8eca0,2520,"/Users/bmc/src/node-postgres/test/test-helper.js",0x14a483693a10,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa9c480,228,"/Users/bmc/src/node-postgres/test/buffer-list.js",0x14a483693cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9cca0,280,"p.add /Users/bmc/src/node-postgres/test/buffer-list.js:6",0x14a483693d58,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9c580,404,"p.addInt16 /Users/bmc/src/node-postgres/test/buffer-list.js:11",0x14a483693df8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9ffa0,272,"p.getByteLength /Users/bmc/src/node-postgres/test/buffer-list.js:15",0x14a483693e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9e140,480,"p.addInt32 /Users/bmc/src/node-postgres/test/buffer-list.js:21",0x14a483693f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9d100,372,"p.addCString /Users/bmc/src/node-postgres/test/buffer-list.js:30",0x14a483693fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa1100,252,"p.addChar /Users/bmc/src/node-postgres/test/buffer-list.js:38",0x14a483694078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9fd20,628,"p.join /Users/bmc/src/node-postgres/test/buffer-list.js:42",0x14a483694118,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa94740,412,"PG /Users/bmc/src/node-postgres/lib/index.js:9",0x14a4836948a0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa8ffc0,1584,"/Users/bmc/src/node-postgres/lib/index.js",0x14a483694d68,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa93d80,812,"/Users/bmc/src/node-postgres/lib/pool.js",0x14a483696558,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa941c0,360,"/Users/bmc/src/node-postgres/node_modules/generic-pool/lib/generic-pool.js",0x14a483696930,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9a2a0,256,"MemoryStream /Users/bmc/src/node-postgres/test/unit/test-helper.js:4",0x14a4836a3f08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc840,224,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefa99e40,848,"/Users/bmc/src/node-postgres/test/unit/test-helper.js",0x14a4836a41d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa9cea0,592," /Users/bmc/src/node-postgres/test/test-buffers.js:54",0x14a4836a4600,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa1460,308," /Users/bmc/src/node-postgres/test/buffer-list.js:54",0x14a4836a4b90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa08c0,216," /Users/bmc/src/node-postgres/test/buffer-list.js:16",0x14a4836a4cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa2480,424," /Users/bmc/src/node-postgres/test/test-buffers.js:70",0x14a4836a50a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa44e0,748,"module.exports /Users/bmc/src/node-buffer-slice/index.js:3",0x14a4836a54e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa9ba0,568," /Users/bmc/src/node-postgres/test/test-helper.js:141",0x14a4836a5a58,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaa9300,840," /Users/bmc/src/node-postgres/lib/client.js:87",0x14a4836a6490,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaaee0,352," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcc40,400," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1c00,228," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac35c0,228," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac4560,232," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ca0,304," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaddc0,408,"iterate /Users/bmc/src/node-postgres/node_modules/async/lib/async.js:121",0x14a4836a7a50,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab4ba0,304," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:61",0x14a4836a81c0,~
./node_modules/pg/v8.log:code-creation,Script,0x3f2aefaae100,2088,"/Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js",0x14a4836a8408,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab7380,232,"module.exports /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:63",0x14a4836a8770,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa908c0,416," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaecfa0,808,"done /Users/bmc/src/node-postgres/benchmark/index.js:9",0x14a4836a8bd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90700,436,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7640,212," /Users/bmc/src/node-postgres/benchmark/index.js:30",0x14a4836bc218,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac73a0,304," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:65",0x14a4836bc370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf00c0,256," /Users/bmc/src/node-postgres/benchmark/index.js:19",0x14a4836d0ed8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc139e0,1308,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc0e760,4562,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09d80,1484,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09700,1647,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09300,1007," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe9a0,638,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe380,1137,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafdb20,1822,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafcce0,364,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc940,681," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc680,382," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc0a0,1241,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafb0a0,818,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafad00,368,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafa820,946,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9f20,1048,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9960,896,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf8b80,948," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf8780,579,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf3b40,621," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf0720,1478,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefada160,2281,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5a00,1202,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae54c0,282," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5220,396,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae40e0,4092,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae2fc0,962,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae28c0,1496,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1800,1044,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1280,1034,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0b40,1360,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0700,264,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae00a0,1399,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadf700,2078,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddf00,264,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddd00,288,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddaa0,369,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadd880,278," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadc700,4223,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9980,1224,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad80a0,1544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad66e0,739,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4520,2106,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4120,276,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad32e0,508,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad2e20,888,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad27a0,560,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad1820,508,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaede0,524,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaf4c0,5197,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab1a00,579,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab24a0,784,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab27c0,1932,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafb780,1272,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa6f460,3124,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa702e0,1741,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa70a60,1248,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa70f40,3644,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa71d80,3616,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab83c0,776,"doLoops /Users/bmc/src/node-postgres/benchmark/index.js:5",0x25e3e81828f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaab040,556,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90a60,448,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90c20,944,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b940,520,"Query.requiresPreparation /Users/bmc/src/node-postgres/lib/query.js:37",0x14a48366bb08,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1d00,676,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac36c0,776,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5de0,224,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7200,404,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b800,304,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa17b80,276,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb9e0,344,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa175e0,1248,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b600,316,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ec0,648,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3e00,224,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3bc0,212,"noParse /Users/bmc/src/node-postgres/lib/types/index.js:10",0x14a48366d138,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac23a0,292,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac3ae0,224,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac39e0,256,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa1b360,476,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9e20,532,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9420,428,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab86e0,784,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaba700,1272,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabbcc0,536,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc240,260,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6e40,304,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabb4c0,340,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcde0,516,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabd180,2524,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5b00,232,"Connection.parseC /Users/bmc/src/node-postgres/lib/connection.js:465",0x14a48368e0f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac6f80,232,"Connection.parseZ /Users/bmc/src/node-postgres/lib/connection.js:470",0x14a48368e190,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabfd80,524,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0520,708,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2ce0,756,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac7080,212,"Connection.readChar /Users/bmc/src/node-postgres/lib/connection.js:584",0x14a48368e5f0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabdce0,320,"Connection.parseInt32 /Users/bmc/src/node-postgres/lib/connection.js:588",0x14a48368e690,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabffa0,320,"Connection.parseInt16 /Users/bmc/src/node-postgres/lib/connection.js:594",0x14a48368e730,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac2fe0,316,"Connection.readString /Users/bmc/src/node-postgres/lib/connection.js:600",0x14a48368e7d0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac0800,532,"Connection.parseCString /Users/bmc/src/node-postgres/lib/connection.js:608",0x14a48368e910,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8c40,456,"Writer._ensure /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:12",0x14a48368ee80,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab99e0,716,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9240,460,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9160,212,"writeString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:38",0x14a48368f060,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab8a00,552,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabacc0,420,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc360,360,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc740,248,"Writer.clear /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:91",0x14a48368f4c0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab9680,544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc5e0,336,"Writer.join /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:115",0x14a48368f600,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc4e0,248,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabc840,224,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaaee0,352," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefabcc40,400," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac1c00,228," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac35c0,228," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac4560,232," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefac5ca0,304," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa908c0,416," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa90700,436,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf00c0,256," /Users/bmc/src/node-postgres/benchmark/index.js:19",0x14a4836d0ed8,~
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa71d80,3616,"Query.prepare /Users/bmc/src/node-postgres/lib/query.js:143",0x14a48366c148,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa702e0,1741,"Result.addCommandComplete /Users/bmc/src/node-postgres/lib/result.js:14",0x14a48366c720,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefa6f460,3124,"Connection.bind /Users/bmc/src/node-postgres/lib/connection.js:206",0x14a48368d790,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab27c0,1932,"Connection.parse /Users/bmc/src/node-postgres/lib/connection.js:181",0x14a48368d6f0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefab1a00,579,"run /Users/bmc/src/node-postgres/benchmark/index.js:25",0x14a4836a8c78,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaaf4c0,5197,"Connection.parseT /Users/bmc/src/node-postgres/lib/connection.js:475",0x14a48368e230,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc139e0,1308,"Query.handleRowDescription /Users/bmc/src/node-postgres/lib/query.js:60",0x14a48366bc48,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc0e760,4562,"Query /Users/bmc/src/node-postgres/lib/query.js:11",0x14a48366ba68,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09d80,1484,"Writer.addString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:71",0x14a48368f2e0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09700,1647,"Client.query /Users/bmc/src/node-postgres/lib/client.js:245",0x14a48365c030,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefc09300,1007," /Users/bmc/src/node-postgres/lib/connection.js:95",0x14a4836a6cb8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe9a0,638,"Query.handleReadyForQuery /Users/bmc/src/node-postgres/lib/query.js:97",0x14a48366be28,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafe380,1137,"Connection.sync /Users/bmc/src/node-postgres/lib/connection.js:262",0x14a48368d970,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafcce0,364,"Query.handleCommandComplete /Users/bmc/src/node-postgres/lib/query.js:93",0x14a48366bd88,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc940,681," /Users/bmc/src/node-postgres/lib/client.js:103",0x14a4836a7078,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc680,382," /Users/bmc/src/node-postgres/lib/client.js:89",0x14a4836a6e98,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafc0a0,1241,"Connection.describe /Users/bmc/src/node-postgres/lib/connection.js:277",0x14a48368dab0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafb0a0,818,"prepareValue /Users/bmc/src/node-postgres/lib/utils.js:48",0x14a48368c910,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafad00,368,"Query.hasBeenParsed /Users/bmc/src/node-postgres/lib/query.js:131",0x14a48366c008,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefafa820,946,"Query.submit /Users/bmc/src/node-postgres/lib/query.js:122",0x14a48366bf68,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9f20,1048,"Result /Users/bmc/src/node-postgres/lib/result.js:4",0x14a48366c680,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf9960,896,"normalizeQueryConfig /Users/bmc/src/node-postgres/lib/utils.js:61",0x14a48368c7d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf8b80,948," /Users/bmc/src/node-postgres/benchmark/prepared-statement-parsing.js:64",0x14a4836a89e8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf3b40,621," /Users/bmc/src/node-postgres/lib/client.js:145",0x14a4836a6530,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaf0720,1478,"Query.handleDataRow /Users/bmc/src/node-postgres/lib/query.js:72",0x14a48366bce8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefada160,2281,"Connection.parseD /Users/bmc/src/node-postgres/lib/connection.js:505",0x14a48368e370,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5a00,1202,"Client._pulseQueryQueue /Users/bmc/src/node-postgres/lib/client.js:205",0x14a48365bdb0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae54c0,282," /Users/bmc/src/node-postgres/lib/client.js:99",0x14a4836a6fd8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae5220,396,"getTypeParser /Users/bmc/src/node-postgres/lib/types/index.js:16",0x14a48366d1d8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae40e0,4092,"Connection.parseField /Users/bmc/src/node-postgres/lib/connection.js:485",0x14a48368e2d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae2fc0,962,"Connection.flush /Users/bmc/src/node-postgres/lib/connection.js:256",0x14a48368d8d0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae28c0,1496,"Connection.execute /Users/bmc/src/node-postgres/lib/connection.js:242",0x14a48368d830,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1800,1044,"Query.getRows /Users/bmc/src/node-postgres/lib/query.js:135",0x14a48366c0a8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae1280,1034,"Writer.addInt16 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:30",0x14a48368efc0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0b40,1360,"Writer.addCString /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:49",0x14a48368f1a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae0700,264,"p.write /Users/bmc/src/node-postgres/test/unit/test-helper.js:14",0x14a4836a3fa8,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefae00a0,1399,"Writer.add /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:84",0x14a48368f420,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadf700,2078,"Writer.flush /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:122",0x14a48368f6a0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddf00,264,"Result.addRow /Users/bmc/src/node-postgres/lib/result.js:36",0x14a48366c7c0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddd00,288,"parseInteger /Users/bmc/src/node-postgres/lib/types/textParsers.js:158",0x14a48366df90,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefaddaa0,369,"typeParsers.text.(anonymous function) /Users/bmc/src/node-postgres/lib/types/index.js:33",0x14a48368be20,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadd880,278," /Users/bmc/src/node-postgres/lib/client.js:94",0x14a4836a6f38,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefadc700,4223,"Connection.parseMessage /Users/bmc/src/node-postgres/lib/connection.js:323",0x14a48368de70,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad9980,1224,"Connection.setBuffer /Users/bmc/src/node-postgres/lib/connection.js:297",0x14a48368dd30,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad80a0,1544,"Writer.addHeader /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:99",0x14a48368f560,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad66e0,739,"Connection._send /Users/bmc/src/node-postgres/lib/connection.js:165",0x14a48368d5b0,*
./node_modules/pg/v8.log:code-creation,LazyCompile,0x3f2aefad4520,2106,"Writer.addInt32 /Users/bmc/src/node-postgres/node_modules/buffer-writer/index.js:21",0x14a48368ef20,*