├── .gitignore ├── index.js ├── lib └── exif │ ├── index.js │ ├── Buffer.js │ ├── makernotes │ ├── sanyo.js │ ├── fujifilm.js │ ├── panasonic.js │ ├── olympus.js │ ├── agfa.js │ └── epson.js │ └── ExifImage.js ├── test ├── evil1.jpg ├── right.jpg ├── test1.jpg ├── test2.jpg ├── test3.jpg ├── lens_info.jpg ├── down-mirrored.jpg ├── short-ascii-II.jpg ├── short-ascii-MM.jpg ├── agfa-makernotes.jpg ├── sony-alpha-6000.jpg ├── right.jpg.json ├── down-mirrored.jpg.json ├── lens_info.jpg.json ├── test2.jpg.json ├── right.jpg.expected ├── down-mirrored.jpg.expected ├── lens_info.jpg.expected ├── test1.jpg.json ├── short-ascii-II.jpg.expected ├── short-ascii-MM.jpg.expected ├── test2.jpg.expected ├── test1.jpg.expected ├── test3.jpg.expected ├── test3.jpg.json ├── evil1.jpg.expected ├── sony-alpha-6000.jpg.expected ├── evil1.jpg.json ├── agfa-makernotes.jpg.json ├── short-ascii-MM.jpg.json ├── api-test.js ├── short-ascii-II.jpg.json └── sony-alpha-6000.jpg.json ├── .project ├── package.json ├── LICENSE.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/exif'); -------------------------------------------------------------------------------- /lib/exif/index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./ExifImage'); -------------------------------------------------------------------------------- /test/evil1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/evil1.jpg -------------------------------------------------------------------------------- /test/right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/right.jpg -------------------------------------------------------------------------------- /test/test1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/test1.jpg -------------------------------------------------------------------------------- /test/test2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/test2.jpg -------------------------------------------------------------------------------- /test/test3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/test3.jpg -------------------------------------------------------------------------------- /test/lens_info.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/lens_info.jpg -------------------------------------------------------------------------------- /test/down-mirrored.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/down-mirrored.jpg -------------------------------------------------------------------------------- /test/short-ascii-II.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/short-ascii-II.jpg -------------------------------------------------------------------------------- /test/short-ascii-MM.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/short-ascii-MM.jpg -------------------------------------------------------------------------------- /test/agfa-makernotes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/agfa-makernotes.jpg -------------------------------------------------------------------------------- /test/sony-alpha-6000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josephfrazier/node-exif/master/test/sony-alpha-6000.jpg -------------------------------------------------------------------------------- /test/right.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Orientation":8,"XResolution":28,"YResolution":28,"ResolutionUnit":3,"YCbCrPositioning":1},"thumbnail":{},"exif":{},"gps":{},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /test/down-mirrored.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Orientation":4,"XResolution":28,"YResolution":28,"ResolutionUnit":3,"YCbCrPositioning":1},"thumbnail":{},"exif":{},"gps":{},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /test/lens_info.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"XResolution":96,"YResolution":96,"ResolutionUnit":2,"YCbCrPositioning":1,"ExifOffset":90},"thumbnail":{},"exif":{"ExifVersion":{"type":"Buffer","data":[48,50,51,48]},"ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":65535,"LensInfo":[10,400,1.1,1.2],"LensMake":"Lens Maker Inc.","LensModel":"Lens Model mk I","LensSerialNumber":"123"},"gps":{},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | node-exif 4 | 5 | 6 | 7 | 8 | 9 | com.eclipsesource.jshint.ui.builder 10 | 11 | 12 | 13 | 14 | 15 | org.nodeclipse.ui.NodeNature 16 | org.eclipse.wst.jsdt.core.jsNature 17 | tern.eclipse.ide.core.ternnature 18 | 19 | 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "exif", 3 | "version" : "0.6.0", 4 | "description" : "A node.js library to extract Exif metadata from images.", 5 | "author" : [ "Daniel Leinich ", "Olivier Oeuillot " ], 6 | "keywords" : ["exif", "image", "jpeg", "jpg", "makernotes", "gps"], 7 | "main" : "./lib/exif", 8 | "repository" : { 9 | "type" : "git", 10 | "url" : "http://github.com/gomfunkel/node-exif.git" 11 | }, 12 | "dependencies": { 13 | "debug": "^2.2" 14 | }, 15 | "devDependencies": { 16 | "mocha": "^2.4" 17 | }, 18 | "scripts": { 19 | "test": "node_modules/.bin/mocha --reporter spec test/*-test.js" 20 | } 21 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License =============== Copyright (c) 2010 Daniel Leinich . Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /test/test2.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Make":"Apple","Model":"iPhone 4S","XResolution":72,"YResolution":72,"ResolutionUnit":2,"Software":"6.0.1","ModifyDate":"2012:12:23 14:47:49","YCbCrPositioning":1,"ExifOffset":192,"GPSInfo":582},"thumbnail":{},"exif":{"ExposureTime":0.008333333333333333,"FNumber":2.4,"ExposureProgram":2,"ISO":80,"ExifVersion":{"type":"Buffer","data":[48,50,50,49]},"DateTimeOriginal":"2012:12:23 14:47:49","CreateDate":"2012:12:23 14:47:49","ComponentsConfiguration":{"type":"Buffer","data":[0,0,0,1]},"ShutterSpeedValue":6.906947890818858,"ApertureValue":2.5260691271236086,"BrightnessValue":4.82600561272217,"MeteringMode":5,"Flash":16,"FocalLength":4.28,"SubjectArea":[1631,1223,881,881],"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":1319,"ExifImageHeight":1040,"SensingMethod":2,"ExposureMode":0,"WhiteBalance":0,"FocalLengthIn35mmFormat":35,"SceneCaptureType":0},"gps":{"GPSLatitudeRef":"N","GPSLatitude":[37,48.88,0],"GPSLongitudeRef":"W","GPSLongitude":[122,15.85,0],"GPSAltitudeRef":0,"GPSAltitude":2,"GPSTimeStamp":[22,47,49],"GPSImgDirectionRef":"T","GPSImgDirection":24.543212890625},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /test/right.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : 2 | Camera model : 3 | Software : 4 | Bits per sample : 0 5 | Image width : 0 6 | Image height : 0 7 | Image description : 8 | Image orientation : 8 9 | Image copyright : 10 | Image date/time : 11 | Original date/time : 12 | Digitize date/time : 13 | Subsecond time : 14 | Exposure time : 1/0 s 15 | F-stop : f/0.0 16 | ISO speed : 0 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 0 20 | Metering mode : 0 21 | Lens focal length : 0.000000 mm 22 | 35mm focal length : 0 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/down-mirrored.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : 2 | Camera model : 3 | Software : 4 | Bits per sample : 0 5 | Image width : 0 6 | Image height : 0 7 | Image description : 8 | Image orientation : 4 9 | Image copyright : 10 | Image date/time : 11 | Original date/time : 12 | Digitize date/time : 13 | Subsecond time : 14 | Exposure time : 1/0 s 15 | F-stop : f/0.0 16 | ISO speed : 0 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 0 20 | Metering mode : 0 21 | Lens focal length : 0.000000 mm 22 | 35mm focal length : 0 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/lens_info.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : 2 | Camera model : 3 | Software : 4 | Bits per sample : 0 5 | Image width : 0 6 | Image height : 0 7 | Image description : 8 | Image orientation : 0 9 | Image copyright : 10 | Image date/time : 11 | Original date/time : 12 | Digitize date/time : 13 | Subsecond time : 14 | Exposure time : 1/0 s 15 | F-stop : f/0.0 16 | ISO speed : 0 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 0 20 | Metering mode : 0 21 | Lens focal length : 0.000000 mm 22 | 35mm focal length : 0 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 10.000000 mm 28 | Lens max focal length: 400.000000 mm 29 | Lens f-stop min : f/1.1 30 | Lens f-stop max : f/1.2 31 | Lens make : Lens Maker Inc. 32 | Lens model : Lens Model mk I 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/test1.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Make":"Apple","Model":"iPhone 4S","Orientation":1,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"Software":"6.1","ModifyDate":"2013:02:06 16:00:03","YCbCrPositioning":1,"ExifOffset":198,"GPSInfo":580},"thumbnail":{"Compression":6,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"ThumbnailOffset":876,"ThumbnailLength":10430},"exif":{"ExposureTime":0.00021701388888888888,"FNumber":2.4,"ExposureProgram":2,"ISO":50,"ExifVersion":{"type":"Buffer","data":[48,50,50,49]},"DateTimeOriginal":"2013:02:06 16:00:03","CreateDate":"2013:02:06 16:00:03","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"ShutterSpeedValue":12.170018281535649,"ApertureValue":2.5260688216892597,"BrightnessValue":10.693570451436388,"MeteringMode":5,"Flash":0,"FocalLength":4.28,"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":3264,"ExifImageHeight":2448,"SensingMethod":2,"CustomRendered":2,"ExposureMode":0,"WhiteBalance":0,"FocalLengthIn35mmFormat":35,"SceneCaptureType":0},"gps":{"GPSLatitudeRef":"N","GPSLatitude":[37,53.1,0],"GPSLongitudeRef":"W","GPSLongitude":[122,37.35,0],"GPSAltitudeRef":0,"GPSAltitude":122,"GPSTimeStamp":[0,0,2.49],"GPSImgDirectionRef":"T","GPSImgDirection":7.69967707212056},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /test/short-ascii-II.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : XIAOMI 2 | Camera model : MI3 3 | Software : 4 | Bits per sample : 0 5 | Image width : 4208 6 | Image height : 3120 7 | Image description : 8 | Image orientation : 1 9 | Image copyright : 10 | Image date/time : 2015:02:28 17:10:49 11 | Original date/time : 2015:02:28 17:10:49 12 | Digitize date/time : 2015:02:28 17:10:49 13 | Subsecond time : 14 | Exposure time : 1/20 s 15 | F-stop : f/2.2 16 | ISO speed : 250 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 1 20 | Metering mode : 2 21 | Lens focal length : 3.510000 mm 22 | 35mm focal length : 0 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/short-ascii-MM.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : Canon 2 | Camera model : S40 3 | Software : 4 | Bits per sample : 0 5 | Image width : 2272 6 | Image height : 1704 7 | Image description : 8 | Image orientation : 1 9 | Image copyright : 10 | Image date/time : 2003:12:14 12:01:44 11 | Original date/time : 2003:12:14 12:01:44 12 | Digitize date/time : 2003:12:14 12:01:44 13 | Subsecond time : 14 | Exposure time : 1/500 s 15 | F-stop : f/4.9 16 | ISO speed : 0 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 1 20 | Metering mode : 2 21 | Lens focal length : 21.300000 mm 22 | 35mm focal length : 0 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 8114.285714 34 | Focal plane YRes : 8114.285714 35 | -------------------------------------------------------------------------------- /test/test2.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : Apple 2 | Camera model : iPhone 4S 3 | Software : 6.0.1 4 | Bits per sample : 0 5 | Image width : 1319 6 | Image height : 1040 7 | Image description : 8 | Image orientation : 0 9 | Image copyright : 10 | Image date/time : 2012:12:23 14:47:49 11 | Original date/time : 2012:12:23 14:47:49 12 | Digitize date/time : 2012:12:23 14:47:49 13 | Subsecond time : 14 | Exposure time : 1/120 s 15 | F-stop : f/2.4 16 | ISO speed : 80 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 1 20 | Metering mode : 5 21 | Lens focal length : 4.280000 mm 22 | 35mm focal length : 35 mm 23 | GPS Latitude : 37.814667 deg (37.000000 deg, 48.880000 min, 0.000000 sec N) 24 | GPS Longitude : -122.264167 deg (122.000000 deg, 15.850000 min, 0.000000 sec W) 25 | GPS Altitude : 2.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/test1.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : Apple 2 | Camera model : iPhone 4S 3 | Software : 6.1 4 | Bits per sample : 0 5 | Image width : 3264 6 | Image height : 2448 7 | Image description : 8 | Image orientation : 1 9 | Image copyright : 10 | Image date/time : 2013:02:06 16:00:03 11 | Original date/time : 2013:02:06 16:00:03 12 | Digitize date/time : 2013:02:06 16:00:03 13 | Subsecond time : 14 | Exposure time : 1/4608 s 15 | F-stop : f/2.4 16 | ISO speed : 50 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 0 20 | Metering mode : 5 21 | Lens focal length : 4.280000 mm 22 | 35mm focal length : 35 mm 23 | GPS Latitude : 37.885000 deg (37.000000 deg, 53.100000 min, 0.000000 sec N) 24 | GPS Longitude : -122.622500 deg (122.000000 deg, 37.350000 min, 0.000000 sec W) 25 | GPS Altitude : 122.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/test3.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : Apple 2 | Camera model : iPhone 4S 3 | Software : 6.0.1 4 | Bits per sample : 0 5 | Image width : 3264 6 | Image height : 2448 7 | Image description : 8 | Image orientation : 1 9 | Image copyright : 10 | Image date/time : 2012:12:22 19:40:02 11 | Original date/time : 2012:12:22 19:40:02 12 | Digitize date/time : 2012:12:22 19:40:02 13 | Subsecond time : 14 | Exposure time : 1/15 s 15 | F-stop : f/2.4 16 | ISO speed : 500 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 1 20 | Metering mode : 5 21 | Lens focal length : 4.280000 mm 22 | 35mm focal length : 35 mm 23 | GPS Latitude : 37.776333 deg (37.000000 deg, 46.580000 min, 0.000000 sec N) 24 | GPS Longitude : -122.419667 deg (122.000000 deg, 25.180000 min, 0.000000 sec W) 25 | GPS Altitude : 15.833345 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/test3.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Make":"Apple","Model":"iPhone 4S","Orientation":1,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"Software":"6.0.1","ModifyDate":"2012:12:22 19:40:02","YCbCrPositioning":1,"ExifOffset":204,"GPSInfo":594},"thumbnail":{"Compression":6,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"ThumbnailOffset":890,"ThumbnailLength":9881},"exif":{"ExposureTime":0.06666666666666667,"FNumber":2.4,"ExposureProgram":2,"ISO":500,"ExifVersion":{"type":"Buffer","data":[48,50,50,49]},"DateTimeOriginal":"2012:12:22 19:40:02","CreateDate":"2012:12:22 19:40:02","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"ShutterSpeedValue":3.906905055487053,"ApertureValue":2.5260688216892597,"BrightnessValue":-0.3639823717948718,"MeteringMode":5,"Flash":16,"FocalLength":4.28,"SubjectArea":[1631,1223,881,881],"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":3264,"ExifImageHeight":2448,"SensingMethod":2,"ExposureMode":0,"WhiteBalance":0,"FocalLengthIn35mmFormat":35,"SceneCaptureType":0},"gps":{"GPSLatitudeRef":"N","GPSLatitude":[37,46.58,0],"GPSLongitudeRef":"W","GPSLongitude":[122,25.18,0],"GPSAltitudeRef":0,"GPSAltitude":15.833345415005438,"GPSTimeStamp":[3,39,45.27],"GPSImgDirectionRef":"T","GPSImgDirection":190.08588957055215},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /test/evil1.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : Canon 2 | Camera model : Canon PowerShot S400 3 | Software : Adobe Photoshop 7.0 4 | Bits per sample : 0 5 | Image width : 400 6 | Image height : 300 7 | Image description : 8 | Image orientation : 1 9 | Image copyright : 10 | Image date/time : 2003:05:25 11:11:41 11 | Original date/time : 2003:05:24 16:40:33 12 | Digitize date/time : 2003:05:24 16:40:33 13 | Subsecond time : 14 | Exposure time : 1/8 s 15 | F-stop : f/2.8 16 | ISO speed : 0 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 1 20 | Metering mode : 5 21 | Lens focal length : 7.406250 mm 22 | 35mm focal length : 0 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 0.000000 mm 28 | Lens max focal length: 0.000000 mm 29 | Lens f-stop min : f/0.0 30 | Lens f-stop max : f/0.0 31 | Lens make : 32 | Lens model : 33 | Focal plane XRes : 8114.285714 34 | Focal plane YRes : 8114.285714 35 | -------------------------------------------------------------------------------- /test/sony-alpha-6000.jpg.expected: -------------------------------------------------------------------------------- 1 | Camera make : SONY 2 | Camera model : ILCE-6000 3 | Software : ILCE-6000 v1.00 4 | Bits per sample : 0 5 | Image width : 6000 6 | Image height : 4000 7 | Image description : 8 | Image orientation : 1 9 | Image copyright : 10 | Image date/time : 2014:04:18 20:33:53 11 | Original date/time : 2014:04:18 20:33:53 12 | Digitize date/time : 2014:04:18 20:33:53 13 | Subsecond time : 14 | Exposure time : 1/0 s 15 | F-stop : f/8.0 16 | ISO speed : 100 17 | Subject distance : 0.000000 m 18 | Exposure bias : 0.000000 EV 19 | Flash used? : 1 20 | Metering mode : 5 21 | Lens focal length : 22.000000 mm 22 | 35mm focal length : 33 mm 23 | GPS Latitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 24 | GPS Longitude : 0.000000 deg (0.000000 deg, 0.000000 min, 0.000000 sec ?) 25 | GPS Altitude : 0.000000 m 26 | GPS Precision (DOP) : 0.000000 27 | Lens min focal length: 16.000000 mm 28 | Lens max focal length: 50.000000 mm 29 | Lens f-stop min : f/3.5 30 | Lens f-stop max : f/5.6 31 | Lens make : 32 | Lens model : E PZ 16-50mm F3.5-5.6 OSS 33 | Focal plane XRes : 0.000000 34 | Focal plane YRes : 0.000000 35 | -------------------------------------------------------------------------------- /test/evil1.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Make":"Canon","Model":"Canon PowerShot S400","Orientation":1,"XResolution":180,"YResolution":180,"ResolutionUnit":2,"Software":"Adobe Photoshop 7.0","ModifyDate":"2003:05:25 11:11:41","YCbCrPositioning":1,"ExifOffset":217},"thumbnail":{"Compression":6,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"ThumbnailOffset":1057,"ThumbnailLength":6298},"exif":{"ExposureTime":0.125,"FNumber":2.8,"ExifVersion":{"type":"Buffer","data":[48,50,50,48]},"DateTimeOriginal":"2003:05:24 16:40:33","CreateDate":"2003:05:24 16:40:33","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"CompressedBitsPerPixel":3,"ShutterSpeedValue":3,"ApertureValue":2.96875,"ExposureCompensation":0,"MaxApertureValue":2.96875,"MeteringMode":5,"Flash":16,"FocalLength":7.40625,"UserComment":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":400,"ExifImageHeight":300,"FocalPlaneXResolution":8114.285714285715,"FocalPlaneYResolution":8114.285714285715,"FocalPlaneResolutionUnit":2,"SensingMethod":2,"FileSource":{"type":"Buffer","data":[3]},"CustomRendered":0,"ExposureMode":0,"WhiteBalance":0,"DigitalZoomRatio":1,"SceneCaptureType":0},"gps":{},"interoperability":{},"makernote":{}} -------------------------------------------------------------------------------- /lib/exif/Buffer.js: -------------------------------------------------------------------------------- 1 | // 2 | // A couple of methods that make working with buffers more easy. 3 | // 4 | 5 | Buffer.prototype.getByte = function (offset) { 6 | return this[offset]; 7 | }; 8 | 9 | Buffer.prototype.getSignedByte = function (offset) { 10 | return (this[offset] > 127) ? this[offset] - 256 : this[offset]; 11 | }; 12 | 13 | Buffer.prototype.getShort = function (offset, bigEndian) { 14 | var shortVal = (bigEndian) ? (this[offset] << 8) + this[offset + 1] : (this[offset + 1] << 8) + this[offset]; 15 | return (shortVal < 0) ? shortVal + 65536 : shortVal; 16 | }; 17 | 18 | Buffer.prototype.getSignedShort = function (offset, bigEndian) { 19 | var shortVal = (bigEndian) ? (this[offset] << 8) + this[offset + 1] : (this[offset + 1] << 8) + this[offset]; 20 | return (shortVal > 32767) ? shortVal - 65536 : shortVal; 21 | }; 22 | 23 | Buffer.prototype.getLong = function (offset, bigEndian) { 24 | var longVal = (bigEndian) ? (((((this[offset] << 8) + this[offset + 1]) << 8) + this[offset + 2]) << 8) + this[offset + 3] : (((((this[offset + 3] << 8) + this[offset + 2]) << 8) + this[offset + 1]) << 8) + this[offset]; 25 | return (longVal < 0) ? longVal + 4294967296 : longVal; 26 | }; 27 | 28 | Buffer.prototype.getSignedLong = function (offset, bigEndian) { 29 | var longVal = (bigEndian) ? (((((this[offset] << 8) + this[offset + 1]) << 8) + this[offset + 2]) << 8) + this[offset + 3] : (((((this[offset + 3] << 8) + this[offset + 2]) << 8) + this[offset + 1]) << 8) + this[offset]; 30 | return (longVal > 2147483647) ? longVal - 4294967296 : longVal; 31 | }; 32 | 33 | Buffer.prototype.getString = function (offset, length) { 34 | var string = []; 35 | for (var i = offset; i < offset + length; i++) { 36 | string.push(String.fromCharCode(this[i])); 37 | } 38 | return string.join(''); 39 | }; -------------------------------------------------------------------------------- /lib/exif/makernotes/sanyo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Extracts Sanyo flavored Makernotes. 3 | */ 4 | exports.extractMakernotes = function (data, makernoteOffset, tiffOffset) { 5 | 6 | // List of vendor specific Makernote tags found on 7 | // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Sanyo.html 8 | var tags = { 9 | 10 | 0x00FF : "MakerNoteOffset", 11 | 0x0100 : "SanyoThumbnail", 12 | 0x0200 : "SpecialMode", 13 | 0x0201 : "SanyoQuality", 14 | 0x0202 : "Macro", 15 | 0x0204 : "DigitalZoom", 16 | 0x0207 : "SoftwareVersion", 17 | 0x0208 : "PictInfo", 18 | 0x0209 : "CameraID", 19 | 0x020E : "SequentialShot", 20 | 0x020F : "WideRange", 21 | 0x0210 : "ColorAdjustmentMode", 22 | 0x0213 : "QuickShot", 23 | 0x0214 : "SelfTimer", 24 | 0x0216 : "VoiceMemo", 25 | 0x0217 : "RecordShutterRelease", 26 | 0x0218 : "FlickerReduce", 27 | 0x0219 : "OpticalZoomOn", 28 | 0x021B : "DigitalZoomOn", 29 | 0x021D : "LightSourceSpecial", 30 | 0x021E : "Resaved", 31 | 0x021F : "SceneSelect", 32 | 0x0223 : function (entry) { 33 | 34 | switch (entry.format) { 35 | case 0x0005: 36 | return "ManualFocusDistance"; 37 | case 0x0007: 38 | return "FaceInfo"; 39 | default: 40 | return false; 41 | } 42 | 43 | }, 44 | 0x0224 : "SequenceShotInterval", 45 | 0x0225 : "FlashMode", 46 | 0x0E00 : "PrintIM", 47 | 0x0F00 : "DataDump" 48 | 49 | }; 50 | 51 | // Sanyo flavored Makernote data starts after eight bytes 52 | var ifdOffset = makernoteOffset + 8; 53 | 54 | // Get the number of entries and extract them 55 | var numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 56 | if (this.options.sanyoMaxEntries) { 57 | numberOfEntries=Math.min(numberOfEntries, this.options.sanyoMaxEntries); 58 | } 59 | 60 | var makernoteData = {}; 61 | 62 | for (var i = 0; i < numberOfEntries; i++) { 63 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, tags); 64 | if (exifEntry && exifEntry.tagName) { 65 | makernoteData[exifEntry.tagName] = exifEntry.value; 66 | } 67 | } 68 | 69 | return makernoteData; 70 | 71 | }; -------------------------------------------------------------------------------- /test/agfa-makernotes.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"ImageDescription":"AGFA DIGITAL CAMERA","Make":"Agfa Gevaert","Model":"SR841","Orientation":1,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"Software":"v841p-73","ModifyDate":"2002:04:18 11:05:28","YCbCrPositioning":2,"ExifOffset":284},"thumbnail":{"Compression":6,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"ThumbnailOffset":2012,"ThumbnailLength":6314},"exif":{"ExposureTime":0.05,"FNumber":2.8,"ISO":100,"ExifVersion":{"type":"Buffer","data":[48,50,49,48]},"DateTimeOriginal":"2002:04:18 11:05:28","CreateDate":"2002:04:18 11:05:28","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"CompressedBitsPerPixel":1,"ExposureCompensation":1.5,"MaxApertureValue":3,"MeteringMode":0,"LightSource":0,"Flash":0,"FocalLength":5.3,"MakerNote":{"type":"Buffer","data":[65,71,70,65,32,0,1,0,6,0,0,2,4,0,3,0,0,0,210,3,0,0,1,2,3,0,1,0,0,0,4,0,0,0,2,2,3,0,1,0,0,0,0,0,0,0,3,2,3,0,1,0,0,0,0,0,0,0,4,2,5,0,1,0,0,0,222,3,0,0,0,15,4,0,30,0,0,0,230,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,0,219,0,128,0,222,77,0,0,0,0,1,99,0,0,0,86,150,0,0,7,180,0,0,158,155,0,0,35,101,0,0,198,200,0,0,51,174,0,0,51,174,1,1,0,0,16,84,0,0,13,170,10,35,0,0,0,0,0,0,0,0,0,0,0,101,17,0,0,0,51,51,6,0,0,0,0,0,0,0,0,0,0,0,64,0,43,45,0,0,74,3,31,231,12,240,222,0,0,100,100,0,0,192,16,17,255,255,255,0,0,0,0,0,0,0,98,56,0,0]},"UserComment":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]},"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":1280,"ExifImageHeight":960,"InteropOffset":862,"FileSource":{"type":"Buffer","data":[3]}},"gps":{},"interoperability":{"InteropIndex":"R98","InteropVersion":{"type":"Buffer","data":[48,49,48,48]}},"makernote":{"SpecialMode":[0,0,0],"Quality":4,"Macro":0,"BWMode":0,"DigitalZoom":2,"DataDump":[2147539712,5103104,16777216,99,38486,46087,39838,25891,51398,44595,16887347,1410334720,2852978688,8970,0,0,1139968,858980352,6,0,0,757792832,55181312,4027377439,1677721822,3221225572,4294906128,255,0,14434]}} -------------------------------------------------------------------------------- /test/short-ascii-MM.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"Compression":6,"Make":"Canon","Model":"S40","Orientation":1,"XResolution":180,"YResolution":180,"ResolutionUnit":2,"ModifyDate":"2003:12:14 12:01:44","YCbCrPositioning":1,"ExifOffset":176},"thumbnail":{"Compression":6,"XResolution":180,"YResolution":180,"ResolutionUnit":2,"ThumbnailOffset":1276,"ThumbnailLength":5448},"exif":{"ExposureTime":0.002,"FNumber":4.9,"ExifVersion":{"type":"Buffer","data":[48,50,50,48]},"DateTimeOriginal":"2003:12:14 12:01:44","CreateDate":"2003:12:14 12:01:44","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"CompressedBitsPerPixel":5,"ShutterSpeedValue":8.968666803194758,"ApertureValue":4.643856143856143,"ExposureCompensation":0,"MaxApertureValue":2.9708536585365852,"MeteringMode":2,"Flash":24,"FocalLength":21.3,"MakerNote":{"type":"Buffer","data":[12,0,1,0,3,0,40,0,0,0,28,3,0,0,2,0,3,0,4,0,0,0,108,3,0,0,3,0,3,0,4,0,0,0,116,3,0,0,4,0,3,0,27,0,0,0,124,3,0,0,0,0,3,0,6,0,0,0,178,3,0,0,0,0,3,0,4,0,0,0,190,3,0,0,6,0,2,0,32,0,0,0,198,3,0,0,7,0,2,0,24,0,0,0,230,3,0,0,8,0,4,0,1,0,0,0,59,225,17,0,9,0,2,0,32,0,0,0,254,3,0,0,16,0,4,0,1,0,0,0,0,0,17,1,13,0,3,0,21,0,0,0,30,4,0,0,0,0,0,0,80,0,2,0,0,0,5,0,1,0,0,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,17,0,5,0,1,0,3,48,1,0,255,255,255,255,170,2,227,0,32,0,149,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,49,0,224,8,224,8,0,0,1,0,2,0,170,2,30,1,215,0,0,0,0,0,0,0,0,0,54,0,0,0,160,0,20,1,149,0,31,1,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,2,48,0,0,0,0,0,0,1,0,14,3,0,0,149,0,33,1,0,0,0,0,0,0,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,77,71,58,80,111,119,101,114,83,104,111,116,32,83,52,48,32,74,80,69,71,0,0,0,0,0,0,0,0,0,0,70,105,114,109,119,97,114,101,32,86,101,114,115,105,111,110,32,49,46,49,48,0,0,0,65,110,100,114,101,97,115,32,72,117,103,103,101,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,3,0,1,128,122,1,1,128,0,0,0,0,0,0,3,1,2,0,0,0,10,0,0,0,0,0,0,0,57,0,198,0,5,0,0,0,0,0,0,0,73,73,42,0,134,2,0,0]},"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":2272,"ExifImageHeight":1704,"InteropOffset":1128,"FocalPlaneXResolution":8114.285714285715,"FocalPlaneYResolution":8114.285714285715,"FocalPlaneResolutionUnit":2,"SensingMethod":2,"FileSource":{"type":"Buffer","data":[3]},"CustomRendered":0,"ExposureMode":0,"WhiteBalance":0,"DigitalZoomRatio":1,"SceneCaptureType":0},"gps":{},"interoperability":{"InteropIndex":"R98","InteropVersion":{"type":"Buffer","data":[48,49,48,48]},"RelatedImageWidth":2272,"RelatedImageHeight":1704},"makernote":{"error":"Unable to extract Makernote information as it is in an unsupported or unrecognized format."}} -------------------------------------------------------------------------------- /lib/exif/makernotes/fujifilm.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Extracts Fujifilm flavored Makernotes which are always stored in little 3 | * endian, no matter what the rest of the file is. Additionally the offsets 4 | * are relative to the start of the Makernote instead of the start of the 5 | * TIFF header. 6 | */ 7 | exports.extractMakernotes = function (data, makernoteOffset, tiffOffset) { 8 | 9 | // List of vendor specific Makernote tags found on 10 | // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/FujiFilm.html 11 | var tags = { 12 | 0x0000 : "Version", 13 | 0x0010 : "InternalSerialNumber", 14 | 0x1000 : "Quality", 15 | 0x1001 : "Sharpness", 16 | 0x1002 : "WhiteBalance", 17 | 0x1003 : "Saturation", 18 | 0x1004 : "Contrast", 19 | 0x1005 : "ColorTemperature", 20 | 0x1006 : "Contrast", 21 | 0x100a : "WhiteBalanceFineTune", 22 | 0x100b : "NoiseReduction", 23 | 0x100e : "HighISONoiseReduction", 24 | 0x1010 : "FujiFlashMode", 25 | 0x1011 : "FlashExposureComp", 26 | 0x1020 : "Macro", 27 | 0x1021 : "FocusMode", 28 | 0x1023 : "FocusPixel", 29 | 0x1030 : "SlowSync", 30 | 0x1033 : "EXRAuto", 31 | 0x1034 : "EXRMode", 32 | 0x1100 : "AutoBracketing", 33 | 0x1101 : "SequenceNumber", 34 | 0x1210 : "ColorMode", 35 | 0x1300 : "BlurWarning", 36 | 0x1301 : "FocusWarning", 37 | 0x1302 : "ExposureWarning", 38 | 0x1304 : "GEImageSize", 39 | 0x1400 : "DynamicRange", 40 | 0x1401 : "FilmMode", 41 | 0x1402 : "DynamicRangeSetting", 42 | 0x1403 : "DevelopmentDynamicRange", 43 | 0x1404 : "MinFocalLength", 44 | 0x1405 : "MaxFocalLength", 45 | 0x1406 : "MaxApertureAtMinFocal", 46 | 0x1407 : "MaxApertureAtMaxFocal", 47 | 0x140b : "AutoDynamicRange", 48 | 0x4100 : "FacesDetected", 49 | 0x4103 : "FacePositions", 50 | 0x4282 : "FaceRecInfo", 51 | 0x8000 : "FileSource", 52 | 0x8002 : "OrderNumber", 53 | 0x8003 : "FrameNumber", 54 | 0xb211 : "Parallax" 55 | 56 | }; 57 | 58 | // Start of the Fujifilm flavored Makernote data is determined by the four 59 | // bytes following the Makernote vendor name 60 | var ifdOffset = makernoteOffset + data.getLong(makernoteOffset + 8, false, tiffOffset); 61 | 62 | // Get the number of entries and extract them 63 | var numberOfEntries = data.getShort(ifdOffset, false); 64 | if (this.options.fujifilmMaxEntries) { 65 | numberOfEntries=Math.min(numberOfEntries, this.options.fujifilmMaxEntries); 66 | } 67 | 68 | var makernoteData = {}; 69 | 70 | for (var i = 0; i < numberOfEntries; i++) { 71 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), makernoteOffset, false, tags); 72 | if (exifEntry && exifEntry.tagName !== null) makernoteData[exifEntry.tagName] = exifEntry.value; 73 | } 74 | 75 | return makernoteData; 76 | 77 | }; -------------------------------------------------------------------------------- /lib/exif/makernotes/panasonic.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Extracts Panasonic flavored Makernotes. 3 | */ 4 | exports.extractMakernotes = function (data, makernoteOffset, tiffOffset) { 5 | 6 | // List of vendor specific Makernote tags found on 7 | // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Panasonic.html 8 | var tags = { 9 | 10 | 0x0001 : "ImageQuality", 11 | 0x0002 : "FirmwareVersion", 12 | 0x0003 : "WhiteBalance", 13 | 0x0007 : "FocusMode", 14 | 0x000f : "AFAreaMode", 15 | 0x001a : "ImageStabilization", 16 | 0x001c : "MacroMode", 17 | 0x001f : "ShootingMode", 18 | 0x0020 : "Audio", 19 | 0x0021 : "DataDump", 20 | 0x0023 : "WhiteBalanceBias", 21 | 0x0024 : "FlashBias", 22 | 0x0025 : "InternalSerialNumber", 23 | 0x0026 : "PanasonicExifVersion", 24 | 0x0028 : "ColorEffect", 25 | 0x0029 : "TimeSincePowerOn", 26 | 0x002a : "BurstMode", 27 | 0x002b : "SequenceNumber", 28 | 0x002c : "ContrastMode", 29 | 0x002d : "NoiseReduction", 30 | 0x002e : "SelfTimer", 31 | 0x0030 : "Rotation", 32 | 0x0031 : "AFAssistLamp", 33 | 0x0032 : "ColorMode", 34 | 0x0033 : "BabyAge", 35 | 0x0034 : "OpticalZoomMode", 36 | 0x0035 : "ConversionLens", 37 | 0x0036 : "TravelDay", 38 | 0x0039 : "Contrast", 39 | 0x003a : "WorldTimeLocation", 40 | 0x003b : "TextStamp", 41 | 0x003c : "ProgramISO", 42 | 0x003d : "AdvancedSceneType", 43 | 0x003e : "TextStamp", 44 | 0x003f : "FacesDetected", 45 | 0x0040 : "Saturation", 46 | 0x0041 : "Sharpness", 47 | 0x0042 : "FilmMode", 48 | 0x0044 : "ColorTempKelvin", 49 | 0x0045 : "BracketSettings", 50 | 0x0046 : "WBShiftAB", 51 | 0x0047 : "WBShiftGM", 52 | 0x0048 : "FlashCurtain", 53 | 0x0049 : "LongExposureNoiseReduction", 54 | 0x004b : "PanasonicImageWidth", 55 | 0x004c : "PanasonicImageHeight", 56 | 0x004d : "AFPointPosition", 57 | 0x004e : "FaceDetInfo", 58 | 0x0051 : "LensType", 59 | 0x0052 : "LensSerialNumber", 60 | 0x0053 : "AccessoryType", 61 | 0x0054 : "AccessorySerialNumber", 62 | 0x0059 : "Transform", 63 | 0x005d : "IntelligentExposure", 64 | 0x0060 : "LensFirmwareVersion", 65 | 0x0061 : "FaceRecInfo", 66 | 0x0062 : "FlashWarning", 67 | 0x0063 : "RecognizedFaceFlags?", 68 | 0x0065 : "Title", 69 | 0x0066 : "BabyName", 70 | 0x0067 : "Location", 71 | 0x0069 : "Country", 72 | 0x006b : "State", 73 | 0x006d : "City", 74 | 0x006f : "Landmark", 75 | 0x0070 : "IntelligentResolution", 76 | 0x0077 : "BurstSpeed", 77 | 0x0079 : "IntelligentD-Range", 78 | 0x007c : "ClearRetouch", 79 | 0x0086 : "ManometerPressure", 80 | 0x0089 : "PhotoStyle", 81 | 0x008a : "ShadingCompensation", 82 | 0x008c : "AccelerometerZ", 83 | 0x008d : "AccelerometerX", 84 | 0x008e : "AccelerometerY", 85 | 0x008f : "CameraOrientation", 86 | 0x0090 : "RollAngle", 87 | 0x0091 : "PitchAngle", 88 | 0x0093 : "SweepPanoramaDirection", 89 | 0x0094 : "SweepPanoramaFieldOfView", 90 | 0x0096 : "TimerRecording", 91 | 0x009d : "InternalNDFilter", 92 | 0x009e : "HDR", 93 | 0x009f : "ShutterType", 94 | 0x00a3 : "ClearRetouchValue", 95 | 0x00ab : "TouchAE", 96 | 0x0e00 : "PrintIM", 97 | 0x8000 : "MakerNoteVersion", 98 | 0x8001 : "SceneMode", 99 | 0x8004 : "WBRedLevel", 100 | 0x8005 : "WBGreenLevel", 101 | 0x8006 : "WBBlueLevel", 102 | 0x8007 : "FlashFired", 103 | 0x8008 : "TextStamp", 104 | 0x8009 : "TextStamp", 105 | 0x8010 : "BabyAge", 106 | 0x8012 : "Transform" 107 | 108 | }; 109 | 110 | // Panasonic flavored Makernote data starts after twelve bytes 111 | var ifdOffset = makernoteOffset + 12; 112 | 113 | // Get the number of entries and extract them 114 | var numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 115 | if (this.options.panasonicMaxEntries) { 116 | numberOfEntries=Math.min(numberOfEntries, this.options.panasonicMaxEntries); 117 | } 118 | 119 | var makernoteData = {}; 120 | 121 | for (var i = 0; i < numberOfEntries; i++) { 122 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), makernoteOffset, false, tags); 123 | if( ! exifEntry ) break; // stop if exifEntry starts to return false, prevents a process out of memory 124 | if (exifEntry && exifEntry.tagName) { 125 | makernoteData[exifEntry.tagName] = exifEntry.value; 126 | } 127 | } 128 | 129 | return makernoteData; 130 | 131 | }; 132 | -------------------------------------------------------------------------------- /test/api-test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var fs=require('fs'); 3 | var Path = require('path'); 4 | 5 | describe('node-exif API', function() { 6 | 7 | var path=Path.join(__dirname, "evil1.jpg"); 8 | var json='{"image":{"Make":"Canon","Model":"Canon PowerShot S400","Orientation":1,"XResolution":180,"YResolution":180,"ResolutionUnit":2,"Software":"Adobe Photoshop 7.0","ModifyDate":"2003:05:25 11:11:41","YCbCrPositioning":1,"ExifOffset":217},"thumbnail":{"Compression":6,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"ThumbnailOffset":1057,"ThumbnailLength":6298},"exif":{"ExposureTime":0.125,"FNumber":2.8,"ExifVersion":{"type":"Buffer","data":[48,50,50,48]},"DateTimeOriginal":"2003:05:24 16:40:33","CreateDate":"2003:05:24 16:40:33","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"CompressedBitsPerPixel":3,"ShutterSpeedValue":3,"ApertureValue":2.96875,"ExposureCompensation":0,"MaxApertureValue":2.96875,"MeteringMode":5,"Flash":16,"FocalLength":7.40625,"UserComment":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":400,"ExifImageHeight":300,"FocalPlaneXResolution":8114.285714285715,"FocalPlaneYResolution":8114.285714285715,"FocalPlaneResolutionUnit":2,"SensingMethod":2,"FileSource":{"type":"Buffer","data":[3]},"CustomRendered":0,"ExposureMode":0,"WhiteBalance":0,"DigitalZoomRatio":1,"SceneCaptureType":0},"gps":{},"interoperability":{},"makernote":{}}'; 9 | 10 | 11 | it('test constructor (filename)', function(done) { 12 | 13 | var ExifImage = require('..').ExifImage; 14 | 15 | new ExifImage({image: path }, function(error, data) { 16 | if (error) { 17 | throw error; 18 | } 19 | 20 | assert.equal(JSON.stringify(data), json, "Not same datas ?"); 21 | 22 | done(); 23 | }); 24 | }); 25 | 26 | it('test constructor (buffer)', function(done) { 27 | 28 | var ExifImage = require('..').ExifImage; 29 | 30 | var buffer=fs.readFileSync(path); 31 | 32 | new ExifImage({image: buffer }, function(error, data) { 33 | if (error) { 34 | throw error; 35 | } 36 | 37 | assert.equal(JSON.stringify(data), json, "Not same datas ?"); 38 | 39 | done(); 40 | }); 41 | }); 42 | 43 | it('test loadImage (filename)', function(done) { 44 | 45 | var ExifImage = require('..').ExifImage; 46 | 47 | var exif=new ExifImage(); 48 | 49 | exif.loadImage(path, function(error, data) { 50 | if (error) { 51 | throw error; 52 | } 53 | 54 | assert.equal(JSON.stringify(data), json, "Not same datas ?"); 55 | 56 | done(); 57 | }); 58 | }); 59 | 60 | it('test loadImage (buffer)', function(done) { 61 | 62 | var ExifImage = require('..').ExifImage; 63 | 64 | var buffer=fs.readFileSync(path); 65 | 66 | var exif=new ExifImage(); 67 | 68 | exif.loadImage(buffer , function(error, data) { 69 | if (error) { 70 | throw error; 71 | } 72 | 73 | assert.equal(JSON.stringify(data), json, "Not same datas"); 74 | 75 | done(); 76 | }); 77 | }); 78 | 79 | it('test wrapper', function(done) { 80 | 81 | var Exif = require('..'); 82 | 83 | Exif(path, function(error, data, dataPath) { 84 | if (error) { 85 | throw error; 86 | } 87 | 88 | assert.equal(dataPath, path, "Not same path"); 89 | delete data.path; 90 | 91 | assert.equal(JSON.stringify(data), json, "Not same datas ?"); 92 | 93 | done(); 94 | }); 95 | }); 96 | }); 97 | 98 | describe('node-exif tests', function() { 99 | var ExifImage = require('..').ExifImage; 100 | 101 | var files=fs.readdirSync(__dirname); 102 | 103 | files.forEach(function(f) { 104 | if (!/\.jpg$/.exec(f)) { 105 | return; 106 | } 107 | 108 | var path=Path.join(__dirname, f); 109 | 110 | it('test '+f, function(done) { 111 | var expected=String(fs.readFileSync(path+".json")); 112 | 113 | new ExifImage({image: path }, function(error, data) { 114 | if (error) { 115 | throw error; 116 | } 117 | 118 | var json=JSON.stringify(data); 119 | 120 | //console.log(" data=", json, json.length); 121 | // console.log("expected=", expected, expected.length); 122 | 123 | assert.equal(json, expected, "Data are not the same"); 124 | 125 | done(); 126 | }); 127 | }); 128 | }); 129 | }); 130 | -------------------------------------------------------------------------------- /lib/exif/makernotes/olympus.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Extracts Olympus flavored Makernotes. 3 | */ 4 | exports.extractMakernotes = function (data, makernoteOffset, tiffOffset) { 5 | 6 | // List of vendor specific Makernote tags found on 7 | // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Olympus.html 8 | var tags = { 9 | 10 | 0x0000 : "MakerNoteVersion", 11 | 0x0001 : "MinoltaCameraSettingsOld", 12 | 0x0003 : "MinoltaCameraSettings", 13 | 0x0040 : "CompressedImageSize", 14 | 0x0081 : "PreviewImageData", 15 | 0x0088 : "PreviewImageStart", 16 | 0x0089 : "PreviewImageLength", 17 | 0x0100 : "ThumbnailImage", 18 | 0x0104 : "BodyFirmwareVersion", 19 | 0x0200 : "SpecialMode", 20 | 0x0201 : "Quality", 21 | 0x0202 : "Macro", 22 | 0x0203 : "BWMode", 23 | 0x0204 : "DigitalZoom", 24 | 0x0205 : "FocalPlaneDiagonal", 25 | 0x0206 : "LensDistortionParams", 26 | 0x0207 : "CameraType", 27 | 0x0208 : "TextInfo", 28 | 0x0209 : "CameraID", 29 | 0x020B : "EpsonImageWidth", 30 | 0x020C : "EpsonImageHeight", 31 | 0x020D : "EpsonSoftware", 32 | 0x0280 : "PreviewImage", 33 | 0x0300 : "PreCaptureFrames", 34 | 0x0301 : "WhiteBoard", 35 | 0x0302 : "OneTouchWB", 36 | 0x0303 : "WhiteBalanceBracket", 37 | 0x0304 : "WhiteBalanceBias", 38 | 0x0403 : "SceneMode", 39 | 0x0404 : "SerialNumber", 40 | 0x0405 : "Firmware", 41 | 0x0E00 : "PrintIM", 42 | 0x0F00 : "DataDump", 43 | 0x0F01 : "DataDump2", 44 | 0x0F04 : "ZoomedPreviewStart", 45 | 0x0F05 : "ZoomedPreviewLength", 46 | 0x0F06 : "ZoomedPreviewSize", 47 | 0x1000 : "ShutterSpeedValue", 48 | 0x1001 : "ISOValue", 49 | 0x1002 : "ApertureValue", 50 | 0x1003 : "BrightnessValue", 51 | 0x1004 : "FlashMode", 52 | 0x1005 : "FlashDevice", 53 | 0x1006 : "ExposureCompensation", 54 | 0x1007 : "SensorTemperature", 55 | 0x1008 : "LensTemperature", 56 | 0x1009 : "LightCondition", 57 | 0x100A : "FocusRange", 58 | 0x100B : "FocusMode", 59 | 0x100C : "ManualFocusDistance", 60 | 0x100D : "ZoomStepCount", 61 | 0x100E : "FocusStepCount", 62 | 0x100F : "Sharpness", 63 | 0x1010 : "FlashChargeLevel", 64 | 0x1011 : "ColorMatrix", 65 | 0x1012 : "BlackLevel", 66 | 0x1013 : "ColorTemperatureBG?", 67 | 0x1014 : "ColorTemperatureRG?", 68 | 0x1015 : "WBMode", 69 | 0x1017 : "RedBalance", 70 | 0x1018 : "BlueBalance", 71 | 0x1019 : "ColorMatrixNumber", 72 | 0x101A : "SerialNumber", 73 | 0x101B : "ExternalFlashAE1_0?", 74 | 0x101C : "ExternalFlashAE2_0?", 75 | 0x101D : "InternalFlashAE1_0?", 76 | 0x101E : "InternalFlashAE2_0?", 77 | 0x101F : "ExternalFlashAE1?", 78 | 0x1020 : "ExternalFlashAE2?", 79 | 0x1021 : "InternalFlashAE1?", 80 | 0x1022 : "InternalFlashAE2?", 81 | 0x1023 : "FlashExposureComp", 82 | 0x1024 : "InternalFlashTable", 83 | 0x1025 : "ExternalFlashGValue", 84 | 0x1026 : "ExternalFlashBounce", 85 | 0x1027 : "ExternalFlashZoom", 86 | 0x1028 : "ExternalFlashMode", 87 | 0x1029 : "Contrast", 88 | 0x102A : "SharpnessFactor", 89 | 0x102B : "ColorControl", 90 | 0x102C : "ValidBits", 91 | 0x102D : "CoringFilter", 92 | 0x102E : "OlympusImageWidth", 93 | 0x102F : "OlympusImageHeight", 94 | 0x1030 : "SceneDetect", 95 | 0x1031 : "SceneArea?", 96 | 0x1033 : "SceneDetectData?", 97 | 0x1034 : "CompressionRatio", 98 | 0x1035 : "PreviewImageValid", 99 | 0x1036 : "PreviewImageStart", 100 | 0x1037 : "PreviewImageLength", 101 | 0x1038 : "AFResult", 102 | 0x1039 : "CCDScanMode", 103 | 0x103A : "NoiseReduction", 104 | 0x103B : "FocusStepInfinity", 105 | 0x103C : "FocusStepNear", 106 | 0x103D : "LightValueCenter", 107 | 0x103E : "LightValuePeriphery", 108 | 0x103F : "FieldCount?", 109 | 0x2010 : "Equipment", 110 | 0x2020 : "CameraSettings", 111 | 0x2030 : "RawDevelopment", 112 | 0x2031 : "RawDev2", 113 | 0x2040 : "ImageProcessing", 114 | 0x2050 : "FocusInfo", 115 | 0x2100 : "Olympus2100", 116 | 0x2200 : "Olympus2200", 117 | 0x2300 : "Olympus2300", 118 | 0x2400 : "Olympus2400", 119 | 0x2500 : "Olympus2500", 120 | 0x2600 : "Olympus2600", 121 | 0x2700 : "Olympus2700", 122 | 0x2800 : "Olympus2800", 123 | 0x2900 : "Olympus2900", 124 | 0x3000 : "RawInfo", 125 | 0x4000 : "MainInfo", 126 | 0x5000 : "UnknownInfo" 127 | 128 | }; 129 | 130 | // Olympus flavored Makernote data starts after eight bytes 131 | var ifdOffset = makernoteOffset + 8; 132 | 133 | // Get the number of entries and extract them 134 | var numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 135 | if (this.options.olympusMaxEntries) { 136 | numberOfEntries=Math.min(numberOfEntries, this.options.olympusMaxEntries); 137 | } 138 | 139 | var makernoteData = {}; 140 | 141 | for (var i = 0; i < numberOfEntries; i++) { 142 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, tags); 143 | if (exifEntry && exifEntry.tagName !== null) makernoteData[exifEntry.tagName] = exifEntry.value; 144 | } 145 | 146 | return makernoteData; 147 | 148 | }; -------------------------------------------------------------------------------- /lib/exif/makernotes/agfa.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Extracts Agfa flavored Makernotes which are equal to those of Olympus. 3 | */ 4 | exports.extractMakernotes = function (data, makernoteOffset, tiffOffset) { 5 | 6 | // List of vendor specific Makernote tags found on 7 | // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Olympus.html 8 | var tags = { 9 | 10 | 0x0000 : "MakerNoteVersion", 11 | 0x0001 : "MinoltaCameraSettingsOld", 12 | 0x0003 : "MinoltaCameraSettings", 13 | 0x0040 : "CompressedImageSize", 14 | 0x0081 : "PreviewImageData", 15 | 0x0088 : "PreviewImageStart", 16 | 0x0089 : "PreviewImageLength", 17 | 0x0100 : "ThumbnailImage", 18 | 0x0104 : "BodyFirmwareVersion", 19 | 0x0200 : "SpecialMode", 20 | 0x0201 : "Quality", 21 | 0x0202 : "Macro", 22 | 0x0203 : "BWMode", 23 | 0x0204 : "DigitalZoom", 24 | 0x0205 : "FocalPlaneDiagonal", 25 | 0x0206 : "LensDistortionParams", 26 | 0x0207 : "CameraType", 27 | 0x0208 : "TextInfo", 28 | 0x0209 : "CameraID", 29 | 0x020B : "EpsonImageWidth", 30 | 0x020C : "EpsonImageHeight", 31 | 0x020D : "EpsonSoftware", 32 | 0x0280 : "PreviewImage", 33 | 0x0300 : "PreCaptureFrames", 34 | 0x0301 : "WhiteBoard", 35 | 0x0302 : "OneTouchWB", 36 | 0x0303 : "WhiteBalanceBracket", 37 | 0x0304 : "WhiteBalanceBias", 38 | 0x0403 : "SceneMode", 39 | 0x0404 : "SerialNumber", 40 | 0x0405 : "Firmware", 41 | 0x0E00 : "PrintIM", 42 | 0x0F00 : "DataDump", 43 | 0x0F01 : "DataDump2", 44 | 0x0F04 : "ZoomedPreviewStart", 45 | 0x0F05 : "ZoomedPreviewLength", 46 | 0x0F06 : "ZoomedPreviewSize", 47 | 0x1000 : "ShutterSpeedValue", 48 | 0x1001 : "ISOValue", 49 | 0x1002 : "ApertureValue", 50 | 0x1003 : "BrightnessValue", 51 | 0x1004 : "FlashMode", 52 | 0x1005 : "FlashDevice", 53 | 0x1006 : "ExposureCompensation", 54 | 0x1007 : "SensorTemperature", 55 | 0x1008 : "LensTemperature", 56 | 0x1009 : "LightCondition", 57 | 0x100A : "FocusRange", 58 | 0x100B : "FocusMode", 59 | 0x100C : "ManualFocusDistance", 60 | 0x100D : "ZoomStepCount", 61 | 0x100E : "FocusStepCount", 62 | 0x100F : "Sharpness", 63 | 0x1010 : "FlashChargeLevel", 64 | 0x1011 : "ColorMatrix", 65 | 0x1012 : "BlackLevel", 66 | 0x1013 : "ColorTemperatureBG?", 67 | 0x1014 : "ColorTemperatureRG?", 68 | 0x1015 : "WBMode", 69 | 0x1017 : "RedBalance", 70 | 0x1018 : "BlueBalance", 71 | 0x1019 : "ColorMatrixNumber", 72 | 0x101A : "SerialNumber", 73 | 0x101B : "ExternalFlashAE1_0?", 74 | 0x101C : "ExternalFlashAE2_0?", 75 | 0x101D : "InternalFlashAE1_0?", 76 | 0x101E : "InternalFlashAE2_0?", 77 | 0x101F : "ExternalFlashAE1?", 78 | 0x1020 : "ExternalFlashAE2?", 79 | 0x1021 : "InternalFlashAE1?", 80 | 0x1022 : "InternalFlashAE2?", 81 | 0x1023 : "FlashExposureComp", 82 | 0x1024 : "InternalFlashTable", 83 | 0x1025 : "ExternalFlashGValue", 84 | 0x1026 : "ExternalFlashBounce", 85 | 0x1027 : "ExternalFlashZoom", 86 | 0x1028 : "ExternalFlashMode", 87 | 0x1029 : "Contrast", 88 | 0x102A : "SharpnessFactor", 89 | 0x102B : "ColorControl", 90 | 0x102C : "ValidBits", 91 | 0x102D : "CoringFilter", 92 | 0x102E : "OlympusImageWidth", 93 | 0x102F : "OlympusImageHeight", 94 | 0x1030 : "SceneDetect", 95 | 0x1031 : "SceneArea?", 96 | 0x1033 : "SceneDetectData?", 97 | 0x1034 : "CompressionRatio", 98 | 0x1035 : "PreviewImageValid", 99 | 0x1036 : "PreviewImageStart", 100 | 0x1037 : "PreviewImageLength", 101 | 0x1038 : "AFResult", 102 | 0x1039 : "CCDScanMode", 103 | 0x103A : "NoiseReduction", 104 | 0x103B : "FocusStepInfinity", 105 | 0x103C : "FocusStepNear", 106 | 0x103D : "LightValueCenter", 107 | 0x103E : "LightValuePeriphery", 108 | 0x103F : "FieldCount?", 109 | 0x2010 : "Equipment", 110 | 0x2020 : "CameraSettings", 111 | 0x2030 : "RawDevelopment", 112 | 0x2031 : "RawDev2", 113 | 0x2040 : "ImageProcessing", 114 | 0x2050 : "FocusInfo", 115 | 0x2100 : "Olympus2100", 116 | 0x2200 : "Olympus2200", 117 | 0x2300 : "Olympus2300", 118 | 0x2400 : "Olympus2400", 119 | 0x2500 : "Olympus2500", 120 | 0x2600 : "Olympus2600", 121 | 0x2700 : "Olympus2700", 122 | 0x2800 : "Olympus2800", 123 | 0x2900 : "Olympus2900", 124 | 0x3000 : "RawInfo", 125 | 0x4000 : "MainInfo", 126 | 0x5000 : "UnknownInfo" 127 | 128 | }; 129 | 130 | // Agfa flavored Makernote data starts after eight bytes 131 | var ifdOffset = makernoteOffset + 8; 132 | 133 | // Get the number of entries and extract them 134 | var numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 135 | if (this.options.agfaMaxEntries) { 136 | numberOfEntries=Math.min(numberOfEntries, this.options.agfaMaxEntries); 137 | } 138 | 139 | var makernoteData = {}; 140 | 141 | for (var i = 0; i < numberOfEntries; i++) { 142 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, tags); 143 | if (exifEntry && exifEntry.tagName !== null) { 144 | makernoteData[exifEntry.tagName] = exifEntry.value; 145 | } 146 | } 147 | 148 | return makernoteData; 149 | 150 | }; -------------------------------------------------------------------------------- /lib/exif/makernotes/epson.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Extracts Epson flavored Makernotes which are equal to those of Olympus. 3 | */ 4 | exports.extractMakernotes = function (data, makernoteOffset, tiffOffset) { 5 | 6 | // List of vendor specific Makernote tags found on 7 | // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Olympus.html 8 | var tags = { 9 | 10 | 0x0000 : "MakerNoteVersion", 11 | 0x0001 : "MinoltaCameraSettingsOld", 12 | 0x0003 : "MinoltaCameraSettings", 13 | 0x0040 : "CompressedImageSize", 14 | 0x0081 : "PreviewImageData", 15 | 0x0088 : "PreviewImageStart", 16 | 0x0089 : "PreviewImageLength", 17 | 0x0100 : "ThumbnailImage", 18 | 0x0104 : "BodyFirmwareVersion", 19 | 0x0200 : "SpecialMode", 20 | 0x0201 : "Quality", 21 | 0x0202 : "Macro", 22 | 0x0203 : "BWMode", 23 | 0x0204 : "DigitalZoom", 24 | 0x0205 : "FocalPlaneDiagonal", 25 | 0x0206 : "LensDistortionParams", 26 | 0x0207 : "CameraType", 27 | 0x0208 : "TextInfo", 28 | 0x0209 : "CameraID", 29 | 0x020B : "EpsonImageWidth", 30 | 0x020C : "EpsonImageHeight", 31 | 0x020D : "EpsonSoftware", 32 | 0x0280 : "PreviewImage", 33 | 0x0300 : "PreCaptureFrames", 34 | 0x0301 : "WhiteBoard", 35 | 0x0302 : "OneTouchWB", 36 | 0x0303 : "WhiteBalanceBracket", 37 | 0x0304 : "WhiteBalanceBias", 38 | 0x0403 : "SceneMode", 39 | 0x0404 : "SerialNumber", 40 | 0x0405 : "Firmware", 41 | 0x0E00 : "PrintIM", 42 | 0x0F00 : "DataDump", 43 | 0x0F01 : "DataDump2", 44 | 0x0F04 : "ZoomedPreviewStart", 45 | 0x0F05 : "ZoomedPreviewLength", 46 | 0x0F06 : "ZoomedPreviewSize", 47 | 0x1000 : "ShutterSpeedValue", 48 | 0x1001 : "ISOValue", 49 | 0x1002 : "ApertureValue", 50 | 0x1003 : "BrightnessValue", 51 | 0x1004 : "FlashMode", 52 | 0x1005 : "FlashDevice", 53 | 0x1006 : "ExposureCompensation", 54 | 0x1007 : "SensorTemperature", 55 | 0x1008 : "LensTemperature", 56 | 0x1009 : "LightCondition", 57 | 0x100A : "FocusRange", 58 | 0x100B : "FocusMode", 59 | 0x100C : "ManualFocusDistance", 60 | 0x100D : "ZoomStepCount", 61 | 0x100E : "FocusStepCount", 62 | 0x100F : "Sharpness", 63 | 0x1010 : "FlashChargeLevel", 64 | 0x1011 : "ColorMatrix", 65 | 0x1012 : "BlackLevel", 66 | 0x1013 : "ColorTemperatureBG?", 67 | 0x1014 : "ColorTemperatureRG?", 68 | 0x1015 : "WBMode", 69 | 0x1017 : "RedBalance", 70 | 0x1018 : "BlueBalance", 71 | 0x1019 : "ColorMatrixNumber", 72 | 0x101A : "SerialNumber", 73 | 0x101B : "ExternalFlashAE1_0?", 74 | 0x101C : "ExternalFlashAE2_0?", 75 | 0x101D : "InternalFlashAE1_0?", 76 | 0x101E : "InternalFlashAE2_0?", 77 | 0x101F : "ExternalFlashAE1?", 78 | 0x1020 : "ExternalFlashAE2?", 79 | 0x1021 : "InternalFlashAE1?", 80 | 0x1022 : "InternalFlashAE2?", 81 | 0x1023 : "FlashExposureComp", 82 | 0x1024 : "InternalFlashTable", 83 | 0x1025 : "ExternalFlashGValue", 84 | 0x1026 : "ExternalFlashBounce", 85 | 0x1027 : "ExternalFlashZoom", 86 | 0x1028 : "ExternalFlashMode", 87 | 0x1029 : "Contrast", 88 | 0x102A : "SharpnessFactor", 89 | 0x102B : "ColorControl", 90 | 0x102C : "ValidBits", 91 | 0x102D : "CoringFilter", 92 | 0x102E : "OlympusImageWidth", 93 | 0x102F : "OlympusImageHeight", 94 | 0x1030 : "SceneDetect", 95 | 0x1031 : "SceneArea?", 96 | 0x1033 : "SceneDetectData?", 97 | 0x1034 : "CompressionRatio", 98 | 0x1035 : "PreviewImageValid", 99 | 0x1036 : "PreviewImageStart", 100 | 0x1037 : "PreviewImageLength", 101 | 0x1038 : "AFResult", 102 | 0x1039 : "CCDScanMode", 103 | 0x103A : "NoiseReduction", 104 | 0x103B : "FocusStepInfinity", 105 | 0x103C : "FocusStepNear", 106 | 0x103D : "LightValueCenter", 107 | 0x103E : "LightValuePeriphery", 108 | 0x103F : "FieldCount?", 109 | 0x2010 : "Equipment", 110 | 0x2020 : "CameraSettings", 111 | 0x2030 : "RawDevelopment", 112 | 0x2031 : "RawDev2", 113 | 0x2040 : "ImageProcessing", 114 | 0x2050 : "FocusInfo", 115 | 0x2100 : "Olympus2100", 116 | 0x2200 : "Olympus2200", 117 | 0x2300 : "Olympus2300", 118 | 0x2400 : "Olympus2400", 119 | 0x2500 : "Olympus2500", 120 | 0x2600 : "Olympus2600", 121 | 0x2700 : "Olympus2700", 122 | 0x2800 : "Olympus2800", 123 | 0x2900 : "Olympus2900", 124 | 0x3000 : "RawInfo", 125 | 0x4000 : "MainInfo", 126 | 0x5000 : "UnknownInfo" 127 | 128 | }; 129 | 130 | // Epson flavored Makernote data starts after eight bytes 131 | var ifdOffset = makernoteOffset + 8; 132 | 133 | // Get the number of entries and extract them 134 | var numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 135 | if (this.options.epsonMaxEntries) { 136 | numberOfEntries=Math.min(numberOfEntries, this.options.epsonMaxEntries); 137 | } 138 | 139 | var makernoteData = {}; 140 | 141 | for (var i = 0; i < numberOfEntries; i++) { 142 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, tags); 143 | if (exifEntry && exifEntry.tagName !== null) { 144 | makernoteData[exifEntry.tagName] = exifEntry.value; 145 | } 146 | } 147 | 148 | return makernoteData; 149 | 150 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-exif 2 | 3 | With _node-exif_ you can extract Exif metadata from images (JPEG). Exif is a format used, for example, by digital cameras and scanners to save additional information about an image in the image file. This information can be the camera model, resolution, where the image was taken (GPS) or when it was taken. 4 | 5 | ## node-exif CLI 6 | 7 | Rodrigo Espinosa proposes the npm package [exif-cli](https://github.com/RodrigoEspinosa/exif-cli) to execute node-exif from a shell. 8 | 9 | ## Table of Contents 10 | 11 | * [Installation](#installation) 12 | * [Usage](#usage) 13 | * [ToDo / Ideas](#todo--ideas) 14 | * [License](#license) 15 | 16 | ## Installation 17 | 18 | Installing using npm (node package manager): 19 | 20 | npm install exif 21 | 22 | If you don't have npm installed or don't want to use it: 23 | 24 | cd ~/.node_libraries 25 | git clone git://github.com/gomfunkel/node-exif.git exif 26 | 27 | ## Usage 28 | 29 | Easy. Just require _node-exif_ and throw an image at it. If _node-exif_ is able to extract data from the image it does so and returns an object with all the information found, if an error occurs you will receive an error message. To prove that it really is easy please see the following example. 30 | 31 | ```javascript 32 | var ExifImage = require('exif').ExifImage; 33 | 34 | try { 35 | new ExifImage({ image : 'myImage.jpg' }, function (error, exifData) { 36 | if (error) 37 | console.log('Error: '+error.message); 38 | else 39 | console.log(exifData); // Do something with your data! 40 | }); 41 | } catch (error) { 42 | console.log('Error: ' + error.message); 43 | } 44 | ``` 45 | 46 | Instead of providing a filename of an image in your filesystem you can also pass a Buffer to ExifImage. 47 | 48 | The data returned (`exifData` in the example above) is an object containing objects for each type of available Exif metadata: 49 | 50 | * `image` for image information data (IFD0) 51 | * `thumbnail` for information regarding a possibly embedded thumbnail (IFD1) 52 | * `exif` for Exif-specific attribute information (Exif IFD) 53 | * `gps` for GPS information (GPS IFD) 54 | * `interoperability` for interoperability information (Interoperability IFD) 55 | * `makernote` for vendor specific Exif information (Makernotes) 56 | 57 | The ouput for an [example image](http://www.exif.org/samples/fujifilm-finepix40i.jpg) might thus look like this: 58 | 59 | ``` 60 | { 61 | image: { 62 | Make: 'FUJIFILM', 63 | Model: 'FinePix40i', 64 | Orientation: 1, 65 | XResolution: 72, 66 | YResolution: 72, 67 | ResolutionUnit: 2, 68 | Software: 'Digital Camera FinePix40i Ver1.39', 69 | ModifyDate: '2000:08:04 18:22:57', 70 | YCbCrPositioning: 2, 71 | Copyright: ' ', 72 | ExifOffset: 250 73 | }, 74 | thumbnail: { 75 | Compression: 6, 76 | Orientation: 1, 77 | XResolution: 72, 78 | YResolution: 72, 79 | ResolutionUnit: 2, 80 | ThumbnailOffset: 1074, 81 | ThumbnailLength: 8691, 82 | YCbCrPositioning: 2 83 | }, 84 | exif: { 85 | FNumber: 2.8, 86 | ExposureProgram: 2, 87 | ISO: 200, 88 | ExifVersion: , 89 | DateTimeOriginal: '2000:08:04 18:22:57', 90 | CreateDate: '2000:08:04 18:22:57', 91 | ComponentsConfiguration: , 92 | CompressedBitsPerPixel: 1.5, 93 | ShutterSpeedValue: 5.5, 94 | ApertureValue: 3, 95 | BrightnessValue: 0.26, 96 | ExposureCompensation: 0, 97 | MaxApertureValue: 3, 98 | MeteringMode: 5, 99 | Flash: 1, 100 | FocalLength: 8.7, 101 | MakerNote: , 102 | FlashpixVersion: , 103 | ColorSpace: 1, 104 | ExifImageWidth: 2400, 105 | ExifImageHeight: 1800, 106 | InteropOffset: 926, 107 | FocalPlaneXResolution: 2381, 108 | FocalPlaneYResolution: 2381, 109 | FocalPlaneResolutionUnit: 3, 110 | SensingMethod: 2, 111 | FileSource: , 112 | SceneType: 113 | }, 114 | gps: {}, 115 | interoperability: { 116 | InteropIndex: 'R98', 117 | InteropVersion: 118 | }, 119 | makernote: { 120 | Version: , 121 | Quality: 'NORMAL ', 122 | Sharpness: 3, 123 | WhiteBalance: 0, 124 | FujiFlashMode: 1, 125 | FlashExposureComp: 0, 126 | Macro: 0, 127 | FocusMode: 0, 128 | SlowSync: 0, 129 | AutoBracketing: 0, 130 | BlurWarning: 0, 131 | FocusWarning: 0, 132 | ExposureWarning: 0 133 | } 134 | } 135 | ``` 136 | 137 | For more information about the Exif standard please refer to the specification found on [http://www.exif.org](http://www.exif.org). A comprehensive list of available Exif attributes and their meaning can be found on [http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/](http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/). 138 | 139 | ## ToDo / Ideas 140 | 141 | There are a lot of things still to be done and to be made better. If you have any special requests please open an issue with a feature request. 142 | 143 | ## License 144 | 145 | _node-exif_ is licensed under the MIT License. (See LICENSE) -------------------------------------------------------------------------------- /test/short-ascii-II.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"ImageDescription":"\u0000\u0000\u0000\u0000","Make":"XIAOMI","Model":"MI3","Orientation":1,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"Software":"\u0000\u0000\u0000\u0000","ModifyDate":"2015:02:28 17:10:49","Artist":"\u0000\u0000\u0000\u0000","YCbCrPositioning":1,"Copyright":"\u0000\u0000\u0000\u0000","ExifOffset":245,"GPSInfo":2964},"thumbnail":{"Compression":6,"Orientation":1,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"ThumbnailOffset":3159,"ThumbnailLength":11279,"YCbCrPositioning":1},"exif":{"ExposureTime":0.0499,"FNumber":2.2,"ExposureProgram":2,"ISO":250,"ExifVersion":{"type":"Buffer","data":[48,50,50,48]},"DateTimeOriginal":"2015:02:28 17:10:49","CreateDate":"2015:02:28 17:10:49","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"CompressedBitsPerPixel":4,"ExposureCompensation":0,"MaxApertureValue":2.2,"SubjectDistance":0,"MeteringMode":2,"LightSource":0,"Flash":9,"FocalLength":3.51,"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":4208,"ExifImageHeight":3120,"InteropOffset":2902,"FileSource":{"type":"Buffer","data":[3]},"CustomRendered":0,"ExposureMode":0,"WhiteBalance":0,"DigitalZoomRatio":1,"SceneCaptureType":0,"ImageUniqueID":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","ShutterSpeedValue":null,"ApertureValue":2.275,"BrightnessValue":0.5374,"UserComment":{"type":"Buffer","data":[65,83,67,73,73,0,0,0,0]},"Sharpness":1,"SensingMethod":2,"SubjectArea":[0,7172,0,6150],"MakerNote":{"type":"Buffer","data":[1,11,108,160,201,214,29,174,106,200,26,240,30,114,97,159,67,32,139,211,87,111,88,17,249,32,139,211,87,111,88,17,249,32,139,211,87,111,88,17,249,196,223,253,13,222,12,33,237,125,217,179,220,25,19,157,33,32,139,211,87,111,88,17,249,32,139,211,87,111,88,17,249,32,139,211,87,111,88,17,249,179,224,25,97,0,128,97,58,32,139,211,87,111,88,17,249,32,139,211,87,111,88,17,249,32,139,211,87,111,88,17,249,121,194,211,230,160,128,43,181,90,233,243,176,52,11,116,20,214,255,117,97,65,192,13,203,253,177,137,191,179,111,122,73,253,45,104,11,116,25,54,136,214,146,168,133,104,73,69,61,115,133,6,146,76,222,9,140,115,139,89,68,115,220,140,167,94,40,78,60,247,93,22,76,86,133,226,190,186,128,87,251,241,216,125,35,127,88,161,185,49,217,158,49,252,218,131,215,73,168,117,222,246,87,108,111,137,94,223,141,17,223,119,24,39,116,34,61,202,178,238,87,129,66,212,214,179,179,47,76,211,231,129,23,253,102,36,31,45,46,132,145,219,0,172,229,161,59,83,171,164,109,239,228,126,45,182,180,76,191,179,179,110,100,26,163,249,213,232,136,166,171,121,168,61,6,247,125,198,3,29,220,152,135,111,168,29,105,106,235,65,230,75,210,188,218,218,242,98,13,82,90,133,38,207,189,224,242,230,252,49,41,93,61,178,233,124,15,101,1,114,234,18,86,178,9,59,108,141,156,199,210,151,244,186,181,92,107,86,119,236,131,10,213,146,39,111,205,69,69,237,11,14,1,207,197,71,106,205,88,17,125,132,21,222,100,60,216,128,160,103,241,243,133,107,203,163,208,122,203,182,60,197,52,94,85,26,12,171,98,2,132,120,58,49,189,142,253,76,125,248,210,4,209,237,73,78,116,55,246,89,153,65,128,73,207,226,21,232,41,78,239,22,150,56,5,20,187,130,172,175,120,168,105,50,27,225,49,158,241,71,159,40,170,253,180,212,47,190,98,193,223,228,47,240,193,226,109,241,227,232,90,130,89,91,57,91,188,164,74,233,217,164,128,134,19,172,127,34,189,184,90,130,223,185,203,140,133,75,22,51,228,21,47,63,144,195,233,141,113,211,148,3,140,112,149,214,226,91,133,233,89,86,79,116,139,105,104,13,13,7,142,228,20,82,134,197,250,91,118,111,13,85,65,20,202,249,69,124,35,223,218,226,223,135,37,95,64,230,84,59,210,181,222,251,2,159,100,88,160,90,118,214,118,31,5,203,87,49,4,183,179,110,160,14,215,111,234,82,204,201,113,121,94,222,144,16,173,64,214,127,141,141,62,112,42,112,188,193,209,190,19,107,77,254,6,18,38,144,143,146,83,34,119,139,71,61,185,238,183,161,75,97,194,161,91,85,12,186,113,163,52,68,140,12,165,59,58,15,61,53,3,223,211,191,255,24,46,44,15,10,10,236,36,205,138,145,253,243,57,235,116,112,242,62,185,139,55,2,142,54,249,97,222,151,123,198,189,206,134,21,208,52,238,109,67,215,193,223,110,18,155,184,82,161,255,60,16,185,208,80,62,14,89,206,99,162,245,6,75,44,215,221,151,139,147,125,173,10,106,82,250,151,177,133,202,19,227,1,188,214,24,183,159,3,52,200,142,55,250,40,69,25,22,66,15,36,87,135,94,206,67,4,243,18,72,2,38,73,202,30,58,17,183,130,232,61,188,40,250,148,247,160,174,145,149,143,128,96,80,255,211,48,69,139,72,41,90,17,208,222,212,27,39,133,62,28,34,152,100,0,252,25,17,186,141,37,204,161,175,19,134,28,84,237,212,48,79,143,66,11,56,199,168,33,225,87,194,49,203,151,4,127,24,130,241,1,4,197,0,99,149,189,143,44,197,83,130,143,28,16,245,209,56,113,5,62,150,101,161,112,104,67,80,112,28,160,159,48,158,60,4,65,47,68,7,212,38,207,150,43,95,160,22,144,135,212,159,225,107,60,199,27,173,25,184,163,143,201,103,101,247,231,238,71,8,60,196,197,241,156,135,246,121,180,203,226,114,146,71,81,112,140,108,126,150,33,222,243,121,214,255,14,239,177,89,189,73,152,10,88,143,216,54,38,144,167,175,226,119,104,65,66,96,102,230,53,5,153,25,53,171,8,48,61,21,243,55,67,33,46,21,169,153,251,195,6,202,161,100,182,181,231,252,242,150,108,174,214,204,24,236,254,44,202,64,209,162,147,171,122,183,140,177,161,148,122,149,89,128,85,6,60,218,117,105,184,6,30,233,255,249,61,172,173,89,214,134,76,77,78,145,184,239,143,130,249,125,227,192,131,196,130,225,88,58,170,105,242,254,28,99,164,244,152,118,222,50,76,110,53,32,98,128,144,41,125,211,167,116,140,86,180,153,143,38,38,208,52,73,146,152,241,15,149,40,138,158,33,192,36,235,43,240,57,73,73,175,53,85,138,31,197,138,255,32,12,18,175,81,162,33,44,143,255,58,161,72,178,23,149,171,206,4,107,30,115,199,220,106,77,68,123,146,193,158,11,114,16,70,86,36,130,55,208,120,229,227,59,145,45,37,108,254,235,174,150,24,45,37,108,254,235,174,150,24,129,168,153,72,24,87,225,186,72,229,9,161,92,25,40,183,119,187,35,4,230,144,73,136,10,38,83,91,136,247,136,97,122,10,183,251,126,240,2,200,131,204,204,141,106,112,134,237,147,173,166,85,70,236,104,19,47,97,210,27,127,74,37,191,79,200,178,230,185,190,10,165,48,15,164,225,138,242,228,190,95,90,193,181,159,13,186,12,65,77,38,47,79,245,63,175,232,33,232,26,62,1,91,101,140,250,91,140,7,221,133,195,60,220,156,231,18,33,93,80,130,182,105,18,185,205,250,63,107,197,31,49,83,223,110,199,239,184,186,135,5,151,117,252,118,255,36,204,181,229,62,252,239,180,251,5,165,13,23,132,28,252,106,184,156,202,224,6,79,164,165,52,190,14,187,76,33,210,118,202,175,52,229,241,84,52,93,209,15,253,128,172,95,110,77,87,208,167,124,13,147,56,105,201,128,225,105,250,240,224,55,138,169,159,202,7,20,238,11,230,223,235,219,19,87,148,24,212,34,231,81,141,235,120,190,119,243,165,147,208,10,200,45,22,213,129,23,85,141,96,128,212,228,202,91,48,56,35,236,166,202,133,255,85,193,175,220,60,59,47,104,40,75,35,11,195,80,138,227,126,187,238,249,15,213,20,253,110,166,237,198,55,114,26,103,41,124,185,112,140,194,186,245,177,196,107,39,195,94,190,202,223,33,90,123,89,197,68,27,27,202,64,124,223,173,209,203,70,168,188,131,84,148,134,255,80,18,8,87,109,50,180,51,73,228,174,119,230,180,210,168,213,17,140,151,100,43,26,58,210,55,175,59,178,94,179,7,72,99,179,116,171,88,41,240,57,68,100,221,55,239,66,63,40,26,47,31,35,58,211,251,115,249,126,209,182,21,152,173,129,213,228,180,90,16,115,123,89,218,40,243,93,5,3,97,4,27,98,126,78,255,185,159,227,149,104,88,77,10,68,16,186,138,21,206,231,22,238,45,7,121,83,37,12,68,207,226,250,152,13,216,142,133,250,93,2,176,32,99,41,130,46,216,44,174,192,40,12,242,58,35,167,13,17,114,53,39,16,210,133,191,79,9,150,127,217,195,73,83,16,124,222,34,212,100,162,19,8,85,124,152,21,127,119,179,189,206,168,179,199,61,216,60,175,83,50,202,161,224,72,101,116,165,137,192,157,225,122,5,143,135,129,63,231,16,164,65,76,148,241,71,122,135,242,208,51,198,252,237,131,13,119,243,148,200,138,1,25,9,228,124,188,239,99,235,197,18,5,52,232,113,229,70,156,163,181,30,11,75,255,156,161,238,149,1,168,243,181,14,115,182,200,222,94,47,163,153,177,97,242,146,99,150,226,134,47,166,143,8,157,19,234,206,214,215,19,158,250,207,3,176,49,160,197,19,125,118,12,84,111,183,163,34,66,235,173,122,191,179,223,38,160,175,225,54,236,108,196,187,187,251,106,248,120,153,252,145,147,220,36,32,92,203,239,92,63,248,249,249,1,200,21,131,59,237,19,22,168,90,109,252,57,80,187,39,210,52,112,7,49,31,215,118,216,65,77,74,111,98,143,147,162,125,230,217,79,19,233,46,230,119,205,34,154,103,239,64,203,156,17,48,99,50,212,55,134,81,113,60,254,10,21,200,126,20,160,201,181,85,1,21,59,168,210,58,0,119,252,28,20,254,240,127,177,5,228,43,35,248,219,23,14,97,91,252,91,204,185,89,122,48,154,200,36,5,250,242,164,236,45,34,44,224,19,39,175,228,141,1,165,27,92,176,205,240,16,45,231,230,122,28,32,87,104,89,104,92,65,25,158,30,126,133,252,3,26,118,161,116,242,149,69,54,190,243,81,66,57,54,80,244,136,220,228,11,129,66,9,247,68,45,136,217,165,250,93,207,69,206,24,178,14,148,204,249,55,206,24,178,14,148,204,249,55]}},"gps":{"GPSVersionID":[2,2,0,0],"GPSTimeStamp":[9,10,49],"GPSDateStamp":"2015:02:28"},"interoperability":{"InteropIndex":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","InteropVersion":{"type":"Buffer","data":[48,49,49,48]}},"makernote":{"error":"Unable to extract Makernote information as it is in an unsupported or unrecognized format."}} -------------------------------------------------------------------------------- /lib/exif/ExifImage.js: -------------------------------------------------------------------------------- 1 | /*jslint node: true */ 2 | "use strict"; 3 | 4 | var assert = require('assert'); 5 | var fs = require('fs'); 6 | var util = require('util'); 7 | var BufferExtender = require('./Buffer'); // bad idea 8 | var debug = require('debug')('exif'); 9 | 10 | var DEFAULT_MAX_ENTRIES=128; 11 | 12 | /** 13 | * Represents an image with Exif information. When instantiating it you have to 14 | * provide an image and a callback function which is called once all metadata 15 | * is extracted from the image. 16 | * 17 | * Available options are: 18 | * - image The image to get Exif data from can be either a filesystem path or 19 | * a Buffer. 20 | * - tiffOffsets (boolean) an object named "offsets" is added to exifData 21 | * and contains lot of offsets needed to get thumbnail and other things. 22 | * - fixThumbnailOffset: node-exif corrects the thumbnail offset in order to have an offset from the start of the buffer/file. 23 | * - maxEntries: Specifies the maximum entries to be parsed 24 | * - ifd0MaxEntries 25 | * - ifd1MaxEntries 26 | * - maxGpsEntries 27 | * - maxInteroperabilityEntries 28 | * - agfaMaxEntries 29 | * - epsonMaxEntries 30 | * - fujifilmMaxEntries 31 | * - olympusMaxEntries 32 | * - panasonicMaxEntries 33 | * - sanyoMaxEntries 34 | * - noPadding 35 | * 36 | * If you don't set the image field, you might call exifImage.loadImage(image, callback) to get exif datas. 37 | * 38 | * @param options Configuration options as described above 39 | * @param callback Function to call when data is extracted or an error occurred 40 | * @return Nothing of importance, calls the specified callback function instead 41 | */ 42 | function ExifImage (options, callback) { 43 | if (!(this instanceof ExifImage)) { 44 | if (typeof(options)==="string") { 45 | options = { 46 | image: options 47 | } 48 | } 49 | 50 | assert(typeof(options)==="object", "Invalid options object"); 51 | 52 | var exifImage = new ExifImage(options, function(error, data) { 53 | if (error) { 54 | return callback(error); 55 | } 56 | 57 | callback(null, data, options.image); 58 | }); 59 | 60 | return exifImage; 61 | } 62 | 63 | if (typeof(options)==="string") { 64 | options= { 65 | image: options 66 | } 67 | } else if (options instanceof Buffer) { 68 | options= { 69 | image: options 70 | } 71 | } 72 | 73 | var ops={}; 74 | if (options) { 75 | for(var k in options) { 76 | ops[k]=options[k]; 77 | } 78 | } 79 | this.options=ops; 80 | 81 | // Default option values 82 | ["ifd0MaxEntries", "ifd1MaxEntries", "maxGpsEntries", "maxInteroperabilityEntries", "agfaMaxEntries", "epsonMaxEntries", 83 | "fujifilmMaxEntries", "olympusMaxEntries", "panasonicMaxEntries", "sanyoMaxEntries"].forEach(function(p) { 84 | if (ops[p]===undefined) { 85 | ops[p]=DEFAULT_MAX_ENTRIES; 86 | } 87 | }); 88 | 89 | this.exifData = { 90 | image : {}, // Information about the main image 91 | thumbnail : {}, // Information about the thumbnail 92 | exif : {}, // Exif information 93 | gps : {}, // GPS information 94 | interoperability: {}, // Exif Interoperability information 95 | makernote : {} // Makernote information 96 | }; 97 | 98 | this.offsets={}; 99 | if (ops.tiffOffsets) { 100 | exifData.offsets=offsets; 101 | } 102 | 103 | debug("New ExifImage options=",options); 104 | 105 | if (!ops.image) { 106 | // If options image is not specified, the developper must call loadImage() to parse the image. 107 | // callback(new Error('You have to provide an image, it is pretty hard to extract Exif data from nothing...')); 108 | return; 109 | } 110 | 111 | if (typeof callback !== 'function') { 112 | throw new Error('You have to provide a callback function.'); 113 | } 114 | 115 | var self=this; 116 | setImmediate(function() { 117 | self.loadImage(ops.image, function (error, exifData) { 118 | if (error) { 119 | return callback(error); 120 | } 121 | 122 | callback(null, exifData, ops.image); 123 | }); 124 | }); 125 | } 126 | 127 | ExifImage.ExifImage=ExifImage; 128 | 129 | module.exports = ExifImage; 130 | 131 | /** 132 | * Load image and parse exifDatas 133 | * 134 | * @param [String|Buffer] image the image 135 | * @param callback a callback which is called when exif datas are parsed. 136 | * @return Nothing 137 | */ 138 | ExifImage.prototype.loadImage = function (image, callback) { 139 | assert(typeof(callback)==="function", "Callback must be a function"); 140 | 141 | var self = this; 142 | 143 | debug("loadImage image=", image); 144 | 145 | if (image.constructor.name === 'Buffer') { 146 | this.processImage("Buffer", image, callback); 147 | return; 148 | } 149 | 150 | if (image.constructor.name === 'String') { 151 | fs.readFile(image, function (error, data) { 152 | if (error) { 153 | callback(new Error('Encountered the following error while trying to read given image: '+error)); 154 | return; 155 | } 156 | 157 | self.processImage("File: "+image, data, callback); 158 | }); 159 | return; 160 | } 161 | 162 | callback(new Error('Given image is neither a buffer nor a file, please provide one of these.')); 163 | }; 164 | 165 | ExifImage.prototype.processImage = function (source, data, callback) { 166 | assert(typeof(source)==="string", "Source must be a string"); 167 | assert(typeof(callback)==="function", "Callback must be a function"); 168 | 169 | var offset = 0; 170 | 171 | if (data[offset++] != 0xFF || data[offset++] != 0xD8) { 172 | var e=new Error('The given image is not a JPEG and thus unsupported right now.'); 173 | e.source=source; 174 | e.code="NOT_A_JPEG"; 175 | callback(e); 176 | return; 177 | } 178 | 179 | this.imageType = 'JPEG'; 180 | 181 | while (offset < data.length) { 182 | 183 | if (data[offset++] != 0xFF) { 184 | break; 185 | } 186 | 187 | if (data[offset++] == 0xE1) { 188 | try { 189 | this.extractExifData(data, offset + 2, data.getShort(offset, true) - 2); 190 | 191 | } catch (error) { 192 | error.code="PARSING_ERROR"; 193 | error.source=source; 194 | 195 | debug("Extract exif data error source=", source, "offset=", offset, "error=",error); 196 | 197 | callback(error); 198 | return; 199 | } 200 | 201 | debug("Extract exif data success source=", source, "exifData=",this.exifData); 202 | 203 | callback(null, this.exifData); 204 | return; 205 | } 206 | 207 | offset += data.getShort(offset, true); 208 | } 209 | 210 | var e2=new Error('No Exif segment found in the given image.'); 211 | e2.source=source; 212 | e2.code="NO_EXIF_SEGMENT"; 213 | 214 | callback(e2); 215 | }; 216 | 217 | ExifImage.prototype.extractExifData = function (data, start, length) { 218 | 219 | var exifData=this.exifData; 220 | var tiffOffset = start + 6; 221 | var ifdOffset, numberOfEntries; 222 | var noPadding = (this.options.noPadding!==false); 223 | 224 | this.offsets.tiff=tiffOffset; 225 | 226 | // Exif data always starts with Exif\0\0 227 | if (data.toString('utf8', start, tiffOffset) != 'Exif\0\0') { 228 | throw new Error('The Exif data is not valid.'); 229 | } 230 | 231 | // After the Exif start we either have 0x4949 if the following data is 232 | // stored in big endian or 0x4D4D if it is stored in little endian 233 | if (data.getShort(tiffOffset) == 0x4949) { 234 | this.isBigEndian = false; 235 | 236 | } else if (data.getShort(tiffOffset) == 0x4D4D) { 237 | this.isBigEndian = true; 238 | 239 | } else { 240 | throw new Error('Invalid TIFF data! Expected 0x4949 or 0x4D4D at offset '+(tiffOffset)+' but found 0x'+data[tiffOffset].toString(16).toUpperCase()+data[tiffOffset + 1].toString(16).toUpperCase()+"."); 241 | } 242 | 243 | debug("BigEndian=",this.isBigEndian); 244 | 245 | // Valid TIFF headers always have 0x002A here 246 | if (data.getShort(tiffOffset + 2, this.isBigEndian) != 0x002A) { 247 | var expected = (this.isBigEndian) ? '0x002A' : '0x2A00'; 248 | throw new Error('Invalid TIFF data! Expected '+expected+' at offset '+(tiffOffset + 2)+' but found 0x'+data[tiffOffset + 2].toString(16).toUpperCase()+data[tiffOffset + 3].toString(16).toUpperCase()+"."); 249 | } 250 | 251 | /********************************* IFD0 **********************************/ 252 | 253 | // Offset to IFD0 which is always followed by two bytes with the amount of 254 | // entries in this IFD 255 | ifdOffset = tiffOffset + data.getLong(tiffOffset + 4, this.isBigEndian); 256 | this.offsets.ifd0=ifdOffset; 257 | 258 | numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 259 | if (this.options.ifd0MaxEntries) { 260 | numberOfEntries=Math.min(numberOfEntries, this.options.ifd0MaxEntries); 261 | } 262 | 263 | debug("IFD0 ifdOffset=",ifdOffset, "numberOfEntries=", numberOfEntries); 264 | 265 | // Each IFD entry consists of 12 bytes which we loop through and extract 266 | // the data from 267 | for (var i = 0; i < numberOfEntries; i++) { 268 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, ExifImage.TAGS.exif); 269 | if (!exifEntry) { 270 | continue; 271 | } 272 | 273 | if (exifEntry.tagId===0xEA1C && noPadding) { 274 | continue; 275 | } 276 | 277 | exifData.image[exifEntry.tagName] = exifEntry.value; 278 | } 279 | 280 | debug("IFD0 parsed", exifData.image); 281 | 282 | /********************************* IFD1 **********************************/ 283 | 284 | // Check if there is an offset for IFD1. If so it is always followed by two 285 | // bytes with the amount of entries in this IFD, if not there is no IFD1 286 | var nextIfdOffset = data.getLong(ifdOffset + 2 + (numberOfEntries * 12), this.isBigEndian) 287 | if (nextIfdOffset != 0x00000000) { 288 | ifdOffset = tiffOffset + nextIfdOffset; 289 | this.offsets.ifd1=ifdOffset; 290 | numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 291 | if (this.options.ifd1MaxEntries) { 292 | numberOfEntries=Math.min(numberOfEntries, this.options.ifd1MaxEntries); 293 | } 294 | 295 | debug("IFD1 ifdOffset=",ifdOffset, "numberOfEntries=", numberOfEntries); 296 | 297 | // Each IFD entry consists of 12 bytes which we loop through and extract 298 | // the data from 299 | for (var i = 0; i < numberOfEntries; i++) { 300 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, ExifImage.TAGS.exif); 301 | if (!exifEntry) { 302 | continue; 303 | } 304 | 305 | if (exifEntry.tagId===0xEA1C && noPadding) { 306 | continue; 307 | } 308 | 309 | exifData.thumbnail[exifEntry.tagName] = exifEntry.value; 310 | } 311 | 312 | if (this.options.fixThumbnailOffset) { 313 | var thumbnailOffset=exifData.thumbnail[ExifImage.TAGS.exif[0x0201]]; 314 | if (thumbnailOffset) { 315 | debug("IFD1 fix thumbnail offset, add=",this.offsets.tiff); 316 | 317 | exifData.thumbnail[ExifImage.TAGS.exif[0x0201]]+=this.offsets.tiff; 318 | } 319 | } 320 | 321 | debug("IFD1 parsed", exifData.thumbnail); 322 | } 323 | 324 | /******************************* EXIF IFD ********************************/ 325 | 326 | // Look for a pointer to the Exif IFD in IFD0 and extract information from 327 | // it if available 328 | if (exifData.image[ExifImage.TAGS.exif[0x8769]]) { 329 | 330 | ifdOffset = tiffOffset + exifData.image[ExifImage.TAGS.exif[0x8769]]; 331 | this.offsets.tags=ifdOffset; 332 | 333 | numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 334 | if (this.options.maxEntries) { 335 | numberOfEntries=Math.min(numberOfEntries, this.options.maxEntries); 336 | } 337 | 338 | debug("EXIF IFD ifdOffset=",ifdOffset, "numberOfEntries=", numberOfEntries); 339 | 340 | // Each IFD entry consists of 12 bytes which we loop through and extract 341 | // the data from 342 | for (var i = 0; i < numberOfEntries; i++) { 343 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, ExifImage.TAGS.exif); 344 | if (!exifEntry) { 345 | continue; 346 | } 347 | 348 | if (exifEntry.tagId===0xEA1C && noPadding) { 349 | continue; 350 | } 351 | 352 | exifData.exif[exifEntry.tagName] = exifEntry.value; 353 | } 354 | 355 | debug("EXIF IFD parsed",exifData.exif); 356 | } 357 | 358 | /******************************** GPS IFD ********************************/ 359 | 360 | // Look for a pointer to the GPS IFD in IFD0 and extract information from 361 | // it if available 362 | if (exifData.image[ExifImage.TAGS.exif[0x8825]]) { 363 | 364 | ifdOffset = tiffOffset + exifData.image[ExifImage.TAGS.exif[0x8825]]; 365 | this.offsets.gps=ifdOffset; 366 | 367 | numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 368 | if (this.options.maxGpsEntries) { 369 | numberOfEntries=Math.min(numberOfEntries, this.options.maxGpsEntries); 370 | } 371 | 372 | debug("GPS IFD ifdOffset=", ifdOffset, "numberOfEntries=", numberOfEntries); 373 | 374 | // Each IFD entry consists of 12 bytes which we loop through and extract 375 | // the data from 376 | for (var i = 0; i < numberOfEntries; i++) { 377 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, ExifImage.TAGS.gps); 378 | if (!exifEntry) { 379 | continue; 380 | } 381 | 382 | if (exifEntry.tagId===0xEA1C && noPadding) { 383 | continue; 384 | } 385 | 386 | exifData.gps[exifEntry.tagName] = exifEntry.value; 387 | } 388 | 389 | debug("GPS IFD parsed",exifData.gps); 390 | } 391 | 392 | /************************* Interoperability IFD **************************/ 393 | 394 | // Look for a pointer to the interoperatbility IFD in the Exif IFD and 395 | // extract information from it if available 396 | if (exifData.exif[ExifImage.TAGS.exif[0xA005]]) { 397 | 398 | ifdOffset = tiffOffset + exifData.exif[ExifImage.TAGS.exif[0xA005]]; 399 | this.offsets.interoperability=ifdOffset; 400 | 401 | numberOfEntries = data.getShort(ifdOffset, this.isBigEndian); 402 | if (this.options.maxInteroperabilityEntries) { 403 | numberOfEntries=Math.min(numberOfEntries, this.options.maxInteroperabilityEntries); 404 | } 405 | 406 | debug("Interoperability IFD ifdOffset=", ifdOffset, "numberOfEntries=", numberOfEntries); 407 | 408 | // Each IFD entry consists of 12 bytes which we loop through and extract 409 | // the data from 410 | for (var i = 0; i < numberOfEntries; i++) { 411 | var exifEntry = this.extractExifEntry(data, (ifdOffset + 2 + (i * 12)), tiffOffset, this.isBigEndian, ExifImage.TAGS.exif); 412 | if (!exifEntry) { 413 | break; 414 | } 415 | 416 | if (exifEntry.tagId===0xEA1C && noPadding) { 417 | continue; 418 | } 419 | 420 | exifData.interoperability[exifEntry.tagName] = exifEntry.value; 421 | } 422 | 423 | debug("Interoperability IFD parsed",exifData.gps); 424 | } 425 | 426 | /***************************** Makernote IFD *****************************/ 427 | 428 | // Look for Makernote data in the Exif IFD, check which type of proprietary 429 | // Makernotes the image contains, load the respective functionality and 430 | // start the extraction 431 | if (typeof exifData.exif[ExifImage.TAGS.exif[0x927C]] != "undefined") { 432 | 433 | var type; 434 | // Check the header to see what kind of Makernote we are dealing with 435 | if (exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 7) === "OLYMP\x00\x01" || exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 7) === "OLYMP\x00\x02") { 436 | type="olympus" 437 | 438 | } else if (exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 7) === "AGFA \x00\x01") { 439 | type="agfa"; 440 | 441 | } else if (exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 8) === "EPSON\x00\x01\x00") { 442 | type="epson"; 443 | 444 | } else if (exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 8) === "FUJIFILM") { 445 | type="fujifilm"; 446 | 447 | } else if (exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 9) === "Panasonic") { 448 | type="panasonic"; 449 | 450 | } else if (exifData.exif[ExifImage.TAGS.exif[0x927C]].getString(0, 5) === "SANYO") { 451 | type="sanyo"; 452 | } 453 | 454 | 455 | debug("Makernote IFD ifdOffset=", ifdOffset, "type=", type); 456 | 457 | if (type) { 458 | var extractMakernotes = require('./makernotes/'+type).extractMakernotes; 459 | 460 | exifData.makernote = extractMakernotes.call(this, data, this.offsets.makernoteOffset, tiffOffset); 461 | 462 | } else { 463 | // Makernotes are available but the format is not recognized so 464 | // an error message is pushed instead, this ain't the best 465 | // solution but should do for now 466 | exifData.makernote['error'] = 'Unable to extract Makernote information as it is in an unsupported or unrecognized format.'; 467 | } 468 | 469 | debug("Makernote IFD parsed",exifData.makernote); 470 | } 471 | }; 472 | 473 | ExifImage.prototype.extractExifEntry = function (data, entryOffset, tiffOffset, isBigEndian, tags) { 474 | 475 | var entry = { 476 | tag : data.slice(entryOffset, entryOffset + 2), 477 | tagId : null, 478 | tagName : null, 479 | format : data.getShort(entryOffset + 2, isBigEndian), 480 | components : data.getLong(entryOffset + 4, isBigEndian), 481 | valueOffset: null, 482 | value : [] 483 | } 484 | 485 | entry.tagId = entry.tag.getShort(0, isBigEndian); 486 | 487 | // The tagId may correspond to more then one tagName so check which 488 | if (tags && tags[entry.tagId] && typeof tags[entry.tagId] == "function") { 489 | entry.tagName = tags[entry.tagId].call(this, entry); 490 | if (!entry.tagName) { 491 | return false; 492 | } 493 | 494 | // The tagId corresponds to exactly one tagName 495 | } else if (tags && tags[entry.tagId]) { 496 | entry.tagName = tags[entry.tagId]; 497 | if (entry.tagName===undefined) { 498 | return false; 499 | } 500 | 501 | // The tagId is not recognized 502 | } else { 503 | return false; 504 | } 505 | 506 | switch (entry.format) { 507 | 508 | case 0x0001: // unsigned byte, 1 byte per component 509 | entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 510 | for (var i = 0; i < entry.components; i++) 511 | entry.value.push(data.getByte(entry.valueOffset + i)); 512 | break; 513 | 514 | case 0x0002: // ascii strings, 1 byte per component 515 | entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 516 | entry.value = data.getString(entry.valueOffset, entry.components); 517 | if (entry.value[entry.value.length - 1] === "\u0000") // Trim null terminated strings 518 | entry.value = entry.value.substring(0, entry.value.length - 1); 519 | break; 520 | 521 | case 0x0003: // unsigned short, 2 byte per component 522 | entry.valueOffset = (entry.components <= 2) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 523 | for (var i = 0; i < entry.components; i++) 524 | entry.value.push(data.getShort(entry.valueOffset + i * 2, isBigEndian)); 525 | break; 526 | 527 | case 0x0004: // unsigned long, 4 byte per component 528 | entry.valueOffset = (entry.components == 1) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 529 | for (var i = 0; i < entry.components; i++) 530 | entry.value.push(data.getLong(entry.valueOffset + i * 4, isBigEndian)); 531 | break; 532 | 533 | case 0x0005: // unsigned rational, 8 byte per component (4 byte numerator and 4 byte denominator) 534 | entry.valueOffset = data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 535 | for (var i = 0; i < entry.components; i++) 536 | entry.value.push(data.getLong(entry.valueOffset + i * 8, isBigEndian) / data.getLong(entry.valueOffset + i * 8 + 4, isBigEndian)); 537 | break; 538 | 539 | case 0x0006: // signed byte, 1 byte per component 540 | entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 541 | for (var i = 0; i < entry.components; i++) 542 | entry.value.push(data.getSignedByte(entry.valueOffset + i)); 543 | break; 544 | 545 | case 0x0007: // undefined, 1 byte per component 546 | entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 547 | entry.value.push(data.slice(entry.valueOffset, entry.valueOffset + entry.components)); 548 | break; 549 | 550 | case 0x0008: // signed short, 2 byte per component 551 | entry.valueOffset = (entry.components <= 2) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 552 | for (var i = 0; i < entry.components; i++) 553 | entry.value.push(data.getSignedShort(entry.valueOffset + i * 2, isBigEndian)); 554 | break; 555 | 556 | case 0x0009: // signed long, 4 byte per component 557 | entry.valueOffset = (entry.components == 1) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 558 | for (var i = 0; i < entry.components; i++) 559 | entry.value.push(data.getSignedLong(entry.valueOffset + i * 4, isBigEndian)); 560 | break; 561 | 562 | case 0x000A: // signed rational, 8 byte per component (4 byte numerator and 4 byte denominator) 563 | entry.valueOffset = data.getLong(entryOffset + 8, isBigEndian) + tiffOffset; 564 | for (var i = 0; i < entry.components; i++) 565 | entry.value.push(data.getSignedLong(entry.valueOffset + i * 8, isBigEndian) / data.getSignedLong(entry.valueOffset + i * 8 + 4, isBigEndian)); 566 | break; 567 | 568 | default: 569 | return false; 570 | 571 | } 572 | 573 | // If this is the Makernote tag save its offset for later use 574 | if (entry.tagName === "MakerNote") { 575 | this.offsets.makernoteOffset = entry.valueOffset; 576 | } 577 | 578 | // If the value array has only one element we don't need an array 579 | if (entry.value.length == 1) { 580 | entry.value = entry.value[0]; 581 | } 582 | 583 | return entry; 584 | }; 585 | 586 | /** 587 | * Comprehensive list of TIFF and Exif tags found on 588 | * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html 589 | */ 590 | ExifImage.TAGS = { 591 | 592 | // Exif tags 593 | exif : { 594 | 595 | 0x0001 : "InteropIndex", 596 | 0x0002 : "InteropVersion", 597 | 0x000B : "ProcessingSoftware", 598 | 0x00FE : "SubfileType", 599 | 0x00FF : "OldSubfileType", 600 | 0x0100 : "ImageWidth", 601 | 0x0101 : "ImageHeight", 602 | 0x0102 : "BitsPerSample", 603 | 0x0103 : "Compression", 604 | 0x0106 : "PhotometricInterpretation", 605 | 0x0107 : "Thresholding", 606 | 0x0108 : "CellWidth", 607 | 0x0109 : "CellLength", 608 | 0x010A : "FillOrder", 609 | 0x010D : "DocumentName", 610 | 0x010E : "ImageDescription", 611 | 0x010F : "Make", 612 | 0x0110 : "Model", 613 | 0x0111 : "StripOffsets", 614 | 0x0112 : "Orientation", 615 | 0x0115 : "SamplesPerPixel", 616 | 0x0116 : "RowsPerStrip", 617 | 0x0117 : "StripByteCounts", 618 | 0x0118 : "MinSampleValue", 619 | 0x0119 : "MaxSampleValue", 620 | 0x011A : "XResolution", 621 | 0x011B : "YResolution", 622 | 0x011C : "PlanarConfiguration", 623 | 0x011D : "PageName", 624 | 0x011E : "XPosition", 625 | 0x011F : "YPosition", 626 | 0x0120 : "FreeOffsets", 627 | 0x0121 : "FreeByteCounts", 628 | 0x0122 : "GrayResponseUnit", 629 | 0x0123 : "GrayResponseCurve", 630 | 0x0124 : "T4Options", 631 | 0x0125 : "T6Options", 632 | 0x0128 : "ResolutionUnit", 633 | 0x0129 : "PageNumber", 634 | 0x012C : "ColorResponseUnit", 635 | 0x012D : "TransferFunction", 636 | 0x0131 : "Software", 637 | 0x0132 : "ModifyDate", 638 | 0x013B : "Artist", 639 | 0x013C : "HostComputer", 640 | 0x013D : "Predictor", 641 | 0x013E : "WhitePoint", 642 | 0x013F : "PrimaryChromaticities", 643 | 0x0140 : "ColorMap", 644 | 0x0141 : "HalftoneHints", 645 | 0x0142 : "TileWidth", 646 | 0x0143 : "TileLength", 647 | 0x0144 : "TileOffsets", 648 | 0x0145 : "TileByteCounts", 649 | 0x0146 : "BadFaxLines", 650 | 0x0147 : "CleanFaxData", 651 | 0x0148 : "ConsecutiveBadFaxLines", 652 | 0x014A : "SubIFD", 653 | 0x014C : "InkSet", 654 | 0x014D : "InkNames", 655 | 0x014E : "NumberofInks", 656 | 0x0150 : "DotRange", 657 | 0x0151 : "TargetPrinter", 658 | 0x0152 : "ExtraSamples", 659 | 0x0153 : "SampleFormat", 660 | 0x0154 : "SMinSampleValue", 661 | 0x0155 : "SMaxSampleValue", 662 | 0x0156 : "TransferRange", 663 | 0x0157 : "ClipPath", 664 | 0x0158 : "XClipPathUnits", 665 | 0x0159 : "YClipPathUnits", 666 | 0x015A : "Indexed", 667 | 0x015B : "JPEGTables", 668 | 0x015F : "OPIProxy", 669 | 0x0190 : "GlobalParametersIFD", 670 | 0x0191 : "ProfileType", 671 | 0x0192 : "FaxProfile", 672 | 0x0193 : "CodingMethods", 673 | 0x0194 : "VersionYear", 674 | 0x0195 : "ModeNumber", 675 | 0x01B1 : "Decode", 676 | 0x01B2 : "DefaultImageColor", 677 | 0x01B3 : "T82Options", 678 | 0x01B5 : "JPEGTables", 679 | 0x0200 : "JPEGProc", 680 | 0x0201 : "ThumbnailOffset", 681 | 0x0202 : "ThumbnailLength", 682 | 0x0203 : "JPEGRestartInterval", 683 | 0x0205 : "JPEGLosslessPredictors", 684 | 0x0206 : "JPEGPointTransforms", 685 | 0x0207 : "JPEGQTables", 686 | 0x0208 : "JPEGDCTables", 687 | 0x0209 : "JPEGACTables", 688 | 0x0211 : "YCbCrCoefficients", 689 | 0x0212 : "YCbCrSubSampling", 690 | 0x0213 : "YCbCrPositioning", 691 | 0x0214 : "ReferenceBlackWhite", 692 | 0x022F : "StripRowCounts", 693 | 0x02BC : "ApplicationNotes", 694 | 0x03E7 : "USPTOMiscellaneous", 695 | 0x1000 : "RelatedImageFileFormat", 696 | 0x1001 : "RelatedImageWidth", 697 | 0x1002 : "RelatedImageHeight", 698 | 0x4746 : "Rating", 699 | 0x4747 : "XP_DIP_XML", 700 | 0x4748 : "StitchInfo", 701 | 0x4749 : "RatingPercent", 702 | 0x800D : "ImageID", 703 | 0x80A3 : "WangTag1", 704 | 0x80A4 : "WangAnnotation", 705 | 0x80A5 : "WangTag3", 706 | 0x80A6 : "WangTag4", 707 | 0x80E3 : "Matteing", 708 | 0x80E4 : "DataType", 709 | 0x80E5 : "ImageDepth", 710 | 0x80E6 : "TileDepth", 711 | 0x827D : "Model2", 712 | 0x828D : "CFARepeatPatternDim", 713 | 0x828E : "CFAPattern2", 714 | 0x828F : "BatteryLevel", 715 | 0x8290 : "KodakIFD", 716 | 0x8298 : "Copyright", 717 | 0x829A : "ExposureTime", 718 | 0x829D : "FNumber", 719 | 0x82A5 : "MDFileTag", 720 | 0x82A6 : "MDScalePixel", 721 | 0x82A7 : "MDColorTable", 722 | 0x82A8 : "MDLabName", 723 | 0x82A9 : "MDSampleInfo", 724 | 0x82AA : "MDPrepDate", 725 | 0x82AB : "MDPrepTime", 726 | 0x82AC : "MDFileUnits", 727 | 0x830E : "PixelScale", 728 | 0x8335 : "AdventScale", 729 | 0x8336 : "AdventRevision", 730 | 0x835C : "UIC1Tag", 731 | 0x835D : "UIC2Tag", 732 | 0x835E : "UIC3Tag", 733 | 0x835F : "UIC4Tag", 734 | 0x83BB : "IPTC-NAA", 735 | 0x847E : "IntergraphPacketData", 736 | 0x847F : "IntergraphFlagRegisters", 737 | 0x8480 : "IntergraphMatrix", 738 | 0x8481 : "INGRReserved", 739 | 0x8482 : "ModelTiePoint", 740 | 0x84E0 : "Site", 741 | 0x84E1 : "ColorSequence", 742 | 0x84E2 : "IT8Header", 743 | 0x84E3 : "RasterPadding", 744 | 0x84E4 : "BitsPerRunLength", 745 | 0x84E5 : "BitsPerExtendedRunLength", 746 | 0x84E6 : "ColorTable", 747 | 0x84E7 : "ImageColorIndicator", 748 | 0x84E8 : "BackgroundColorIndicator", 749 | 0x84E9 : "ImageColorValue", 750 | 0x84EA : "BackgroundColorValue", 751 | 0x84EB : "PixelIntensityRange", 752 | 0x84EC : "TransparencyIndicator", 753 | 0x84ED : "ColorCharacterization", 754 | 0x84EE : "HCUsage", 755 | 0x84EF : "TrapIndicator", 756 | 0x84F0 : "CMYKEquivalent", 757 | 0x8546 : "SEMInfo", 758 | 0x8568 : "AFCP_IPTC", 759 | 0x85B8 : "PixelMagicJBIGOptions", 760 | 0x85D8 : "ModelTransform", 761 | 0x8602 : "WB_GRGBLevels", 762 | 0x8606 : "LeafData", 763 | 0x8649 : "PhotoshopSettings", 764 | 0x8769 : "ExifOffset", 765 | 0x8773 : "ICC_Profile", 766 | 0x877F : "TIFF_FXExtensions", 767 | 0x8780 : "MultiProfiles", 768 | 0x8781 : "SharedData", 769 | 0x8782 : "T88Options", 770 | 0x87AC : "ImageLayer", 771 | 0x87AF : "GeoTiffDirectory", 772 | 0x87B0 : "GeoTiffDoubleParams", 773 | 0x87B1 : "GeoTiffAsciiParams", 774 | 0x8822 : "ExposureProgram", 775 | 0x8824 : "SpectralSensitivity", 776 | 0x8825 : "GPSInfo", 777 | 0x8827 : "ISO", 778 | 0x8828 : "Opto-ElectricConvFactor", 779 | 0x8829 : "Interlace", 780 | 0x882A : "TimeZoneOffset", 781 | 0x882B : "SelfTimerMode", 782 | 0x8830 : "SensitivityType", 783 | 0x8831 : "StandardOutputSensitivity", 784 | 0x8832 : "RecommendedExposureIndex", 785 | 0x8833 : "ISOSpeed", 786 | 0x8834 : "ISOSpeedLatitudeyyy", 787 | 0x8835 : "ISOSpeedLatitudezzz", 788 | 0x885C : "FaxRecvParams", 789 | 0x885D : "FaxSubAddress", 790 | 0x885E : "FaxRecvTime", 791 | 0x888A : "LeafSubIFD", 792 | 0x9000 : "ExifVersion", 793 | 0x9003 : "DateTimeOriginal", 794 | 0x9004 : "CreateDate", 795 | 0x9101 : "ComponentsConfiguration", 796 | 0x9102 : "CompressedBitsPerPixel", 797 | 0x9201 : "ShutterSpeedValue", 798 | 0x9202 : "ApertureValue", 799 | 0x9203 : "BrightnessValue", 800 | 0x9204 : "ExposureCompensation", 801 | 0x9205 : "MaxApertureValue", 802 | 0x9206 : "SubjectDistance", 803 | 0x9207 : "MeteringMode", 804 | 0x9208 : "LightSource", 805 | 0x9209 : "Flash", 806 | 0x920A : "FocalLength", 807 | 0x920B : "FlashEnergy", 808 | 0x920C : "SpatialFrequencyResponse", 809 | 0x920D : "Noise", 810 | 0x920E : "FocalPlaneXResolution", 811 | 0x920F : "FocalPlaneYResolution", 812 | 0x9210 : "FocalPlaneResolutionUnit", 813 | 0x9211 : "ImageNumber", 814 | 0x9212 : "SecurityClassification", 815 | 0x9213 : "ImageHistory", 816 | 0x9214 : "SubjectArea", 817 | 0x9215 : "ExposureIndex", 818 | 0x9216 : "TIFF-EPStandardID", 819 | 0x9217 : "SensingMethod", 820 | 0x923A : "CIP3DataFile", 821 | 0x923B : "CIP3Sheet", 822 | 0x923C : "CIP3Side", 823 | 0x923F : "StoNits", 824 | 0x927C : "MakerNote", 825 | 0x9286 : "UserComment", 826 | 0x9290 : "SubSecTime", 827 | 0x9291 : "SubSecTimeOriginal", 828 | 0x9292 : "SubSecTimeDigitized", 829 | 0x932F : "MSDocumentText", 830 | 0x9330 : "MSPropertySetStorage", 831 | 0x9331 : "MSDocumentTextPosition", 832 | 0x935C : "ImageSourceData", 833 | 0x9C9B : "XPTitle", 834 | 0x9C9C : "XPComment", 835 | 0x9C9D : "XPAuthor", 836 | 0x9C9E : "XPKeywords", 837 | 0x9C9F : "XPSubject", 838 | 0xA000 : "FlashpixVersion", 839 | 0xA001 : "ColorSpace", 840 | 0xA002 : "ExifImageWidth", 841 | 0xA003 : "ExifImageHeight", 842 | 0xA004 : "RelatedSoundFile", 843 | 0xA005 : "InteropOffset", 844 | 0xA20B : "FlashEnergy", 845 | 0xA20C : "SpatialFrequencyResponse", 846 | 0xA20D : "Noise", 847 | 0xA20E : "FocalPlaneXResolution", 848 | 0xA20F : "FocalPlaneYResolution", 849 | 0xA210 : "FocalPlaneResolutionUnit", 850 | 0xA211 : "ImageNumber", 851 | 0xA212 : "SecurityClassification", 852 | 0xA213 : "ImageHistory", 853 | 0xA214 : "SubjectLocation", 854 | 0xA215 : "ExposureIndex", 855 | 0xA216 : "TIFF-EPStandardID", 856 | 0xA217 : "SensingMethod", 857 | 0xA300 : "FileSource", 858 | 0xA301 : "SceneType", 859 | 0xA302 : "CFAPattern", 860 | 0xA401 : "CustomRendered", 861 | 0xA402 : "ExposureMode", 862 | 0xA403 : "WhiteBalance", 863 | 0xA404 : "DigitalZoomRatio", 864 | 0xA405 : "FocalLengthIn35mmFormat", 865 | 0xA406 : "SceneCaptureType", 866 | 0xA407 : "GainControl", 867 | 0xA408 : "Contrast", 868 | 0xA409 : "Saturation", 869 | 0xA40A : "Sharpness", 870 | 0xA40B : "DeviceSettingDescription", 871 | 0xA40C : "SubjectDistanceRange", 872 | 0xA420 : "ImageUniqueID", 873 | 0xA430 : "OwnerName", 874 | 0xA431 : "SerialNumber", 875 | 0xA432 : "LensInfo", 876 | 0xA433 : "LensMake", 877 | 0xA434 : "LensModel", 878 | 0xA435 : "LensSerialNumber", 879 | 0xA480 : "GDALMetadata", 880 | 0xA481 : "GDALNoData", 881 | 0xA500 : "Gamma", 882 | 0xAFC0 : "ExpandSoftware", 883 | 0xAFC1 : "ExpandLens", 884 | 0xAFC2 : "ExpandFilm", 885 | 0xAFC3 : "ExpandFilterLens", 886 | 0xAFC4 : "ExpandScanner", 887 | 0xAFC5 : "ExpandFlashLamp", 888 | 0xBC01 : "PixelFormat", 889 | 0xBC02 : "Transformation", 890 | 0xBC03 : "Uncompressed", 891 | 0xBC04 : "ImageType", 892 | 0xBC80 : "ImageWidth", 893 | 0xBC81 : "ImageHeight", 894 | 0xBC82 : "WidthResolution", 895 | 0xBC83 : "HeightResolution", 896 | 0xBCC0 : "ImageOffset", 897 | 0xBCC1 : "ImageByteCount", 898 | 0xBCC2 : "AlphaOffset", 899 | 0xBCC3 : "AlphaByteCount", 900 | 0xBCC4 : "ImageDataDiscard", 901 | 0xBCC5 : "AlphaDataDiscard", 902 | 0xC427 : "OceScanjobDesc", 903 | 0xC428 : "OceApplicationSelector", 904 | 0xC429 : "OceIDNumber", 905 | 0xC42A : "OceImageLogic", 906 | 0xC44F : "Annotations", 907 | 0xC4A5 : "PrintIM", 908 | 0xC580 : "USPTOOriginalContentType", 909 | 0xC612 : "DNGVersion", 910 | 0xC613 : "DNGBackwardVersion", 911 | 0xC614 : "UniqueCameraModel", 912 | 0xC615 : "LocalizedCameraModel", 913 | 0xC616 : "CFAPlaneColor", 914 | 0xC617 : "CFALayout", 915 | 0xC618 : "LinearizationTable", 916 | 0xC619 : "BlackLevelRepeatDim", 917 | 0xC61A : "BlackLevel", 918 | 0xC61B : "BlackLevelDeltaH", 919 | 0xC61C : "BlackLevelDeltaV", 920 | 0xC61D : "WhiteLevel", 921 | 0xC61E : "DefaultScale", 922 | 0xC61F : "DefaultCropOrigin", 923 | 0xC620 : "DefaultCropSize", 924 | 0xC621 : "ColorMatrix1", 925 | 0xC622 : "ColorMatrix2", 926 | 0xC623 : "CameraCalibration1", 927 | 0xC624 : "CameraCalibration2", 928 | 0xC625 : "ReductionMatrix1", 929 | 0xC626 : "ReductionMatrix2", 930 | 0xC627 : "AnalogBalance", 931 | 0xC628 : "AsShotNeutral", 932 | 0xC629 : "AsShotWhiteXY", 933 | 0xC62A : "BaselineExposure", 934 | 0xC62B : "BaselineNoise", 935 | 0xC62C : "BaselineSharpness", 936 | 0xC62D : "BayerGreenSplit", 937 | 0xC62E : "LinearResponseLimit", 938 | 0xC62F : "CameraSerialNumber", 939 | 0xC630 : "DNGLensInfo", 940 | 0xC631 : "ChromaBlurRadius", 941 | 0xC632 : "AntiAliasStrength", 942 | 0xC633 : "ShadowScale", 943 | 0xC634 : "DNGPrivateData", 944 | 0xC635 : "MakerNoteSafety", 945 | 0xC640 : "RawImageSegmentation", 946 | 0xC65A : "CalibrationIlluminant1", 947 | 0xC65B : "CalibrationIlluminant2", 948 | 0xC65C : "BestQualityScale", 949 | 0xC65D : "RawDataUniqueID", 950 | 0xC660 : "AliasLayerMetadata", 951 | 0xC68B : "OriginalRawFileName", 952 | 0xC68C : "OriginalRawFileData", 953 | 0xC68D : "ActiveArea", 954 | 0xC68E : "MaskedAreas", 955 | 0xC68F : "AsShotICCProfile", 956 | 0xC690 : "AsShotPreProfileMatrix", 957 | 0xC691 : "CurrentICCProfile", 958 | 0xC692 : "CurrentPreProfileMatrix", 959 | 0xC6BF : "ColorimetricReference", 960 | 0xC6D2 : "PanasonicTitle", 961 | 0xC6D3 : "PanasonicTitle2", 962 | 0xC6F3 : "CameraCalibrationSig", 963 | 0xC6F4 : "ProfileCalibrationSig", 964 | 0xC6F5 : "ProfileIFD", 965 | 0xC6F6 : "AsShotProfileName", 966 | 0xC6F7 : "NoiseReductionApplied", 967 | 0xC6F8 : "ProfileName", 968 | 0xC6F9 : "ProfileHueSatMapDims", 969 | 0xC6FA : "ProfileHueSatMapData1", 970 | 0xC6FB : "ProfileHueSatMapData2", 971 | 0xC6FC : "ProfileToneCurve", 972 | 0xC6FD : "ProfileEmbedPolicy", 973 | 0xC6FE : "ProfileCopyright", 974 | 0xC714 : "ForwardMatrix1", 975 | 0xC715 : "ForwardMatrix2", 976 | 0xC716 : "PreviewApplicationName", 977 | 0xC717 : "PreviewApplicationVersion", 978 | 0xC718 : "PreviewSettingsName", 979 | 0xC719 : "PreviewSettingsDigest", 980 | 0xC71A : "PreviewColorSpace", 981 | 0xC71B : "PreviewDateTime", 982 | 0xC71C : "RawImageDigest", 983 | 0xC71D : "OriginalRawFileDigest", 984 | 0xC71E : "SubTileBlockSize", 985 | 0xC71F : "RowInterleaveFactor", 986 | 0xC725 : "ProfileLookTableDims", 987 | 0xC726 : "ProfileLookTableData", 988 | 0xC740 : "OpcodeList1", 989 | 0xC741 : "OpcodeList2", 990 | 0xC74E : "OpcodeList3", 991 | 0xC761 : "NoiseProfile", 992 | 0xC763 : "TimeCodes", 993 | 0xC764 : "FrameRate", 994 | 0xC772 : "TStop", 995 | 0xC789 : "ReelName", 996 | 0xC791 : "OriginalDefaultFinalSize", 997 | 0xC792 : "OriginalBestQualitySize", 998 | 0xC793 : "OriginalDefaultCropSize", 999 | 0xC7A1 : "CameraLabel", 1000 | 0xC7A3 : "ProfileHueSatMapEncoding", 1001 | 0xC7A4 : "ProfileLookTableEncoding", 1002 | 0xC7A5 : "BaselineExposureOffset", 1003 | 0xC7A6 : "DefaultBlackRender", 1004 | 0xC7A7 : "NewRawImageDigest", 1005 | 0xC7A8 : "RawToPreviewGain", 1006 | 0xC7B5 : "DefaultUserCrop", 1007 | 0xEA1C : "Padding", 1008 | 0xEA1D : "OffsetSchema", 1009 | 0xFDE8 : "OwnerName", 1010 | 0xFDE9 : "SerialNumber", 1011 | 0xFDEA : "Lens", 1012 | 0xFE00 : "KDC_IFD", 1013 | 0xFE4C : "RawFile", 1014 | 0xFE4D : "Converter", 1015 | 0xFE4E : "WhiteBalance", 1016 | 0xFE51 : "Exposure", 1017 | 0xFE52 : "Shadows", 1018 | 0xFE53 : "Brightness", 1019 | 0xFE54 : "Contrast", 1020 | 0xFE55 : "Saturation", 1021 | 0xFE56 : "Sharpness", 1022 | 0xFE57 : "Smoothness", 1023 | 0xFE58 : "MoireFilter" 1024 | 1025 | }, 1026 | 1027 | // GPS Tags 1028 | gps : { 1029 | 1030 | 0x0000 : 'GPSVersionID', 1031 | 0x0001 : 'GPSLatitudeRef', 1032 | 0x0002 : 'GPSLatitude', 1033 | 0x0003 : 'GPSLongitudeRef', 1034 | 0x0004 : 'GPSLongitude', 1035 | 0x0005 : 'GPSAltitudeRef', 1036 | 0x0006 : 'GPSAltitude', 1037 | 0x0007 : 'GPSTimeStamp', 1038 | 0x0008 : 'GPSSatellites', 1039 | 0x0009 : 'GPSStatus', 1040 | 0x000A : 'GPSMeasureMode', 1041 | 0x000B : 'GPSDOP', 1042 | 0x000C : 'GPSSpeedRef', 1043 | 0x000D : 'GPSSpeed', 1044 | 0x000E : 'GPSTrackRef', 1045 | 0x000F : 'GPSTrack', 1046 | 0x0010 : 'GPSImgDirectionRef', 1047 | 0x0011 : 'GPSImgDirection', 1048 | 0x0012 : 'GPSMapDatum', 1049 | 0x0013 : 'GPSDestLatitudeRef', 1050 | 0x0014 : 'GPSDestLatitude', 1051 | 0x0015 : 'GPSDestLongitudeRef', 1052 | 0x0016 : 'GPSDestLongitude', 1053 | 0x0017 : 'GPSDestBearingRef', 1054 | 0x0018 : 'GPSDestBearing', 1055 | 0x0019 : 'GPSDestDistanceRef', 1056 | 0x001A : 'GPSDestDistance', 1057 | 0x001B : 'GPSProcessingMethod', 1058 | 0x001C : 'GPSAreaInformation', 1059 | 0x001D : 'GPSDateStamp', 1060 | 0x001E : 'GPSDifferential', 1061 | 0x001F : 'GPSHPositioningError' 1062 | 1063 | } 1064 | 1065 | }; -------------------------------------------------------------------------------- /test/sony-alpha-6000.jpg.json: -------------------------------------------------------------------------------- 1 | {"image":{"ImageDescription":" ","Make":"SONY","Model":"ILCE-6000","Orientation":1,"XResolution":350,"YResolution":350,"ResolutionUnit":2,"Software":"ILCE-6000 v1.00","ModifyDate":"2014:04:18 20:33:53","YCbCrPositioning":2,"ExifOffset":364,"PrintIM":{"type":"Buffer","data":[80,114,105,110,116,73,77,0,48,51,48,48,0,0,3,0,2,0,1,0,0,0,3,0,34,0,0,0,1,1,0,0,0,0,9,17,0,0,16,39,0,0,11,15,0,0,16,39,0,0,151,5,0,0,16,39,0,0,176,8,0,0,16,39,0,0,1,28,0,0,16,39,0,0,94,2,0,0,16,39,0,0,139,0,0,0,16,39,0,0,203,3,0,0,16,39,0,0,229,27,0,0,16,39,0,0]}},"thumbnail":{"Compression":6,"ImageDescription":" ","Make":"SONY","Model":"ILCE-6000","Orientation":1,"XResolution":72,"YResolution":72,"ResolutionUnit":2,"Software":"ILCE-6000 v1.00","ModifyDate":"2014:04:18 20:33:53","ThumbnailOffset":38460,"ThumbnailLength":8156,"YCbCrPositioning":2},"exif":{"ExposureTime":6,"FNumber":8,"ExposureProgram":1,"ISO":100,"SensitivityType":2,"RecommendedExposureIndex":100,"ExifVersion":{"type":"Buffer","data":[48,50,51,48]},"DateTimeOriginal":"2014:04:18 20:33:53","CreateDate":"2014:04:18 20:33:53","ComponentsConfiguration":{"type":"Buffer","data":[1,2,3,0]},"CompressedBitsPerPixel":2,"BrightnessValue":-2.04921875,"ExposureCompensation":0,"MaxApertureValue":4,"MeteringMode":5,"LightSource":0,"Flash":16,"FocalLength":22,"MakerNote":{"type":"Buffer","data":[83,79,78,89,32,68,83,67,32,0,0,0,94,0,3,16,4,0,16,0,0,0,16,8,0,0,0,32,7,0,1,0,0,0,0,0,0,0,1,32,7,0,149,34,9,0,118,24,91,0,2,32,4,0,1,0,0,0,0,0,0,0,3,32,2,0,0,1,0,0,80,8,0,0,4,32,9,0,1,0,0,0,0,0,0,0,5,32,9,0,1,0,0,0,0,0,0,0,6,32,9,0,1,0,0,0,0,0,0,0,7,32,9,0,1,0,0,0,0,0,0,0,8,32,4,0,1,0,0,0,1,0,1,0,9,32,3,0,1,0,0,0,2,0,0,0,10,32,4,0,1,0,0,0,0,0,0,0,12,32,4,0,3,0,0,0,80,9,0,0,13,32,5,0,1,0,0,0,92,9,0,0,20,32,9,0,2,0,0,0,100,9,0,0,0,48,7,0,134,1,0,0,108,9,0,0,32,176,2,0,16,0,0,0,242,10,0,0,33,176,4,0,1,0,0,0,0,0,0,0,34,176,4,0,1,0,0,0,0,0,0,0,35,176,4,0,1,0,0,0,0,0,0,0,36,176,4,0,1,0,0,0,0,0,0,0,37,176,4,0,1,0,0,0,3,0,0,0,38,176,4,0,1,0,0,0,0,0,0,0,41,176,4,0,1,0,0,0,0,0,0,0,43,176,4,0,2,0,0,0,2,11,0,0,44,176,4,0,2,0,0,0,10,11,0,0,0,176,1,0,4,0,0,0,3,3,1,0,2,1,4,0,1,0,0,0,6,0,0,0,4,1,10,0,1,0,0,0,18,11,0,0,18,1,4,0,1,0,0,0,0,0,0,0,21,1,4,0,1,0,0,0,0,0,0,0,1,176,3,0,1,0,0,0,56,1,0,0,5,1,4,0,1,0,0,0,0,0,0,0,11,32,4,0,1,0,0,0,0,0,0,0,14,32,3,0,1,0,0,0,0,0,0,0,15,32,4,0,1,0,0,0,0,0,0,0,17,32,4,0,1,0,0,0,2,0,0,0,18,32,4,0,1,0,0,0,2,0,0,0,19,32,4,0,1,0,0,0,2,0,0,0,21,32,3,0,1,0,0,0,255,255,0,0,39,176,4,0,1,0,0,0,255,255,0,0,42,176,1,0,8,0,0,0,26,11,0,0,22,32,3,0,1,0,0,0,0,0,0,0,23,32,4,0,1,0,0,0,0,0,0,0,24,32,4,0,1,0,0,0,0,0,0,0,25,32,4,0,1,0,0,0,0,0,0,0,26,32,4,0,1,0,0,0,1,0,0,0,27,32,1,0,1,0,0,0,0,0,0,0,28,32,1,0,1,0,0,0,3,0,0,0,29,32,3,0,2,0,0,0,64,1,240,0,30,32,1,0,1,0,0,0,0,0,0,0,31,32,1,0,4,0,0,0,0,0,0,0,32,32,1,0,10,0,0,0,34,11,0,0,33,32,1,0,1,0,0,0,0,0,0,0,34,32,1,0,26,0,0,0,44,11,0,0,35,32,4,0,1,0,0,0,0,0,0,0,1,80,5,0,1,0,0,0,70,11,0,0,2,80,1,0,1,0,0,0,128,0,0,0,65,176,3,0,1,0,0,0,15,0,0,0,69,176,3,0,1,0,0,0,0,0,0,0,70,176,3,0,1,0,0,0,0,0,0,0,71,176,3,0,1,0,0,0,255,255,255,255,72,176,8,0,1,0,0,0,0,0,0,0,73,176,3,0,1,0,0,0,0,0,0,0,74,176,3,0,1,0,0,0,0,0,0,0,75,176,3,0,1,0,0,0,0,0,0,0,76,176,5,0,1,0,0,0,86,11,0,0,77,176,3,0,1,0,0,0,0,0,0,0,79,176,3,0,1,0,0,0,1,0,0,0,80,176,3,0,1,0,0,0,255,255,255,255,81,176,3,0,1,0,0,0,0,0,0,0,82,176,3,0,1,0,0,0,0,0,0,0,83,176,3,0,1,0,0,0,0,0,0,0,84,176,3,0,1,0,0,0,0,0,0,0,0,148,7,0,44,2,0,0,94,11,0,0,1,148,7,0,0,16,0,0,138,13,0,0,2,148,7,0,144,1,0,0,138,29,0,0,3,148,7,0,232,3,0,0,26,31,0,0,4,148,7,0,44,2,0,0,2,35,0,0,5,148,7,0,200,7,0,0,46,37,0,0,6,148,7,0,64,0,0,0,246,44,0,0,7,148,7,0,64,0,0,0,54,45,0,0,8,148,7,0,232,3,0,0,118,45,0,0,9,148,7,0,64,5,0,0,94,49,0,0,10,148,7,0,16,1,0,0,158,54,0,0,11,148,7,0,144,1,0,0,174,55,0,0,12,148,7,0,64,0,0,0,62,57,0,0,13,148,7,0,236,4,0,0,126,57,0,0,14,148,7,0,0,48,0,0,106,62,0,0,0,161,7,0,64,0,0,0,106,110,0,0,16,32,7,0,156,25,0,0,170,110,0,0,15,148,7,0,0,8,0,0,70,136,0,0,80,144,7,0,176,3,0,0,70,144,0,0,18,148,7,0,160,0,0,0,246,147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,73,73,94,0,2,1,50,48,49,52,58,48,52,58,49,56,32,50,48,58,51,51,58,53,51,0,160,15,112,23,0,0,210,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,68,67,55,51,48,51,51,50,48,50,50,50,48,48,48,0,0,0,0,0,135,22,217,62,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,116,97,110,100,97,114,100,0,0,0,0,0,0,0,0,160,15,0,0,112,23,0,0,56,4,0,0,80,6,0,0,0,0,0,0,10,0,0,0,195,0,22,0,80,53,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,3,0,0,1,0,0,0,1,0,0,0,10,0,0,0,10,0,0,0,35,1,1,1,0,0,0,0,0,0,1,0,0,0,146,78,0,74,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,129,1,223,8,0,0,1,8,1,0,64,135,5,0,0,0,0,0,0,67,8,0,0,0,0,0,0,0,0,0,0,0,0,86,218,0,124,1,1,0,255,255,255,255,255,233,0,215,5,79,255,255,255,255,255,255,255,255,255,255,255,231,255,255,255,255,255,5,255,255,255,255,255,231,255,255,255,255,255,0,255,255,255,255,255,27,255,255,255,255,255,0,255,255,255,255,255,0,255,255,255,255,255,14,255,255,255,255,255,0,255,255,255,255,255,1,255,255,255,255,255,0,255,255,255,255,255,105,255,255,255,255,255,1,255,255,255,255,255,1,255,255,255,255,255,125,255,255,255,255,255,182,4,255,255,255,255,255,94,255,255,255,255,255,182,4,255,255,255,255,255,94,255,255,255,255,255,182,4,255,255,255,255,255,94,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,182,4,255,255,255,255,255,94,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,62,8,18,91,43,0,0,0,0,72,220,95,220,62,255,220,255,254,255,255,255,255,255,61,253,255,255,252,170,249,255,127,62,170,92,255,241,78,251,255,38,31,65,27,255,255,255,56,220,251,153,255,153,191,16,255,255,255,64,255,163,255,192,11,16,255,251,220,255,251,255,255,253,192,31,31,56,255,251,255,62,255,144,220,253,254,255,16,253,255,255,255,255,255,12,146,16,253,192,220,254,255,255,251,255,255,220,15,255,62,31,78,255,153,255,251,62,220,16,251,255,31,12,254,253,251,157,251,255,254,170,255,31,154,251,160,254,251,251,255,255,251,31,253,255,255,255,252,62,255,192,68,255,62,255,106,255,255,72,62,253,255,255,253,16,139,255,220,31,253,255,255,3,253,255,62,62,255,62,199,55,24,255,254,255,199,255,254,226,170,144,11,255,255,255,220,11,132,78,255,62,255,255,255,16,78,255,253,16,255,16,170,255,170,170,31,255,251,251,255,206,255,167,255,173,255,251,253,253,255,20,250,255,156,59,255,255,62,220,254,170,70,255,254,255,28,191,255,253,16,255,237,72,194,0,162,5,1,0,0,1,0,1,0,0,0,0,0,0,112,228,96,0,0,0,0,1,203,86,233,146,202,76,25,190,166,1,71,190,71,146,186,146,213,106,213,197,71,190,71,146,186,146,213,106,213,197,1,0,0,36,0,0,0,0,0,0,0,14,0,0,156,27,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147,31,0,0,86,81,0,0,75,228,0,0,184,226,1,0,24,0,0,64,0,216,17,94,27,131,0,0,0,0,0,1,0,0,0,0,0,0,0,4,165,96,0,0,0,0,0,48,187,1,0,64,88,187,4,135,20,105,47,8,71,190,71,146,186,146,213,106,225,135,71,190,71,146,186,146,213,106,225,135,1,0,0,36,0,0,0,0,0,0,0,14,0,0,25,27,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,74,0,0,119,26,0,0,164,140,0,0,187,197,1,0,0,0,74,27,0,216,16,94,27,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,1,0,35,149,0,0,148,146,0,0,123,108,0,0,83,81,0,0,33,93,0,0,167,160,0,0,170,135,0,0,32,2,0,0,191,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,91,255,0,0,0,0,0,0,0,0,0,0,0,0,60,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,16,26,0,0,200,76,0,0,95,76,0,0,117,135,0,0,142,7,0,0,28,106,0,0,23,211,0,0,126,160,0,0,210,12,0,0,186,186,0,0,110,142,0,0,64,35,0,0,209,203,0,0,165,71,0,0,141,172,0,0,5,36,0,0,46,135,0,0,19,211,0,0,234,226,0,0,93,96,0,0,118,96,0,0,214,172,0,0,119,2,0,0,188,240,0,0,132,57,0,0,101,211,0,0,179,146,0,0,254,112,0,0,185,205,0,0,62,48,0,0,33,32,0,0,119,7,0,0,21,236,0,0,174,136,0,0,44,112,0,0,29,5,0,0,227,94,0,0,30,236,0,0,131,138,0,0,246,205,0,0,36,215,0,0,0,234,0,0,171,14,0,0,184,125,0,0,134,105,0,0,229,94,0,0,121,40,0,0,97,94,0,0,118,5,0,0,36,94,0,0,196,216,0,0,153,138,0,0,44,48,0,0,160,231,0,0,247,125,0,0,128,182,0,0,98,48,0,0,34,234,0,0,184,86,0,0,54,234,0,0,34,182,0,0,58,138,0,0,205,125,0,0,98,246,79,69,69,69,79,246,98,98,246,79,69,69,69,79,246,98,79,69,19,91,147,91,19,69,79,101,207,177,115,95,115,177,207,101,101,75,39,45,74,45,39,75,101,101,207,177,115,95,115,177,207,101,79,69,19,91,147,91,19,69,79,0,0,127,160,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,30,12,0,0,30,12,0,0,0,0,0,0,0,0,0,0,128,255,37,255,37,255,157,255,37,255,0,149,27,1,73,215,0,0,0,149,0,0,30,12,0,0,0,149,0,0,231,231,0,0,73,215,0,0,12,12,0,0,157,40,0,0,22,160,0,0,21,106,0,0,53,197,0,0,68,36,0,0,60,220,60,136,0,4,193,94,0,0,228,255,0,0,37,255,228,96,228,96,12,43,174,96,121,43,207,43,19,43,19,43,227,43,2,43,146,43,0,43,209,96,151,96,45,96,167,43,107,43,63,43,46,43,29,43,139,43,179,43,212,43,78,43,105,43,89,96,201,43,253,43,4,71,138,71,1,71,15,43,157,43,170,43,204,43,75,43,136,43,6,43,53,43,209,43,103,43,192,43,153,43,80,43,24,43,172,43,241,96,148,96,38,224,189,96,67,224,37,96,159,96,243,43,251,96,219,96,226,96,187,96,141,224,12,224,84,224,253,96,205,96,202,224,158,96,170,224,186,224,12,224,163,96,117,224,12,224,75,224,44,96,12,224,248,224,12,224,12,224,48,96,37,96,216,96,12,224,12,224,12,224,47,96,12,224,0,96,144,224,12,224,172,224,129,96,12,224,12,224,12,224,12,224,65,96,142,43,20,224,75,224,188,96,237,96,216,96,12,224,96,224,138,220,92,0,171,255,224,220,224,220,224,220,224,220,60,220,224,220,94,1,60,220,60,220,60,220,60,220,60,220,64,0,0,0,0,91,0,0,0,0,0,0,0,0,0,0,0,249,255,0,0,204,0,0,0,0,0,0,86,81,8,33,231,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,153,255,60,220,86,220,86,150,0,194,86,150,0,194,0,194,194,254,86,0,86,0,146,0,0,0,0,0,8,0,207,215,0,0,157,108,0,0,84,12,0,0,157,108,0,0,235,14,0,0,207,215,0,0,143,146,0,0,203,40,0,0,140,108,0,0,40,106,0,0,34,92,0,0,231,121,0,0,60,220,60,136,0,4,48,14,0,0,126,255,0,0,126,255,37,96,12,43,166,96,205,220,149,0,133,255,240,220,60,220,60,220,60,220,60,220,224,220,94,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,36,158,239,147,239,57,226,64,26,238,197,255,106,159,211,184,108,90,196,223,194,30,78,91,220,201,51,172,203,206,224,236,36,219,92,112,224,148,142,76,35,98,117,196,35,149,172,41,240,174,57,145,108,75,182,161,5,100,48,199,136,184,76,217,146,134,215,100,136,27,112,71,14,75,40,145,205,243,86,237,129,244,86,109,14,11,14,213,105,122,231,36,236,154,231,247,138,5,14,239,125,233,5,116,160,237,94,69,94,245,105,97,136,121,234,231,234,194,205,124,136,231,112,236,125,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,216,1,0,1,0,0,0,216,1,0,1,234,0,0,64,27,64,27,125,0,190,0,112,110,205,0,112,0,0,0,0,0,0,92,190,0,0,0,112,0,0,0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,19,112,0,0,0,1,1,56,112,0,0,1,0,0,0,0,27,113,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,255,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,112,228,96,1,0,0,0,0,0,1,0,0,0,0,1,0,27,27,94,159,0,0,27,0,0,0,0,191,198,8,0,1,132,1,1,0,0,0,48,187,23,0,0,1,0,0,149,125,64,27,35,160,0,0,98,76,0,0,55,236,0,0,109,48,0,0,91,205,0,0,1,0,0,0,1,0,126,255,12,32,0,190,0,190,0,112,0,112,110,205,0,112,0,1,113,138,0,0,0,0,0,112,228,96,216,0,1,0,149,27,86,146,0,0,0,146,0,0,0,0,0,219,238,0,149,191,0,0,0,0,0,0,0,0,0,148,146,0,0,107,255,196,108,0,0,42,255,148,146,0,0,184,76,0,0,0,0,0,0,81,0,113,76,0,0,255,135,0,0,112,76,0,0,141,197,0,0,7,7,0,0,167,106,0,0,219,211,0,0,145,160,0,0,109,12,0,0,100,71,0,0,3,117,0,0,37,142,0,0,56,203,0,0,35,71,0,0,225,172,0,0,202,239,0,0,206,135,0,0,33,81,0,0,78,226,0,0,50,96,0,0,191,96,0,0,66,172,0,0,178,183,0,0,30,240,0,0,148,57,0,0,80,211,0,0,17,146,0,0,180,112,0,0,40,5,0,0,7,48,0,0,88,136,0,0,85,106,0,0,232,187,0,0,35,48,0,0,8,182,0,0,130,138,0,0,180,94,0,0,58,160,0,0,237,5,0,0,254,234,0,0,63,215,0,0,254,4,0,0,75,14,0,0,16,125,0,0,179,136,0,0,116,94,0,0,208,187,0,0,123,216,0,0,142,112,0,0,254,125,0,0,56,125,0,0,72,5,0,0,221,190,0,0,145,14,0,0,235,125,0,0,56,32,0,0,218,48,0,0,8,234,0,0,124,86,0,0,136,234,0,0,194,112,0,0,196,182,0,0,130,125,0,0,122,240,0,0,36,226,0,0,227,226,0,0,86,240,0,0,48,76,0,0,91,7,0,0,113,93,0,0,108,81,0,0,190,236,0,0,161,96,0,0,200,43,0,0,169,71,0,0,77,96,0,0,249,183,0,0,65,36,0,0,192,76,0,0,162,92,0,0,74,81,0,0,140,26,0,0,67,239,0,0,11,36,0,0,248,36,0,0,11,239,0,0,37,76,0,0,128,106,0,0,61,149,0,0,71,12,0,0,190,48,0,0,218,190,0,0,90,146,0,0,204,146,0,0,15,81,0,0,166,12,0,0,19,190,0,0,240,136,0,0,105,182,0,0,43,86,0,0,209,190,0,0,41,112,0,0,61,138,0,0,35,32,0,0,221,5,0,0,173,86,0,0,152,4,0,0,55,182,0,0,3,4,0,0,201,136,0,0,201,234,0,0,222,5,0,0,61,231,0,0,57,231,0,0,123,205,0,0,211,182,0,0,14,4,0,0,47,14,0,0,160,105,0,0,23,136,0,0,47,234,0,0,191,86,0,0,148,86,0,0,193,138,0,0,86,112,0,0,229,94,0,0,119,0,6,0,58,0,218,0,229,0,84,0,172,0,86,0,13,255,25,0,23,0,52,0,66,0,151,0,28,0,232,0,194,0,112,0,189,0,61,0,181,0,162,0,134,0,191,0,142,0,125,0,153,255,188,255,31,255,53,255,198,255,48,0,213,255,175,255,227,255,215,255,90,254,119,255,5,255,185,254,91,255,168,254,37,254,115,254,106,255,49,254,56,255,148,254,113,254,227,254,36,254,46,254,187,255,83,254,125,254,26,255,116,255,210,254,204,254,154,254,241,254,0,255,201,253,98,246,79,69,69,69,79,246,98,98,246,79,69,69,69,79,246,98,79,69,19,91,147,91,19,69,79,101,207,177,115,95,115,177,207,101,101,75,39,45,74,45,39,75,101,101,207,177,115,95,115,177,207,101,79,69,19,91,147,91,19,69,79,98,246,79,69,69,69,79,246,98,98,246,79,69,69,69,79,246,98,79,69,19,91,147,91,19,69,79,101,207,177,115,95,115,177,207,101,101,75,39,45,74,45,39,75,101,101,207,177,115,95,115,177,207,101,79,69,19,91,147,91,19,69,79,0,0,0,0,0,0,0,0,84,12,0,0,84,12,0,0,0,0,0,0,0,0,0,0,77,255,126,255,126,255,242,255,126,255,0,0,0,0,0,0,0,0,0,0,0,0,0,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,190,0,112,110,205,0,112,0,0,0,0,0,190,0,112,60,136,0,4,0,190,0,112,110,205,0,112,206,32,0,112,165,32,146,4,0,190,0,112,60,136,0,4,81,0,0,86,0,4,146,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,220,224,220,110,220,0,206,32,0,0,190,0,112,0,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,112,60,136,0,4,0,190,0,112,60,136,0,4,0,190,0,112,60,136,0,4,0,190,0,112,110,205,0,112,0,190,0,112,0,136,0,86,206,32,0,112,125,32,0,86,0,190,0,112,0,136,0,86,16,255,56,252,170,16,16,255,255,16,251,254,255,255,255,75,255,251,255,255,31,255,220,255,254,255,255,62,255,254,255,16,16,255,31,253,16,255,255,255,255,153,255,254,255,31,220,11,255,255,255,62,167,205,255,62,27,255,253,251,255,98,255,253,255,220,255,62,255,255,255,255,170,31,255,255,220,31,170,255,170,255,255,157,255,170,59,255,254,15,255,132,254,251,139,220,255,168,27,163,16,255,144,144,255,254,220,170,31,62,62,255,255,191,159,220,199,255,35,255,255,78,253,67,153,255,255,255,192,255,255,16,16,255,255,255,255,255,255,62,255,255,255,220,24,255,255,255,255,251,255,220,62,27,62,253,16,255,170,255,27,16,255,255,16,255,255,251,13,255,255,255,62,220,251,255,20,255,254,156,255,132,11,159,255,31,62,255,253,254,255,255,255,12,255,220,255,170,253,255,255,132,254,255,255,251,251,11,31,255,255,119,254,62,255,254,255,250,20,67,255,241,121,253,16,255,8,252,255,144,255,56,170,255,62,255,170,251,59,254,253,220,220,252,16,170,255,255,69,31,98,252,170,62,255,144,21,255,255,62,170,255,253,254,144,255,170,220,72,251,255,255,255,64,16,255,251,31,62,62,255,31,251,255,255,220,254,255,255,16,253,255,170,251,72,170,250,237,255,255,251,31,220,254,255,255,220,220,251,249,251,31,255,251,255,255,255,255,254,253,11,255,220,16,255,251,62,237,192,255,255,237,16,16,255,253,255,191,243,253,251,205,62,255,255,12,62,254,253,255,251,144,170,255,255,8,32,1,0,0,0,0,4,0,4,211,227,0,0,0,0,0,217,138,0,0,0,0,0,255,0,0,0,255,0,0,0,0,119,112,0,0,0,0,13,0,0,0,209,0,0,22,0,0,51,35,0,0,51,35,0,0,63,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,0,0,0,0,0,0,0,0,0,0,0,1,8,94,207,0,0,0,0,0,0,0,0,51,35,64,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,47,8,8,216,8,216,64,0,0,1,27,0,0,0,0,0,0,0,167,216,0,0,0,0,52,94,0,0,14,1,0,0,0,0,8,195,96,40,12,200,138,230,231,215,231,173,14,251,231,142,205,94,205,115,234,153,4,126,231,4,231,16,14,251,14,76,231,192,14,8,14,191,94,22,1,35,0,197,0,236,0,48,0,105,0,231,0,14,0,14,0,64,0,1,0,0,0,0,0,42,1,83,0,142,0,164,0,85,0,61,0,102,0,197,0,27,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,1,14,64,8,27,216,112,216,0,0,0,0,0,0,0,0,0,51,51,254,51,0,0,0,205,0,216,125,0,0,167,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,69,0,0,0,0,65,94,0,0,167,216,149,4,0,0,0,0,0,18,0,113,0,18,0,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,16,0,0,0,0,0,0,0,196,0,0,0,0,0,57,146,2,2,1,127,0,187,187,48,48,69,117,7,4,0,0,1,1,0,1,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,255,255,0,0,231,231,27,27,27,27,231,27,231,27,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,31,8,170,255,72,253,58,251,253,56,0,112,0,112,0,0,0,112,0,0,110,205,216,0,1,0,0,190,12,32,119,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,125,27,0,27,0,0,0,0,0,0,0,251,251,231,0,0,16,58,215,22,138,8,0,1,0,0,0,27,0,0,0,0,0,1,0,0,0,0,0,0,0,0,27,16,0,1,1,8,1,8,255,187,74,0,0,7,0,0,0,63,255,189,255,129,255,133,254,36,254,22,253,36,253,170,252,93,252,0,0,0,0,0,0,0,0,0,0,255,255,55,255,255,253,241,87,251,255,253,253,170,255,253,62,105,0,0,0,0,0,0,251,74,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,112,110,205,1,62,255,255,16,62,0,0,0,0,0,255,62,255,0,112,0,112,0,112,0,112,0,112,0,112,0,112,0,112,8,112,64,112,231,112,5,112,182,112,187,112,47,112,26,112,96,112,78,112,56,112,87,112,49,112,45,112,49,112,212,112,131,112,131,112,74,112,233,112,11,112,8,182,50,182,53,182,0,112,0,112,0,112,0,112,0,112,0,112,0,112,0,112,8,112,64,112,231,112,5,112,182,112,187,112,47,112,26,112,96,112,78,112,56,112,87,112,49,112,45,112,49,112,212,112,131,112,131,112,74,112,233,112,11,112,8,182,50,182,53,182,0,112,0,112,0,112,0,112,0,112,0,112,0,112,0,112,8,112,64,112,231,112,5,112,182,112,187,112,47,112,26,112,96,112,78,112,56,112,87,112,49,112,45,112,49,112,212,112,131,112,131,112,74,112,233,112,11,112,8,182,50,182,53,182,0,112,0,112,0,112,0,112,0,112,0,112,0,112,0,112,8,112,64,112,231,112,5,112,182,112,187,112,47,112,26,112,96,112,78,112,56,112,87,112,49,112,45,112,49,112,212,112,131,112,131,112,74,112,233,112,11,112,8,182,50,182,53,182,255,255,255,255,255,255,255,255,255,255,0,253,9,86,9,86,9,86,9,86,62,94,62,94,62,94,62,94,215,215,215,215,215,215,215,215,215,0,215,0,215,0,215,0,215,0,215,0,215,0,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,1,0,93,0,0,190,0,0,110,205,14,1,0,1,1,27,1,0,0,0,149,0,199,0,199,1,0,27,62,64,149,94,74,231,0,205,0,105,196,187,0,0,0,0,0,0,0,0,0,0,1,1,1,86,234,1,0,0,0,0,0,0,0,0,4,0,1,1,128,255,128,255,168,255,0,0,71,0,204,0,67,0,21,1,64,8,158,8,194,27,0,0,0,0,0,0,0,0,0,0,246,125,248,64,162,64,71,64,128,27,238,27,9,8,238,8,107,1,112,1,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,8,0,27,0,64,0,125,0,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,4,0,231,0,14,0,14,0,94,0,216,0,125,0,27,0,8,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93,0,2,0,2,0,2,0,0,155,219,216,81,0,219,216,81,0,219,216,81,0,105,0,105,0,105,0,93,0,93,0,93,0,96,0,96,0,96,0,5,5,5,8,8,8,1,1,1,255,62,255,255,254,153,144,255,31,254,220,170,35,253,255,251,251,62,156,170,16,0,63,125,0,0,0,0,0,0,0,74,125,1,255,16,253,0,0,0,0,215,0,0,190,0,112,0,112,1,8,255,237,31,173,255,16,220,255,255,255,255,15,170,31,255,253,16,170,255,254,191,254,220,255,0,0,0,112,1,1,1,1,1,38,255,0,0,0,8,1,0,8,0,0,219,0,219,0,0,0,0,0,254,27,0,0,0,0,1,27,1,36,1,0,95,0,1,71,164,0,0,0,0,0,254,27,14,255,74,94,138,138,0,1,0,0,164,0,0,0,0,0,254,27,14,0,14,0,14,0,14,0,0,74,0,1,0,0,0,0,0,0,1,0,0,1,0,27,149,0,149,0,125,94,8,1,0,1,1,1,0,0,0,0,0,0,216,216,255,220,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,253,255,170,16,124,31,205,0,8,0,1,0,0,1,1,1,74,74,8,8,196,251,1,1,1,1,160,64,1,129,1,236,138,216,160,64,1,129,1,236,138,216,0,0,0,0,0,0,27,27,8,57,160,220,62,255,255,255,251,254,75,255,255,220,255,11,255,70,220,92,251,255,255,249,254,255,159,255,136,254,254,79,170,159,254,191,16,254,237,31,35,253,157,255,112,255,255,220,253,255,170,255,255,255,27,251,255,62,255,16,237,170,255,255,170,253,253,27,255,8,253,255,253,255,251,16,191,72,255,255,12,255,255,226,12,255,220,27,251,68,255,170,12,170,156,254,255,170,252,255,255,255,255,62,170,255,16,31,62,220,252,255,170,106,251,31,255,253,255,62,64,255,191,62,16,254,255,255,251,8,255,255,170,255,254,255,153,255,254,255,253,68,253,62,249,220,126,220,62,251,253,31,251,220,255,191,255,253,255,31,237,255,253,0,112,1,1,1,0,196,0,0,216,216,1,1,0,0,0,0,1,1,0,8,0,112,0,129,0,8,0,112,0,129,0,0,1,1,74,0,0,0,196,39,74,1,8,14,0,27,1,0,0,25,86,13,94,1,149,112,0,149,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,112,0,112,0,112,0,255,254,254,252,0,205,254,149,23,255,30,27,235,255,73,0,18,255,165,0,196,0,196,0,39,0,39,0,0,1,0,1,74,0,74,0,0,108,181,1,108,170,181,1,223,0,0,0,0,0,0,0,8,125,91,125,0,0,8,125,91,125,0,0,8,125,91,125,0,0,8,125,91,125,34,255,152,0,245,255,47,0,125,215,86,196,74,74,39,74,74,39,246,255,196,0,0,0,69,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,8,8,56,0,8,36,128,64,0,0,0,0,129,196,149,74,253,1,128,0,16,0,67,27,112,0,40,0,69,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,31,255,220,253,254,254,170,62,255,255,170,255,255,8,1,149,1,149,0,196,0,0,199,0,0,8,74,0,74,0,149,0,39,0,0,8,74,0,74,0,0,1,86,0,255,0,39,0,0,8,39,0,74,0,0,8,112,0,196,0,0,0,63,0,39,1,0,8,1,149,1,149,0,196,0,0,225,0,0,8,74,0,74,0,149,0,196,0,0,8,74,0,74,0,225,0,86,0,255,0,39,0,0,8,39,0,74,0,0,8,112,0,196,0,0,0,63,0,39,1,0,0,0,31,255,31,237,0,0,0,0,209,0,166,0,200,0,140,0,89,0,0,0,1,27,0,14,1,1,0,0,0,0,0,0,255,255,0,0,255,62,170,31,255,255,254,31,255,31,62,255,62,16,31,255,255,62,251,191,255,255,12,255,253,64,254,255,255,254,121,255,255,255,253,250,254,255,64,255,255,185,251,12,192,255,255,27,255,255,62,149,253,251,62,16,255,255,251,16,249,72,8,234,27,9,9,79,0,84,0,187,27,108,27,13,8,13,8,44,8,157,8,38,8,2,27,186,27,0,217,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,255,254,255,255,12,255,254,255,255,220,170,252,12,253,62,153,170,56,255,31,253,253,220,31,96,255,253,255,255,220,255,255,170,16,106,255,255,253,255,92,62,62,255,255,253,170,185,8,255,255,255,253,254,254,254,62,170,220,255,16,255,255,255,255,31,255,255,11,106,220,16,220,167,254,220,255,191,220,255,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,8,0,1,0,1,63,1,104,129,0,0,0,196,0,0,0,196,0,0,134,93,0,0,0,0,54,8,0,1,63,1,234,125,238,255,174,255,143,255,117,125,18,254,67,255,61,255,204,64,87,110,164,19,107,1,156,1,158,1,235,1,1,0,0,0,0,0,163,14,241,215,67,94,248,4,0,0,0,0,112,112,1,0,1,112,112,1,149,149,103,27,103,27,103,27,1,0,0,0,0,0,0,0,94,136,171,112,191,86,171,112,191,86,11,4,195,105,11,4,195,105,5,1,1,1,233,0,14,125,48,4,245,8,0,0,0,0,171,105,172,4,59,4,143,182,74,74,74,74,62,62,62,62,0,0,196,112,36,138,56,0,0,240,0,229,0,64,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,64,199,76,0,87,0,2,211,196,37,74,74,196,0,221,126,64,1,183,58,0,0,105,0,0,234,125,238,255,174,255,143,255,117,125,18,254,67,255,61,255,204,64,0,0,140,135,29,212,49,172,106,147,198,2,77,51,175,79,178,43,214,26,136,188,213,121,216,24,0,0,0,0,96,92,86,73,211,169,191,93,248,47,21,119,112,211,167,194,28,197,76,212,62,36,65,208,83,226,29,98,216,78,16,186,87,47,87,69,39,96,195,65,208,105,182,48,168,0,19,86,189,94,68,30,0,0,0,0,115,1,134,186,189,8,99,231,79,94,145,0,114,0,121,0,183,129,231,0,213,121,216,24,0,0,0,0,144,226,32,68,0,0,0,0,37,216,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,31,226,37,68,175,226,74,68,90,226,74,68,253,226,47,87,253,226,47,87,253,226,47,87,175,226,74,68,3,36,254,169,3,36,254,169,255,255,96,255,255,255,5,172,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,85,0,0,1,0,0,144,226,32,68,0,0,0,0,0,0,0,0,140,135,29,212,214,26,136,188,144,226,32,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,105,0,0,182,48,0,0,100,0,0,0,19,86,0,0,234,125,0,0,213,27,0,0,236,0,0,0,229,0,0,0,0,0,0,0,0,0,0,0,134,186,0,0,122,36,254,169,122,36,254,169,186,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,122,36,254,169,186,197,0,0,0,0,0,0,0,0,0,0,122,36,254,169,254,169,0,0,122,36,254,169,122,36,254,169,0,0,0,0,2,1,0,8,0,8,0,8,48,36,17,65,136,36,17,65,136,36,17,65,0,0,0,0,3,36,254,169,0,0,0,0,3,36,254,169,3,36,254,169,54,8,0,1,63,1,54,8,0,1,63,1,104,129,0,196,134,93,208,4,0,64,0,94,8,0,0,0,254,0,0,0,240,0,157,0,254,0,0,0,254,169,0,0,0,0,0,0,0,0,0,0,138,135,201,219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,1,0,0,187,0,89,84,2,61,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,174,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,218,226,37,68,31,226,37,68,0,26,0,26,138,135,201,219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,1,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,0,0,0,58,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,158,0,166,0,166,0,139,0,80,0,134,0,17,0,140,0,21,0,97,0,120,0,163,0,33,0,124,0,163,0,34,0,143,0,178,0,11,0,28,0,60,0,2,1,98,1,84,1,208,1,116,1,142,1,106,1,4,1,244,0,10,0,193,0,216,1,57,1,150,1,227,1,43,1,240,1,138,1,245,0,157,0,151,0,30,0,145,0,84,0,35,0,177,0,83,0,210,0,123,0,84,0,69,0,194,0,203,0,32,0,211,0,21,0,172,0,239,0,97,0,7,0,40,0,136,0,177,0,211,0,105,0,108,0,169,0,48,0,186,0,190,0,136,0,43,0,50,0,239,0,231,0,125,0,40,0,101,0,146,0,96,0,197,0,105,0,129,0,96,0,205,0,94,0,4,0,48,0,246,0,17,0,149,0,135,0,56,0,208,0,43,0,12,0,236,0,167,0,55,0,99,0,29,0,151,0,230,0,199,0,61,0,17,0,175,0,188,0,249,0,94,1,234,1,234,1,216,1,249,0,67,0,143,0,46,0,167,0,200,0,147,1,229,1,90,1,60,1,45,1,221,1,98,1,57,1,216,1,62,0,107,0,226,1,84,1,123,1,70,1,219,1,232,1,43,1,136,1,235,0,9,0,167,0,127,0,16,0,246,0,219,0,97,0,148,0,176,0,131,0,65,0,207,0,194,0,211,0,26,0,191,0,43,0,183,0,21,0,172,0,93,0,93,0,169,0,36,0,40,0,239,0,45,0,93,0,51,0,81,0,190,0,186,0,73,0,183,0,205,0,138,0,76,0,101,0,135,0,51,0,224,0,227,0,93,0,186,0,5,0,136,0,136,0,57,0,75,0,189,0,106,0,239,0,96,0,123,0,227,0,239,0,187,0,0,0,156,149,229,200,59,149,95,228,124,149,107,154,75,81,178,154,172,211,118,154,186,81,162,20,93,81,41,20,68,81,91,20,3,81,39,228,156,149,178,37,245,160,117,37,57,47,187,85,125,47,237,119,206,47,58,119,32,93,237,119,120,47,104,73,12,93,43,119,205,93,219,119,6,47,208,119,220,47,40,204,232,47,9,204,163,47,80,17,223,92,75,164,217,92,98,164,240,57,84,232,147,57,100,232,79,57,196,232,40,57,25,243,123,57,5,164,64,57,150,164,141,92,225,45,79,57,179,130,56,57,129,176,0,2,80,208,61,2,82,147,70,183,246,147,110,172,26,147,67,183,241,110,242,172,13,147,188,183,117,208,203,2,68,50,229,121,158,177,178,36,48,87,104,239,178,87,74,196,222,78,104,220,99,150,44,220,19,246,15,194,35,79,249,117,222,116,202,98,213,117,207,227,84,196,190,79,101,78,118,196,124,238,100,150,125,227,120,238,66,150,255,255,255,255,118,212,58,224,46,97,123,43,166,82,166,203,204,91,245,194,76,220,35,227,196,117,45,78,107,21,233,81,255,255,255,255,44,188,34,160,174,208,237,2,255,255,255,255,175,87,90,183,67,207,193,145,167,65,158,101,244,169,148,106,255,255,255,255,98,83,51,93,145,110,229,183,212,79,78,142,187,98,251,196,255,255,255,255,255,255,255,255,242,75,1,26,124,68,6,172,255,255,255,255,227,116,23,2,91,88,228,160,255,255,255,255,255,255,255,255,64,87,145,121,112,7,193,150,255,255,255,255,255,255,255,255,99,106,178,116,92,116,199,240,123,56,225,117,23,110,7,150,44,101,223,226,195,142,80,78,241,177,120,186,62,219,64,76,185,39,174,81,123,16,156,106,147,47,137,200,130,47,64,200,206,47,101,37,244,47,120,228,27,93,60,228,26,93,210,228,183,93,113,228,69,93,19,37,115,93,239,200,109,93,218,225,191,93,122,118,17,93,234,17,132,93,39,85,14,106,201,204,135,106,56,204,169,106,135,204,243,106,135,204,188,106,30,204,88,106,57,85,243,106,197,17,139,106,5,6,46,106,217,6,203,57,227,130,74,57,173,45,193,57,173,45,23,57,233,45,62,57,49,45,231,7,88,45,255,57,77,45,163,57,221,130,59,57,17,176,8,7,6,189,136,7,247,175,143,121,22,97,243,2,254,177,226,183,26,177,52,183,242,50,154,183,108,177,214,183,186,65,2,183,140,97,118,2,3,65,107,121,90,169,146,121,45,39,99,36,51,221,226,196,133,238,243,150,106,207,7,220,137,207,63,127,142,207,168,127,79,101,137,75,232,186,121,79,15,246,57,79,194,101,138,98,3,238,144,98,20,98,225,246,255,101,6,35,192,238,81,238,232,117,204,91,248,227,197,110,67,71,42,19,101,246,219,101,236,117,93,207,29,117,222,83,84,71,247,208,28,71,185,39,217,92,155,56,79,150,255,255,255,255,240,16,89,224,143,75,168,172,194,188,246,226,174,75,151,239,95,69,98,183,255,255,255,255,174,208,92,186,188,207,90,203,155,50,173,186,255,255,255,255,255,255,255,255,108,238,127,71,139,50,235,224,132,150,67,142,45,116,12,36,198,84,204,36,242,246,192,79,115,110,198,226,5,110,181,117,255,255,255,255,255,255,255,255,255,255,255,255,168,172,129,79,24,101,27,224,84,56,130,71,166,56,231,35,206,207,79,239,109,127,58,145,97,39,118,239,232,169,173,121,150,97,129,226,19,68,14,224,0,0,0,0,0,0,0,0,182,182,81,184,255,255,255,255,156,0,48,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,13,209,67,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,32,255,255,255,255,255,255,64,187,74,196,1,149,1,8,0,0,0,0,231,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,0,0,0,89,0,0,0,0,0,0,0,90,0,0,0,15,0,0,0,90,0,0,0,171,0,0,0,1,0,0,0,0,0,0,0,89,0,0,0,47,255,255,255,62,0,0,0,152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,0,47,255,15,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,216,0,0,89,90,33,0,196,1,0,89,90,51,255,168,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,255,31,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,96,214,141,2,0,0,42,0,98,50,232,90,0,0,10,0,148,187,46,129,0,0,30,0,198,147,223,79,0,0,240,0,6,29,245,108,0,0,182,0,35,4,9,203,0,0,31,10,15,18,105,182,0,0,115,0,73,232,6,182,0,0,117,250,149,89,192,218,0,0,187,1,151,147,65,229,0,0,133,1,43,229,234,129,0,0,17,0,171,151,183,129,0,0,40,0,25,177,103,229,0,0,8,0,147,229,137,246,0,0,153,0,87,240,21,122,0,0,240,0,140,90,186,83,0,0,122,0,123,240,226,57,0,0,68,0,175,147,247,155,0,0,57,51,171,74,9,108,0,0,212,7,49,139,37,246,0,0,33,1,65,193,79,145,0,0,203,1,19,171,103,151,0,0,10,0,145,246,30,190,0,0,74,0,67,26,104,193,0,0,155,0,246,26,81,105,0,0,242,0,56,108,180,224,0,0,108,0,39,211,180,182,0,0,10,0,100,193,40,150,0,0,91,0,199,177,224,151,0,0,251,103,204,151,138,218,0,0,254,241,4,151,58,218,0,0,179,218,167,117,11,211,0,0,47,0,78,194,132,84,0,0,12,0,17,229,74,134,0,0,242,0,250,232,211,90,0,0,178,0,87,227,39,193,0,0,177,0,1,193,97,150,0,0,214,0,247,211,41,86,0,0,210,171,57,151,105,218,0,0,121,92,115,151,211,123,0,0,29,101,79,171,96,218,0,0,203,1,21,211,58,174,0,0,248,0,168,218,74,1,0,0,12,0,132,189,156,90,0,0,83,0,167,218,151,123,0,0,182,0,76,218,128,218,0,0,179,0,198,50,190,84,0,0,229,0,169,26,183,50,0,0,177,0,161,246,79,187,0,0,242,0,232,229,79,26,0,0,193,0,249,246,220,184,0,0,232,20,60,171,243,218,0,0,248,0,142,117,113,190,0,0,40,0,14,151,200,194,0,0,83,0,230,50,143,158,0,0,153,0,182,123,216,214,0,0,250,255,245,130,71,158,0,0,240,0,195,193,251,239,0,0,214,0,131,240,226,150,0,0,178,0,91,194,108,151,0,0,122,0,252,229,78,229,0,0,242,0,20,177,124,93,0,0,38,227,61,151,122,218,0,0,254,0,83,214,4,189,0,0,74,0,67,50,251,147,0,0,118,0,170,194,96,117,0,0,229,0,236,211,49,118,0,0,103,0,231,178,199,181,0,0,254,255,28,50,121,117,0,0,8,0,125,193,107,130,0,0,178,0,240,50,233,194,0,0,30,0,249,177,129,97,0,0,11,0,45,147,118,239,0,0,167,203,76,89,143,218,0,0,226,0,139,50,46,177,0,0,27,0,172,240,244,90,0,0,182,0,156,179,132,143,0,0,153,0,181,158,176,182,0,0,89,0,146,108,235,125,0,0,155,0,34,207,233,210,0,0,105,0,9,90,43,203,0,0,242,0,153,232,73,240,0,0,153,0,86,240,129,178,0,0,186,245,69,89,138,218,0,0,115,0,53,189,226,123,0,0,12,0,151,117,167,125,0,0,243,0,161,4,85,243,0,0,193,0,54,229,31,26,0,0,240,0,28,240,197,130,0,0,182,0,85,53,217,224,96,232,103,0,125,53,39,125,0,0,243,0,122,50,127,240,0,0,83,0,95,240,11,80,0,0,113,248,128,171,133,218,0,0,17,0,227,179,143,151,0,0,140,0,242,246,35,2,0,0,13,0,54,117,129,246,0,0,155,0,211,179,79,227,0,0,229,0,127,117,125,53,0,0,153,0,223,235,34,134,38,177,240,0,35,122,137,145,72,177,132,102,157,151,221,218,0,0,254,241,180,151,171,123,0,0,157,1,76,177,213,227,0,0,93,1,227,117,179,105,0,0,102,0,69,151,250,240,0,0,118,0,169,4,20,142,0,0,97,0,89,147,150,239,0,0,0,0,197,122,28,154,0,0,250,255,183,207,189,174,0,0,171,12,115,54,189,130,0,0,134,10,24,151,117,123,0,0,230,205,74,171,170,218,0,0,186,246,200,151,239,218,0,0,190,1,40,179,46,5,0,0,54,1,198,246,194,117,0,0,42,0,96,171,92,50,0,0,242,0,148,117,17,148,0,0,214,0,208,211,206,206,0,0,242,0,143,193,19,203,0,0,48,0,228,229,37,89,0,0,105,29,96,171,241,218,0,0,190,1,198,151,96,218,0,0,209,103,108,171,176,218,0,0,61,242,164,2,150,218,0,0,125,1,61,50,161,182,0,0,101,0,246,2,210,229,0,0,27,0,241,50,167,4,0,0,254,255,138,211,126,198,0,0,48,0,198,29,17,179,0,0,177,0,125,240,226,243,0,0,185,147,172,171,33,218,0,0,118,85,55,2,183,218,0,0,146,132,197,2,238,218,0,0,47,0,147,246,42,235,0,0,50,1,44,29,107,57,0,0,215,1,137,117,183,182,0,0,195,0,100,89,250,2,0,0,63,0,129,26,102,179,0,0,108,0,215,232,5,117,0,0,55,255,217,227,81,134,0,0,122,0,211,50,89,151,0,0,51,227,47,151,54,123,0,0,132,69,217,171,41,218,0,0,107,0,31,232,229,2,0,0,250,0,140,232,201,202,0,0,198,1,49,229,74,54,0,0,102,0,52,189,239,89,0,0,48,0,120,229,174,194,0,0,178,0,103,147,0,193,0,0,193,0,223,229,61,227,0,0,177,0,22,50,197,229,0,0,98,255,89,189,174,179,0,0,223,0,97,50,183,2,0,0,254,241,171,151,96,218,0,0,188,1,5,50,194,235,0,0,50,1,56,177,167,203,0,0,117,1,155,171,8,194,0,0,19,0,107,151,245,123,0,0,12,0,104,117,209,148,0,0,214,0,66,147,0,53,0,0,0,0,227,179,202,54,0,0,119,255,3,26,155,125,0,0,254,255,171,179,143,129,0,0,122,0,131,187,222,171,0,0,222,193,148,2,128,1,0,0,33,1,92,229,212,148,0,0,54,1,207,232,182,182,0,0,10,0,50,171,76,2,0,0,11,0,191,189,116,2,0,0,103,0,247,130,72,134,0,0,126,255,229,240,119,229,0,0,0,0,90,177,143,147,0,0,3,255,50,26,18,145,0,0,191,0,57,50,27,179,0,0,93,233,170,2,148,218,0,0,247,0,16,26,73,122,0,0,167,1,170,187,214,177,0,0,215,1,164,194,198,26,0,0,215,116,137,89,112,0,1,0,0,0,0,0,53,1,196,0,92,0,97,0,5,5,218,1,255,136,255,159,253,8,48,254,3,251,62,255,146,15,220,31,255,31,255,251,254,191,255,39,255,31,255,253,136,255,255,254,170,255,16,129,255,31,255,16,31,255,255,31,255,11,255,255,251,255,75,55,31,255,253,255,255,170,253,62,62,156,255,220,31,153,255,254,170,170,253,159,255,255,255,220,255,31,220,196,64,255,255,254,78,251,199,255,191,255,254,62,255,255,170,255,237,16,255,255,170,255,249,255,255,12,199,255,251,255,75,255,31,251,220,255,170,255,255,255,251,191,255,254,254,255,253,253,253,12,31,255,170,249,255,255,249,126,72,255,255,255,253,255,16,255,255,220,62,255,255,255,255,16,144,157,16,255,170,170,220,173,62,17,170,170,62,75,255,15,31,62,255,35,255,255,255,251,255,253,64,255,249,255,16,255,170,255,79,255,64,252,255,153,224,255,255,128,62,255,255,255,255,251,31,28,31,170,31,255,250,253,16,31,62,255,31,255,255,220,255,170,16,72,255,255,255,220,255,255,255,62,255,251,253,255,220,251,220,254,11,251,62,55,255,255,255,255,55,31,254,72,253,153,252,255,220,255,254,253,253,144,237,255,255,255,255,255,255,220,255,255,156,255,255,255,220,255,251,170,253,170,255,255,255,62,255,250,255,170,170,255,170,255,255,64,255,255,255,199,251,255,255,220,253,254,253,56,199,251,255,254,255,31,253,254,192,78,192,220,144,16,144,62,255,255,253,220,255,255,250,220,170,255,62,72,254,220,220,170,255,255,48,255,31,27,255,128,251,255,253,62,255,255,156,253,251,255,170,157,220,255,72,220,35,255,255,220,72,220,253,255,220,251,254,255,62,16,255,255,255,255,226,106,255,255,255,62,255,255,255,216,255,255,255,62,220,62,62,220,255,255,255,255,253,255,249,31,31,16,6,56,31,78,253,170,170,170,255,237,251,254,170,255,251,170,62,220,255,255,62,220,255,255,255,192,251,31,255,120,170,170,255,254,78,254,254,254,170,253,255,254,62,16,254,251,251,106,255,220,251,255,255,255,255,255,220,255,31,31,255,255,153,255,255,255,220,16,255,255,170,192,255,255,254,255,237,8,62,255,252,220,59,16,62,255,65,31,47,255,16,251,255,255,255,12,255,255,153,191,12,220,16,255,12,255,153,253,255,59,251,251,220,31,251,15,16,255,220,255,255,255,255,253,65,255,16,144,220,255,255,255,255,115,255,170,6,16,68,192,59,255,251,31,37,255,255,199,220,255,255,15,255,75,220,255,255,255,64,16,249,253,159,16,254,255,62,255,255,255,251,31,253,254,170,255,31,220,192,255,254,255,255,153,253,75,139,255,255,251,92,16,255,255,255,255,255,255,255,31,144,255,170,16,255,254,31,255,254,170,251,170,169,220,255,251,16,75,255,251,254,248,253,255,251,95,255,62,72,255,255,255,255,255,170,255,255,255,255,255,220,124,251,255,253,255,251,255,31,255,59,170,132,255,92,253,62,255,255,255,254,253,16,31,255,253,255,255,255,112,255,255,255,220,251,31,255,170,16,16,62,255,255,12,62,106,16,31,255,237,255,153,70,254,254,251,255,31,255,64,255,255,31,192,75,220,64,251,254,255,192,255,156,255,156,255,255,255,255,255,255,62,255,31,252,255,55,250,62,254,255,251,220,254,255,170,255,132,255,254,255,255,255,255,126,11,220,251,220,255,27,255,16,255,31,8,255,28,253,255,62,255,255,153,220,255,254,255,255,62,170,170,106,253,255,170,255,255,31,106,255,255,220,12,255,254,255,255,106,255,255,144,255,253,35,170,255,255,199,31,62,220,170,251,255,220,251,62,15,75,16,255,255,249,255,255,35,253,170,253,11,253,255,255,255,255,191,16,192,255,255,31,62,11,255,255,255,255,170,255,255,31,27,220,255,62,192,255,16,254,255,237,255,62,255,153,255,16,170,132,255,250,251,64,75,255,16,255,75,64,16,255,254,253,220,31,62,255,255,192,253,35,251,35,255,254,255,255,255,31,105,191,255,255,253,31,255,98,64,255,220,62,78,255,156,62,156,251,255,251,255,170,254,16,106,255,251,255,62,56,254,255,255,106,251,255,255,16,220,157,255,159,255,255,169,220,254,255,220,255,62,255,255,16,255,255,170,191,255,62,255,221,255,55,255,170,11,255,255,255,220,62,31,255,55,255,48,255,255,251,15,16,255,255,253,191,255,255,255,255,255,255,255,255,17,255,149,251,253,170,12,83,255,255,255,255,59,62,255,251,81,220,15,78,255,255,255,255,253,192,153,170,255,255,16,31,62,14,191,31,255,255,31,255,62,78,220,255,255,220,31,156,27,255,255,251,62,251,255,16,67,170,92,16,55,16,255,237,253,255,255,220,72,255,220,251,220,62,255,255,255,31,254,192,255,255,253,255,251,255,255,255,16,255,106,251,253,254,255,31,255,62,31,255,255,220,191,251,255,62,255,255,72,255,31,31,63,199,254,153,255,251,27,62,255,255,255,255,255,255,254,254,16,62,31,255,31,254,255,220,255,254,31,255,255,255,170,255,253,255,156,255,255,255,255,255,254,255,220,255,115,252,255,251,253,252,16,255,255,170,255,8,255,220,255,31,255,254,199,255,31,106,78,251,31,220,255,170,255,255,253,255,255,78,153,170,255,62,255,31,255,255,35,253,61,139,255,192,170,27,16,220,255,253,220,255,253,220,251,255,255,220,220,251,62,255,170,192,254,250,254,255,253,220,255,255,220,255,72,254,255,250,255,255,251,132,254,31,255,35,253,255,21,254,35,250,17,237,254,254,255,255,62,16,62,253,27,11,255,220,31,255,255,255,255,251,255,255,251,16,170,255,250,237,220,255,16,35,252,62,153,106,255,253,16,253,255,170,31,38,59,255,11,75,170,254,255,132,185,31,220,62,132,16,255,170,255,16,255,237,254,253,255,255,126,112,210,255,255,255,132,255,255,75,255,153,255,255,255,255,255,254,157,255,255,254,255,192,16,237,255,255,255,77,255,170,62,56,255,255,106,255,255,62,159,249,31,31,62,70,11,205,252,62,251,192,253,119,255,185,255,253,170,253,255,255,255,251,62,255,16,249,157,252,255,31,35,55,64,156,255,255,220,255,62,62,170,59,255,170,255,255,255,220,132,31,62,170,16,255,62,255,220,255,16,75,16,55,255,75,14,132,255,253,255,255,16,255,255,62,255,156,92,255,255,72,250,185,153,253,3,255,253,254,170,170,153,255,255,251,255,254,255,255,255,220,62,251,255,220,170,35,254,62,170,251,220,255,16,16,126,254,255,255,255,220,255,170,254,253,255,78,62,255,191,255,167,31,255,254,220,31,16,31,255,254,253,255,8,62,78,12,254,255,16,16,254,220,251,170,144,62,220,31,252,62,255,255,255,255,16,62,255,220,78,255,72,55,62,255,157,16,170,170,254,251,253,255,254,255,16,170,8,62,220,251,254,127,255,255,255,72,255,35,255,255,255,255,255,255,144,220,255,254,254,255,255,255,255,78,253,255,237,170,237,62,255,170,170,253,255,255,56,253,94,251,255,16,255,31,59,255,255,255,255,8,157,253,255,255,126,170,253,220,255,31,255,226,254,192,191,132,255,255,255,255,251,16,253,62,255,255,46,3,106,255,31,253,170,255,62,255,31,220,62,62,255,253,253,170,156,62,156,220,253,62,220,255,253,255,63,255,169,255,255,254,255,255,253,12,255,16,253,87,253,31,255,255,156,255,253,62,255,255,55,255,255,156,255,220,31,153,220,255,48,175,170,255,170,16,255,251,255,255,254,126,255,255,255,16,192,170,254,255,255,255,62,62,255,31,255,12,253,255,255,65,255,12,255,250,255,16,31,62,255,255,255,254,191,16,251,254,254,251,75,255,220,191,255,62,255,255,253,95,220,255,255,255,251,251,31,59,62,8,11,55,255,31,31,254,255,255,220,56,249,16,62,255,25,31,255,220,64,70,220,62,220,78,255,255,255,31,62,255,170,251,224,72,255,255,253,253,173,139,255,255,31,251,56,255,255,11,62,255,251,220,255,255,253,255,255,220,255,31,255,255,31,253,254,255,254,192,254,115,255,255,62,253,254,15,11,15,16,157,255,31,216,254,65,145,31,255,115,254,106,168,220,255,255,251,255,255,255,255,8,252,255,255,255,255,78,16,254,254,251,31,255,159,255,251,62,254,255,16,255,248,255,31,62,255,255,255,255,255,15,8,255,241,255,255,199,255,31,31,255,62,255,170,31,255,255,255,220,237,255,62,124,62,254,255,27,70,255,16,254,16,251,106,126,253,255,31,255,72,255,255,21,144,59,31,77,253,255,255,255,199,75,251,255,159,255,255,62,11,255,72,72,255,255,184,55,253,254,255,255,24,255,255,159,255,255,16,255,220,251,251,220,251,132,255,255,253,255,35,255,253,255,153,27,159,255,255,62,249,62,255,251,16,16,237,255,255,75,220,65,180,255,170,255,255,253,220,126,16,255,255,255,255,255,255,255,87,255,31,255,255,106,16,237,255,62,255,255,173,253,251,255,170,255,192,250,255,153,251,220,62,156,31,16,255,16,16,254,62,170,255,252,237,255,16,220,255,31,11,170,255,251,255,31,220,220,254,255,253,250,255,255,251,221,255,253,75,47,254,255,27,27,255,255,255,77,126,170,255,255,255,255,15,255,170,253,255,31,255,119,255,157,255,255,255,255,255,255,251,251,170,72,62,3,255,170,255,170,16,115,254,170,224,255,157,191,78,199,72,220,251,255,255,64,251,255,255,255,191,75,31,254,255,255,62,255,62,54,128,31,254,170,62,15,255,255,251,170,156,59,254,31,153,62,253,59,255,124,159,255,255,255,254,251,255,253,255,255,255,170,251,250,192,253,253,16,12,252,253,78,64,255,31,12,255,78,255,251,156,220,156,254,16,255,106,255,255,253,255,251,170,255,255,255,255,16,16,253,253,170,11,12,220,72,62,255,220,255,62,255,253,75,250,27,153,62,255,15,250,255,253,198,16,31,144,64,8,253,253,255,220,170,170,31,31,255,56,31,170,251,255,255,255,220,132,255,31,255,255,170,255,31,255,28,12,255,184,250,254,16,27,132,31,255,63,254,27,255,136,255,255,255,252,112,170,255,254,255,191,95,255,170,251,254,255,254,255,192,255,255,16,255,62,132,251,220,255,75,170,250,255,255,170,62,75,59,16,255,255,255,170,255,64,16,216,255,247,31,170,255,255,64,255,251,220,16,170,144,255,255,62,56,255,132,255,220,255,255,16,255,62,12,249,254,255,250,78,16,157,253,31,255,254,16,255,65,255,170,249,255,16,31,15,78,220,255,31,115,72,31,251,62,255,62,254,254,255,255,78,254,255,16,12,255,254,56,31,75,255,126,255,237,255,16,59,255,12,255,38,220,220,170,255,59,35,75,11,253,31,170,31,255,139,74,255,255,16,255,64,255,159,255,255,255,255,255,255,255,254,170,251,255,62,255,132,255,27,62,106,255,255,16,146,15,62,255,55,27,159,255,254,254,72,255,255,95,255,192,144,132,27,220,59,255,220,255,149,253,78,31,62,255,31,255,20,253,255,255,12,255,253,16,255,253,252,16,12,35,251,78,12,255,170,156,255,75,35,251,78,255,255,255,255,156,220,254,255,144,254,31,255,255,255,255,255,254,255,255,170,255,144,170,255,255,255,31,12,65,156,16,255,155,255,255,31,255,253,251,255,255,255,255,251,255,252,255,255,31,255,68,251,220,253,62,27,16,62,255,31,255,255,255,220,153,254,12,31,16,159,251,144,251,170,255,255,255,31,255,16,31,72,16,255,254,132,255,78,255,118,251,59,220,254,106,163,255,191,255,78,59,255,255,255,253,254,255,255,255,254,149,83,16,255,98,191,121,136,62,251,3,255,62,255,62,255,255,199,59,120,251,12,255,16,16,251,255,159,255,255,55,170,255,31,255,31,170,254,16,253,254,15,255,255,255,255,62,255,255,255,255,220,31,255,220,253,255,106,159,255,153,255,255,255,62,31,254,255,255,251,255,255,251,220,199,59,220,27,255,62,251,251,255,220,31,255,251,255,255,16,31,255,170,255,255,251,170,255,254,255,199,253,255,255,132,12,255,72,255,226,255,170,251,255,106,255,159,31,59,252,160,31,163,56,255,255,17,255,251,16,237,254,144,254,255,132,255,255,16,255,255,220,255,255,31,255,220,170,255,139,255,251,255,16,255,253,31,255,56,254,255,255,253,253,31,251,255,255,255,188,255,255,237,153,254,255,191,31,31,255,157,16,253,159,255,251,253,16,255,31,254,126,153,31,220,254,170,255,253,252,31,255,62,31,249,119,251,16,255,220,62,255,255,255,255,106,16,251,170,77,16,106,255,220,12,92,170,112,132,153,255,255,255,255,16,255,255,251,220,255,255,255,191,249,62,253,255,253,192,251,11,255,255,31,255,254,170,106,8,253,255,255,16,55,255,59,255,62,255,31,255,220,255,251,255,254,255,255,254,199,255,31,255,72,255,27,255,255,35,255,255,255,62,126,157,220,255,16,62,255,126,255,16,253,255,255,22,255,255,199,31,170,251,253,255,159,255,16,62,8,255,255,27,255,191,255,251,157,27,220,255,255,255,31,62,249,160,255,35,220,173,251,11,144,255,254,31,253,92,253,170,255,56,255,255,62,16,169,255,255,28,170,255,220,170,62,255,106,251,251,255,59,62,64,251,255,255,31,255,253,255,144,255,31,251,255,255,254,255,255,255,254,16,255,38,12,255,255,64,251,251,170,31,220,255,255,120,255,255,64,255,255,16,220,62,254,192,255,251,255,255,64,254,254,62,156,253,62,62,255,251,255,255,12,255,31,255,255,254,55,173,16,254,255,255,170,255,237,62,199,249,251,255,12,255,252,255,170,255,220,255,255,255,132,62,149,56,253,255,65,255,220,255,126,253,255,31,251,255,220,16,253,255,251,124,153,253,255,254,16,170,255,60,255,254,255,78,255,31,199,220,231,62,255,62,220,128,31,250,31,241,255,15,170,254,254,170,253,255,255,255,199,255,199,16,255,255,253,31,251,254,72,255,255,35,255,31,170,157,255,255,255,16,255,255,255,221,35,255,16,16,255,255,255,255,255,220,255,255,220,255,169,62,255,251,220,31,255,3,251,59,220,253,251,255,255,251,192,16,253,255,16,220,255,255,78,255,250,255,255,251,252,255,255,255,253,220,255,95,253,170,255,220,255,255,255,254,255,253,255,250,255,255,255,255,255,62,59,254,255,31,199,255,254,191,255,249,251,255,255,31,255,253,250,255,255,253,255,255,255,170,16,170,247,31,255,253,253,31,220,191,72,255,27,255,62,255,156,27,255,255,254,132,255,255,255,253,255,16,255,255,157,62,31,220,252,255,157,253,253,31,251,237,254,62,78,62,75,255,251,56,255,153,172,255,255,255,251,255,254,255,255,255,62,170,255,62,255,144,255,255,253,31,16,31,251,170,31,255,124,220,38,20,95,255,255,220,255,255,255,255,16,157,255,251,254,251,253,220,255,255,251,255,170,62,157,156,251,255,251,255,255,255,31,170,255,255,255,223,62,255,255,254,254,255,255,11,255,170,255,255,62,136,220,255,112,254,255,156,31,12,251,169,251,255,132,62,255,255,255,20,255,255,31,68,11,255,255,95,199,255,255,106,35,255,170,220,31,255,170,253,255,31,31,78,254,251,16,62,255,255,220,255,220,255,27,255,250,255,255,16,255,17,254,31,255,255,191,255,62,64,250,251,59,255,255,255,59,62,159,163,255,74,59,141,233,31,31,16,56,255,255,248,62,251,255,254,255,157,251,255,255,255,191,220,253,62,255,62,55,12,62,255,31,170,31,188,247,255,254,254,156,255,31,255,253,54,255,255,159,248,170,251,56,65,31,220,251,255,27,253,16,255,78,255,253,255,31,255,223,253,157,253,62,255,132,75,255,16,250,254,16,31,31,62,254,62,255,237,255,31,255,250,62,255,16,253,255,62,31,159,254,92,255,159,255,16,62,253,31,16,255,36,254,31,153,62,255,31,255,62,62,46,255,255,255,27,157,220,15,255,255,255,75,15,253,106,255,255,255,28,255,163,255,170,62,62,27,255,12,31,253,220,255,62,251,254,252,254,255,62,255,255,255,55,62,78,8,170,255,255,253,62,16,56,255,253,90,191,199,255,15,255,220,62,255,255,251,219,75,255,253,255,253,31,31,254,31,15,220,62,62,16,255,255,255,255,16,254,15,31,12,170,255,255,31,62,255,255,255,75,62,31,251,255,62,16,255,255,250,16,255,255,255,254,31,255,220,220,255,74,253,255,255,251,253,126,31,62,255,253,62,31,251,170,31,255,255,11,255,48,35,28,132,253,255,255,16,253,196,255,253,16,255,255,170,255,252,31,220,157,251,250,64,255,75,251,255,59,255,255,169,27,251,106,8,255,255,163,16,253,255,170,255,255,126,139,220,55,255,16,59,75,255,255,251,220,255,254,253,255,255,192,255,254,255,170,170,64,254,157,255,16,16,139,255,255,13,255,192,252,255,55,12,255,220,255,255,255,62,170,255,12,56,255,220,196,220,146,31,31,72,255,153,254,16,255,170,255,77,220,31,64,255,251,255,255,255,255,64,62,16,251,251,255,251,255,149,255,255,255,250,255,220,255,170,62,16,170,170,98,35,254,255,255,16,255,255,16,255,237,78,255,255,255,255,255,31,255,170,255,8,62,255,21,253,210,255,170,255,255,255,255,8,255,255,62,62,31,48,126,255,255,255,255,255,11,250,55,62,255,59,255,255,64,255,253,16,12,255,106,253,167,253,255,251,62,255,106,106,220,139,253,255,255,64,255,253,255,31,255,255,255,234,62,254,16,255,255,255,255,255,255,56,139,59,255,170,252,192,12,255,254,255,153,95,62,255,253,220,255,169,220,254,255,255,253,62,255,251,255,170,254,62,254,55,112,118,16,255,12,251,220,255,157,56,31,62,12,12,254,16,31,220,255,255,78,70,157,132,255,253,220,255,255,255,255,255,255,253,253,56,192,255,170,237,251,199,255,31,220,31,157,255,255,255,255,62,27,255,255,255,254,126,255,255,126,8,252,255,16,255,253,253,255,255,255,170,31,16,255,255,255,255,31,255,170,255,251,255,255,255,16,255,78,255,253,128,255,253,252,253,16,255,255,255,253,255,255,144,251,12,78,255,220,255,56,255,15,12,15,254,251,64,253,62,255,153,237,255,255,255,157,255,16,235,254,255,255,192,255,78,27,12,70,255,255,255,255,220,31,31,220,255,251,170,11,253,255,255,126,220,170,157,16,253,31,254,255,255,157,255,255,62,149,255,253,62,255,31,31,255,83,251,253,72,220,35,144,255,59,64,255,255,255,255,251,118,16,62,253,55,255,255,237,255,170,31,65,62,31,255,255,255,255,78,56,255,255,191,95,62,192,16,16,255,255,251,255,251,78,170,255,254,78,255,255,255,153,192,254,251,255,255,253,251,160,199,75,255,16,62,255,254,170,157,254,254,254,210,254,72,255,191,16,255,255,254,120,159,255,128,251,170,156,255,192,255,59,255,156,220,132,12,251,255,251,251,31,255,255,170,254,253,31,255,170,112,255,163,254,136,16,255,255,255,253,78,75,72,255,251,15,255,92,16,255,156,255,16,170,157,254,255,159,129,31,255,16,254,159,170,254,220,132,255,31,75,255,16,250,255,149,255,255,255,254,62,255,255,62,16,255,6,255,253,11,253,255,255,255,255,224,72,255,156,31,255,220,255,255,220,106,220,78,255,191,255,62,16,62,95,251,255,253,72,255,255,255,255,144,255,170,254,11,12,27,255,255,31,170,255,62,62,254,62,31,16,255,31,255,254,62,254,16,139,255,220,255,170,255,250,251,255,255,144,16,31,255,220,250,251,255,255,255,255,255,199,255,237,253,255,254,220,67,31,192,255,173,254,3,255,220,233,255,191,62,255,251,251,62,255,251,31,255,254,16,62,255,12,31,16,254,255,55,92,255,62,253,254,255,255,16,254,254,255,255,255,31,254,170,255,220,188,191,62,16,253,62,251,255,254,170,234,255,31,254,255,62,170,144,31,170,255,255,192,255,255,31,64,255,191,255,170,62,255,255,59,62,220,31,255,255,251,31,153,31,255,78,62,254,220,251,157,220,251,255,11,254,253,255,255,255,62,16,163,220,255,64,255,46,255,255,78,56,16,170,255,255,220,192,16,254,249,121,255,144,255,254,255,27,170,12,8,237,237,92,12,255,255,255,170,70,255,255,170,191,31,170,255,255,255,255,62,253,252,255,253,78,253,255,27,132,251,255,16,220,255,255,16,255,192,255,156,62,16,12,62,62,72,156,255,255,95,255,255,220,251,16,16,21,255,196,255,253,170,255,255,255,249,255,239,255,8,255,255,253,156,20,255,35,251,251,255,254,250,78,111,55,250,254,191,253,255,255,62,15,16,170,220,251,62,106,253,254,31,255,64,220,255,255,78,255,255,16,255,255,255,251,255,199,255,16,11,255,253,31,255,170,16,255,255,255,253,31,170,253,159,149,64,255,170,255,170,141,62,74,255,220,75,255,255,62,188,255,255,62,17,255,255,255,255,185,170,255,251,255,250,88,255,255,16,250,253,254,205,255,31,156,255,8,75,255,31,220,255,255,62,255,253,255,255,191,253,255,157,153,255,250,255,255,11,255,170,254,220,72,255,31,255,255,170,170,126,16,255,31,255,157,255,255,254,255,37,253,255,16,255,157,6,35,255,62,27,251,192,255,254,31,255,255,255,170,255,253,251,64,31,254,56,254,16,255,255,157,35,255,237,59,254,255,220,255,170,20,95,255,250,192,62,31,16,62,255,255,191,255,252,251,47,167,126,170,16,253,64,31,255,255,220,72,31,251,255,255,31,77,16,251,255,255,255,31,251,255,255,170,164,255,24,255,170,252,62,255,252,170,75,170,255,157,56,255,255,170,237,192,199,254,185,78,16,220,252,78,156,170,62,251,64,59,220,220,139,62,220,251,27,220,8,153,170,253,255,220,251,252,255,255,253,31,254,132,255,72,255,255,251,253,220,31,255,255,8,255,249,255,38,255,170,153,31,31,157,255,252,255,170,255,254,170,31,12,62,78,255,255,255,78,253,255,255,255,220,253,254,92,220,106,62,255,111,31,255,255,153,255,253,220,255,254,255,167,170,149,188,255,11,255,170,255,62,31,255,167,255,253,255,62,255,255,72,153,170,255,254,255,170,31,72,255,170,170,253,191,62,255,62,255,255,157,255,251,255,255,255,16,15,127,255,159,31,255,255,255,255,255,255,255,170,62,255,253,255,255,253,255,255,62,15,255,255,254,253,255,251,31,31,220,31,255,220,253,255,251,220,253,255,254,255,255,255,255,253,16,255,253,47,75,170,255,17,249,255,254,254,255,170,55,37,251,55,56,31,149,170,253,98,253,255,254,106,251,255,255,255,255,251,31,56,64,15,254,170,170,255,255,255,255,255,255,252,192,170,255,56,251,255,35,255,78,16,12,220,255,255,220,72,255,170,255,21,255,16,8,157,255,255,237,16,59,149,199,254,251,251,255,254,255,64,156,170,255,241,253,255,156,31,144,17,255,56,253,255,254,31,251,224,62,220,254,62,255,156,31,255,170,16,62,220,255,11,62,254,170,139,255,253,121,254,255,253,170,170,62,157,255,170,159,255,251,255,254,255,251,255,255,255,96,255,62,255,255,156,255,62,31,31,15,255,251,255,255,254,253,255,255,255,75,59,255,255,255,170,255,255,255,31,220,56,8,16,255,255,255,255,170,253,255,251,255,255,255,15,255,255,255,16,170,254,251,255,253,255,251,78,55,255,220,62,255,170,132,255,255,255,78,62,31,220,255,253,253,251,170,191,62,255,255,16,255,8,252,255,254,220,251,62,255,255,251,255,16,255,75,156,255,255,220,255,255,170,16,127,35,255,255,11,255,16,31,251,62,255,170,64,220,252,65,255,62,62,250,205,95,255,255,8,255,75,170,16,255,16,255,144,255,220,216,255,55,170,24,255,255,255,170,170,255,255,255,255,255,62,254,255,255,255,255,251,255,255,255,78,253,254,170,150,255,255,62,55,254,157,170,255,35,254,16,153,192,255,170,255,252,252,170,255,220,255,27,62,255,253,16,255,65,253,255,62,255,170,185,16,170,8,24,255,255,251,16,170,220,221,31,255,255,255,255,156,17,255,255,59,62,255,255,255,27,75,237,255,220,254,255,251,16,253,192,255,170,254,170,255,253,255,251,153,16,55,16,31,254,255,255,31,31,16,56,255,255,255,255,255,253,153,255,35,28,220,255,16,255,253,255,31,255,255,192,254,72,62,253,192,251,62,255,132,255,31,253,255,255,255,8,255,62,255,253,255,159,16,255,255,251,255,255,8,231,251,255,255,255,255,255,255,31,255,132,255,255,220,255,192,31,220,255,255,170,253,170,255,31,255,255,255,160,62,255,251,107,220,255,159,220,255,255,255,255,252,31,16,253,220,255,255,12,59,235,16,255,62,255,170,253,8,64,237,170,255,255,16,254,255,251,254,75,255,167,16,255,254,78,255,254,72,251,233,56,255,255,255,253,241,250,250,75,255,12,31,255,172,251,153,191,132,255,255,251,62,255,255,255,62,62,255,255,255,35,31,251,255,255,16,159,255,8,253,252,255,16,255,255,220,238,64,220,170,255,255,35,27,118,251,255,106,254,191,62,255,251,255,252,59,255,251,255,132,255,255,255,254,185,255,255,255,170,170,67,255,255,255,75,255,255,253,220,163,255,255,255,255,31,255,115,220,170,16,252,144,255,255,255,170,255,220,220,255,64,144,75,17,31,156,255,254,255,251,255,72,253,255,62,220,170,251,62,253,255,255,220,241,12,16,255,255,255,255,255,15,16,12,75,255,31,31,255,72,255,170,220,255,255,251,191,255,16,251,252,220,15,255,255,220,251,31,255,255,153,62,62,59,196,255,254,255,62,255,255,62,251,253,31,250,249,31,75,255,251,255,27,144,205,192,255,220,62,157,255,220,255,16,62,255,31,27,251,253,255,14,62,62,255,221,16,62,255,255,254,62,192,132,255,255,255,255,17,253,255,59,255,255,144,255,253,255,255,170,253,55,254,255,220,253,255,237,78,220,255,15,255,252,247,254,255,255,255,253,251,255,255,220,255,254,170,191,170,255,255,255,255,255,191,27,253,170,255,16,220,255,255,255,75,31,31,255,31,170,8,255,254,6,156,255,254,255,255,31,253,254,255,16,72,253,255,127,75,72,255,255,220,55,255,192,220,28,31,253,220,255,255,12,96,255,254,255,159,255,192,255,254,72,12,255,255,255,255,255,255,255,12,255,253,62,78,255,255,254,255,31,253,126,255,170,255,35,255,16,255,159,255,255,252,254,16,255,62,253,255,255,220,56,254,220,95,220,253,249,255,72,156,31,55,220,255,78,252,253,255,255,62,255,255,255,255,31,132,59,220,255,255,255,62,255,255,255,75,255,16,255,253,255,68,59,251,191,255,59,255,253,16,157,31,255,253,255,254,157,253,253,252,255,255,170,157,250,132,192,62,254,255,251,254,62,255,251,62,220,41,170,251,255,253,31,255,255,255,185,75,251,255,255,59,255,255,255,31,255,255,255,255,62,11,92,255,159,253,255,252,255,12,163,255,253,255,153,31,255,62,8,16,62,11,251,8,251,31,170,251,55,255,255,170,56,31,62,255,124,170,254,255,253,170,255,254,220,251,255,253,237,170,16,35,255,255,63,255,253,106,255,31,255,255,157,255,255,16,255,220,62,31,255,255,220,38,31,255,254,251,112,170,55,144,255,253,82,255,255,220,251,156,255,132,255,62,220,27,255,255,255,251,255,255,16,254,251,251,126,156,255,16,16,255,253,255,31,255,62,12,31,253,16,59,16,199,59,16,255,157,255,254,251,156,255,251,31,170,255,255,255,16,253,255,153,170,252,255,237,16,16,170,255,31,55,31,255,62,255,255,255,169,35,255,16,255,251,64,170,220,255,255,255,31,255,251,251,252,254,144,251,255,153,8,62,253,255,255,64,255,31,255,153,220,27,255,170,62,220,220,254,170,255,253,255,255,254,153,254,255,253,31,31,56,255,255,255,144,255,255,255,62,67,255,246,251,220,168,96,62,31,255,255,253,170,118,255,220,255,255,16,253,255,251,16,254,255,255,255,169,8,251,255,255,220,250,31,220,62,153,64,251,20,255,31,220,170,199,255,157,220,255,192,254,159,38,144,31,35,17,255,62,255,199,16,255,255,16,255,255,55,255,251,16,255,255,255,220,255,251,255,253,255,255,31,170,251,255,255,255,16,255,31,255,255,156,220,255,253,106,255,220,253,37,255,249,220,255,253,199,251,255,153,16,255,16,11,255,255,251,220,255,255,144,170,255,31,170,199,255,220,251,27,15,255,255,233,251,59,144,16,17,31,255,220,160,255,128,255,62,220,62,255,255,253,159,255,253,255,95,220,159,159,62,168,16,55,62,251,255,65,59,255,12,255,16,255,255,253,253,12,255,16,253,92,253,253,255,16,255,170,170,126,255,75,153,226,255,253,199,31,62,31,220,255,254,220,237,255,170,254,56,255,255,255,24,170,31,253,251,251,251,255,255,16,16,255,253,205,72,72,31,53,255,75,31,170,62,254,31,255,254,255,21,16,254,16,170,185,253,16,255,153,251,31,255,170,55,56,255,92,254,254,251,255,62,255,255,251,255,31,255,255,254,48,31,251,255,253,153,251,75,159,251,192,255,31,254,16,251,62,62,11,255,144,255,16,255,241,255,31,255,159,255,62,253,255,251,16,251,254,220,254,255,255,37,255,31,221,16,16,255,220,78,255,159,220,255,250,255,251,255,62,16,12,126,255,255,255,78,255,255,255,255,255,255,72,255,254,70,56,16,191,251,255,255,251,255,253,144,56,31,126,16,251,159,255,255,65,59,95,59,172,159,255,254,153,255,101,31,255,251,220,92,78,15,159,255,31,159,56,121,64,255,251,255,255,255,220,251,255,255,255,220,251,255,15,31,62,254,253,8,78,159,255,253,255,255,255,255,255,255,254,16,255,237,254,170,31,255,159,254,255,255,16,254,255,220,220,31,251,191,255,255,251,220,255,255,31,255,170,16,237,16,255,255,12,62,255,255,255,255,254,170,191,254,253,191,132,255,255,255,16,253,255,251,255,170,75,255,192,31,255,255,251,220,196,255,255,255,170,255,255,255,254,12,220,255,255,31,21,255,3,62,255,254,255,255,255,220,255,251,255,156,255,255,156,220,255,16,251,254,220,255,16,159,254,255,255,255,251,31,170,62,255,253,16,132,16,92,64,255,220,220,31,255,255,31,255,27,254,253,220,16,56,255,253,170,220,159,255,72,192,255,31,255,62,251,62,250,124,16,251,132,255,255,255,62,254,255,255,255,62,251,75,252,253,31,255,255,255,159,251,255,255,170,151,241,220,31,157,253,255,55,251,16,75,31,255,255,253,253,255,31,62,255,65,255,170,255,255,27,62,255,191,255,255,31,35,59,253,255,255,220,220,255,255,255,31,255,62,255,55,31,37,255,255,255,255,249,255,66,255,255,253,251,192,220,255,255,255,31,254,27,16,8,253,255,255,255,75,170,255,252,253,254,192,255,31,255,192,254,255,253,16,251,255,172,254,220,75,16,255,220,251,62,251,255,255,170,249,255,127,199,11,255,62,255,170,12,254,170,16,255,255,254,255,255,16,255,27,220,59,255,255,170,255,251,255,199,255,255,62,253,62,255,16,31,126,255,255,62,253,255,16,255,251,255,255,241,47,31,78,255,56,249,251,59,75,255,78,75,255,255,255,220,255,253,79,134,254,251,255,75,255,153,255,255,254,253,251,254,255,170,255,39,233,251,255,255,252,255,16,253,255,255,199,220,255,253,253,255,255,255,210,251,255,12,153,255,250,92,255,11,144,255,16,62,31,124,147,255,62,62,255,255,31,255,16,255,255,255,255,255,255,16,170,62,255,16,191,253,62,255,255,62,62,255,255,31,254,255,31,31,255,255,170,31,254,12,255,62,75,16,255,163,255,168,255,255,255,8,16,255,255,255,153,62,237,78,153,220,170,250,255,254,255,255,96,62,255,255,251,31,255,11,16,254,255,132,16,255,254,170,132,220,255,249,255,255,255,255,64,62,252,62,156,64,8,254,220,253,62,255,62,191,220,255,251,23,67,11,24,255,255,253,255,170,170,255,254,255,55,253,254,27,220,255,255,62,56,16,255,251,220,255,255,124,255,31,191,254,253,255,255,254,255,254,251,254,250,255,255,255,255,255,31,255,254,35,16,255,255,78,16,188,220,220,31,62,255,255,31,254,3,16,254,255,255,255,253,156,253,157,16,255,75,75,64,42,255,255,15,220,255,16,255,220,62,170,255,62,254,251,31,220,220,251,106,55,220,255,16,16,255,170,31,255,253,251,255,255,255,170,255,16,253,254,191,255,56,16,255,159,255,255,255,220,56,253,251,220,255,127,255,157,255,251,31,72,144,255,251,11,220,75,253,255,255,31,12,106,62,16,132,251,255,3,255,72,8,255,159,255,253,172,139,77,255,16,255,15,254,191,255,255,255,160,251,253,31,220,192,251,8,13,255,220,255,250,255,220,15,146,255,159,62,170,170,170,254,255,170,75,167,255,170,16,95,146,64,254,253,62,16,75,170,62,13,62,141,31,199,16,254,255,16,254,253,16,16,59,255,255,255,220,255,16,72,255,255,255,11,170,254,191,250,254,255,132,255,62,62,255,250,64,255,170,255,16,255,255,16,157,255,251,255,255,15,253,12,199,132,255,62,255,62,170,220,62,255,251,136,35,199,157,251,255,253,255,192,170,255,255,16,255,62,254,255,255,254,255,167,220,255,192,31,253,132,253,31,62,254,27,255,65,255,220,237,62,191,16,254,11,255,255,27,170,255,220,254,11,72,251,96,255,255,191,59,141,255,255,255,220,255,251,255,251,62,16,251,255,220,12,241,255,252,255,16,16,254,255,255,56,75,220,192,255,220,255,16,255,255,249,170,255,199,92,47,118,255,255,255,255,255,12,16,255,253,255,153,144,255,252,192,251,144,78,31,255,254,191,220,62,254,253,106,62,119,106,62,16,59,163,255,170,220,255,170,170,253,24,16,255,250,255,31,255,62,255,251,255,220,255,170,255,255,31,13,31,255,251,16,255,255,255,254,255,255,35,16,169,167,255,16,220,170,163,106,192,253,255,62,251,31,255,255,255,56,62,16,255,255,255,192,220,31,157,252,220,115,237,153,255,170,64,15,31,255,37,239,254,255,255,106,62,254,251,31,62,253,251,8,255,255,31,46,170,255,199,12,16,62,31,12,255,255,251,254,251,253,251,255,127,132,254,31,13,95,31,16,55,253,31,78,255,144,172,170,255,255,126,8,237,254,254,255,31,220,254,16,254,254,106,220,31,255,132,255,251,255,250,31,253,27,255,251,251,124,255,170,255,253,255,16,255,16,55,255,220,35,16,255,62,255,253,92,62,254,255,205,253,62,255,255,255,255,192,31,253,255,255,255,31,220,255,24,220,255,251,31,170,55,255,255,157,255,255,78,56,159,168,251,220,75,255,59,132,62,31,62,255,255,251,170,31,255,253,250,72,159,31,31,35,75,255,251,220,31,220,255,220,62,157,251,31,220,31,255,255,72,191,255,96,255,251,255,31,199,255,64,255,255,254,249,254,255,255,237,255,31,118,255,255,255,132,255,72,62,255,170,255,220,144,255,126,31,191,78,253,56,255,255,159,72,31,121,255,255,96,31,81,255,255,170,255,255,255,31,255,255,253,220,251,253,255,170,62,62,255,255,255,253,254,255,253,235,251,8,254,253,16,153,106,251,170,144,170,251,255,31,68,62,75,255,251,255,255,251,255,255,251,16,255,254,255,192,62,255,255,251,255,254,255,253,64,254,153,191,8,251,255,31,55,75,31,59,255,75,255,16,255,55,255,251,14,255,8,255,252,255,16,16,255,16,255,16,255,255,16,254,255,13,255,251,255,62,255,31,170,252,255,16,255,255,255,255,255,62,72,255,15,255,255,64,255,106,156,255,62,199,157,216,255,253,62,251,14,255,170,62,220,254,255,24,249,255,64,170,72,254,62,255,253,254,16,255,255,62,255,255,31,31,153,170,255,199,255,255,251,12,255,255,62,255,255,170,255,253,255,12,255,255,255,12,254,170,255,255,255,168,253,170,255,255,255,255,16,170,255,255,56,124,12,255,255,255,192,255,255,255,192,192,31,255,253,255,254,255,6,255,254,31,62,255,254,55,253,170,220,255,255,255,220,255,248,170,253,251,251,255,255,255,255,255,253,220,64,157,15,16,74,170,255,250,16,255,55,62,16,170,55,255,199,255,252,16,12,78,255,11,255,251,253,55,254,220,64,255,160,12,37,157,170,255,255,252,16,12,62,220,16,255,255,62,255,255,75,255,170,38,14,220,191,170,255,170,249,170,255,220,156,255,170,255,253,251,31,237,170,251,220,253,170,255,62,16,170,255,75,55,249,255,255,254,16,255,251,20,106,250,255,255,170,16,31,251,255,253,16,254,255,255,255,220,65,255,153,254,220,255,253,255,255,255,255,156,255,255,199,252,62,192,255,220,27,170,255,255,252,8,255,31,78,251,56,255,253,251,255,170,255,136,255,255,220,255,235,78,62,255,254,251,31,62,255,254,3,170,255,62,254,64,255,115,170,170,157,255,31,255,72,11,255,16,255,62,251,255,255,255,255,191,255,255,153,254,255,255,16,16,106,252,255,255,62,255,255,255,255,252,31,255,56,254,16,251,31,220,255,149,64,220,255,251,251,251,56,170,253,255,62,255,220,72,16,255,220,252,255,254,255,128,255,253,170,220,255,251,156,62,170,98,62,31,251,255,170,251,254,59,31,254,16,170,132,62,199,192,255,253,16,255,31,254,251,121,106,16,255,255,255,254,255,170,95,255,220,78,220,56,251,31,254,199,255,157,106,62,251,185,255,31,255,159,254,255,170,31,198,62,15,255,76,255,253,31,75,255,251,31,220,169,249,251,255,59,27,31,64,255,106,251,255,220,255,255,255,62,96,121,220,255,255,156,72,62,255,192,15,254,254,31,255,56,72,255,72,251,16,62,170,170,253,153,220,62,254,11,72,170,157,126,220,16,27,191,56,255,64,255,31,255,31,16,115,255,31,255,220,12,253,153,157,254,153,220,255,255,16,170,31,255,160,255,62,253,251,254,62,199,126,126,252,31,205,170,251,255,199,78,255,254,255,255,255,254,16,170,31,186,255,255,253,170,16,16,255,170,31,16,254,255,192,157,255,255,251,170,62,253,255,192,255,220,16,233,255,255,8,251,70,253,253,255,255,159,170,254,255,255,62,16,255,75,255,255,251,31,251,220,254,31,255,156,255,254,16,16,254,252,8,35,249,249,255,16,16,254,157,251,255,87,31,170,255,62,249,251,31,255,255,255,170,255,31,78,255,252,191,170,27,220,64,16,254,253,156,255,255,255,254,253,55,101,249,255,255,106,220,255,255,255,62,78,255,255,191,220,252,72,14,153,35,253,254,255,220,255,255,255,255,62,144,253,253,253,191,16,255,115,255,255,62,254,78,251,220,55,255,255,255,159,170,255,255,62,255,31,106,255,237,153,255,16,144,251,8,255,220,255,75,250,249,168,255,62,255,251,253,254,255,254,255,255,255,16,56,255,255,252,255,62,255,251,31,252,255,251,92,126,13,251,62,75,255,255,62,65,255,31,255,255,253,255,252,220,255,31,126,255,16,254,255,255,170,255,255,16,16,253,255,28,255,255,31,255,255,251,253,56,255,255,255,220,31,185,254,62,31,31,16,255,255,255,62,159,255,16,55,255,170,13,15,255,170,12,62,255,251,106,62,255,220,43,255,255,62,59,220,72,16,255,170,255,11,255,35,159,31,62,173,220,8,255,68,253,106,251,255,220,28,255,170,62,16,255,55,254,255,153,255,72,255,170,253,255,185,253,255,254,16,62,255,255,255,163,255,72,255,31,62,56,255,253,255,199,12,255,16,253,255,251,170,255,16,255,255,253,192,250,55,253,255,250,255,255,255,31,159,255,75,255,220,254,255,220,255,253,255,31,253,62,27,31,255,255,185,254,56,255,251,255,254,252,64,8,56,170,255,255,255,220,16,255,255,251,98,255,170,255,31,255,75,253,199,255,16,255,62,255,16,16,253,251,253,157,253,255,72,146,255,16,255,255,31,220,220,55,132,192,35,255,170,126,255,62,255,31,255,31,253,8,255,220,191,144,255,253,170,170,255,72,255,255,62,254,253,24,27,62,56,255,62,255,251,136,255,255,64,251,255,62,12,253,255,235,255,31,16,255,255,255,254,255,47,255,255,254,255,220,251,62,251,220,255,72,255,31,220,156,170,126,144,255,62,254,255,159,255,16,255,255,62,192,59,72,170,31,170,255,78,170,31,55,251,31,255,255,255,255,255,62,62,31,159,115,255,254,62,248,255,255,254,254,220,251,255,220,254,255,254,31,28,255,255,252,255,78,126,220,220,170,31,157,8,16,255,62,16,31,170,254,253,255,72,255,129,16,255,16,253,253,255,78,16,255,62,255,255,255,11,156,255,220,255,199,251,255,220,132,170,8,255,253,255,153,62,255,255,250,62,62,173,251,253,237,16,255,255,255,31,255,62,31,255,249,220,255,251,255,56,72,16,16,255,62,253,198,16,255,191,170,253,254,185,255,220,255,78,251,16,55,64,191,255,253,255,255,126,62,251,31,170,253,255,255,255,106,192,56,255,144,253,255,241,255,250,170,252,255,172,255,220,255,74,170,220,62,255,144,220,62,255,220,55,56,255,253,255,196,255,252,199,55,255,16,255,255,255,170,170,253,251,255,255,255,255,255,220,62,220,255,255,255,251,16,255,62,255,12,255,157,220,144,253,220,16,255,254,62,16,170,255,255,55,255,254,176,31,31,255,255,255,121,220,255,255,255,255,70,253,249,153,255,255,237,16,37,157,255,254,252,255,251,16,255,192,220,255,255,255,48,253,253,251,96,199,159,15,220,55,255,255,255,251,255,255,8,16,253,255,144,254,255,27,62,253,255,16,31,72,62,220,251,62,253,12,251,252,67,78,255,199,16,255,12,253,251,237,255,253,252,55,254,255,255,253,255,255,233,251,255,255,62,255,199,251,255,255,78,255,156,132,78,251,220,253,153,255,255,64,251,255,59,255,255,220,255,146,192,93,255,62,31,119,220,62,11,255,172,255,255,156,96,255,78,255,31,170,255,252,170,255,255,255,220,255,255,241,170,255,253,254,255,255,254,253,251,255,255,255,254,59,31,170,6,62,31,255,255,253,191,255,255,253,253,157,255,12,16,157,255,31,255,170,156,255,251,220,255,255,255,255,15,220,251,253,253,255,254,31,255,62,255,255,159,255,31,255,241,255,253,6,31,62,16,255,255,62,255,253,254,253,16,15,62,220,255,251,255,31,221,255,220,170,191,255,251,251,255,156,249,255,31,255,253,254,251,255,62,255,31,31,255,254,255,72,255,251,156,255,170,255,251,255,170,255,255,255,159,253,255,170,159,255,16,251,72,16,153,255,170,255,255,255,251,220,255,255,220,170,220,199,31,253,16,62,254,170,255,255,254,62,255,55,237,31,255,255,159,255,239,255,56,16,255,246,220,191,255,255,21,62,31,255,255,253,255,55,126,170,255,47,253,255,144,170,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,38,47,117,107,218,76,117,29,33,253,142,189,121,7,35,203,86,233,146,202,76,25,190,166,1,0,0,1,0,1,64,71,190,71,146,186,146,213,106,213,197,0,36,0,172,0,0,1,0,1,64,71,190,71,146,186,146,213,106,213,197,0,36,0,172,62,62,1,0,0,0,1,1,0,0,219,54,0,0,14,138,0,0,20,216,0,0,96,216,0,0,64,216,0,0,189,216,0,0,215,216,0,0,23,125,0,0,165,64,0,0,162,64,0,0,130,64,0,0,72,27,0,0,30,27,0,0,133,27,0,0,44,27,0,0,153,64,0,0,112,94,0,0,126,4,0,0,106,4,0,0,155,4,0,0,174,86,0,0,24,234,0,0,112,8,0,0,48,0,0,0,94,0,0,0,27,0,0,0,125,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,186,0,0,211,57,0,0,123,138,0,0,35,234,0,0,196,216,0,0,133,216,0,0,146,14,0,0,125,234,0,0,250,5,0,0,18,182,0,0,194,182,0,0,41,105,0,0,117,136,0,0,38,136,0,0,160,48,0,0,56,234,0,0,73,27,0,0,47,0,0,0,215,0,0,0,86,0,0,0,125,0,0,0,216,0,0,0,14,0,0,0,94,0,0,0,216,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,226,1,0,196,108,0,0,148,146,0,0,42,255,107,255,0,0,0,0,0,0,0,0,0,170,255,56,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,0,0,0,0,0,0,0,0,0,0,0,0,8,255,15,255,1,0,0,0,0,0,0,112,228,96,253,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,220,126,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,27,27,94,0,159,0,131,8,176,0,220,255,0,0,0,0,8,0,0,0,0,27,0,0,0,0,191,255,198,8,0,1,132,1,1,0,1,0,0,36,0,0,1,0,0,48,187,254,23,0,0,1,0,0,0,0,0,0,0,0,0,237,0,0,1,0,1,64,71,190,71,146,186,146,213,106,225,135,0,36,0,172,0,0,1,0,1,64,71,190,71,146,186,146,213,106,225,135,0,36,0,172,0,0,0,149,125,255,64,27,0,0,0,0,0,0,0,0,0,0,0,92,255,170,35,160,0,0,98,76,0,0,55,236,0,0,109,48,0,0,91,205,0,0,1,0,0,0,1,0,126,255,255,1,0,0,74,56,196,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,159,0,0,0,0,1,94,237,255,0,0,0,0,0,0,2,8,219,1,158,183,240,234,19,231,236,14,84,94,200,216,44,125,158,125,45,125,64,125,2,125,63,125,62,216,68,14,119,112,0,0,0,117,13,0,199,0,124,1,8,1,0,16,156,74,0,0,0,0,0,0,0,0,0,0,0,0,0,112,220,254,35,149,0,0,148,146,0,0,123,108,0,0,83,81,0,0,33,93,0,0,167,160,0,0,170,135,0,0,32,2,0,0,100,187,198,190,198,190,100,187,198,190,198,190,100,187,198,190,198,190,100,187,198,190,198,190,100,187,198,190,198,190,0,0,234,0,0,0,95,0,0,0,102,36,0,0,234,0,0,0,212,0,0,0,158,239,0,0,234,0,0,0,212,0,0,0,147,239,0,0,234,0,0,0,131,0,0,0,57,226,0,0,234,0,0,0,195,0,0,0,64,26,0,0,234,0,0,0,87,0,0,0,238,197,0,0,234,0,0,0,91,0,0,0,255,106,0,0,234,0,0,0,207,0,0,0,159,211,0,0,234,0,0,0,194,0,0,0,184,108,0,0,234,0,0,0,118,0,0,0,90,196,0,0,234,0,0,0,80,0,0,0,223,194,0,0,234,0,0,0,184,0,0,0,30,78,0,0,234,0,0,0,161,0,0,0,91,220,0,0,234,0,0,0,225,0,0,0,201,51,0,0,234,0,0,0,17,0,0,0,172,203,0,0,234,0,0,0,175,0,0,0,206,224,0,0,234,0,0,0,229,0,0,0,236,36,0,0,234,0,0,0,110,0,0,0,219,92,0,0,112,0,0,0,176,0,0,0,112,224,0,0,112,0,0,0,154,0,0,0,148,142,0,0,112,0,0,0,20,0,0,0,76,35,0,0,112,0,0,0,58,0,0,0,98,117,0,0,112,0,0,0,228,0,0,0,196,35,0,0,112,0,0,0,130,0,0,0,149,172,0,0,112,0,0,0,115,0,0,0,41,240,0,0,112,0,0,0,50,0,0,0,174,57,0,0,112,0,0,0,194,0,0,0,145,108,0,0,112,0,0,0,57,0,0,0,75,182,0,0,112,0,0,0,81,0,0,0,161,5,0,0,112,0,0,0,121,0,0,0,100,48,0,0,112,0,0,0,26,0,0,0,199,136,0,0,112,0,0,0,221,0,0,0,184,76,0,0,112,0,0,0,117,0,0,0,217,146,0,0,112,0,0,0,224,0,0,0,134,215,0,0,112,0,0,0,26,0,0,0,100,136,0,0,112,0,0,0,47,0,0,0,27,112,0,0,112,0,0,0,105,0,0,0,71,14,0,0,112,0,0,0,196,0,0,0,75,40,0,0,112,0,0,0,236,0,0,0,145,205,0,0,112,0,0,0,187,0,0,0,243,86,0,0,112,0,0,0,71,0,0,0,237,129,0,0,112,0,0,0,12,0,0,0,244,86,0,0,112,0,0,0,136,0,0,0,109,14,0,0,112,0,0,0,136,0,0,0,11,14,0,0,112,0,0,0,135,0,0,0,213,105,0,0,234,0,0,0,48,0,0,0,122,231,0,0,234,0,0,0,150,0,0,0,36,236,0,0,234,0,0,0,48,0,0,0,154,231,0,0,234,0,0,0,47,0,0,0,247,138,0,0,234,0,0,0,105,0,0,0,5,14,0,0,234,0,0,0,86,0,0,0,239,125,0,0,234,0,0,0,81,0,0,0,233,5,0,0,234,0,0,0,127,0,0,0,116,160,0,0,234,0,0,0,182,0,0,0,237,94,0,0,234,0,0,0,112,0,0,0,69,94,0,0,234,0,0,0,135,0,0,0,245,105,0,0,234,0,0,0,76,0,0,0,97,136,0,0,234,0,0,0,12,0,0,0,121,234,0,0,234,0,0,0,12,0,0,0,231,234,0,0,234,0,0,0,236,0,0,0,194,205,0,0,234,0,0,0,26,0,0,0,124,136,0,0,234,0,0,0,93,0,0,0,231,112,0,0,234,0,0,0,86,0,0,0,236,125,0,0,234,0,0,0,84,0,0,0,129,106,0,0,234,0,0,0,177,0,0,0,125,7,0,0,234,0,0,0,97,0,0,0,69,7,0,0,234,0,0,0,177,0,0,0,137,57,0,0,234,0,0,0,208,0,0,0,13,92,0,0,234,0,0,0,84,0,0,0,172,106,0,0,234,0,0,0,19,0,0,0,231,47,0,0,234,0,0,0,79,0,0,0,21,149,0,0,234,0,0,0,220,0,0,0,148,236,0,0,234,0,0,0,117,0,0,0,156,146,0,0,234,0,0,0,183,0,0,0,174,190,0,0,234,0,0,0,45,0,0,0,99,183,0,0,234,0,0,0,90,0,0,0,84,96,0,0,234,0,0,0,31,0,0,0,253,96,0,0,234,0,0,0,31,0,0,0,77,96,0,0,234,0,0,0,175,0,0,0,243,224,0,0,234,0,0,0,232,0,0,0,156,2,0,0,234,0,0,0,212,0,0,0,200,239,0,0,234,0,0,0,221,0,0,0,134,76,0,0,234,0,0,0,50,0,0,0,116,57,0,0,234,0,0,0,207,0,0,0,247,211,0,0,234,0,0,0,220,0,0,0,237,236,0,0,234,0,0,0,228,0,0,0,54,35,0,0,234,0,0,0,54,0,0,0,39,150,0,0,234,0,0,0,80,0,0,0,223,194,0,0,234,0,0,0,184,0,0,0,30,78,0,0,234,0,0,0,161,0,0,0,91,220,0,0,234,0,0,0,225,0,0,0,201,51,0,0,234,0,0,0,17,0,0,0,172,203,0,0,234,0,0,0,175,0,0,0,206,224,0,0,234,0,0,0,229,0,0,0,236,36,0,0,234,0,0,0,169,0,0,0,152,197,0,0,234,0,0,0,19,0,0,0,239,47,0,0,112,0,0,0,70,0,0,0,29,121,0,0,112,0,0,0,109,0,0,0,49,71,0,0,112,0,0,0,154,0,0,0,148,142,0,0,112,0,0,0,20,0,0,0,76,35,0,0,112,0,0,0,58,0,0,0,98,117,0,0,112,0,0,0,228,0,0,0,196,35,0,0,112,0,0,0,130,0,0,0,149,172,0,0,112,0,0,0,115,0,0,0,41,240,0,0,112,0,0,0,50,0,0,0,174,57,0,0,112,0,0,0,69,0,0,0,246,81,0,0,112,0,0,0,142,0,0,0,26,12,0,0,112,0,0,0,160,0,0,0,132,205,0,0,112,0,0,0,239,0,0,0,217,32,0,0,112,0,0,0,81,0,0,0,161,5,0,0,112,0,0,0,121,0,0,0,100,48,0,0,112,0,0,0,26,0,0,0,199,136,0,0,112,0,0,0,221,0,0,0,184,76,0,0,112,0,0,0,117,0,0,0,217,146,0,0,112,0,0,0,224,0,0,0,134,215,0,0,112,0,0,0,26,0,0,0,100,136,0,0,112,0,0,0,92,0,0,0,215,182,0,0,112,0,0,0,81,0,0,0,18,5,0,0,112,0,0,0,138,0,0,0,34,216,0,0,112,0,0,0,48,0,0,0,200,231,0,0,112,0,0,0,196,0,0,0,75,40,0,0,112,0,0,0,236,0,0,0,145,205,0,0,112,0,0,0,187,0,0,0,243,86,0,0,112,0,0,0,71,0,0,0,237,129,0,0,112,0,0,0,12,0,0,0,244,86,0,0,112,0,0,0,136,0,0,0,109,14,0,0,112,0,0,0,136,0,0,0,11,14,0,0,112,0,0,0,145,0,0,0,244,187,0,0,112,0,0,0,146,0,0,0,167,86,0,0,234,0,0,0,138,0,0,0,104,216,0,0,234,0,0,0,40,0,0,0,167,234,0,0,234,0,0,0,150,0,0,0,36,236,0,0,234,0,0,0,48,0,0,0,154,231,0,0,234,0,0,0,47,0,0,0,247,138,0,0,234,0,0,0,105,0,0,0,5,14,0,0,234,0,0,0,86,0,0,0,239,125,0,0,234,0,0,0,81,0,0,0,233,5,0,0,234,0,0,0,127,0,0,0,116,160,0,0,234,0,0,0,236,0,0,0,15,234,0,0,234,0,0,0,216,0,0,0,52,8,0,0,234,0,0,0,216,0,0,0,66,8,0,0,234,0,0,0,190,0,0,0,137,231,0,0,234,0,0,0,76,0,0,0,231,136,0,0,234,0,0,0,48,0,0,0,133,231,0,0,234,0,0,0,81,0,0,0,118,5,0,0,234,0,0,0,236,0,0,0,4,205,0,0,234,0,0,0,81,0,0,0,111,5,0,0,234,0,0,0,32,0,0,0,96,231,0,0,234,0,0,0,149,0,0,0,87,5,0,0,234,0,0,0,216,0,0,0,230,8,0,0,234,0,0,0,231,0,0,0,121,64,0,0,234,0,0,0,231,0,0,0,86,64,0,0,234,0,0,0,112,0,0,0,145,94,0,0,234,0,0,0,135,0,0,0,156,105,0,0,234,0,0,0,227,0,0,0,4,236,0,0,234,0,0,0,190,0,0,0,192,231,0,0,234,0,0,0,187,0,0,0,231,86,0,0,234,0,0,0,146,0,0,0,72,86,0,0,234,0,0,0,78,0,0,0,151,108,0,0,234,0,0,0,7,0,0,0,29,182,0,0,234,0,0,0,40,0,0,0,39,234,0,0,234,0,0,0,205,0,0,0,93,216,0,0,187,215,6,121,2,215,183,121,95,215,245,36,200,215,213,36,102,215,166,36,206,215,148,36,128,215,23,36,141,215,235,36,235,215,220,121,64,129,107,121,249,215,240,2,231,129,245,240,224,129,170,240,191,129,119,240,20,129,116,240,55,129,51,240,77,129,51,240,214,129,219,240,22,129,162,240,77,129,249,240,44,129,116,226,1,187,80,226,36,146,239,7,115,146,125,7,6,146,125,7,139,146,18,57,122,146,62,57,143,146,209,57,9,146,1,7,46,146,203,7,29,146,165,7,173,146,27,197,13,146,176,197,181,211,85,108,129,47,227,108,11,47,185,236,226,93,143,236,241,47,18,236,236,93,171,108,170,47,95,108,36,47,103,108,6,211,17,160,94,211,51,149,22,81,217,149,0,226,4,187,9,239,61,187,87,36,141,187,71,183,162,187,69,183,26,129,32,117,4,105,7,224,11,215,149,224,135,129,130,183,234,187,211,172,26,215,174,172,95,129,170,26,129,187,218,43,211,136,235,35,106,48,164,51,168,182,116,145,243,215,236,96,27,136,190,186,145,136,55,142,102,182,58,227,198,182,94,246,79,86,56,203,150,48,255,255,255,255,54,101,214,112,64,117,87,112,243,69,249,205,62,203,218,5,245,96,23,138,255,255,255,255,70,227,163,182,101,186,128,105,45,150,76,105,255,255,255,255,255,255,255,255,140,43,184,182,43,150,153,112,14,36,230,136,154,71,139,5,75,35,213,5,141,172,0,129,165,51,47,5,68,51,36,136,255,255,255,255,255,255,255,255,255,255,255,255,0,106,132,215,149,96,21,112,192,145,180,182,32,203,29,136,30,186,147,5,64,183,123,105,228,98,191,5,231,127,227,138,74,220,67,205,22,127,95,112,179,94,58,94,17,94,85,94,204,94,204,94,204,94,204,94,204,94,85,94,17,94,90,94,175,94,176,94,130,94,45,94,164,94,45,94,130,94,176,94,176,94,176,94,177,94,208,94,147,94,110,94,91,94,84,94,91,94,110,94,208,94,50,94,97,94,160,1,93,1,135,1,240,1,76,1,57,0,92,1,149,1,215,234,112,234,5,234,81,1,189,1,0,234,93,0,92,1,109,1,175,1,195,1,106,1,7,1,57,1,0,234,0,234,215,234,0,234,0,234,68,1,0,234,0,234,0,234,0,234,0,234,0,234,0,234,47,1,0,234,0,234,0,234,0,234,0,234,149,1,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,234,220,1,0,234,0,234,0,234,0,234,0,234,0,234,0,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,1,0,0,0,43,0,0,0,0,125,0,0,0,0,0,0,0,0,0,0,0,125,0,0,1,0,0,0,254,255,255,255,0,125,0,0,0,0,0,0,50,1,0,0,0,27,0,0,0,0,0,0,19,0,0,0,0,27,0,0,0,0,0,0,51,0,0,0,63,27,0,0,0,0,0,0,163,255,255,255,63,27,0,0,0,0,0,0,158,1,0,0,0,216,0,0,0,0,0,0,115,0,0,0,0,216,0,0,0,0,0,0,151,0,0,0,74,190,0,0,1,0,0,0,137,8,0,0,0,48,0,0,1,0,0,0,237,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,148,146,0,0,0,0,0,0,0,0,0,0,1,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,148,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,170,170,251,156,254,255,251,255,251,253,255,253,254,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,103,27,103,27,103,27,234,125,238,255,174,255,143,255,117,125,18,254,67,255,61,255,204,64,107,255,156,255,158,255,235,255,87,0,110,0,164,0,19,0,0,0,8,14,151,8,0,1,10,1,0,0,46,215,0,196,77,47,54,8,0,1,63,1,104,129,0,196,134,93,54,8,0,1,63,1,0,0,1,0,103,27,103,27,103,27,0,0,0,0,0,0,0,0,196,0,0,0,0,136,94,0,1,0,0,0,0,0,163,14,241,215,67,94,248,4,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,149,149,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,103,27,103,27,103,27,234,125,238,255,174,255,143,255,117,125,18,254,67,255,61,255,204,64,107,255,202,255,139,255,155,255,169,0,91,0,45,0,56,0,0,0,8,14,151,8,0,1,10,1,0,0,46,215,0,196,77,47,151,8,0,1,10,1,46,215,0,196,77,47,151,8,0,1,10,1,0,0,1,0,103,27,103,27,103,27,0,0,0,0,0,0,0,0,196,0,0,0,0,136,94,0,1,0,0,0,0,0,163,14,241,215,67,94,248,4,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,149,149,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,132,56,255,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,74,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,8,0,27,0,64,0,125,0,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,4,0,231,0,14,0,14,0,94,0,216,0,125,0,27,0,8,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,220,62,0,0,0,0,0,0,0,0,93,0,2,0,2,0,2,0,0,16,219,216,81,0,219,216,81,0,219,216,81,0,105,0,105,0,105,0,93,0,93,0,93,0,96,0,96,0,96,0,5,5,5,8,8,8,1,1,1,1,220,56,0,0,0,0,0,63,125,0,0,0,74,125,1,1,1,1,1,0,8,1,0,8,219,0,219,0,0,0,0,0,0,0,0,0,1,1,27,36,95,0,1,71,14,55,74,94,138,138,164,0,0,0,254,27,1,0,0,0,164,0,0,0,254,27,14,0,14,0,14,0,14,0,0,74,0,1,1,1,0,0,1,1,1,0,64,94,0,72,0,0,149,0,25,86,13,94,216,0,216,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,255,31,255,254,253,220,78,255,254,92,156,72,255,255,16,255,62,255,16,255,255,0,0,0,0,255,255,16,220,249,170,253,11,31,251,12,199,255,255,253,62,255,31,255,220,255,12,115,253,255,170,255,255,37,47,255,254,12,255,255,253,168,251,255,255,255,255,255,255,106,255,255,62,16,251,255,255,56,31,255,251,253,255,56,254,220,139,157,128,251,170,255,157,251,255,253,255,255,12,255,31,255,16,255,157,255,255,255,255,78,255,56,220,170,255,255,56,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,160,0,0,0,64,0,0,0,1,0,0,0,129,0,0,0,1,0,0,0,236,0,0,0,138,0,0,0,216,0,0,0,160,0,0,0,64,0,0,0,1,0,0,0,129,0,0,0,1,0,0,0,236,0,0,0,138,0,0,0,216,0,0,0,0,0,0,0,8,0,0,0,1,0,0,0,1,0,0,0,74,0,0,0,74,0,0,0,8,0,0,0,8,0,0,0,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,27,0,0,0,8,0,0,0,57,0,0,0,160,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,196,0,0,0,216,0,0,0,216,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,8,0,0,0,112,0,0,0,129,0,0,0,0,0,0,0,8,0,0,0,112,0,0,0,129,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,0,0,0,39,0,0,0,74,0,0,0,1,0,0,0,14,0,0,0,8,0,0,0,27,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,149,0,0,0,112,0,0,0,0,0,0,0,149,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,1,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,112,0,0,0,63,0,0,0,189,0,0,0,0,0,0,0,1,0,0,0,51,81,125,0,0,0,0,0,81,32,0,0,0,0,0,0,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,94,0,0,0,113,0,0,0,8,0,0,0,149,0,0,0,211,0,0,0,93,0,0,0,92,0,0,0,7,0,0,0,36,0,0,0,149,0,0,0,211,0,0,0,93,0,0,0,92,0,0,0,7,0,0,0,197,0,0,0,1,0,0,0,27,0,0,0,1,0,0,0,8,0,0,0,112,0,0,0,1,0,0,0,44,27,0,0,191,8,0,0,44,27,0,0,191,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,255,149,23,255,30,27,235,255,73,0,18,255,165,0,196,0,196,0,39,0,39,0,0,1,0,1,74,0,74,0,0,108,181,1,108,16,181,1,223,0,0,0,0,0,0,0,8,125,91,125,0,0,8,125,91,125,0,0,8,125,91,125,0,0,8,125,91,125,34,255,152,0,245,255,47,0,125,215,86,196,74,74,39,74,74,39,246,255,196,0,0,0,69,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,8,8,56,0,8,36,128,64,0,0,0,0,129,196,149,74,253,1,128,0,16,0,67,27,112,0,40,0,69,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,174,196,124,253,185,116,128,253,185,116,84,223,64,51,143,118,64,51,0,0,0,0,76,236,200,220,149,0,0,0,234,29,174,196,32,0,0,0,190,205,125,0,204,149,0,0,255,255,31,31,160,67,220,255,255,56,255,251,251,170,191,31,170,55,170,253,62,31,220,170,255,220,31,255,254,255,251,191,220,253,255,251,255,59,31,38,255,31,15,64,254,255,253,106,255,255,31,249,254,75,31,220,253,237,255,254,59,255,62,255,255,251,251,251,62,255,62,31,255,31,253,153,255,253,7,0,0,0,63,255,189,255,129,255,133,254,36,254,22,253,36,253,170,252,93,252,93,252,93,252,93,252,93,252,93,252,8,1,8,187,74,0,0,0,1,86,253,255,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,236,0,0,1,0,0,0,0,0,0,0,1,0,0,0,253,144,255,255,170,16,255,67,255,255,255,35,126,255,72,62,251,255,255,16,221,90,255,62,170,233,72,78,255,8,255,31,255,237,254,255,170,249,255,253,62,255,255,56,170,255,31,20,251,255,255,253,62,255,255,255,16,170,121,254,255,250,253,254,70,215,0,0,199,138,0,0,234,0,234,0,234,0,234,0,0,0,129,0,0,0,0,0,8,0,70,215,199,138,0,72,16,15,31,255,255,255,253,255,255,255,255,255,170,16,59,251,254,255,62,220,251,254,255,255,255,144,253,255,12,255,255,31,170,255,220,254,153,153,255,254,255,24,170,141,31,255,255,170,255,255,255,255,159,27,55,62,8,157,0,8,108,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,4,1,0,84,0,0,0,199,8,105,0,0,0,0,0,64,64,0,0,199,27,105,0,0,0,0,0,145,64,0,0,199,8,105,0,0,0,0,0,152,64,0,0,199,27,105,0,0,0,0,0,246,216,0,0,199,8,105,0,0,0,0,0,31,94,0,0,199,27,105,0,0,0,0,0,93,14,0,0,199,64,105,0,73,0,0,0,106,14,0,0,41,0,105,0,73,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,0,0,0,3,27,0,0,0,0,0,0,194,0,0,0,151,182,0,0,0,0,0,0,13,0,0,0,170,149,0,0,0,0,0,0,147,1,0,0,170,0,0,0,0,0,0,0,26,8,0,0,170,149,0,0,0,0,0,0,14,27,0,0,170,0,0,0,0,0,0,0,70,64,0,0,170,149,0,0,0,0,0,0,46,125,0,0,170,36,0,0,0,0,0,0,221,94,0,0,170,149,0,0,0,0,0,0,107,94,0,0,170,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,234,184,48,214,12,0,0,0,0,0,0,0,0,0,0,0,196,45,27,0,0,0,0,0,8,110,205,0,190,0,0,0,0,196,138,0,227,0,0,0,0,1,0,45,27,0,0,0,5,64,105,136,81,197,32,182,182,182,32,0,0,0,0,0,8,110,205,0,190,0,0,0,0,196,138,0,227,0,0,0,0,0,0,64,0,0,0,49,174,39,0,254,254,248,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,63,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,1,187,74,0,0,1,1,1,1,0,1,1,27,0,1,1,153,0,48,215,48,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,1,204,0,2,0,192,0,137,8,51,8,231,86,0,112,207,0,149,0,192,255,0,192,255,0,0,0,0,0,0,0,0,0,0,211,116,27,0,0,20,125,129,86,158,112,36,190,107,12,246,81,143,92,39,26,44,121,189,43,93,0,93,0,93,0,93,0,93,0,106,0,106,0,106,0,106,0,93,0,47,0,0,0,0,0,0,0,45,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,5,199,253,0,145,71,43,224,183,121,226,226,26,76,135,197,197,57,57,92,106,106,106,93,93,47,47,47,211,211,81,211,211,211,81,81,81,81,81,81,81,81,81,81,81,149,0,233,0,196,138,64,0,0,0,0,0,8,8,1,187,74,0,0,1,1,1,1,0,1,1,27,0,1,1,153,0,48,215,48,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,1,85,0,2,0,192,0,44,8,117,8,231,86,0,112,207,0,149,0,192,255,0,192,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,190,0,112,60,136,0,4,0,190,0,112,110,205,0,112,206,32,0,112,165,32,146,4,0,190,0,112,60,136,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,220,224,220,110,220,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,62,215,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,251,255,159,31,220,62,255,249,153,247,255,255,75,255,8,0,136,0,136,0,27,0,86,86,0,0,0,0,0,0,0,0,0,0,0,0,190,1,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,113,138,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,1,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,211,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"UserComment":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"FlashpixVersion":{"type":"Buffer","data":[48,49,48,48]},"ColorSpace":1,"ExifImageWidth":6000,"ExifImageHeight":4000,"InteropOffset":38168,"FileSource":{"type":"Buffer","data":[3]},"SceneType":{"type":"Buffer","data":[1]},"CustomRendered":0,"ExposureMode":1,"WhiteBalance":0,"DigitalZoomRatio":1,"FocalLengthIn35mmFormat":33,"SceneCaptureType":0,"Contrast":0,"Saturation":0,"Sharpness":0,"LensInfo":[16,50,3.5,5.6],"LensModel":"E PZ 16-50mm F3.5-5.6 OSS"},"gps":{},"interoperability":{"InteropIndex":"R98","InteropVersion":{"type":"Buffer","data":[48,49,48,48]}},"makernote":{"error":"Unable to extract Makernote information as it is in an unsupported or unrecognized format."}} --------------------------------------------------------------------------------