middleman-wizard-template 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. checksums.yaml +7 -0
  2. data/lib/middleman-wizard-template/template/source/index.html.erb +1 -89
  3. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Matrix.js +449 -0
  4. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoader.js +395 -0
  5. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoaderImage.js +96 -0
  6. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoaderSwiffy.js +68 -0
  7. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/RouteRecognizer.js +506 -0
  8. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Slides.js +846 -0
  9. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Transform.js +312 -0
  10. data/lib/middleman-wizard-template/template/source/javascripts/_lib/{Tween.js → ww/Tween.js} +26 -11
  11. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/base.js +8 -0
  12. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/raf.js +131 -0
  13. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/statemachine.js +1024 -0
  14. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/useragent.js +1244 -0
  15. data/lib/middleman-wizard-template/template/source/javascripts/_lib/{util.js → ww/util.js} +48 -50
  16. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/viewport.js +89 -0
  17. data/lib/middleman-wizard-template/template/source/javascripts/{app.js → site.js} +5 -5
  18. data/lib/middleman-wizard-template/template/source/layouts/layout.erb +85 -0
  19. data/lib/middleman-wizard-template/template/source/stylesheets/default.css +2 -1
  20. data/lib/middleman-wizard-template/template/source/stylesheets/site.css.scss +11 -3
  21. data/lib/middleman-wizard-template/version.rb +1 -1
  22. metadata +23 -23
  23. data/lib/middleman-wizard-template/template/source/javascripts/_lib/Transform.js +0 -401
  24. data/lib/middleman-wizard-template/template/source/javascripts/_lib/raf.js +0 -26
  25. data/lib/middleman-wizard-template/template/source/javascripts/_lib/router.js +0 -679
@@ -0,0 +1,1244 @@
1
+ // Copyright 2012 Google Inc. All Rights Reserved.
2
+
3
+ /**
4
+ * @fileoverview Returns a string reporting the user's browser, OS and versions
5
+ * of both. Can also be extended to return platform data.
6
+ * @author brian.hefter@weareinstrument.com (Brian Hefter)
7
+ */
8
+
9
+ goog.provide('ww.userAgent');
10
+
11
+
12
+ // Creates a multi-dimensional array full of browser, os, and device regex data.
13
+ var browserData = {
14
+ 'userAgentParsers': [
15
+ {
16
+ 'regex': '^(Opera)/(\\d+)\\.(\\d+) \\(Nintendo Wii',
17
+ 'familyReplacement': 'Wii'
18
+ },
19
+ {
20
+ 'regex': '(SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)'
21
+ },
22
+ {
23
+ 'regex': '(Pale[Mm]oon)/(\\d+)\\.(\\d+)\\.?(\\d+)?',
24
+ 'familyReplacement': 'Pale Moon (Firefox Variant)'
25
+ },
26
+ {
27
+ 'regex': '(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)',
28
+ 'familyReplacement': 'Firefox Mobile'
29
+ },
30
+ {
31
+ 'regex': '(Fennec)/(\\d+)\\.(\\d+)(pre)',
32
+ 'familyReplacement': 'Firefox Mobile'
33
+ },
34
+ {
35
+ 'regex': '(Fennec)/(\\d+)\\.(\\d+)',
36
+ 'familyReplacement': 'Firefox Mobile'
37
+ },
38
+ {
39
+ 'regex': 'Mobile.*(Firefox)/(\\d+)\\.(\\d+)',
40
+ 'familyReplacement': 'Firefox Mobile'
41
+ },
42
+ {
43
+ 'regex': '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)',
44
+ 'familyReplacement': 'Firefox ($1)'
45
+ },
46
+ {
47
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
48
+ 'familyReplacement': 'Firefox Alpha'
49
+ },
50
+ {
51
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
52
+ 'familyReplacement': 'Firefox Beta'
53
+ },
54
+ {
55
+ 'regex': '(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
56
+ 'familyReplacement': 'Firefox Alpha'
57
+ },
58
+ {
59
+ 'regex': '(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
60
+ 'familyReplacement': 'Firefox Beta'
61
+ },
62
+ {
63
+ 'regex': '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?',
64
+ 'familyReplacement': 'Firefox ($1)'
65
+ },
66
+ {
67
+ 'regex': '(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)',
68
+ 'familyReplacement': 'MicroB'
69
+ },
70
+ {
71
+ 'regex': '(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?'
72
+ },
73
+ {
74
+ 'regex': '(Flock)/(\\d+)\\.(\\d+)(b\\d+?)'
75
+ },
76
+ {
77
+ 'regex': '(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)'
78
+ },
79
+ {
80
+ 'regex': '(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)',
81
+ 'familyReplacement': 'Netscape'
82
+ },
83
+ {
84
+ 'regex': '(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)',
85
+ 'familyReplacement': 'Netscape'
86
+ },
87
+ {
88
+ 'regex': '(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)',
89
+ 'familyReplacement': 'Netscape'
90
+ },
91
+ {
92
+ 'regex': '(MyIBrow)/(\\d+)\\.(\\d+)',
93
+ 'familyReplacement': 'My Internet Browser'
94
+ },
95
+ {
96
+ 'regex': '(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
97
+ },
98
+ {
99
+ 'regex': '(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)',
100
+ 'familyReplacement': 'Opera Mobile'
101
+ },
102
+ {
103
+ 'regex': 'Opera Mobi',
104
+ 'familyReplacement': 'Opera Mobile'
105
+ },
106
+ {
107
+ 'regex': '(Opera Mini)/(\\d+)\\.(\\d+)'
108
+ },
109
+ {
110
+ 'regex': '(Opera Mini)/att/(\\d+)\\.(\\d+)'
111
+ },
112
+ {
113
+ 'regex': '(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
114
+ },
115
+ {
116
+ 'regex': '(webOSBrowser)/(\\d+)\\.(\\d+)'
117
+ },
118
+ {
119
+ 'regex': '(webOS)/(\\d+)\\.(\\d+)',
120
+ 'familyReplacement': 'webOSBrowser'
121
+ },
122
+ {
123
+ 'regex': '(wOSBrowser).+TouchPad/(\\d+)\\.(\\d+)',
124
+ 'familyReplacement': 'webOS TouchPad'
125
+ },
126
+ {
127
+ 'regex': '(luakit)',
128
+ 'familyReplacement': 'LuaKit'
129
+ },
130
+ {
131
+ 'regex': '(Lightning)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)'
132
+ },
133
+ {
134
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)',
135
+ 'familyReplacement': 'Swiftfox'
136
+ },
137
+ {
138
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)',
139
+ 'familyReplacement': 'Swiftfox'
140
+ },
141
+ {
142
+ 'regex': 'rekonq',
143
+ 'familyReplacement': 'Rekonq'
144
+ },
145
+ {
146
+ 'regex': '(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?',
147
+ 'familyReplacement': 'Conkeror'
148
+ },
149
+ {
150
+ 'regex': '(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)',
151
+ 'familyReplacement': 'Konqueror'
152
+ },
153
+ {
154
+ 'regex': '(WeTab)-Browser'
155
+ },
156
+ {
157
+ 'regex': '(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)',
158
+ 'familyReplacement': 'Comodo Dragon'
159
+ },
160
+ {
161
+ 'regex': '(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)'
162
+ },
163
+ {
164
+ 'regex': '(Kindle)/(\\d+)\\.(\\d+)'
165
+ },
166
+ {
167
+ 'regex': '(Symphony) (\\d+).(\\d+)'
168
+ },
169
+ {
170
+ 'regex': '(Minimo)'
171
+ },
172
+ {
173
+ 'regex': '(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
174
+ 'familyReplacement': 'Chrome Mobile'
175
+ },
176
+ {
177
+ 'regex': '(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
178
+ 'familyReplacement': 'Chrome Mobile iOS'
179
+ },
180
+ {
181
+ 'regex': '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile',
182
+ 'familyReplacement': 'Chrome Mobile'
183
+ },
184
+ {
185
+ 'regex': '(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)',
186
+ 'familyReplacement': 'Chrome Frame'
187
+ },
188
+ {
189
+ 'regex': '(UC Browser)(\\d+)\\.(\\d+)\\.(\\d+)'
190
+ },
191
+ {
192
+ 'regex': '(SLP Browser)/(\\d+)\\.(\\d+)',
193
+ 'familyReplacement': 'Tizen Browser'
194
+ },
195
+ {
196
+ 'regex': '(Epiphany)/(\\d+)\\.(\\d+).(\\d+)'
197
+ },
198
+ {
199
+ 'regex': '(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)',
200
+ 'familyReplacement': 'Sogou Explorer'
201
+ },
202
+ {
203
+ 'regex': '(FlyFlow)/(\\d+)\\.(\\d+)',
204
+ 'familyReplacement': 'Baidu Explorer'
205
+ },
206
+ {
207
+ 'regex': '(Pingdom.com_bot_version_)(\\d+)\\.(\\d+)',
208
+ 'familyReplacement': 'PingdomBot'
209
+ },
210
+ {
211
+ 'regex': '(facebookexternalhit)/(\\d+)\\.(\\d+)',
212
+ 'familyReplacement': 'FacebookBot'
213
+ },
214
+ {
215
+ 'regex': '(Twitterbot)/(\\d+)\\.(\\d+)',
216
+ 'familyReplacement': 'TwitterBot'
217
+ },
218
+ {
219
+ 'regex': '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjaloo|Google Earth|Raven for Mac)/(\\d+)\\.(\\d+)\\.(\\d+)'
220
+ },
221
+ {
222
+ 'regex': '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser)/(\\d+)\\.(\\d+)'
223
+ },
224
+ {
225
+ 'regex': '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)'
226
+ },
227
+ {
228
+ 'regex': '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|BREW) (\\d+)\\.(\\d+)\\.?(\\d+)?'
229
+ },
230
+ {
231
+ 'regex': '(Android) Donut',
232
+ 'v2Replacement': '2',
233
+ 'v1Replacement': '1'
234
+ },
235
+ {
236
+ 'regex': '(Android) Eclair',
237
+ 'v2Replacement': '1',
238
+ 'v1Replacement': '2'
239
+ },
240
+ {
241
+ 'regex': '(Android) Froyo',
242
+ 'v2Replacement': '2',
243
+ 'v1Replacement': '2'
244
+ },
245
+ {
246
+ 'regex': '(Android) Gingerbread',
247
+ 'v2Replacement': '3',
248
+ 'v1Replacement': '2'
249
+ },
250
+ {
251
+ 'regex': '(Android) Honeycomb',
252
+ 'v1Replacement': '3'
253
+ },
254
+ {
255
+ 'regex': '(IEMobile)[ /](\\d+)\\.(\\d+)',
256
+ 'familyReplacement': 'IE Mobile'
257
+ },
258
+ {
259
+ 'regex': '(MSIE) (\\d+)\\.(\\d+).*XBLWP7',
260
+ 'familyReplacement': 'IE Large Screen'
261
+ },
262
+ {
263
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)'
264
+ },
265
+ {
266
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?'
267
+ },
268
+ {
269
+ 'regex': '(Obigo)InternetBrowser'
270
+ },
271
+ {
272
+ 'regex': '(Obigo)\\-Browser'
273
+ },
274
+ {
275
+ 'regex': '(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?'
276
+ },
277
+ {
278
+ 'regex': '(MAXTHON|Maxthon) (\\d+)\\.(\\d+)',
279
+ 'familyReplacement': 'Maxthon'
280
+ },
281
+ {
282
+ 'regex': '(Maxthon|MyIE2|Uzbl|Shiira)',
283
+ 'v1Replacement': '0'
284
+ },
285
+ {
286
+ 'regex': '(PLAYSTATION) (\\d+)',
287
+ 'familyReplacement': 'PlayStation'
288
+ },
289
+ {
290
+ 'regex': '(PlayStation Portable)[^\\d]+(\\d+).(\\d+)'
291
+ },
292
+ {
293
+ 'regex': '(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)'
294
+ },
295
+ {
296
+ 'regex': '(POLARIS)/(\\d+)\\.(\\d+)',
297
+ 'familyReplacement': 'Polaris'
298
+ },
299
+ {
300
+ 'regex': '(Embider)/(\\d+)\\.(\\d+)',
301
+ 'familyReplacement': 'Polaris'
302
+ },
303
+ {
304
+ 'regex': '(BonEcho)/(\\d+)\\.(\\d+)\\.(\\d+)',
305
+ 'familyReplacement': 'Bon Echo'
306
+ },
307
+ {
308
+ 'regex': '(iPod).+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
309
+ 'familyReplacement': 'Mobile Safari'
310
+ },
311
+ {
312
+ 'regex': '(iPod).*Version/(\\d+)\\.(\\d+)',
313
+ 'familyReplacement': 'Mobile Safari'
314
+ },
315
+ {
316
+ 'regex': '(iPhone).*Version/(\\d+)\\.(\\d+)\\.(\\d+)',
317
+ 'familyReplacement': 'Mobile Safari'
318
+ },
319
+ {
320
+ 'regex': '(iPhone).*Version/(\\d+)\\.(\\d+)',
321
+ 'familyReplacement': 'Mobile Safari'
322
+ },
323
+ {
324
+ 'regex': '(iPad).*Version/(\\d+)\\.(\\d+)\\.(\\d+)',
325
+ 'familyReplacement': 'Mobile Safari'
326
+ },
327
+ {
328
+ 'regex': '(iPad).*Version/(\\d+)\\.(\\d+)',
329
+ 'familyReplacement': 'Mobile Safari'
330
+ },
331
+ {
332
+ 'regex': '(iPod|iPhone|iPad);.*CPU.*OS (\\d+)(?:_\\d+)?_(\\d+).*Mobile',
333
+ 'familyReplacement': 'Mobile Safari'
334
+ },
335
+ {
336
+ 'regex': '(iPod|iPhone|iPad)',
337
+ 'familyReplacement': 'Mobile Safari'
338
+ },
339
+ {
340
+ 'regex': '(AvantGo) (\\d+).(\\d+)'
341
+ },
342
+ {
343
+ 'regex': '(Avant)',
344
+ 'v1Replacement': '1'
345
+ },
346
+ {
347
+ 'regex': '^(Nokia)',
348
+ 'familyReplacement': 'Nokia Services (WAP) Browser'
349
+ },
350
+ {
351
+ 'regex': '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)'
352
+ },
353
+ {
354
+ 'regex': '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)'
355
+ },
356
+ {
357
+ 'regex': '(NokiaBrowser)/(\\d+)\\.(\\d+)'
358
+ },
359
+ {
360
+ 'regex': '(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)',
361
+ 'familyReplacement': 'NokiaBrowser'
362
+ },
363
+ {
364
+ 'regex': '(Series60)/5\\.0',
365
+ 'v2Replacement': '0',
366
+ 'v1Replacement': '7',
367
+ 'familyReplacement': 'NokiaBrowser'
368
+ },
369
+ {
370
+ 'regex': '(Series60)/(\\d+)\\.(\\d+)',
371
+ 'familyReplacement': 'Nokia OSS Browser'
372
+ },
373
+ {
374
+ 'regex': '(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
375
+ 'familyReplacement': 'Nokia Series 40 Ovi Browser'
376
+ },
377
+ {
378
+ 'regex': '(Nokia)[EN]?(\\d+)'
379
+ },
380
+ {
381
+ 'regex': '(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)',
382
+ 'familyReplacement': 'Blackberry WebKit'
383
+ },
384
+ {
385
+ 'regex': '(Black[bB]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
386
+ 'familyReplacement': 'Blackberry WebKit'
387
+ },
388
+ {
389
+ 'regex': '(Black[bB]erry)\\s?(\\d+)',
390
+ 'familyReplacement': 'Blackberry'
391
+ },
392
+ {
393
+ 'regex': '(OmniWeb)/v(\\d+)\\.(\\d+)'
394
+ },
395
+ {
396
+ 'regex': '(Blazer)/(\\d+)\\.(\\d+)',
397
+ 'familyReplacement': 'Palm Blazer'
398
+ },
399
+ {
400
+ 'regex': '(Pre)/(\\d+)\\.(\\d+)',
401
+ 'familyReplacement': 'Palm Pre'
402
+ },
403
+ {
404
+ 'regex': '(Links) \\((\\d+)\\.(\\d+)'
405
+ },
406
+ {
407
+ 'regex': '(QtWeb) Internet Browser/(\\d+)\\.(\\d+)'
408
+ },
409
+ {
410
+ 'regex': '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?'
411
+ },
412
+ {
413
+ 'regex': '(AppleWebKit)/(\\d+)\\.?(\\d+)?\\+ .* Safari',
414
+ 'familyReplacement': 'WebKit Nightly'
415
+ },
416
+ {
417
+ 'regex': '(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/',
418
+ 'familyReplacement': 'Safari'
419
+ },
420
+ {
421
+ 'regex': '(Safari)/\\d+'
422
+ },
423
+ {
424
+ 'regex': '(OLPC)/Update(\\d+)\\.(\\d+)'
425
+ },
426
+ {
427
+ 'regex': '(OLPC)/Update()\\.(\\d+)',
428
+ 'v1Replacement': '0'
429
+ },
430
+ {
431
+ 'regex': '(SEMC\\-Browser)/(\\d+)\\.(\\d+)'
432
+ },
433
+ {
434
+ 'regex': '(Teleca)',
435
+ 'familyReplacement': 'Teleca Browser'
436
+ },
437
+ {
438
+ 'regex': '(MSIE) (\\d+)\\.(\\d+)',
439
+ 'familyReplacement': 'IE'
440
+ },
441
+ {
442
+ 'regex': '(Nintendo 3DS).* Version/(\\d+)\\.(\\d+)(?:\\.(\\w+))'
443
+ }
444
+ ],
445
+ 'osParsers': [
446
+ {
447
+ 'regex': '(Android) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?'
448
+ },
449
+ {
450
+ 'regex': '(Android)\\-(\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?'
451
+ },
452
+ {
453
+ 'regex': '(Android) Donut',
454
+ 'osV2Replacement': '2',
455
+ 'osV1Replacement': '1'
456
+ },
457
+ {
458
+ 'regex': '(Android) Eclair',
459
+ 'osV2Replacement': '1',
460
+ 'osV1Replacement': '2'
461
+ },
462
+ {
463
+ 'regex': '(Android) Froyo',
464
+ 'osV2Replacement': '2',
465
+ 'osV1Replacement': '2'
466
+ },
467
+ {
468
+ 'regex': '(Android) Gingerbread',
469
+ 'osV2Replacement': '3',
470
+ 'osV1Replacement': '2'
471
+ },
472
+ {
473
+ 'regex': '(Android) Honeycomb',
474
+ 'osV1Replacement': '3'
475
+ },
476
+ {
477
+ 'regex': '(Windows Phone 6\\.5)'
478
+ },
479
+ {
480
+ 'regex': '(Windows (?:NT 5\\.2|NT 5\\.1))',
481
+ 'osReplacement': 'Windows XP'
482
+ },
483
+ {
484
+ 'regex': '(XBLWP7)',
485
+ 'osReplacement': 'Windows Phone OS'
486
+ },
487
+ {
488
+ 'regex': '(Windows NT 6\\.1)',
489
+ 'osReplacement': 'Windows 7'
490
+ },
491
+ {
492
+ 'regex': '(Windows NT 6\\.0)',
493
+ 'osReplacement': 'Windows Vista'
494
+ },
495
+ {
496
+ 'regex': '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\\.0|Windows Vista|Windows 2000)'
497
+ },
498
+ {
499
+ 'regex': '(Windows NT 6\\.2)',
500
+ 'osReplacement': 'Windows 8'
501
+ },
502
+ {
503
+ 'regex': '(Windows NT 5\\.0)',
504
+ 'osReplacement': 'Windows 2000'
505
+ },
506
+ {
507
+ 'regex': '(Windows Phone OS) (\\d+)\\.(\\d+)'
508
+ },
509
+ {
510
+ 'regex': '(Windows ?Mobile)',
511
+ 'osReplacement': 'Windows Mobile'
512
+ },
513
+ {
514
+ 'regex': '(WinNT4.0)',
515
+ 'osReplacement': 'Windows NT 4.0'
516
+ },
517
+ {
518
+ 'regex': '(Win98)',
519
+ 'osReplacement': 'Windows 98'
520
+ },
521
+ {
522
+ 'regex': '(Tizen)/(\\d+)\\.(\\d+)'
523
+ },
524
+ {
525
+ 'regex': '(Mac OS X) (\\d+)[_.](\\d+)(?:[_.](\\d+))?'
526
+ },
527
+ {
528
+ 'regex': '(?:PPC|Intel) (Mac OS X)'
529
+ },
530
+ {
531
+ 'regex': '(CPU OS|iPhone OS) (\\d+)_(\\d+)(?:_(\\d+))?',
532
+ 'osReplacement': 'iOS'
533
+ },
534
+ {
535
+ 'regex': '(iPhone|iPad|iPod); Opera',
536
+ 'osReplacement': 'iOS'
537
+ },
538
+ {
539
+ 'regex': '(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)',
540
+ 'osReplacement': 'iOS'
541
+ },
542
+ {
543
+ 'regex': '(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+))?',
544
+ 'osReplacement': 'Chrome OS'
545
+ },
546
+ {
547
+ 'regex': '(Debian)-(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
548
+ },
549
+ {
550
+ 'regex': '(Linux Mint)(?:/(\\d+))?'
551
+ },
552
+ {
553
+ 'regex': '(Mandriva)(?: Linux)?/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
554
+ },
555
+ {
556
+ 'regex': '(Symbian[Oo][Ss])/(\\d+)\\.(\\d+)',
557
+ 'osReplacement': 'Symbian OS'
558
+ },
559
+ {
560
+ 'regex': '(Symbian/3).+NokiaBrowser/7\\.3',
561
+ 'osReplacement': 'Symbian^3 Anna'
562
+ },
563
+ {
564
+ 'regex': '(Symbian/3).+NokiaBrowser/7\\.4',
565
+ 'osReplacement': 'Symbian^3 Belle'
566
+ },
567
+ {
568
+ 'regex': '(Symbian/3)',
569
+ 'osReplacement': 'Symbian^3'
570
+ },
571
+ {
572
+ 'regex': '(Series 60|SymbOS|S60)',
573
+ 'osReplacement': 'Symbian OS'
574
+ },
575
+ {
576
+ 'regex': '(MeeGo)'
577
+ },
578
+ {
579
+ 'regex': 'Symbian [Oo][Ss]',
580
+ 'osReplacement': 'Symbian OS'
581
+ },
582
+ {
583
+ 'regex': '(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
584
+ 'osReplacement': 'BlackBerry OS'
585
+ },
586
+ {
587
+ 'regex': '(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
588
+ 'osReplacement': 'BlackBerry OS'
589
+ },
590
+ {
591
+ 'regex': '(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)',
592
+ 'osReplacement': 'BlackBerry Tablet OS'
593
+ },
594
+ {
595
+ 'regex': '(Play[Bb]ook)',
596
+ 'osReplacement': 'BlackBerry Tablet OS'
597
+ },
598
+ {
599
+ 'regex': '(Black[Bb]erry)',
600
+ 'osReplacement': 'Blackberry OS'
601
+ },
602
+ {
603
+ 'regex': '(webOS|hpwOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
604
+ 'osReplacement': 'webOS'
605
+ },
606
+ {
607
+ 'regex': '(SUSE|Fedora|Red Hat|PCLinuxOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)'
608
+ },
609
+ {
610
+ 'regex': '(SUSE|Fedora|Red Hat|Puppy|PCLinuxOS|CentOS)/(\\d+)\\.(\\d+)\\.(\\d+)'
611
+ },
612
+ {
613
+ 'regex': '(Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Red Hat|Slackware)/(\\d+)\\.(\\d+)'
614
+ },
615
+ {
616
+ 'regex': '(PlayStation Vita) (\\d+)\\.(\\d+)'
617
+ },
618
+ {
619
+ 'regex': '(Windows|OpenBSD|FreeBSD|NetBSD|Ubuntu|Kubuntu|Android|Arch Linux|CentOS|WeTab|Slackware)'
620
+ },
621
+ {
622
+ 'regex': '(Linux|BSD)'
623
+ }
624
+ ],
625
+ 'mobileOSFamilies': [
626
+ 'Windows Phone 6.5',
627
+ 'Windows CE',
628
+ 'Symbian OS'
629
+ ],
630
+ 'deviceParsers': [
631
+ {
632
+ 'regex': 'HTC ([A-Z][a-z0-9]+) Build',
633
+ 'deviceReplacement': 'HTC $1'
634
+ },
635
+ {
636
+ 'regex': 'HTC ([A-Z][a-z0-9 ]+) \\d+\\.\\d+\\.\\d+\\.\\d+',
637
+ 'deviceReplacement': 'HTC $1'
638
+ },
639
+ {
640
+ 'regex': 'HTC_Touch_([A-Za-z0-9]+)',
641
+ 'deviceReplacement': 'HTC Touch ($1)'
642
+ },
643
+ {
644
+ 'regex': 'USCCHTC(\\d+)',
645
+ 'deviceReplacement': 'HTC $1 (US Cellular)'
646
+ },
647
+ {
648
+ 'regex': 'Sprint APA(9292)',
649
+ 'deviceReplacement': 'HTC $1 (Sprint)'
650
+ },
651
+ {
652
+ 'regex': 'HTC ([A-Za-z0-9]+ [A-Z])',
653
+ 'deviceReplacement': 'HTC $1'
654
+ },
655
+ {
656
+ 'regex': 'HTC-([A-Za-z0-9]+)',
657
+ 'deviceReplacement': 'HTC $1'
658
+ },
659
+ {
660
+ 'regex': 'HTC_([A-Za-z0-9]+)',
661
+ 'deviceReplacement': 'HTC $1'
662
+ },
663
+ {
664
+ 'regex': 'HTC ([A-Za-z0-9]+)',
665
+ 'deviceReplacement': 'HTC $1'
666
+ },
667
+ {
668
+ 'regex': '(ADR[A-Za-z0-9]+)',
669
+ 'deviceReplacement': 'HTC $1'
670
+ },
671
+ {
672
+ 'regex': '(HTC)'
673
+ },
674
+ {
675
+ 'regex': '(SamsungSGHi560)',
676
+ 'deviceReplacement': 'Samsung SGHi560'
677
+ },
678
+ {
679
+ 'regex': 'SonyEricsson([A-Za-z0-9]+)/',
680
+ 'deviceReplacement': 'Ericsson $1'
681
+ },
682
+ {
683
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; WOWMobile (.+) Build'
684
+ },
685
+ {
686
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build'
687
+ },
688
+ {
689
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\-update1\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build'
690
+ },
691
+ {
692
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build'
693
+ },
694
+ {
695
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; (.+) Build'
696
+ },
697
+ {
698
+ 'regex': 'NokiaN([0-9]+)',
699
+ 'deviceReplacement': 'Nokia N$1'
700
+ },
701
+ {
702
+ 'regex': 'Nokia([A-Za-z0-9\\v-]+)',
703
+ 'deviceReplacement': 'Nokia $1'
704
+ },
705
+ {
706
+ 'regex': 'NOKIA ([A-Za-z0-9\\-]+)',
707
+ 'deviceReplacement': 'Nokia $1'
708
+ },
709
+ {
710
+ 'regex': 'Nokia ([A-Za-z0-9\\-]+)',
711
+ 'deviceReplacement': 'Nokia $1'
712
+ },
713
+ {
714
+ 'regex': 'Lumia ([A-Za-z0-9\\-]+)',
715
+ 'deviceReplacement': 'Lumia $1'
716
+ },
717
+ {
718
+ 'regex': 'Symbian',
719
+ 'deviceReplacement': 'Nokia'
720
+ },
721
+ {
722
+ 'regex': '(PlayBook).+RIM Tablet OS',
723
+ 'deviceReplacement': 'Blackberry Playbook'
724
+ },
725
+ {
726
+ 'regex': '(Black[Bb]erry [0-9]+);'
727
+ },
728
+ {
729
+ 'regex': 'Black[Bb]erry([0-9]+)',
730
+ 'deviceReplacement': 'BlackBerry $1'
731
+ },
732
+ {
733
+ 'regex': '(Pre)/(\\d+)\\.(\\d+)',
734
+ 'deviceReplacement': 'Palm Pre'
735
+ },
736
+ {
737
+ 'regex': '(Pixi)/(\\d+)\\.(\\d+)',
738
+ 'deviceReplacement': 'Palm Pixi'
739
+ },
740
+ {
741
+ 'regex': '(Touchpad)/(\\d+)\\.(\\d+)',
742
+ 'deviceReplacement': 'HP Touchpad'
743
+ },
744
+ {
745
+ 'regex': 'HPiPAQ([A-Za-z0-9]+)/(\\d+).(\\d+)',
746
+ 'deviceReplacement': 'HP iPAQ $1'
747
+ },
748
+ {
749
+ 'regex': 'Palm([A-Za-z0-9]+)',
750
+ 'deviceReplacement': 'Palm $1'
751
+ },
752
+ {
753
+ 'regex': 'Treo([A-Za-z0-9]+)',
754
+ 'deviceReplacement': 'Palm Treo $1'
755
+ },
756
+ {
757
+ 'regex': 'webOS.*(P160UNA)/(\\d+).(\\d+)',
758
+ 'deviceReplacement': 'HP Veer'
759
+ },
760
+ {
761
+ 'regex': '(PlayStation Portable)'
762
+ },
763
+ {
764
+ 'regex': '(PlayStation Vita)'
765
+ },
766
+ {
767
+ 'regex': '(Kindle Fire)'
768
+ },
769
+ {
770
+ 'regex': '(Kindle)'
771
+ },
772
+ {
773
+ 'regex': '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?',
774
+ 'deviceReplacement': 'Kindle Fire'
775
+ },
776
+ {
777
+ 'regex': '(iPad) Simulator;'
778
+ },
779
+ {
780
+ 'regex': '(iPad);'
781
+ },
782
+ {
783
+ 'regex': '(iPod);'
784
+ },
785
+ {
786
+ 'regex': '(iPhone) Simulator;'
787
+ },
788
+ {
789
+ 'regex': '(iPhone);'
790
+ },
791
+ {
792
+ 'regex': 'acer_([A-Za-z0-9]+)_',
793
+ 'deviceReplacement': 'Acer $1'
794
+ },
795
+ {
796
+ 'regex': 'acer_([A-Za-z0-9]+)_',
797
+ 'deviceReplacement': 'Acer $1'
798
+ },
799
+ {
800
+ 'regex': 'Amoi\\-([A-Za-z0-9]+)',
801
+ 'deviceReplacement': 'Amoi $1'
802
+ },
803
+ {
804
+ 'regex': 'AMOI\\-([A-Za-z0-9]+)',
805
+ 'deviceReplacement': 'Amoi $1'
806
+ },
807
+ {
808
+ 'regex': 'Asus\\-([A-Za-z0-9]+)',
809
+ 'deviceReplacement': 'Asus $1'
810
+ },
811
+ {
812
+ 'regex': 'ASUS\\-([A-Za-z0-9]+)',
813
+ 'deviceReplacement': 'Asus $1'
814
+ },
815
+ {
816
+ 'regex': 'BIRD\\-([A-Za-z0-9]+)',
817
+ 'deviceReplacement': 'Bird $1'
818
+ },
819
+ {
820
+ 'regex': 'BIRD\\.([A-Za-z0-9]+)',
821
+ 'deviceReplacement': 'Bird $1'
822
+ },
823
+ {
824
+ 'regex': 'BIRD ([A-Za-z0-9]+)',
825
+ 'deviceReplacement': 'Bird $1'
826
+ },
827
+ {
828
+ 'regex': 'Dell ([A-Za-z0-9]+)',
829
+ 'deviceReplacement': 'Dell $1'
830
+ },
831
+ {
832
+ 'regex': 'DoCoMo/2\\.0 ([A-Za-z0-9]+)',
833
+ 'deviceReplacement': 'DoCoMo $1'
834
+ },
835
+ {
836
+ 'regex': '([A-Za-z0-9]+)\\_W\\;FOMA',
837
+ 'deviceReplacement': 'DoCoMo $1'
838
+ },
839
+ {
840
+ 'regex': '([A-Za-z0-9]+)\\;FOMA',
841
+ 'deviceReplacement': 'DoCoMo $1'
842
+ },
843
+ {
844
+ 'regex': 'vodafone([A-Za-z0-9]+)',
845
+ 'deviceReplacement': 'Huawei Vodafone $1'
846
+ },
847
+ {
848
+ 'regex': 'i\\-mate ([A-Za-z0-9]+)',
849
+ 'deviceReplacement': 'i-mate $1'
850
+ },
851
+ {
852
+ 'regex': 'Kyocera\\-([A-Za-z0-9]+)',
853
+ 'deviceReplacement': 'Kyocera $1'
854
+ },
855
+ {
856
+ 'regex': 'KWC\\-([A-Za-z0-9]+)',
857
+ 'deviceReplacement': 'Kyocera $1'
858
+ },
859
+ {
860
+ 'regex': 'Lenovo\\-([A-Za-z0-9]+)',
861
+ 'deviceReplacement': 'Lenovo $1'
862
+ },
863
+ {
864
+ 'regex': 'Lenovo\\_([A-Za-z0-9]+)',
865
+ 'deviceReplacement': 'Lenovo $1'
866
+ },
867
+ {
868
+ 'regex': 'LG/([A-Za-z0-9]+)',
869
+ 'deviceReplacement': 'LG $1'
870
+ },
871
+ {
872
+ 'regex': 'LG-LG([A-Za-z0-9]+)',
873
+ 'deviceReplacement': 'LG $1'
874
+ },
875
+ {
876
+ 'regex': 'LGE-LG([A-Za-z0-9]+)',
877
+ 'deviceReplacement': 'LG $1'
878
+ },
879
+ {
880
+ 'regex': 'LGE VX([A-Za-z0-9]+)',
881
+ 'deviceReplacement': 'LG $1'
882
+ },
883
+ {
884
+ 'regex': 'LG ([A-Za-z0-9]+)',
885
+ 'deviceReplacement': 'LG $1'
886
+ },
887
+ {
888
+ 'regex': 'LGE LG\\-AX([A-Za-z0-9]+)',
889
+ 'deviceReplacement': 'LG $1'
890
+ },
891
+ {
892
+ 'regex': 'LG\\-([A-Za-z0-9]+)',
893
+ 'deviceReplacement': 'LG $1'
894
+ },
895
+ {
896
+ 'regex': 'LGE\\-([A-Za-z0-9]+)',
897
+ 'deviceReplacement': 'LG $1'
898
+ },
899
+ {
900
+ 'regex': 'LG([A-Za-z0-9]+)',
901
+ 'deviceReplacement': 'LG $1'
902
+ },
903
+ {
904
+ 'regex': '(KIN)\\.One (\\d+)\\.(\\d+)',
905
+ 'deviceReplacement': 'Microsoft $1'
906
+ },
907
+ {
908
+ 'regex': '(KIN)\\.Two (\\d+)\\.(\\d+)',
909
+ 'deviceReplacement': 'Microsoft $1'
910
+ },
911
+ {
912
+ 'regex': '(Motorola)\\-([A-Za-z0-9]+)'
913
+ },
914
+ {
915
+ 'regex': 'MOTO\\-([A-Za-z0-9]+)',
916
+ 'deviceReplacement': 'Motorola $1'
917
+ },
918
+ {
919
+ 'regex': 'MOT\\-([A-Za-z0-9]+)',
920
+ 'deviceReplacement': 'Motorola $1'
921
+ },
922
+ {
923
+ 'regex': 'Philips([A-Za-z0-9]+)',
924
+ 'deviceReplacement': 'Philips $1'
925
+ },
926
+ {
927
+ 'regex': 'Philips ([A-Za-z0-9]+)',
928
+ 'deviceReplacement': 'Philips $1'
929
+ },
930
+ {
931
+ 'regex': 'SAMSUNG-([A-Za-z0-9\\-]+)',
932
+ 'deviceReplacement': 'Samsung $1'
933
+ },
934
+ {
935
+ 'regex': 'SAMSUNG\\; ([A-Za-z0-9\\-]+)',
936
+ 'deviceReplacement': 'Samsung $1'
937
+ },
938
+ {
939
+ 'regex': 'Softbank/1\\.0/([A-Za-z0-9]+)',
940
+ 'deviceReplacement': 'Softbank $1'
941
+ },
942
+ {
943
+ 'regex': 'Softbank/2\\.0/([A-Za-z0-9]+)',
944
+ 'deviceReplacement': 'Softbank $1'
945
+ },
946
+ {
947
+ 'regex': '(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)',
948
+ 'deviceReplacement': 'Generic Smartphone'
949
+ },
950
+ {
951
+ 'regex': '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|craw|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly\\_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)',
952
+ 'deviceReplacement': 'Generic Feature Phone'
953
+ },
954
+ {
955
+ 'regex': '^(htcp|htcs|htct|htc\\_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|lynx|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)',
956
+ 'deviceReplacement': 'Generic Feature Phone'
957
+ },
958
+ {
959
+ 'regex': '^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)',
960
+ 'deviceReplacement': 'Generic Feature Phone'
961
+ },
962
+ {
963
+ 'regex': '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda\\_)',
964
+ 'deviceReplacement': 'Generic Feature Phone'
965
+ },
966
+ {
967
+ 'regex': '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\\-webcrawler|converacrawler|dataparksearch|findlinks)',
968
+ 'deviceReplacement': 'Spider'
969
+ }
970
+ ],
971
+ 'mobileUserAgentFamilies': [
972
+ 'Firefox Mobile',
973
+ 'Opera Mobile',
974
+ 'Opera Mini',
975
+ 'Mobile Safari',
976
+ 'webOS',
977
+ 'IE Mobile',
978
+ 'Playstation Portable',
979
+ 'Nokia',
980
+ 'Blackberry',
981
+ 'Palm',
982
+ 'Silk',
983
+ 'Android',
984
+ 'Maemo',
985
+ 'Obigo',
986
+ 'Netfront',
987
+ 'AvantGo',
988
+ 'Teleca',
989
+ 'SEMC-Browser',
990
+ 'Bolt',
991
+ 'Iris',
992
+ 'UP.Browser',
993
+ 'Symphony',
994
+ 'Minimo',
995
+ 'Bunjaloo',
996
+ 'Jasmine',
997
+ 'Dolfin',
998
+ 'Polaris',
999
+ 'BREW',
1000
+ 'Chrome Mobile',
1001
+ 'UC Browser',
1002
+ 'Tizen Browser'
1003
+ ]
1004
+ };
1005
+
1006
+
1007
+ /**
1008
+ * Function to loop through our big array or one provided externally to the
1009
+ * function and compare each regex to the user agent being reported by the
1010
+ * user's browser. Then return what browser matches.
1011
+ * @param {array} regexArray is an array of regexes.
1012
+ * @return {string} Browser name that matches the regex of the user agent.
1013
+ */
1014
+ ww.userAgent.getBrowserName = function(regexArray) {
1015
+
1016
+ if (regexArray) {
1017
+ browserData = regexArray;
1018
+ }
1019
+
1020
+ for (var i = 0; i < browserData['userAgentParsers'].length; i++) {
1021
+
1022
+ // Get the regex value of the current index and make a regex object from it.
1023
+ var currentItem =
1024
+ new RegExp(browserData['userAgentParsers'][i]['regex']);
1025
+
1026
+ // Check the string of the user agent against our current regex value.
1027
+ var browserMatch = currentItem.exec(navigator.userAgent);
1028
+
1029
+ // If the regex value matches the user agent, create a string to return.
1030
+ if (browserMatch) {
1031
+
1032
+ /**
1033
+ * If the UA doesn't report a proper browser name, use the replacement
1034
+ * from our browserData array.
1035
+ */
1036
+ if (browserData['userAgentParsers'][i]['familyReplacement']) {
1037
+ var browserName =
1038
+ browserData['userAgentParsers'][i]['familyReplacement'];
1039
+
1040
+ // If the UA provides all the default data then create the string from it.
1041
+ } else {
1042
+ var browserName = browserMatch[1];
1043
+ }
1044
+
1045
+ return browserName;
1046
+ }
1047
+
1048
+ }
1049
+
1050
+ };
1051
+
1052
+ goog.exportSymbol('ww.userAgent.getBrowserName', ww.userAgent.getBrowserName);
1053
+
1054
+ /**
1055
+ * Function to loop through our big array or one provided externally to the
1056
+ * function and compare each regex to the user agent being reported by the
1057
+ * user's browser. Then return what browser version matches.
1058
+ * @param {array} regexArray is an array of regexes.
1059
+ * @return {string} Browser version that matches the regex of the user agent.
1060
+ */
1061
+ ww.userAgent.getBrowserV = function(regexArray) {
1062
+
1063
+ if (regexArray) {
1064
+ browserData = regexArray;
1065
+ }
1066
+
1067
+ for (var i = 0; i < browserData['userAgentParsers'].length; i++) {
1068
+
1069
+ // Get the regex value of the current index and make a regex object from it.
1070
+ var currentItem =
1071
+ new RegExp(browserData['userAgentParsers'][i]['regex']);
1072
+
1073
+ // Check the string of the user agent against our current regex value.
1074
+ var browserMatch = currentItem.exec(navigator.userAgent);
1075
+
1076
+ // If the regex value matches the user agent, create a string to return.
1077
+ if (browserMatch) {
1078
+ /**
1079
+ * If the UA doesn't report a proper browser version, use the replacement
1080
+ * from our browserData array.
1081
+ */
1082
+ if (browserData['userAgentParsers'][i]['v1Replacement']) {
1083
+ var browserVersion =
1084
+ browserData['userAgentParsers'][i]['v1Replacement'];
1085
+
1086
+ // If there is a browser subversion replacement, add it to our string.
1087
+ if (browserData['userAgentParsers'][i]['v2Replacement']) {
1088
+ browserVersion +=
1089
+ '.' + browserData['userAgentParsers'][i]['v2Replacement'];
1090
+ }
1091
+
1092
+ // If the UA provides all the default data then create the string from it.
1093
+ } else {
1094
+ var browserVersion = browserMatch[2];
1095
+ }
1096
+
1097
+ return browserVersion;
1098
+ }
1099
+
1100
+ }
1101
+
1102
+ };
1103
+
1104
+ goog.exportSymbol('ww.userAgent.getBrowserV', ww.userAgent.getBrowserV);
1105
+
1106
+
1107
+ /**
1108
+ * Function to loop through our big array or one provided externally to the
1109
+ * function and compare each regex to the user agent being reported by the
1110
+ * user's browser. Then return what OS matches.
1111
+ * @param {array} regexArray is an array of regexes.
1112
+ * @return {string} The OS name that matches the regex of the user agent.
1113
+ */
1114
+ ww.userAgent.getOS = function(regexArray) {
1115
+
1116
+ if (regexArray) {
1117
+ browserData = regexArray;
1118
+ }
1119
+
1120
+ for (var i = 0; i < browserData['osParsers'].length; i++) {
1121
+
1122
+ // Get the regex value of the current index and make a regex object from it.
1123
+ var currentItem =
1124
+ new RegExp(browserData['osParsers'][i]['regex']);
1125
+
1126
+ // Check the string of the user agent against our current regex value.
1127
+ var browserMatch = currentItem.exec(navigator.userAgent);
1128
+
1129
+ // If the regex value matches the user agent, create a string to return.
1130
+ if (browserMatch) {
1131
+
1132
+ /**
1133
+ * If the UA doesn't report a proper OS name, use the replacement
1134
+ * from our browserData array.
1135
+ */
1136
+ if (browserData['osParsers'][i]['osReplacement']) {
1137
+ var OS = browserData['osParsers'][i]['osReplacement'];
1138
+
1139
+ // If the UA provides all the default data then create the string from it.
1140
+ } else {
1141
+ var OS = browserMatch[1];
1142
+ }
1143
+
1144
+ return OS;
1145
+ }
1146
+
1147
+ }
1148
+
1149
+ };
1150
+
1151
+ goog.exportSymbol('ww.userAgent.getOS', ww.userAgent.getOS);
1152
+
1153
+
1154
+ /**
1155
+ * Function to loop through our big array or one provided externally to the
1156
+ * function and compare each regex to the user agent being reported by the
1157
+ * user's browser. Then return what OS version matches.
1158
+ * @param {array} regexArray is an array of regexes.
1159
+ * @return {string} The OS Version that matches the regex of the user agent.
1160
+ */
1161
+ ww.userAgent.getOSV = function(regexArray) {
1162
+
1163
+ if (regexArray) {
1164
+ browserData = regexArray;
1165
+ }
1166
+
1167
+ for (var i = 0; i < browserData['osParsers'].length; i++) {
1168
+
1169
+ // Get the regex value of the current index and make a regex object from it.
1170
+ var currentItem =
1171
+ new RegExp(browserData['osParsers'][i]['regex']);
1172
+
1173
+ // Check the string of the user agent against our current regex value.
1174
+ var browserMatch = currentItem.exec(navigator.userAgent);
1175
+
1176
+ // If the regex value matches the user agent, create a string to return.
1177
+ if (browserMatch) {
1178
+
1179
+ /**
1180
+ * If the UA doesn't report a proper OS version, use the replacement
1181
+ * from our browserData array.
1182
+ */
1183
+ if (browserData['osParsers'][i]['osV1Replacement']) {
1184
+ var osVersion = browserData['osParsers'][i]['osV1Replacement'];
1185
+
1186
+ // If there is a browser subversion replacement, add it to our string.
1187
+ if (browserData['osParsers'][i]['osV2Replacement']) {
1188
+ osVersion +=
1189
+ '.' + browserData['osParsers'][i]['osV2Replacement'];
1190
+ }
1191
+
1192
+ // If the UA provides all the default data then create the string from it.
1193
+ } else {
1194
+ var osVersion = '';
1195
+ if (browserMatch[2]) {
1196
+ osVersion += browserMatch[2];
1197
+ }
1198
+ if (browserMatch[3]) {
1199
+ osVersion += '.' + browserMatch[3];
1200
+ }
1201
+ if (browserMatch[4]) {
1202
+ osVersion += '.' + browserMatch[4];
1203
+ }
1204
+ }
1205
+
1206
+ return osVersion;
1207
+ }
1208
+
1209
+ }
1210
+
1211
+ };
1212
+
1213
+ goog.exportSymbol('ww.userAgent.getOSV', ww.userAgent.getOSV);
1214
+
1215
+
1216
+ /**
1217
+ * Function to report back if the detected user agent is a mobile device
1218
+ * @param {array} regexArray is an array of regexes.
1219
+ * @return {boolean} Returns true if a mobile device matches the user agent.
1220
+ */
1221
+
1222
+ ww.userAgent.isMobile = function(regexArray) {
1223
+
1224
+ if (regexArray) {
1225
+ browserData = regexArray;
1226
+ }
1227
+
1228
+ for (var i = 0; i < browserData['deviceParsers'].length; i++) {
1229
+
1230
+ // Get the regex value of the current index and make a regex object from it.
1231
+ var currentItem =
1232
+ new RegExp(browserData['deviceParsers'][i]['regex']);
1233
+
1234
+ // Check the string of the user agent against our current regex value.
1235
+ var browserMatch = currentItem.exec(navigator.userAgent);
1236
+
1237
+ if (browserMatch) {
1238
+ return true;
1239
+ }
1240
+ }
1241
+
1242
+ };
1243
+
1244
+ goog.exportSymbol('ww.userAgent.isMobile', ww.userAgent.isMobile);