diff --git a/assets/exif_read.json b/assets/exif_read.json index 4547d4f..15c316d 100644 --- a/assets/exif_read.json +++ b/assets/exif_read.json @@ -339,7 +339,7 @@ "MakerNoteType": "KAABAAMAMQAAAHQFAAACAAMABAA=", "MakerNoteBytes": "KAABAAMAMQAAAHQFAAACAAMABAAAANYFAAADAAMABAAAAN4FAAAEAAMAIgAAAOYFAAAGAAIAFgAAACoGAAAHAAIAGAAAAEoGAAAJAAIAIAAAAGIGAAANAAcAAAYAAIIGAAAQAAQAAQAAAIUCAIATAAMABAAAAIIMAAAZAAMAAQAAAAEAAAAmAAMACQEAAIoMAAA1AAQABAAAAJwOAACTAAMAHgAAAKwOAACVAAIASgAAAOgOAACWAAIAEAAAADIPAACXAAcAAAQAAEIPAACYAAMABAAAAEITAACZAAQAUwAAAEoTAACaAAQABQAAAJYUAACgAAMADgAAAKoUAACqAAMABgAAAMYUAAC0AAMAAQAAAAEAAADQAAQAAQAAAAAAAADgAAMAEQAAANIUAAABQAMAIAUAAPQUAAAIQAMAAwAAADQfAAAJQAMAAwAAADofAAAQQAIAIAAAAEAfAAARQAcA/AAAAGAfAAASQAIAIAAAAFwgAAATQAQACwAAAHwgAAAVQAcAyAEAAKggAAAWQAQABwAAAHAiAAAYQAQABwAAAIwiAAAZQAcAHgAAAKgiAAAhQAQABQAAAMYiAAAlQAQACQAAANoiAAAnQAQABQAAAP4iAAAoQAQAEwAAABIjAAAAAAAAYgACAAAAAwAAAAQAAAAAAAAAAQABAAEAAAAAAAAA/38PAAMAAgAAAAIA///7ASMAEAABAIAAIAEAAAAAAAAAAP///////wAAAAAAAAAA/////wAAAAD/f////////wAA//8AABAAhdLMLwAAAAAAAAAARAAAACABkACAACwBAAAAAAMAAAAIAAgAmQAAAAAAAAAAAAAAAQAAAAAAhAAsAX0AAAAAAPgA//////////8AAAAAAABDYW5vbiBFT1MgNUQgTWFyayBJSUkAAAAAAAAAAAAAAEZpcm13YXJlIFZlcnNpb24gMS4zLjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqDKYMoaAABeAF0AAMAAAAAAAABAAAGAAAAmZoAYQB9AHwAEAAAAAIAAAAAAwAAAAAAAAAQAAABu7tqQP/6QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQP8AagArAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAEAAAAAAAAAAAAAAAAAAAD//wHWBB8fAAAAAAAA/////wzMzAEAAAADAAAABQAAAAAAAAAFAAAAAGoAAAAAagAAAAAA+BEAAAABAAEAAQAAAQAAAAEAAAABAAAAAwAAAAMAAAADAAAAAAAAAAEAAAAAAAAAAAAAAIcAAAABAAAAAQAAAAEAAAAHAAAAAAAAAwUD//8DBwAAAAAAAAcAAAAAAAAWAQAAAgAFAAAAAAAEAAkAAAAAAAEACQEAAAAAAAAABgEAAAcDAwMC/wAAAAAAAAAAAShQAfsAEAAjkXeab4j/AAAAAAAkAAAQaAEABgcpAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAIAWAAAADwAAABIAAIAKAABAAgAAAAMAANACAADgAQAAAAAAAAAAAADQAgAA4AEAANACAADgAQAAAAAAAAAAAADQAgAA4AEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////8AAgAAAAAAAAAAAAAKAgABAAEAAAACAQAAAAAAAAIBAQEAAAAAAAAAAAAAAAAAAAAxLjMuNABBQSgzNCkAVlEAGAKYGVj+EwBk7gAAZO4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMAAABkAAAAZAAAAMQbAADEIgAAAAAAAIQAAABlAAAAZAAAAAgAAAAIAAAACAAAAAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrAQAEAAR+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsBAAQABH4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6wEABAAEfgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrAQAEAAR+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsBAAQABH4CAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAAAAAAA776t3u++rd4AAAAAAgAAAAAAAAAAAAAA776t3u++rd4AAAAABAAAAAAAAAAAAAAA776t3u++rd4AAAAAAAAAAAAAAAAAAAAA776t3u++rd4AAAAAAAAAAAAAAAAAAAAA776t3u++rd4AAAAAAwAAAO++rd7vvq3eAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAA776t3u++rd4AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAACBAIEAgQAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQAAAAAAAAAAOphIloAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAMA2AADEOQEAAAAAAAAAAAAAAAAAAwAAAFMAAABYAAOAAAAAAAMAAABNAAAATgAAAAAAAAADAAAAMwAAADsAA4AAAAAAAwAAAFQAAACfAAcAcAASAgIAPQA9AAAPAAoADwAKfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB+AH4AfgB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AH0AfQB9AMAAAABA//UDNQN1AqoBwAAAAAv8y/yL/Vb+QP/1AzUDdQKqAcAAAAAL/Mv8i/1W/kD/9QM1A3UCqgHAAAAAC/zL/Iv9Vv5A//UDNQN1AqoBwAAAAAv8y/yL/Vb+QP/1AzUDdQKqAcAAAAAL/Mv8i/1W/kD/wAAAAED/UP5Q/lD+3/7f/t/+3/7f/t/+3/7f/t/+3/7f/nH/cf9x/3H/cf9x/3H/cf9x/3H/cf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAjwCPAI8AjwCPAI8AjwCPAI8AjwCPACEBIQEhASEBIQEhASEBIQEhASEBIQGwAbABsAEAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAD//xAAAADgAQAACAAAADwAAAA8AAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAA/////2EA//8AAAAA///WAQAAAAAAAAAA//8AAB8AHwBFRjE2LTM1bW0gZi80TCBJUyBVU00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//9IzEFEMDQxMzg5NQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAQAAAwAAAAEAAABUAAAABgAAAAEBAAABAAAAAAAAAAIBAAABAAAAAAAAAAQBAAABAAAAAAAAAAUBAAABAAAAAAAAAAYBAAACAAAAAwAAAAAAAAAIAQAAAQAAAAAAAAACAAAAIAAAAAIAAAAKBAAAAQAAAAcAAAALBAAAAQAAAAAAAAAEAAAAxAAAAAUAAAAMBwAAIAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAADAAAABgcAAAEAAAAAAAAADwcAAAIAAAAAAAAAAgAAAA4IAAABAAAAAAAAABMIAAABAAAAAAAAAAAAAAAADwAAAAoAAAAAAAAAAAAAHAAAAAMAAAAAAAAAAAAAAP//+BGHAAAAAAAAAAwA6wIABAAEyAEAACIAIBduDwEAAQCMAGAACxdfDwAAAAAAAAAAAAAAAAAAAAAKACwDAAQABF8BNQIABAAE4wGOAQAEAASbAukFOQc4B3QCsQaYC5YLcAVTAxcIFgg9BQMAAAAGAQkBAwEAAMwFPQw6DMAGowLRANEAHgBeAI4CjwIdBGEFJwkmCaQBqQUzCzELCQaDAswAzAAbAF0ARAJFAqEDPwVuCG4IfAGvBwAEAATLBvgSrwcABAAEywb4Eq8HAAQABMsG+BKvBwAEAATLBvgSAAQABAAEAARQEQAEAAQABAAEUBGvBwAEAATLBvgSrwcABAAEywb4Eq8HAAQABMsG+BKvBwAEAATLBvgSrwcABAAEywb4Eq0HAQT+A8kG+BIAAAAAAAAAAAAA+AcABAAEdgZQFCoJAAQABIEFWBuSCAAEAAT0BXAXwQUABAAEqQmADPoGAAQABD8Jgg55BwAEAAQZB/kR4wgABAAE2gWwGPgHAAQABHYGRRT4BwAEAAR2BkUU+AcABAAEdgZFFPgHAAQABHYGRRT4BwAEAAR2BkUU/wMABAAEEgT2EP8DAAQABBIE9hD/AwAEAAQSBPYQ/wMABAAEEgT2EP8DAAQABBIE9hDQ/oQBcAOUKuL+jAFZAxAnEP+jASADbCBE/78B6AJYG3n/3gGwAnAXlP/uAZcC4BWy/wICegJQFOL/HQJLAlwSGgBEAhwCaBBQAG4C8wHYDoAAlgLPAawNuQDIAqgBgAzoAO8ChQG4CxEBHwNyAfAKewGgAz4BYAn0AREIIQgACAAIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAANABgAagAXABUAIQAKADYBUAB3ADUAHwAUAFMAEQAaAB0AlAGQBckBuQGKApQAXQVSAeEB7gBzAE8AgAEqAAgADAA0AisFMwPtAnkC5wAMA7MAAQF3ACoAHABeAAMAhwDLAB0Dhit/D/YLGgpLA4gOJgWtCgcHVgHHAHQCPAAAAAAAAAAAgAAAAAQABAAEYAoLDyEZuw9+/8n/uA9IEIYAOQBMEAAAAAEFAGv7BwB88QcAN/QDAIiBAAQABAAEAAAAAAAA/f8AAP8fAAEAAAAAAASuAqsB6wF+ApYBGAMAAAAAAAAAAAAAHwA/AF8AfwCfAL8A3wD/AAAAIQBGAGoAigCmAMEA3gD/AAEAAABwAAAAEAAgAEAAYACAAMAAAADh/+T/4f/k/+L/4/8sBDAELwQxBC4EMQQvBIgEAQD/B/8HAAgACPY49joQJwAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgBlANIAAAEAAQABAAEAAQAACgBzANIAAAEAAQABAAEAAWUAZQBzAAEAAQDzAPMACgBGAEoAZABnAJMAmwC+AMcA5ADrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAYgBmAG0AmQC8AMYA4gDnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG8FAARbAwAAAAAAAAAAQwBRAKp96gEAAAAAAAAAAGECrAAAAEsCYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAgAEAARbAmQAAABDAFMAtX3PAQAAAAAAAAAAZAB8AGsAgwArAPsB/wAiWuhhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQBHAG0AjACnAMEA3gD/AAAAAAAAAAAAAAAAAAAAAAAAAGQAAABzAAEA8wAAAAAAAAAAAAAAAAAAACEARgBqAIoApgDBAN4A/wA1AD0ASABOAFIAVgBbAGIAaQBwAHYAewCFAI8AkgCUAJcAmACXAJMAiwCDAHwAdwB1AHQAdAB4AH0AhgCKAJAAlwCZAJ4AogCqALAAsACxAKgAoACUAIcAegBkAFgASgBDAD0AOAA2ADQAMQAvAC0AKQAmACUAJgAjAEAAOwAAAP8AAgB8AGsAIlroYQAAAAAAAAAAAAD7Af8AKwBgAp0AAABNAmQAAABgAQAAAACDAAAAAAALAAAAPAAAAP//AAD///////8AAAAAAABBAAAAOAAAAAAAZABkAGQAZAAKAGQAZABkAAAAMgBkAGQAGwABAAAAAAA8AAAAfABrACJa6GEAAAAAAAAAAAAA+wH/ACsAtX3PAQAAAAAAAAAAIlroYQAAfAAAAAAAAAAAAAAAPAAAAAAAIQBGAGoAigCmAMEA3gD/AAAAAAAVAgAEAARbAoEAgQCBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAKAAAA/////wAAAAAKAAAAAAAAAAoAAACw////CgAAAAAhyAEAAAAAAAAAAAAAAAAAAAAAahiAFgAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABwAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAJAAAEGiHACuMAInoABa8AAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAEAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAACAIJADQApqoABjwH0NDQAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJSSoAjgMAAA==" }, - "value_string": "MakerNote\u003cTYPE-ID=[28 00 01 00 03 00 31 00 00 00 74 05 00 00 02 00 03 00 04 00]\u003e" + "value_string": "MakerNote\u003cTYPE-ID=[28 00 01 00 03 00 31 00 00 00 74 05 00 00 02 00 03 00 04 00] LEN=(8152) SHA1=[d4154aa7df5474efe7ab38de2595919b9b4cc29f]\u003e" }, { "ifd_path": "IFD/Exif", diff --git a/exif-read-tool/main_test.go b/exif-read-tool/main_test.go index 9afcd7c..e0c1bf4 100644 --- a/exif-read-tool/main_test.go +++ b/exif-read-tool/main_test.go @@ -65,7 +65,7 @@ IFD-PATH=[IFD/Exif] ID=(0x9204) NAME=[ExposureBiasValue] COUNT=(1) TYPE=[SRATION IFD-PATH=[IFD/Exif] ID=(0x9207) NAME=[MeteringMode] COUNT=(1) TYPE=[SHORT] VALUE=[5] IFD-PATH=[IFD/Exif] ID=(0x9209) NAME=[Flash] COUNT=(1) TYPE=[SHORT] VALUE=[16] IFD-PATH=[IFD/Exif] ID=(0x920a) NAME=[FocalLength] COUNT=(1) TYPE=[RATIONAL] VALUE=[16/1] -IFD-PATH=[IFD/Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote] +IFD-PATH=[IFD/Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote] IFD-PATH=[IFD/Exif] ID=(0x9286) NAME=[UserComment] COUNT=(264) TYPE=[UNDEFINED] VALUE=[UserComment] IFD-PATH=[IFD/Exif] ID=(0x9290) NAME=[SubSecTime] COUNT=(3) TYPE=[ASCII] VALUE=[00] IFD-PATH=[IFD/Exif] ID=(0x9291) NAME=[SubSecTimeOriginal] COUNT=(3) TYPE=[ASCII] VALUE=[00] diff --git a/exif_test.go b/exif_test.go index b2dd42a..234845c 100644 --- a/exif_test.go +++ b/exif_test.go @@ -131,7 +131,7 @@ func TestVisit(t *testing.T) { "IFD-PATH=[IFD/Exif] ID=(0x9207) NAME=[MeteringMode] COUNT=(1) TYPE=[SHORT] VALUE=[5]", "IFD-PATH=[IFD/Exif] ID=(0x9209) NAME=[Flash] COUNT=(1) TYPE=[SHORT] VALUE=[16]", "IFD-PATH=[IFD/Exif] ID=(0x920a) NAME=[FocalLength] COUNT=(1) TYPE=[RATIONAL] VALUE=[16/1]", - "IFD-PATH=[IFD/Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote]", + "IFD-PATH=[IFD/Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote]", "IFD-PATH=[IFD/Exif] ID=(0x9286) NAME=[UserComment] COUNT=(264) TYPE=[UNDEFINED] VALUE=[UserComment]", "IFD-PATH=[IFD/Exif] ID=(0x9290) NAME=[SubSecTime] COUNT=(3) TYPE=[ASCII] VALUE=[00]", "IFD-PATH=[IFD/Exif] ID=(0x9291) NAME=[SubSecTimeOriginal] COUNT=(3) TYPE=[ASCII] VALUE=[00]", diff --git a/ifd_enumerate.go b/ifd_enumerate.go index 1e38f60..df4f042 100644 --- a/ifd_enumerate.go +++ b/ifd_enumerate.go @@ -259,6 +259,9 @@ func (ie *IfdEnumerate) resolveTagValue(ite *IfdTagEntry) (valueBytes []byte, is switch value.(type) { case []byte: return value.([]byte), false, nil + case TagUnknownType_UnknownValue: + b := []byte(value.(TagUnknownType_UnknownValue)) + return b, false, nil case string: return []byte(value.(string)), false, nil case UnknownTagValue: @@ -268,7 +271,7 @@ func (ie *IfdEnumerate) resolveTagValue(ite *IfdTagEntry) (valueBytes []byte, is return valueBytes, false, nil default: // TODO(dustin): !! Finish translating the rest of the types (make reusable and replace into other similar implementations?) - log.Panicf("can not produce bytes for unknown-type tag (0x%04x): [%s]", ite.TagId, reflect.TypeOf(value)) + log.Panicf("can not produce bytes for unknown-type tag (0x%04x) (1): [%s]", ite.TagId, reflect.TypeOf(value)) } } } else { diff --git a/ifd_tag_entry.go b/ifd_tag_entry.go index 3f4f2eb..3409062 100644 --- a/ifd_tag_entry.go +++ b/ifd_tag_entry.go @@ -104,6 +104,9 @@ func (ite IfdTagEntry) ValueBytes(addressableData []byte, byteOrder binary.ByteO switch value.(type) { case []byte: return value.([]byte), nil + case TagUnknownType_UnknownValue: + b := []byte(value.(TagUnknownType_UnknownValue)) + return b, nil case string: return []byte(value.(string)), nil case UnknownTagValue: @@ -113,7 +116,7 @@ func (ite IfdTagEntry) ValueBytes(addressableData []byte, byteOrder binary.ByteO return valueBytes, nil default: // TODO(dustin): !! Finish translating the rest of the types (make reusable and replace into other similar implementations?) - log.Panicf("can not produce bytes for unknown-type tag (0x%04x): [%s]", ite.TagId, reflect.TypeOf(value)) + log.Panicf("can not produce bytes for unknown-type tag (0x%04x) (2): [%s]", ite.TagId, reflect.TypeOf(value)) } } diff --git a/tags_unknown.go b/tags_unknown.go index 6f2a66d..4a4bcc0 100644 --- a/tags_unknown.go +++ b/tags_unknown.go @@ -5,13 +5,14 @@ import ( "fmt" "strings" + "crypto/sha1" "encoding/binary" "github.com/dsoprea/go-logging" ) const ( - UnparseableUnknownTagValuePlaceholder = "!UNPARSEABLE" + UnparseableUnknownTagValuePlaceholder = "!UNKNOWN" ) const ( @@ -126,7 +127,14 @@ func (mn TagUnknownType_927C_MakerNote) String() string { parts[i] = fmt.Sprintf("%02x", c) } - return fmt.Sprintf("MakerNote", strings.Join(parts, " ")) + h := sha1.New() + + _, err := h.Write(mn.MakerNoteBytes) + log.PanicIf(err) + + digest := h.Sum(nil) + + return fmt.Sprintf("MakerNote", strings.Join(parts, " "), len(mn.MakerNoteBytes), digest) } func (uc TagUnknownType_927C_MakerNote) ValueBytes() (value []byte, err error) { @@ -199,6 +207,24 @@ func EncodeUndefined(ifdPath string, tagId uint16, value interface{}) (ed Encode return EncodedData{}, nil } +type TagUnknownType_UnknownValue []byte + +func (tutuv TagUnknownType_UnknownValue) String() string { + parts := make([]string, len(tutuv)) + for i, c := range tutuv { + parts[i] = fmt.Sprintf("%02x", c) + } + + h := sha1.New() + + _, err := h.Write(tutuv) + log.PanicIf(err) + + digest := h.Sum(nil) + + return fmt.Sprintf("Unknown", strings.Join(parts, " "), len(tutuv), digest) +} + // UndefinedValue knows how to resolve the value for most unknown-type tags. func UndefinedValue(ifdPath string, tagId uint16, valueContext ValueContext, byteOrder binary.ByteOrder) (value interface{}, err error) { defer func() { @@ -347,9 +373,20 @@ func UndefinedValue(ifdPath string, tagId uint16, valueContext ValueContext, byt // // complex: 0xa302, 0xa20c, 0x8828 // long: 0xa301, 0xa300 - + // // 0xa40b is device-specific and unhandled. - log.Panic(ErrUnhandledUnknownTypedTag) - return nil, nil + // Return encapsulated data rather than an error so that we can at least + // print/profile the opaque data. + + tt := NewTagType(TypeByte, byteOrder) + + valueBytes, err := tt.ReadByteValues(valueContext) + log.PanicIf(err) + + tutuv := TagUnknownType_UnknownValue(valueBytes) + return tutuv, nil + + // log.Panic(ErrUnhandledUnknownTypedTag) + // return nil, nil }