exiftool-vendored.pl 12.33.0 → 12.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/LICENSE +10 -3
  2. package/bin/Changes +116 -0
  3. package/bin/MANIFEST +2 -0
  4. package/bin/META.json +1 -1
  5. package/bin/META.yml +1 -1
  6. package/bin/README +45 -45
  7. package/bin/config_files/acdsee.config +6 -6
  8. package/bin/config_files/photoshop_paths.config +30 -7
  9. package/bin/config_files/picasa_faces.config +1 -1
  10. package/bin/config_files/pix4d.config +2 -2
  11. package/bin/config_files/tiff_version.config +2 -2
  12. package/bin/exiftool +112 -82
  13. package/bin/lib/File/RandomAccess.pm +1 -1
  14. package/bin/lib/File/RandomAccess.pod +2 -2
  15. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  16. package/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  17. package/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  18. package/bin/lib/Image/ExifTool/APE.pm +1 -1
  19. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  20. package/bin/lib/Image/ExifTool/ASF.pm +1 -1
  21. package/bin/lib/Image/ExifTool/Apple.pm +1 -1
  22. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  23. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  24. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  26. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  27. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +15 -4
  28. package/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  29. package/bin/lib/Image/ExifTool/Canon.pm +225 -13
  30. package/bin/lib/Image/ExifTool/CanonCustom.pm +13 -3
  31. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  32. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  33. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  34. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  35. package/bin/lib/Image/ExifTool/Charset.pm +3 -1
  36. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DJI.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  41. package/bin/lib/Image/ExifTool/DarwinCore.pm +3 -3
  42. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  43. package/bin/lib/Image/ExifTool/EXE.pm +1 -1
  44. package/bin/lib/Image/ExifTool/Exif.pm +64 -20
  45. package/bin/lib/Image/ExifTool/FITS.pm +1 -1
  46. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  47. package/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  48. package/bin/lib/Image/ExifTool/FLIR.pm +48 -11
  49. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  50. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  51. package/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  52. package/bin/lib/Image/ExifTool/Font.pm +1 -1
  53. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  54. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  55. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GIF.pm +6 -2
  57. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  58. package/bin/lib/Image/ExifTool/GPS.pm +15 -11
  59. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  60. package/bin/lib/Image/ExifTool/Geotag.pm +4 -3
  61. package/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  62. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  63. package/bin/lib/Image/ExifTool/HP.pm +1 -1
  64. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  65. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  66. package/bin/lib/Image/ExifTool/ICC_Profile.pm +97 -5
  67. package/bin/lib/Image/ExifTool/ID3.pm +1 -1
  68. package/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  70. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  71. package/bin/lib/Image/ExifTool/Import.pm +1 -1
  72. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  73. package/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  74. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  75. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  76. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  77. package/bin/lib/Image/ExifTool/Jpeg2000.pm +109 -12
  78. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  79. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  80. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  81. package/bin/lib/Image/ExifTool/LNK.pm +1 -1
  82. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  83. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  84. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  85. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  101. package/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  102. package/bin/lib/Image/ExifTool/MIE.pm +1 -1
  103. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  104. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  105. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  106. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  107. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  108. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  109. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MXF.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  115. package/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  116. package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  117. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  118. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  119. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  120. package/bin/lib/Image/ExifTool/Nikon.pm +1918 -72
  121. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  122. package/bin/lib/Image/ExifTool/NikonCustom.pm +523 -6
  123. package/bin/lib/Image/ExifTool/NikonSettings.pm +150 -87
  124. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  125. package/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  127. package/bin/lib/Image/ExifTool/Olympus.pm +7 -7
  128. package/bin/lib/Image/ExifTool/OpenEXR.pm +5 -3
  129. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  130. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  131. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  132. package/bin/lib/Image/ExifTool/PDF.pm +6 -4
  133. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  134. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  135. package/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  136. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PNG.pm +29 -8
  138. package/bin/lib/Image/ExifTool/PPM.pm +1 -1
  139. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  140. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  141. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  142. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  143. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  144. package/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  145. package/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  146. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  147. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  148. package/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  149. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  150. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  151. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  152. package/bin/lib/Image/ExifTool/QuickTime.pm +25 -7
  153. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +40 -4
  154. package/bin/lib/Image/ExifTool/README +4 -0
  155. package/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  156. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  157. package/bin/lib/Image/ExifTool/RTF.pm +1 -1
  158. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  159. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  160. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  161. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  162. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  163. package/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  164. package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
  165. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  166. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Shift.pl +3 -1
  168. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  170. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  171. package/bin/lib/Image/ExifTool/Sony.pm +34 -12
  172. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  173. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  174. package/bin/lib/Image/ExifTool/TagInfoXML.pm +11 -6
  175. package/bin/lib/Image/ExifTool/TagLookup.pm +6581 -5893
  176. package/bin/lib/Image/ExifTool/TagNames.pod +1641 -59
  177. package/bin/lib/Image/ExifTool/Text.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  179. package/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  181. package/bin/lib/Image/ExifTool/VCard.pm +1 -1
  182. package/bin/lib/Image/ExifTool/Validate.pm +1 -1
  183. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  184. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  185. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  186. package/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  187. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  188. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  189. package/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  190. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  191. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  192. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +19 -4
  193. package/bin/lib/Image/ExifTool/WriteXMP.pl +13 -12
  194. package/bin/lib/Image/ExifTool/Writer.pl +56 -10
  195. package/bin/lib/Image/ExifTool/XMP.pm +169 -54
  196. package/bin/lib/Image/ExifTool/XMP2.pl +6 -4
  197. package/bin/lib/Image/ExifTool/XMPStruct.pl +22 -8
  198. package/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  199. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  200. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  201. package/bin/lib/Image/ExifTool.pm +93 -13
  202. package/bin/lib/Image/ExifTool.pod +80 -70
  203. package/bin/perl-Image-ExifTool.spec +43 -43
  204. package/bin/pp_build_exe.args +5 -5
  205. package/package.json +3 -3
@@ -11,6 +11,7 @@
11
11
  # 4) http://www.color.org/privatetag2007-01.pdf
12
12
  # 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
13
13
  # 6) Eef Vreeland private communication
14
+ # 7) https://color.org/specification/ICC.2-2019.pdf
14
15
  #
15
16
  # Notes: The ICC profile information is different: the format of each
16
17
  # tag is embedded in the information instead of in the directory
@@ -24,7 +25,7 @@ use strict;
24
25
  use vars qw($VERSION);
25
26
  use Image::ExifTool qw(:DataAccess :Utils);
26
27
 
27
- $VERSION = '1.36';
28
+ $VERSION = '1.38';
28
29
 
29
30
  sub ProcessICC($$);
30
31
  sub ProcessICC_Profile($$$);
@@ -52,6 +53,11 @@ my %profileClass = (
52
53
  abst => 'Abstract Profile',
53
54
  nmcl => 'NamedColor Profile',
54
55
  nkpf => 'Nikon Input Device Profile (NON-STANDARD!)', # (written by Nikon utilities)
56
+ # additions in v5 (ref 7)
57
+ cenc => 'ColorEncodingSpace Profile',
58
+ 'mid '=> 'MultiplexIdentification Profile',
59
+ mlnk => 'MultiplexLink Profile',
60
+ mvis => 'MultiplexVisualization Profile',
55
61
  );
56
62
  my %manuSig = ( #6
57
63
  'NONE' => 'none',
@@ -539,6 +545,90 @@ my %manuSig = ( #6
539
545
  Binary => 1, # (NC)
540
546
  },
541
547
 
548
+ # new tags in v5 (ref 7)
549
+ A2B3 => 'AToB3',
550
+ A2M0 => 'AToM0',
551
+ B2A3 => 'BToA3',
552
+ bcp0 => 'BRDFColorimetricParam0',
553
+ bcp1 => 'BRDFColorimetricParam1',
554
+ bcp2 => 'BRDFColorimetricParam2',
555
+ bcp3 => 'BRDFColorimetricParam3',
556
+ bsp0 => 'BRDFSpectralParam0',
557
+ bsp1 => 'BRDFSpectralParam1',
558
+ bsp2 => 'BRDFSpectralParam2',
559
+ bsp3 => 'BRDFSpectralParam3',
560
+ bAB0 => 'BRDFAToB0',
561
+ bAB1 => 'BRDFAToB1',
562
+ bAB2 => 'BRDFAToB2',
563
+ bAB3 => 'BRDFAToB3',
564
+ bBA0 => 'BRDFBToA0',
565
+ bBA1 => 'BRDFBToA1',
566
+ bBA2 => 'BRDFBToA2',
567
+ bBA3 => 'BRDFBToA3',
568
+ bBD0 => 'BRDFBToD0',
569
+ bBD1 => 'BRDFBToD1',
570
+ bBD2 => 'BRDFBToD2',
571
+ bBD3 => 'BRDFBToD3',
572
+ bDB0 => 'BRDFDToB0',
573
+ bDB1 => 'BRDFDToB1',
574
+ bDB2 => 'BRDFDToB2',
575
+ bDB3 => 'BRDFDToB3',
576
+ bMB0 => 'BRDFMToB0',
577
+ bMB1 => 'BRDFMToB1',
578
+ bMB2 => 'BRDFMToB2',
579
+ bMB3 => 'BRDFMToB3',
580
+ bMS0 => 'BRDFMToS0',
581
+ bMS1 => 'BRDFMToS1',
582
+ bMS2 => 'BRDFMToS2',
583
+ bMS3 => 'BRDFMToS3',
584
+ dAB0 => 'DirectionalAToB0',
585
+ dAB1 => 'DirectionalAToB1',
586
+ dAB2 => 'DirectionalAToB2',
587
+ dAB3 => 'DirectionalAToB3',
588
+ dBA0 => 'DirectionalBToA0',
589
+ dBA1 => 'DirectionalBToA1',
590
+ dBA2 => 'DirectionalBToA2',
591
+ dBA3 => 'DirectionalBToA3',
592
+ dBD0 => 'DirectionalBToD0',
593
+ dBD1 => 'DirectionalBToD1',
594
+ dBD2 => 'DirectionalBToD2',
595
+ dBD3 => 'DirectionalBToD3',
596
+ dDB0 => 'DirectionalDToB0',
597
+ dDB1 => 'DirectionalDToB1',
598
+ dDB2 => 'DirectionalDToB2',
599
+ dDB3 => 'DirectionalDToB3',
600
+ gdb0 => 'GamutBoundaryDescription0',
601
+ gdb1 => 'GamutBoundaryDescription1',
602
+ gdb2 => 'GamutBoundaryDescription2',
603
+ gdb3 => 'GamutBoundaryDescription3',
604
+ 'mdv '=> 'MultiplexDefaultValues',
605
+ mcta => 'MultiplexTypeArray',
606
+ minf => 'MeasurementInfo',
607
+ miin => 'MeasurementInputInfo',
608
+ M2A0 => 'MToA0',
609
+ M2B0 => 'MToB0',
610
+ M2B1 => 'MToB1',
611
+ M2B2 => 'MToB2',
612
+ M2B3 => 'MToB3',
613
+ M2S0 => 'MToS0',
614
+ M2S1 => 'MToS1',
615
+ M2S2 => 'MToS2',
616
+ M2S3 => 'MToS3',
617
+ cept => 'ColorEncodingParams',
618
+ csnm => 'ColorSpaceName',
619
+ cloo => 'ColorantOrderOut',
620
+ clio => 'ColorantInfoOut',
621
+ c2sp => 'CustomToStandardPcc',
622
+ 'CxF '=> 'CXF',
623
+ nmcl => 'NamedColor',
624
+ psin => 'ProfileSequenceInfo',
625
+ rfnm => 'ReferenceName',
626
+ svcn => 'SpectralViewingConditions',
627
+ swpt => 'SpectralWhitePoint',
628
+ s2cp => 'StandardToCustomPcc',
629
+ smap => 'SurfaceMap',
630
+ # smwp ? (seen in some v5 samples)
631
+
542
632
  # the following entry represents the ICC profile header, and doesn't
543
633
  # exist as a tag in the directory. It is only in this table to provide
544
634
  # a link so ExifTool can locate the header tags
@@ -850,7 +940,7 @@ sub FormatICCTag($$$)
850
940
  # dataType
851
941
  if ($type eq 'data' and $size >= 12) {
852
942
  my $form = Get32u($dataPt, $offset+8);
853
- # format 0 is ASCII data
943
+ # format 0 is UTF-8 data
854
944
  $form == 0 and return substr($$dataPt, $offset+12, $size-12);
855
945
  # binary data and other data types treat as binary (ie. don't format)
856
946
  }
@@ -1022,7 +1112,7 @@ sub ValidateICC($)
1022
1112
  $profileClass{substr($$valPtr, 12, 4)} or $err = 'profile class';
1023
1113
  my $col = substr($$valPtr, 16, 4); # ColorSpaceData
1024
1114
  my $con = substr($$valPtr, 20, 4); # ConnectionSpace
1025
- my $match = '(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR)';
1115
+ my $match = '(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR|nc..|\0{4})';
1026
1116
  $col =~ /$match/ or $err = 'color space';
1027
1117
  $con =~ /$match/ or $err = 'connection space';
1028
1118
  return $err ? "Invalid ICC profile (bad $err)" : undef;
@@ -1134,7 +1224,7 @@ sub ProcessICC_Profile($$$)
1134
1224
  my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
1135
1225
  # unknown tags aren't generated automatically by GetTagInfo()
1136
1226
  # if the tagID's aren't numeric, so we must do this manually:
1137
- if (not $tagInfo and $$et{OPTIONS}{Unknown}) {
1227
+ if (not $tagInfo and ($$et{OPTIONS}{Unknown} or $verbose)) {
1138
1228
  $tagInfo = { Unknown => 1 };
1139
1229
  AddTagToTable($tagTablePtr, $tagID, $tagInfo);
1140
1230
  }
@@ -1264,7 +1354,7 @@ data created on one device into another device's native color space.
1264
1354
 
1265
1355
  =head1 AUTHOR
1266
1356
 
1267
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1357
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1268
1358
 
1269
1359
  This library is free software; you can redistribute it and/or modify it
1270
1360
  under the same terms as Perl itself.
@@ -1277,6 +1367,8 @@ under the same terms as Perl itself.
1277
1367
 
1278
1368
  =item L<http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/ColorSync_Manager.pdf>
1279
1369
 
1370
+ =item L<https://color.org/specification/ICC.2-2019.pdf>
1371
+
1280
1372
  =back
1281
1373
 
1282
1374
  =head1 SEE ALSO
@@ -1652,7 +1652,7 @@ other types of audio files.
1652
1652
 
1653
1653
  =head1 AUTHOR
1654
1654
 
1655
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1655
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1656
1656
 
1657
1657
  This library is free software; you can redistribute it and/or modify it
1658
1658
  under the same terms as Perl itself.
@@ -1280,7 +1280,7 @@ image files.
1280
1280
 
1281
1281
  =head1 AUTHOR
1282
1282
 
1283
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1283
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1284
1284
 
1285
1285
  This library is free software; you can redistribute it and/or modify it
1286
1286
  under the same terms as Perl itself.
@@ -184,7 +184,7 @@ information from ISO 9660 disk images.
184
184
 
185
185
  =head1 AUTHOR
186
186
 
187
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
187
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
188
188
 
189
189
  This library is free software; you can redistribute it and/or modify it
190
190
  under the same terms as Perl itself.
@@ -191,7 +191,7 @@ information (including artwork images) from iTunes Cover Flow files.
191
191
 
192
192
  =head1 AUTHOR
193
193
 
194
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
194
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
195
195
 
196
196
  This library is free software; you can redistribute it and/or modify it
197
197
  under the same terms as Perl itself.
@@ -348,7 +348,7 @@ stored as hash lookups of tag name/value for each SourceFile.
348
348
 
349
349
  =head1 AUTHOR
350
350
 
351
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
351
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
352
352
 
353
353
  This library is free software; you can redistribute it and/or modify it
354
354
  under the same terms as Perl itself.
@@ -258,7 +258,7 @@ them and the LargeFileSupport option is enabled.
258
258
 
259
259
  =head1 AUTHOR
260
260
 
261
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
261
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
262
262
 
263
263
  This library is free software; you can redistribute it and/or modify it
264
264
  under the same terms as Perl itself.
@@ -11,7 +11,7 @@ use strict;
11
11
  use vars qw($VERSION);
12
12
  use Image::ExifTool qw(:DataAccess :Utils);
13
13
 
14
- $VERSION = '1.32';
14
+ $VERSION = '1.33';
15
15
 
16
16
  sub ProcessOcad($$$);
17
17
  sub ProcessJPEG_HDR($$$);
@@ -284,6 +284,10 @@ sub ProcessJPEG_HDR($$$);
284
284
  }, {
285
285
  Name => 'Insta360',
286
286
  Condition => '$$valPt =~ /8db42d694ccc418790edff439fe026bf$/',
287
+ }, {
288
+ Name => 'NikonApp',
289
+ Condition => '$$valPt =~ m(\0{6}/NIKON APP$)',
290
+ Notes => 'contains editing information in XMP format',
287
291
  }, {
288
292
  Name => 'PreviewImage',
289
293
  Condition => '$$valPt =~ /^\xff\xd8\xff/',
@@ -714,7 +718,7 @@ segments are included in the Image::ExifTool module itself.
714
718
 
715
719
  =head1 AUTHOR
716
720
 
717
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
721
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
718
722
 
719
723
  This library is free software; you can redistribute it and/or modify it
720
724
  under the same terms as Perl itself.
@@ -2590,7 +2590,7 @@ estimated JPEG quality if requested.
2590
2590
 
2591
2591
  =head1 AUTHOR
2592
2592
 
2593
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2593
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2594
2594
 
2595
2595
  This library is free software; you can redistribute it and/or modify it
2596
2596
  under the same terms as Perl itself.
@@ -176,7 +176,7 @@ information from JSON files.
176
176
 
177
177
  =head1 AUTHOR
178
178
 
179
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
179
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
180
180
 
181
181
  This library is free software; you can redistribute it and/or modify it
182
182
  under the same terms as Perl itself.
@@ -117,7 +117,7 @@ notes.
117
117
 
118
118
  =head1 AUTHOR
119
119
 
120
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
120
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
121
121
 
122
122
  This library is free software; you can redistribute it and/or modify it
123
123
  under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.31';
19
+ $VERSION = '1.32';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -42,8 +42,9 @@ my %jp2Map = (
42
42
  'UUID-IPTC' => 'JP2',
43
43
  'UUID-EXIF' => 'JP2',
44
44
  'UUID-XMP' => 'JP2',
45
- # jp2h => 'JP2', (not yet functional)
46
- # ICC_Profile => 'jp2h', (not yet functional)
45
+ jp2h => 'JP2',
46
+ colr => 'jp2h',
47
+ ICC_Profile => 'colr',
47
48
  IFD1 => 'IFD0',
48
49
  EXIF => 'IFD0', # to write EXIF as a block
49
50
  ExifIFD => 'IFD0',
@@ -560,11 +561,34 @@ my %j2cMarker = (
560
561
 
561
562
  %Image::ExifTool::Jpeg2000::ColorSpec = (
562
563
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
564
+ WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this)
563
565
  GROUPS => { 2 => 'Image' },
564
566
  FORMAT => 'int8s',
567
+ WRITABLE => 1,
568
+ # (Note: 'colr' is not a real group, but is used as a hack to write the
569
+ # necessary colr box. This hack necessitated another hack in TagInfoXML.pm
570
+ # to avoid reporting this fake group in the XML output)
571
+ WRITE_GROUP => 'colr',
572
+ DATAMEMBER => [ 0 ],
573
+ IS_SUBDIR => [ 3 ],
574
+ NOTES => q{
575
+ The table below contains tags in the color specification (colr) box. This
576
+ box may be rewritten by writing either ICC_Profile, ColorSpace or
577
+ ColorSpecData. When writing, any existing colr boxes are replaced with the
578
+ newly created colr box.
579
+
580
+ B<NOTE>: Care must be taken when writing this color specification because
581
+ writing a specification that is incompatible with the image data may make
582
+ the image undisplayable.
583
+ },
565
584
  0 => {
566
585
  Name => 'ColorSpecMethod',
567
586
  RawConv => '$$self{ColorSpecMethod} = $val',
587
+ Protected => 1,
588
+ Notes => q{
589
+ default for writing is 2 when writing ICC_Profile, 1 when writing
590
+ ColorSpace, or 4 when writing ColorSpecData
591
+ },
568
592
  PrintConv => {
569
593
  1 => 'Enumerated',
570
594
  2 => 'Restricted ICC',
@@ -572,9 +596,15 @@ my %j2cMarker = (
572
596
  4 => 'Vendor Color',
573
597
  },
574
598
  },
575
- 1 => 'ColorSpecPrecedence',
599
+ 1 => {
600
+ Name => 'ColorSpecPrecedence',
601
+ Notes => 'default for writing is 0',
602
+ Protected => 1,
603
+ },
576
604
  2 => {
577
605
  Name => 'ColorSpecApproximation',
606
+ Notes => 'default for writing is 0',
607
+ Protected => 1,
578
608
  PrintConv => {
579
609
  0 => 'Not Specified',
580
610
  1 => 'Accurate',
@@ -599,6 +629,7 @@ my %j2cMarker = (
599
629
  Name => 'ColorSpace',
600
630
  Condition => '$$self{ColorSpecMethod} == 1',
601
631
  Format => 'int32u',
632
+ Protected => 1,
602
633
  PrintConv => { # ref 15444-2 2002-05-15
603
634
  0 => 'Bi-level',
604
635
  1 => 'YCbCr(1)',
@@ -628,6 +659,8 @@ my %j2cMarker = (
628
659
  {
629
660
  Name => 'ColorSpecData',
630
661
  Format => 'undef[$size-3]',
662
+ Writable => 'undef',
663
+ Protected => 1,
631
664
  Binary => 1,
632
665
  },
633
666
  ],
@@ -817,6 +850,48 @@ sub CreateNewBoxes($$)
817
850
  return 1;
818
851
  }
819
852
 
853
+ #------------------------------------------------------------------------------
854
+ # Create Color Specification Box
855
+ # Inputs: 0) ExifTool object ref, 1) Output file or scalar ref
856
+ # Returns: 1 on success
857
+ sub CreateColorSpec($$)
858
+ {
859
+ my ($et, $outfile) = @_;
860
+ my $meth = $et->GetNewValue('Jpeg2000:ColorSpecMethod');
861
+ my $prec = $et->GetNewValue('Jpeg2000:ColorSpecPrecedence') || 0;
862
+ my $approx = $et->GetNewValue('Jpeg2000:ColorSpecApproximation') || 0;
863
+ my $icc = $et->GetNewValue('ICC_Profile');
864
+ my $space = $et->GetNewValue('Jpeg2000:ColorSpace');
865
+ my $cdata = $et->GetNewValue('Jpeg2000:ColorSpecData');
866
+ unless ($meth) {
867
+ if ($icc) {
868
+ $meth = 2;
869
+ } elsif (defined $space) {
870
+ $meth = 1;
871
+ } elsif (defined $cdata) {
872
+ $meth = 4;
873
+ } else {
874
+ $et->Warn('Color space not defined'), return 0;
875
+ }
876
+ }
877
+ if ($meth eq '1') {
878
+ defined $space or $et->Warn('Must specify ColorSpace'), return 0;
879
+ $cdata = pack('N', $space);
880
+ } elsif ($meth eq '2' or $meth eq '3') {
881
+ defined $icc or $et->Warn('Must specify ICC_Profile'), return 0;
882
+ $cdata = $icc;
883
+ } elsif ($meth eq '4') {
884
+ defined $cdata or $et->Warn('Must specify ColorSpecData'), return 0;
885
+ } else {
886
+ $et->Warn('Unknown ColorSpecMethod'), return 0;
887
+ }
888
+ my $boxhdr = pack('N', length($cdata) + 11) . 'colr';
889
+ Write($outfile, $boxhdr, pack('CCC',$meth,$prec,$approx), $cdata) or return 0;
890
+ ++$$et{CHANGED};
891
+ $et->VPrint(1, " + Jpeg2000:ColorSpec\n");
892
+ return 1;
893
+ }
894
+
820
895
  #------------------------------------------------------------------------------
821
896
  # Process JPEG 2000 box
822
897
  # Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) Pointer to tag table
@@ -834,7 +909,7 @@ sub ProcessJpeg2000Box($$$)
834
909
  my $raf = $$dirInfo{RAF};
835
910
  my $outfile = $$dirInfo{OutFile};
836
911
  my $dirEnd = $dirStart + $dirLen;
837
- my ($err, $outBuff, $verbose);
912
+ my ($err, $outBuff, $verbose, $doColour);
838
913
 
839
914
  if ($outfile) {
840
915
  unless ($raf) {
@@ -842,13 +917,19 @@ sub ProcessJpeg2000Box($$$)
842
917
  $outBuff = '';
843
918
  $outfile = \$outBuff;
844
919
  }
920
+ # determine if we will be writing colr box
921
+ if ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'JP2Header') {
922
+ $doColour = 2 if defined $et->GetNewValue('ColorSpecMethod') or $et->GetNewValue('ICC_Profile') or
923
+ defined $et->GetNewValue('ColorSpecPrecedence') or defined $et->GetNewValue('ColorSpace') or
924
+ defined $et->GetNewValue('ColorSpecApproximation') or defined $et->GetNewValue('ColorSpecData');
925
+ }
845
926
  } else {
846
927
  # (must not set verbose flag when writing!)
847
928
  $verbose = $$et{OPTIONS}{Verbose};
848
929
  $et->VerboseDir($$dirInfo{DirName}) if $verbose;
849
930
  }
850
931
  # loop through all contained boxes
851
- my ($pos, $boxLen);
932
+ my ($pos, $boxLen, $lastBox);
852
933
  for ($pos=$dirStart; ; $pos+=$boxLen) {
853
934
  my ($boxID, $buff, $valuePtr);
854
935
  my $hdrLen = 8; # the box header length
@@ -857,9 +938,7 @@ sub ProcessJpeg2000Box($$$)
857
938
  my $n = $raf->Read($buff,$hdrLen);
858
939
  unless ($n == $hdrLen) {
859
940
  $n and $err = '', last;
860
- if ($outfile) {
861
- CreateNewBoxes($et, $outfile) or $err = 1;
862
- }
941
+ CreateNewBoxes($et, $outfile) or $err = 1 if $outfile;
863
942
  last;
864
943
  }
865
944
  $dataPt = \$buff;
@@ -871,6 +950,17 @@ sub ProcessJpeg2000Box($$$)
871
950
  }
872
951
  $boxLen = unpack("x$pos N",$$dataPt); # (length includes header and data)
873
952
  $boxID = substr($$dataPt, $pos+4, 4);
953
+ # remove old colr boxes if necessary
954
+ if ($doColour and $boxID eq 'colr') {
955
+ if ($doColour == 1) { # did we successfully write the new colr box?
956
+ $et->VPrint(1," - Jpeg2000:ColorSpec\n");
957
+ ++$$et{CHANGED};
958
+ next;
959
+ }
960
+ $et->Warn('Out-of-order colr box encountered');
961
+ undef $doColour;
962
+ }
963
+ $lastBox = $boxID;
874
964
  $pos += $hdrLen; # move to end of box header
875
965
  if ($boxLen == 1) {
876
966
  # box header contains an additional 8-byte integer for length
@@ -1009,8 +1099,10 @@ sub ProcessJpeg2000Box($$$)
1009
1099
  # remove this directory from our create list
1010
1100
  delete $$et{AddJp2Dirs}{$$tagInfo{Name}};
1011
1101
  my $newdir;
1012
- # only edit writable UUID and Exif boxes
1013
- if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL})) {
1102
+ # only edit writable UUID, Exif and jp2h boxes
1103
+ if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL}) or
1104
+ ($boxID eq 'jp2h' and $$et{EDIT_DIRS}{jp2h}))
1105
+ {
1014
1106
  $newdir = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
1015
1107
  next if defined $newdir and not length $newdir; # next if deleting the box
1016
1108
  } elsif (defined $uuid) {
@@ -1022,6 +1114,11 @@ sub ProcessJpeg2000Box($$$)
1022
1114
  my $boxhdr = pack('N', length($newdir) + 8 + $prefixLen) . $boxID;
1023
1115
  $boxhdr .= substr($$dataPt, $valuePtr, $prefixLen) if $prefixLen;
1024
1116
  Write($outfile, $boxhdr, $newdir) or $err = 1;
1117
+ # write new colr box immediately after ihdr
1118
+ if ($doColour and $boxID eq 'ihdr') {
1119
+ # (shouldn't be multiple ihdr boxes, but just in case, write only 1)
1120
+ $doColour = $doColour==2 ? CreateColorSpec($et, $outfile) : 0;
1121
+ }
1025
1122
  } else {
1026
1123
  # extract as a block if specified
1027
1124
  $subdirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract};
@@ -1258,7 +1355,7 @@ files.
1258
1355
 
1259
1356
  =head1 AUTHOR
1260
1357
 
1261
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1358
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1262
1359
 
1263
1360
  This library is free software; you can redistribute it and/or modify it
1264
1361
  under the same terms as Perl itself.
@@ -3252,7 +3252,7 @@ interpret Kodak maker notes EXIF meta information.
3252
3252
 
3253
3253
  =head1 AUTHOR
3254
3254
 
3255
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
3255
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
3256
3256
 
3257
3257
  This library is free software; you can redistribute it and/or modify it
3258
3258
  under the same terms as Perl itself.
@@ -152,7 +152,7 @@ meta information from Kyocera Contax N Digital RAW images.
152
152
 
153
153
  =head1 AUTHOR
154
154
 
155
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
155
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
156
156
 
157
157
  This library is free software; you can redistribute it and/or modify it
158
158
  under the same terms as Perl itself.
@@ -139,7 +139,7 @@ metadata from Leica Image File (LIF) images.
139
139
 
140
140
  =head1 AUTHOR
141
141
 
142
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
142
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
143
143
 
144
144
  This library is free software; you can redistribute it and/or modify it
145
145
  under the same terms as Perl itself.
@@ -699,7 +699,7 @@ information MS Shell Link (Windows shortcut) files.
699
699
 
700
700
  =head1 AUTHOR
701
701
 
702
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
702
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
703
703
 
704
704
  This library is free software; you can redistribute it and/or modify it
705
705
  under the same terms as Perl itself.
@@ -1570,7 +1570,7 @@ and values.
1570
1570
 
1571
1571
  =head1 AUTHOR
1572
1572
 
1573
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1573
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1574
1574
 
1575
1575
  This library is free software; you can redistribute it and/or modify it
1576
1576
  under the same terms as Perl itself.
@@ -8702,7 +8702,7 @@ and values.
8702
8702
 
8703
8703
  =head1 AUTHOR
8704
8704
 
8705
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
8705
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
8706
8706
 
8707
8707
  This library is free software; you can redistribute it and/or modify it
8708
8708
  under the same terms as Perl itself.
@@ -989,7 +989,7 @@ and values.
989
989
 
990
990
  =head1 AUTHOR
991
991
 
992
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
992
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
993
993
 
994
994
  This library is free software; you can redistribute it and/or modify it
995
995
  under the same terms as Perl itself.
@@ -1032,7 +1032,7 @@ and values.
1032
1032
 
1033
1033
  =head1 AUTHOR
1034
1034
 
1035
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1035
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1036
1036
 
1037
1037
  This library is free software; you can redistribute it and/or modify it
1038
1038
  under the same terms as Perl itself.
@@ -4005,7 +4005,7 @@ and values.
4005
4005
 
4006
4006
  =head1 AUTHOR
4007
4007
 
4008
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
4008
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
4009
4009
 
4010
4010
  This library is free software; you can redistribute it and/or modify it
4011
4011
  under the same terms as Perl itself.
@@ -2878,7 +2878,7 @@ and values.
2878
2878
 
2879
2879
  =head1 AUTHOR
2880
2880
 
2881
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2881
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2882
2882
 
2883
2883
  This library is free software; you can redistribute it and/or modify it
2884
2884
  under the same terms as Perl itself.
@@ -4751,7 +4751,7 @@ and values.
4751
4751
 
4752
4752
  =head1 AUTHOR
4753
4753
 
4754
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
4754
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
4755
4755
 
4756
4756
  This library is free software; you can redistribute it and/or modify it
4757
4757
  under the same terms as Perl itself.
@@ -7903,7 +7903,7 @@ and values.
7903
7903
 
7904
7904
  =head1 AUTHOR
7905
7905
 
7906
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
7906
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
7907
7907
 
7908
7908
  This library is free software; you can redistribute it and/or modify it
7909
7909
  under the same terms as Perl itself.
@@ -5841,7 +5841,7 @@ and values.
5841
5841
 
5842
5842
  =head1 AUTHOR
5843
5843
 
5844
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
5844
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
5845
5845
 
5846
5846
  This library is free software; you can redistribute it and/or modify it
5847
5847
  under the same terms as Perl itself.
@@ -2316,7 +2316,7 @@ and values.
2316
2316
 
2317
2317
  =head1 AUTHOR
2318
2318
 
2319
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2319
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2320
2320
 
2321
2321
  This library is free software; you can redistribute it and/or modify it
2322
2322
  under the same terms as Perl itself.
@@ -3208,7 +3208,7 @@ and values.
3208
3208
 
3209
3209
  =head1 AUTHOR
3210
3210
 
3211
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
3211
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
3212
3212
 
3213
3213
  This library is free software; you can redistribute it and/or modify it
3214
3214
  under the same terms as Perl itself.