From e4e3f080932f594ae761e531610cf4e68bf26a87 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 21 Oct 2023 13:46:01 +0000 Subject: [PATCH] Update GH pages using commit 60a6b8e784c3d9de633a4783be6ddda8bc56317c --- exif-reader.js | 2 +- exif-reader.js.map | 2 +- src/exif-reader.js | 30 +++++++++++++++++++++- src/image-header-webp.js | 7 ++++- src/image-header.js | 15 +++++++---- src/vp8x-tags.js | 55 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 src/vp8x-tags.js diff --git a/exif-reader.js b/exif-reader.js index 58f63e6..2074cd6 100644 --- a/exif-reader.js +++ b/exif-reader.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ExifReader=t():e.ExifReader=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:1,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:1})}},t={};function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t,n){for(var r=[],i=0;i=8){var t=l(e.slice(0,8));if("ASCII\0\0\0"===t)return l(e.slice(8));if("JIS\0\0\0\0\0"===t)return"[JIS encoded text]";if("UNICODE\0"===t)return"[Unicode encoded text]";if("\0\0\0\0\0\0\0\0"===t)return"[Undefined encoding]"}return"Undefined"}function p(e){return e[0][0]/e[0][1]+e[1][0]/e[1][1]/60+e[2][0]/e[2][1]/3600}var m=18761,g=m,v=function(e,t){if(e.getUint16(t)===m)return m;if(19789===e.getUint16(t))return 19789;throw Error("Illegal byte order value. Faulty image.")},h=65505;function y(e,t){return 65472===e.getUint16(t)}function S(e,t){return 65474===e.getUint16(t)}function b(e,t){return 65506===e.getUint16(t)&&"ICC_PROFILE\0"===r(e,t+4,12)}function C(e,t){return 65506===e.getUint16(t)&&"MPF\0"===r(e,t+4,4)}function A(e,t){return 65504===e.getUint16(t)&&"JFIF"===r(e,t+4,4)&&0===e.getUint8(t+4+4)}function I(e,t){return e.getUint16(t)===h&&"Exif"===r(e,t+4,4)&&0===e.getUint8(t+4+4)}function P(e,t){return e.getUint16(t)===h&&function(e,t){return"http://ns.adobe.com/xap/1.0/\0"===r(e,t+4,29)}(e,t)}function U(e,t){return e.getUint16(t)===h&&function(e,t){return"http://ns.adobe.com/xmp/extension/\0"===r(e,t+4,35)}(e,t)}function w(e,t){return{dataOffset:e+33,length:t-31}}function T(e,t){return{dataOffset:e+79,length:t-77}}function D(e,t){return 65517===e.getUint16(t)&&"Photoshop 3.0"===r(e,t+4,13)&&0===e.getUint8(t+4+13)}function x(e,t){var n=e.getUint16(t);return n>=65504&&n<=65519||65534===n||65472===n||65474===n||65476===n||65499===n||65501===n||65498===n}function M(e,t){return 65535===e.getUint16(t)}var O="‰PNG\r\n\n",F="iTXt",R="pHYs",L="tIME";function k(e,t){return"IHDR"===r(e,t+4,4)}function E(e,t){return"iTXt"===r(e,t+4,4)&&"XML:com.adobe.xmp\0"===r(e,t+8,18)}function N(e,t){var n=r(e,t+4,4);return"tEXt"===n||"iTXt"===n}function G(e,t){return"eXIf"===r(e,t+4,4)}function B(e,t){var n=[R,L],i=r(e,t+4,4);return n.includes(i)}function j(e,t){t+=28;for(var n=0;n<2&&t=4&&function(e){var t=e.getUint16(0)===g;return 42===e.getUint16(2,t)}(e)}(e))return{hasAppMarkers:1,tiffHeaderOffset:0};if(function(e){return!!e&&e.byteLength>=2&&65496===e.getUint16(0)}(e))return function(e){for(var t,n,r,i,o,a,u,c,f,s=2;s+4+5<=e.byteLength;){if(y(e,s))n=s+2;else if(S(e,s))r=s+2;else if(A(e,s))t=e.getUint16(s+2),i=s+2;else if(I(e,s))t=e.getUint16(s+2),o=s+10;else if(P(e,s))u||(u=[]),t=e.getUint16(s+2),u.push(w(s,t));else if(U(e,s))u||(u=[]),t=e.getUint16(s+2),u.push(T(s,t));else if(D(e,s))t=e.getUint16(s+2),a=s+18;else if(b(e,s)){var l=s+18,d=(t=e.getUint16(s+2))-16,p=e.getUint8(s+16),m=e.getUint8(s+17);c||(c=[]),c.push({offset:l,length:d,chunkNumber:p,chunksTotal:m})}else if(C(e,s))t=e.getUint16(s+2),f=s+8;else{if(!x(e,s)){if(M(e,s)){s++;continue}break}t=e.getUint16(s+2)}s+=2+t}return{hasAppMarkers:s>2,fileDataOffset:n||r,jfifDataOffset:i,tiffHeaderOffset:o,iptcDataOffset:a,xmpChunks:u,iccChunks:c,mpfDataOffset:f}}(e);if(function(e){return!!e&&r(e,0,8)===O}(e))return function(e){for(var t={hasAppMarkers:0},n=8;n+4+4<=e.byteLength;){if(k(e,n))t.hasAppMarkers=1,t.pngHeaderOffset=n+8;else if(E(e,n)){var i=j(e,n);void 0!==i&&(t.hasAppMarkers=1,t.xmpChunks=[{dataOffset:i,length:e.getUint32(n+0)-(i-(n+8))}])}else if(N(e,n)){t.hasAppMarkers=1;var o=r(e,n+4,4);t.pngTextChunks||(t.pngTextChunks=[]),t.pngTextChunks.push({length:e.getUint32(n+0),type:o,offset:n+8})}else G(e,n)?(t.hasAppMarkers=1,t.tiffHeaderOffset=n+8):B(e,n)&&(t.hasAppMarkers=1,t.pngChunkOffsets||(t.pngChunkOffsets=[]),t.pngChunkOffsets.push(n+0));n+=e.getUint32(n+0)+4+4+4}return t}(e);if(function(e){if(!e)return 0;var t=r(e,8,4);return"ftyp"===r(e,4,4)&&-1!==["heic","heix","hevc","hevx","heim","heis","hevm","hevs","mif1"].indexOf(t)}(e))return function(e){var t=function(e){for(var t=0;t+4+4<=e.byteLength;){var n=z(e,t);if(n>=8&&"meta"===r(e,t+4,4))return{offset:t,length:n};t+=n}return{offset:void 0,length:0}}(e),n=t.offset,i=t.length;if(void 0===n)return{hasAppMarkers:0};var o=Math.min(n+i,e.byteLength),a=function(e,t,n){for(var i={ilocOffset:void 0,exifItemOffset:void 0,colrOffset:void 0};t+4<=n&&(!i.ilocOffset||!i.exifItemOffset||!i.colrOffset);){var o=r(e,t,4);"iloc"===o?i.ilocOffset=t:"Exif"===o?i.exifItemOffset=t+-4:"colr"===o&&(i.colrOffset=t+-4),t++}return i}(e,n,o),u=a.exifItemOffset,c=a.ilocOffset,f=a.colrOffset,s=function(e,t,n,r){if(n&&t&&!(t+2>r)){var i=e.getUint16(t);for(n+=12;n+16<=r;){if(e.getUint16(n)===i){var o=e.getUint32(n+8);if(o+4<=e.byteLength)return o+(e.getUint32(o)+4)}n+=16}}}(e,u,c,o),l=function(e,t,n){if(t&&!(t+12>n)){var i=r(e,t+8,4);if("prof"===i||"rICC"===i)return[{offset:t+12,length:z(e,t)-12,chunkNumber:1,chunksTotal:1}]}}(e,f,o);return{hasAppMarkers:void 0!==s||void 0!==l,tiffHeaderOffset:s,iccChunks:l}}(e);if(function(e){return!!e&&"RIFF"===r(e,0,4)&&"WEBP"===r(e,8,4)}(e))return function(e){for(var t,n,i,o=12,a=0;o+8=e[1]?"".concat(Math.round(e[0]/e[1])):0!==e[0]?"1/".concat(Math.round(e[1]/e[0])):"0/".concat(e[1])},FNumber:function(e){return"f/".concat(e[0]/e[1])},FocalLength:function(e){return e[0]/e[1]+" mm"},FocalPlaneResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},LightSource:function(e){return 1===e?"Daylight":2===e?"Fluorescent":3===e?"Tungsten (incandescent light)":4===e?"Flash":9===e?"Fine weather":10===e?"Cloudy weather":11===e?"Shade":12===e?"Daylight fluorescent (D 5700 – 7100K)":13===e?"Day white fluorescent (N 4600 – 5400K)":14===e?"Cool white fluorescent (W 3900 – 4500K)":15===e?"White fluorescent (WW 3200 – 3700K)":17===e?"Standard light A":18===e?"Standard light B":19===e?"Standard light C":20===e?"D55":21===e?"D65":22===e?"D75":23===e?"D50":24===e?"ISO studio tungsten":255===e?"Other light source":"Unknown"},MeteringMode:function(e){return 1===e?"Average":2===e?"CenterWeightedAverage":3===e?"Spot":4===e?"MultiSpot":5===e?"Pattern":6===e?"Partial":255===e?"Other":"Unknown"},ResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},Saturation:function(e){return 0===e?"Normal":1===e?"Low saturation":2===e?"High saturation":"Unknown"},SceneCaptureType:function(e){return 0===e?"Standard":1===e?"Landscape":2===e?"Portrait":3===e?"Night scene":"Unknown"},Sharpness:function(e){return 0===e?"Normal":1===e?"Soft":2===e?"Hard":"Unknown"},ShutterSpeedValue:function(e){var t=Math.pow(2,e[0]/e[1]);return t<=1?"".concat(Math.round(1/t)):"1/".concat(Math.round(t))},WhiteBalance:function(e){return 0===e?"Auto white balance":1===e?"Manual white balance":"Unknown"},XResolution:function(e){return""+Math.round(e[0]/e[1])},YResolution:function(e){return""+Math.round(e[0]/e[1])}},J={11:"ProcessingSoftware",254:{name:"SubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image",3:"Single page of multi-page reduced-resolution image",4:"Transparency mask",5:"Transparency mask of reduced-resolution image",6:"Transparency mask of multi-page image",7:"Transparency mask of reduced-resolution multi-page image",65537:"Alternate reduced-resolution image",4294967295:"Invalid"}[e]||"Unknown"}},255:{name:"OldSubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image"}[e]||"Unknown"}},256:"ImageWidth",257:"ImageLength",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",263:{name:"Thresholding",description:function(e){return{1:"No dithering or halftoning",2:"Ordered dither or halfton",3:"Randomized dither"}[e]||"Unknown"}},264:"CellWidth",265:"CellLength",266:{name:"FillOrder",description:function(e){return{1:"Normal",2:"Reversed"}[e]||"Unknown"}},269:"DocumentName",270:"ImageDescription",271:"Make",272:"Model",273:"StripOffsets",274:{name:"Orientation",description:function(e){return 1===e?"top-left":2===e?"top-right":3===e?"bottom-right":4===e?"bottom-left":5===e?"left-top":6===e?"right-top":7===e?"right-bottom":8===e?"left-bottom":"Undefined"}},277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",280:"MinSampleValue",281:"MaxSampleValue",282:{name:"XResolution",description:K.XResolution},283:{name:"YResolution",description:K.YResolution},284:"PlanarConfiguration",285:"PageName",286:{name:"XPosition",description:function(e){return""+Math.round(e[0]/e[1])}},287:{name:"YPosition",description:function(e){return""+Math.round(e[0]/e[1])}},290:{name:"GrayResponseUnit",description:function(e){return{1:"0.1",2:"0.001",3:"0.0001",4:"1e-05",5:"1e-06"}[e]||"Unknown"}},296:{name:"ResolutionUnit",description:K.ResolutionUnit},297:"PageNumber",301:"TransferFunction",305:"Software",306:"DateTime",315:"Artist",316:"HostComputer",317:"Predictor",318:{name:"WhitePoint",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},319:{name:"PrimaryChromaticities",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},321:"HalftoneHints",322:"TileWidth",323:"TileLength",330:"A100DataOffset",332:{name:"InkSet",description:function(e){return{1:"CMYK",2:"Not CMYK"}[e]||"Unknown"}},337:"TargetPrinter",338:{name:"ExtraSamples",description:function(e){return{0:"Unspecified",1:"Associated Alpha",2:"Unassociated Alpha"}[e]||"Unknown"}},339:{name:"SampleFormat",description:function(e){var t={1:"Unsigned",2:"Signed",3:"Float",4:"Undefined",5:"Complex int",6:"Complex float"};return Array.isArray(e)?e.map((function(e){return t[e]||"Unknown"})).join(", "):"Unknown"}},513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",529:{name:"YCbCrCoefficients",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join("/")}},530:"YCbCrSubSampling",531:{name:"YCbCrPositioning",description:function(e){return 1===e?"centered":2===e?"co-sited":"undefined "+e}},532:{name:"ReferenceBlackWhite",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join(", ")}},700:"ApplicationNotes",18246:"Rating",18249:"RatingPercent",33432:{name:"Copyright",description:function(e){return e.join("; ")}},33550:"PixelScale",33723:"IPTC-NAA",33920:"IntergraphMatrix",33922:"ModelTiePoint",34118:"SEMInfo",34264:"ModelTransform",34377:"PhotoshopSettings",34665:"Exif IFD Pointer",34675:"ICC_Profile",34735:"GeoTiffDirectory",34736:"GeoTiffDoubleParams",34737:"GeoTiffAsciiParams",34853:"GPS Info IFD Pointer",40091:"XPTitle",40092:"XPComment",40093:"XPAuthor",40094:"XPKeywords",40095:"XPSubject",42112:"GDALMetadata",42113:"GDALNoData",50341:"PrintIM",50707:"DNGBackwardVersion",50708:"UniqueCameraModel",50709:"LocalizedCameraModel",50721:"ColorMatrix1",50722:"ColorMatrix2",50723:"CameraCalibration1",50724:"CameraCalibration2",50725:"ReductionMatrix1",50726:"ReductionMatrix2",50727:"AnalogBalance",50728:"AsShotNeutral",50729:"AsShotWhiteXY",50730:"BaselineExposure",50731:"BaselineNoise",50732:"BaselineSharpness",50734:"LinearResponseLimit",50735:"CameraSerialNumber",50736:"DNGLensInfo",50739:"ShadowScale",50741:{name:"MakerNoteSafety",description:function(e){return{0:"Unsafe",1:"Safe"}[e]||"Unknown"}},50778:{name:"CalibrationIlluminant1",description:K.LightSource},50779:{name:"CalibrationIlluminant2",description:K.LightSource},50781:"RawDataUniqueID",50827:"OriginalRawFileName",50828:"OriginalRawFileData",50831:"AsShotICCProfile",50832:"AsShotPreProfileMatrix",50833:"CurrentICCProfile",50834:"CurrentPreProfileMatrix",50879:"ColorimetricReference",50885:"SRawType",50898:"PanasonicTitle",50899:"PanasonicTitle2",50931:"CameraCalibrationSig",50932:"ProfileCalibrationSig",50933:"ProfileIFD",50934:"AsShotProfileName",50936:"ProfileName",50937:"ProfileHueSatMapDims",50938:"ProfileHueSatMapData1",50939:"ProfileHueSatMapData2",50940:"ProfileToneCurve",50941:{name:"ProfileEmbedPolicy",description:function(e){return{0:"Allow Copying",1:"Embed if Used",2:"Never Embed",3:"No Restrictions"}[e]||"Unknown"}},50942:"ProfileCopyright",50964:"ForwardMatrix1",50965:"ForwardMatrix2",50966:"PreviewApplicationName",50967:"PreviewApplicationVersion",50968:"PreviewSettingsName",50969:"PreviewSettingsDigest",50970:{name:"PreviewColorSpace",description:function(e){return{1:"Gray Gamma 2.2",2:"sRGB",3:"Adobe RGB",4:"ProPhoto RGB"}[e]||"Unknown"}},50971:"PreviewDateTime",50972:"RawImageDigest",50973:"OriginalRawFileDigest",50981:"ProfileLookTableDims",50982:"ProfileLookTableData",51043:"TimeCodes",51044:"FrameRate",51058:"TStop",51081:"ReelName",51089:"OriginalDefaultFinalSize",51090:"OriginalBestQualitySize",51091:"OriginalDefaultCropSize",51105:"CameraLabel",51107:{name:"ProfileHueSatMapEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51108:{name:"ProfileLookTableEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51109:"BaselineExposureOffset",51110:{name:"DefaultBlackRender",description:function(e){return{0:"Auto",1:"None"}[e]||"Unknown"}},51111:"NewRawImageDigest",51112:"RawToPreviewGain"};function $(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n>31&1,e>>30&1,e>>29&1],n=[];return t[0]&&n.push("Dependent Parent Image"),t[1]&&n.push("Dependent Child Image"),t[2]&&n.push("Representative Image"),{value:t,description:n.join(", ")||"None"}}function ge(e){var t=e>>24&7;return{value:t,description:0===t?"JPEG":"Unknown"}}function ve(e){var t=16777215&e;return{value:t,description:{196608:"Baseline MP Primary Image",65537:"Large Thumbnail (VGA equivalent)",65538:"Large Thumbnail (Full HD equivalent)",131073:"Multi-Frame Image (Panorama)",131074:"Multi-Frame Image (Disparity)",131075:"Multi-Frame Image (Multi-Angle)",0:"Undefined"}[t]||"Unknown"}}function he(e){return 0===e}function ye(e,t,n,r,i,o){var a=X.getTypeSize("SHORT"),u={},c=function(e,t,n){return t+X.getTypeSize("SHORT")<=e.byteLength?X.getShortAt(e,t,n):0}(e,r,i);r+=a;for(var f=0;fe.byteLength);f++){var s=Se(e,t,n,r,i,o);void 0!==s&&(u[s.name]={id:s.id,value:s.value,description:s.description}),r+=12}if(r"}l===X.tagTypes.ASCII&&(a=function(e){try{return e.map((function(e){return decodeURIComponent(escape(e))}))}catch(t){return e}}(a=function(e){for(var t=[],n=0,r=0;r5&&void 0!==arguments[5]?arguments[5]:0,a=[];o&&(r*=X.typeSizes[n],n=X.tagTypes.BYTE);for(var u=0;un)){var r=X.getByteAt(e,t+7);return{value:r,description:""+r}}}(e,t,n);return{"Bits Per Sample":Ie(e,t,n),"Image Height":Pe(e,t,n),"Image Width":Ue(e,t,n),"Color Components":r,Subsampling:r&&we(e,t,r.value,n)}};function Ie(e,t,n){if(!(3>n)){var r=X.getByteAt(e,t+2);return{value:r,description:""+r}}}function Pe(e,t,n){if(!(5>n)){var r=X.getShortAt(e,t+3);return{value:r,description:"".concat(r,"px")}}}function Ue(e,t,n){if(!(7>n)){var r=X.getShortAt(e,t+5);return{value:r,description:"".concat(r,"px")}}}function we(e,t,n,r){if(!(8+3*n>r)){for(var i=[],o=0;o1?Te(i)+De(i):""}}}function Te(e){var t={1:"Y",2:"Cb",3:"Cr",4:"I",5:"Q"};return e.map((function(e){return t[e[0]]})).join("")}function De(e){var t={17:"4:4:4 (1 1)",18:"4:4:0 (1 2)",20:"4:4:1 (1 4)",33:"4:2:2 (2 1)",34:"4:2:0 (2 2)",36:"4:2:1 (2 4)",65:"4:1:1 (4 1)",66:"4:1:0 (4 2)"};return 0===e.length||void 0===e[0][1]||void 0===t[e[0][1]]?"":t[e[0][1]]}var xe=function(e,t){var n=function(e,t){return X.getShortAt(e,t)}(e,t),r=function(e,t,n){if(!(15>n)){var r=X.getByteAt(e,t+14);return{value:r,description:"".concat(r,"px")}}}(e,t,n),i=function(e,t,n){if(!(16>n)){var r=X.getByteAt(e,t+15);return{value:r,description:"".concat(r,"px")}}}(e,t,n),o={"JFIF Version":Me(e,t,n),"Resolution Unit":Oe(e,t,n),XResolution:Re(e,t,n),YResolution:Le(e,t,n),"JFIF Thumbnail Width":r,"JFIF Thumbnail Height":i};if(void 0!==r&&void 0!==i){var a=function(e,t,n,r){if(!(0===n||16+n>r))return{value:e.buffer.slice(t+16,t+16+n),description:"<24-bit RGB pixel data>"}}(e,t,3*r.value*i.value,n);a&&(o["JFIF Thumbnail"]=a)}for(var u in o)void 0===o[u]&&delete o[u];return o};function Me(e,t,n){if(!(9>n)){var r=X.getByteAt(e,t+7),i=X.getByteAt(e,t+7+1);return{value:256*r+i,description:r+"."+i}}}function Oe(e,t,n){if(!(10>n)){var r=X.getByteAt(e,t+9);return{value:r,description:Fe(r)}}}function Fe(e){return 0===e?"None":1===e?"inches":2===e?"cm":"Unknown"}function Re(e,t,n){if(!(12>n)){var r=X.getShortAt(e,t+10);return{value:r,description:""+r}}}function Le(e,t,n){if(!(14>n)){var r=X.getShortAt(e,t+12);return{value:r,description:""+r}}}var ke={iptc:{256:{name:"Model Version",description:function(e){return""+((e[0]<<8)+e[1])}},261:{name:"Destination",repeatable:1},276:{name:"File Format",description:function(e){return""+((e[0]<<8)+e[1])}},278:{name:"File Format Version",description:function(e){return""+((e[0]<<8)+e[1])}},286:"Service Identifier",296:"Envelope Number",306:"Product ID",316:"Envelope Priority",326:{name:"Date Sent",description:Ee},336:{name:"Time Sent",description:Ne},346:{name:"Coded Character Set",description:Ge,encoding_name:Ge},356:"UNO",376:{name:"ARM Identifier",description:function(e){return""+((e[0]<<8)+e[1])}},378:{name:"ARM Version",description:function(e){return""+((e[0]<<8)+e[1])}},512:{name:"Record Version",description:function(e){return""+((e[0]<<8)+e[1])}},515:"Object Type Reference",516:"Object Attribute Reference",517:"Object Name",519:"Edit Status",520:{name:"Editorial Update",description:function(e){return"01"===l(e)?"Additional Language":"Unknown"}},522:"Urgency",524:{name:"Subject Reference",repeatable:1,description:function(e){var t=l(e).split(":");return t[2]+(t[3]?"/"+t[3]:"")+(t[4]?"/"+t[4]:"")}},527:"Category",532:{name:"Supplemental Category",repeatable:1},534:"Fixture Identifier",537:{name:"Keywords",repeatable:1},538:{name:"Content Location Code",repeatable:1},539:{name:"Content Location Name",repeatable:1},542:"Release Date",547:"Release Time",549:"Expiration Date",550:"Expiration Time",552:"Special Instructions",554:{name:"Action Advised",description:function(e){var t=l(e);return"01"===t?"Object Kill":"02"===t?"Object Replace":"03"===t?"Object Append":"04"===t?"Object Reference":"Unknown"}},557:{name:"Reference Service",repeatable:1},559:{name:"Reference Date",repeatable:1},562:{name:"Reference Number",repeatable:1},567:{name:"Date Created",description:Ee},572:{name:"Time Created",description:Ne},574:{name:"Digital Creation Date",description:Ee},575:{name:"Digital Creation Time",description:Ne},577:"Originating Program",582:"Program Version",587:{name:"Object Cycle",description:function(e){var t=l(e);return"a"===t?"morning":"p"===t?"evening":"b"===t?"both":"Unknown"}},592:{name:"By-line",repeatable:1},597:{name:"By-line Title",repeatable:1},602:"City",604:"Sub-location",607:"Province/State",612:"Country/Primary Location Code",613:"Country/Primary Location Name",615:"Original Transmission Reference",617:"Headline",622:"Credit",627:"Source",628:"Copyright Notice",630:{name:"Contact",repeatable:1},632:"Caption/Abstract",634:{name:"Writer/Editor",repeatable:1},637:{name:"Rasterized Caption",description:function(e){return e}},642:"Image Type",643:{name:"Image Orientation",description:function(e){var t=l(e);return"P"===t?"Portrait":"L"===t?"Landscape":"S"===t?"Square":"Unknown"}},647:"Language Identifier",662:{name:"Audio Type",description:function(e){var t=l(e),n=t.charAt(0),r=t.charAt(1),i="";return"1"===n?i+="Mono":"2"===n&&(i+="Stereo"),"A"===r?i+=", actuality":"C"===r?i+=", question and answer session":"M"===r?i+=", music, transmitted by itself":"Q"===r?i+=", response to a question":"R"===r?i+=", raw sound":"S"===r?i+=", scener":"V"===r?i+=", voicer":"W"===r&&(i+=", wrap"),""!==i?i:t}},663:{name:"Audio Sampling Rate",description:function(e){return parseInt(l(e),10)+" Hz"}},664:{name:"Audio Sampling Resolution",description:function(e){var t=parseInt(l(e),10);return t+(1===t?" bit":" bits")}},665:{name:"Audio Duration",description:function(e){var t=l(e);return t.length>=6?t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2):t}},666:"Audio Outcue",698:"Short Document ID",699:"Unique Document ID",700:"Owner ID",712:{name:function(e){return 2===e.length?"ObjectData Preview File Format":"Record 2 destination"},description:function(e){if(2===e.length){var t=(e[0]<<8)+e[1];return 0===t?"No ObjectData":1===t?"IPTC-NAA Digital Newsphoto Parameter Record":2===t?"IPTC7901 Recommended Message Format":3===t?"Tagged Image File Format (Adobe/Aldus Image data)":4===t?"Illustrator (Adobe Graphics data)":5===t?"AppleSingle (Apple Computer Inc)":6===t?"NAA 89-3 (ANPA 1312)":7===t?"MacBinary II":8===t?"IPTC Unstructured Character Oriented File Format (UCOFF)":9===t?"United Press International ANPA 1312 variant":10===t?"United Press International Down-Load Message":11===t?"JPEG File Interchange (JFIF)":12===t?"Photo-CD Image-Pac (Eastman Kodak)":13===t?"Microsoft Bit Mapped Graphics File [*.BMP]":14===t?"Digital Audio File [*.WAV] (Microsoft & Creative Labs)":15===t?"Audio plus Moving Video [*.AVI] (Microsoft)":16===t?"PC DOS/Windows Executable Files [*.COM][*.EXE]":17===t?"Compressed Binary File [*.ZIP] (PKWare Inc)":18===t?"Audio Interchange File Format AIFF (Apple Computer Inc)":19===t?"RIFF Wave (Microsoft Corporation)":20===t?"Freehand (Macromedia/Aldus)":21===t?'Hypertext Markup Language "HTML" (The Internet Society)':22===t?"MPEG 2 Audio Layer 2 (Musicom), ISO/IEC":23===t?"MPEG 2 Audio Layer 3, ISO/IEC":24===t?"Portable Document File (*.PDF) Adobe":25===t?"News Industry Text Format (NITF)":26===t?"Tape Archive (*.TAR)":27===t?"Tidningarnas Telegrambyrå NITF version (TTNITF DTD)":28===t?"Ritzaus Bureau NITF version (RBNITF DTD)":29===t?"Corel Draw [*.CDR]":"Unknown format ".concat(t)}return l(e)}},713:{name:"ObjectData Preview File Format Version",description:function(e,t){var n={"00":{"00":"1"},"01":{"01":"1","02":"2","03":"3","04":"4"},"02":{"04":"4"},"03":{"01":"5.0","02":"6.0"},"04":{"01":"1.40"},"05":{"01":"2"},"06":{"01":"1"},11:{"01":"1.02"},20:{"01":"3.1","02":"4.0","03":"5.0","04":"5.5"},21:{"02":"2.0"}},r=l(e);if(t["ObjectData Preview File Format"]){var i=l(t["ObjectData Preview File Format"].value);if(n[i]&&n[i][r])return n[i][r]}return r}},714:"ObjectData Preview Data",1802:{name:"Size Mode",description:function(e){return e[0].toString()}},1812:{name:"Max Subfile Size",description:function(e){for(var t=0,n=0;n=8?t.substr(0,4)+"-"+t.substr(4,2)+"-"+t.substr(6,2):t}function Ne(e){var t=l(e),n=t;return t.length>=6&&(n=t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2),11===t.length&&(n+=t.substr(6,1)+t.substr(7,2)+":"+t.substr(9,2))),n}function Ge(e){var t=l(e);return"%G"===t?"UTF-8":"%5"===t?"Windows-1252":"%/G"===t?"UTF-8 Level 1":"%/H"===t?"UTF-8 Level 2":"%/I"===t?"UTF-8 Level 3":"/A"===t?"ISO-8859-1":"/B"===t?"ISO-8859-2":"/C"===t?"ISO-8859-3":"/D"===t?"ISO-8859-4":"/@"===t?"ISO-8859-5":"/G"===t?"ISO-8859-6":"/F"===t?"ISO-8859-7":"/H"===t?"ISO-8859-8":"Unknown"}var Be=function(e,t){var n=function(){if("undefined"!=typeof TextDecoder)return TextDecoder}();if("undefined"!=typeof n&&void 0!==e)try{return new n(e).decode(Uint8Array.from(t))}catch(e){}return function(e){try{return decodeURIComponent(escape(e))}catch(t){return e}}(t.map((function(e){return String.fromCharCode(e)})).join(""))},je=function(e,t,n){try{if(Array.isArray(e))return He(new DataView(Uint8Array.from(e).buffer),{size:e.length},0,n);var r=function(e,t){for(;t+12<=e.byteLength;){var n=ze(e,t);if(Ve(n))return{naaBlock:n,dataOffset:t+12};t+=12+n.size+We(n)}throw Error("No IPTC NAA resource block.")}(e,t);return He(e,r.naaBlock,r.dataOffset,n)}catch(e){return{}}};function ze(e,t){if(943868237!==e.getUint32(t,0))throw Error("Not an IPTC resource block.");return{type:e.getUint16(t+4),size:e.getUint16(t+10)}}function Ve(e){return 1028===e.type}function We(e){return e.size%2!=0?1:0}function He(e,t,n,r){for(var i={},o=void 0,a=n+t.size;ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n1&&n.push(nt(e,t.slice(1))),n}(e,t),2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o=[],a=1,u=0;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(o.push(r.value),2!==o.length);a=1);}catch(e){u=1,i=e}finally{try{a||null==n.return||n.return()}finally{if(u)throw i}}return o}}(r)||function(e,t){if(e){if("string"==typeof e)return et(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?et(e,2):void 0}}(r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],a=i[1],u=rt(n,o);if(a){var c=rt(n,a);u||c||(delete n._raw,rt(n,nt(e,t)))}return n};function nt(e,t){for(var n=t.reduce((function(e,t){return e+t.length}),0),r=new Uint8Array(n),i=0,o=0;o).+$/,"$1"),"application/xml");if("parsererror"===i.documentElement.nodeName)throw Error(i.documentElement.textContent);return{doc:i,raw:n}}(t),i=n.doc,o=n.raw;return e._raw=(e._raw||"")+o,a(e,lt(ot(it(i),1))),1}catch(e){return 0}}function it(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:0,n=at(e);return ut(n)?t?{}:ct(n[0]):ft(n)}function at(e){for(var t=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:void 0;if(Array.isArray(e)){var n=ht(e);return t&&"function"==typeof Ke[t]?Ke[t](e,n):n}if("object"===Ze(e))return yt(e);try{return t&&"function"==typeof Ke[t]?Ke[t](e):decodeURIComponent(escape(e))}catch(t){return e}}function ht(e){return e.map((function(e){return void 0!==e.value?vt(e.value):vt(e)})).join(", ")}function yt(e){var t=[];for(var n in e)t.push("".concat(St(n),": ").concat(vt(e[n].value)));return t.join("; ")}function St(e){return"CiAdrCity"===e?"CreatorCity":"CiAdrCtry"===e?"CreatorCountry":"CiAdrExtadr"===e?"CreatorAddress":"CiAdrPcode"===e?"CreatorPostalCode":"CiAdrRegion"===e?"CreatorRegion":"CiEmailWork"===e?"CreatorWorkEmail":"CiTelWork"===e?"CreatorWorkPhone":"CiUrlWork"===e?"CreatorWorkUrl":e}function bt(e){var t={};for(var n in e)mt(n)||(t[gt(n)]=Ct(e[n],n));return t}function Ct(e,t){return At(e)?It(e,t):Ut(e)?wt(e,t):Tt(e)?Dt(e,t):function(e){return void 0!==xt(e.value)}(e)?function(e,t){var n=xt(e.value).value["rdf:li"],r=Pt(e),i=[];return void 0===n?n=[]:Array.isArray(n)||(n=[n]),n.forEach((function(e){i.push(function(e){return At(e)?It(e):Ut(e)?wt(e).value:Tt(e)?Dt(e).value:Mt(e)}(e))})),{value:i,attributes:r,description:vt(i,t)}}(e,t):Mt(e,t)}function At(e){return"Resource"===e.attributes["rdf:parseType"]&&void 0!==e.value["rdf:value"]||void 0!==e.value["rdf:Description"]&&void 0!==e.value["rdf:Description"].value["rdf:value"]}function It(e,t){var n=Pt(e);void 0!==e.value["rdf:Description"]&&(e=e.value["rdf:Description"]),a(n,Pt(e),function(e){var t={};for(var n in e.value)"rdf:value"===n||mt(n)||(t[gt(n)]=e.value[n].value);return t}(e));var r=function(e){return Ot(e.value["rdf:value"])||e.value["rdf:value"].value}(e);return{value:r,attributes:n,description:vt(r,t)}}function Pt(e){var t={};for(var n in e.attributes)"rdf:parseType"===n||"rdf:resource"===n||mt(n)||(t[gt(n)]=e.attributes[n]);return t}function Ut(e){return"Resource"===e.attributes["rdf:parseType"]||void 0!==e.value["rdf:Description"]&&void 0===e.value["rdf:Description"].value["rdf:value"]}function wt(e,t){var n={value:{},attributes:{}};return void 0!==e.value["rdf:Description"]&&(a(n.value,dt(e.value["rdf:Description"].attributes)),a(n.attributes,Pt(e)),e=e.value["rdf:Description"]),a(n.value,bt(e.value)),n.description=vt(n.value,t),n}function Tt(e){return 0===Object.keys(e.value).length&&void 0===e.attributes["xml:lang"]&&void 0===e.attributes["rdf:resource"]}function Dt(e,t){var n=dt(e.attributes);return{value:n,attributes:{},description:vt(n,t)}}function xt(e){return e["rdf:Bag"]||e["rdf:Seq"]||e["rdf:Alt"]}function Mt(e,t){var n=Ot(e)||lt(e.value);return{value:n,attributes:Pt(e),description:vt(n,t)}}function Ot(e){return e.attributes&&e.attributes["rdf:resource"]}var Ft={desc:{name:"ICC Description"},cprt:{name:"ICC Copyright"},dmdd:{name:"ICC Device Model Description"},vued:{name:"ICC Viewing Conditions Description"},dmnd:{name:"ICC Device Manufacturer for Display"},tech:{name:"Technology"}},Rt={4:{name:"Preferred CMM type",value:function(e,t){return r(e,t,4)},description:function(e){return null!==e?Lt(e):""}},8:{name:"Profile Version",value:function(e,t){return e.getUint8(t).toString(10)+"."+(e.getUint8(t+1)>>4).toString(10)+"."+(e.getUint8(t+1)%16).toString(10)}},12:{name:"Profile/Device class",value:function(e,t){return r(e,t,4)},description:function(e){switch(e.toLowerCase()){case"scnr":return"Input Device profile";case"mntr":return"Display Device profile";case"prtr":return"Output Device profile";case"link":return"DeviceLink profile";case"abst":return"Abstract profile";case"spac":return"ColorSpace profile";case"nmcl":return"NamedColor profile";case"cenc":return"ColorEncodingSpace profile";case"mid ":return"MultiplexIdentification profile";case"mlnk":return"MultiplexLink profile";case"mvis":return"MultiplexVisualization profile";default:return e}}},16:{name:"Color Space",value:function(e,t){return r(e,t,4)}},20:{name:"Connection Space",value:function(e,t){return r(e,t,4)}},24:{name:"ICC Profile Date",value:function(e,t){return function(e,t){var n=e.getUint16(t),r=e.getUint16(t+2)-1,i=e.getUint16(t+4),o=e.getUint16(t+6),a=e.getUint16(t+8),u=e.getUint16(t+10);return new Date(Date.UTC(n,r,i,o,a,u))}(e,t).toISOString()}},36:{name:"ICC Signature",value:function(e,t){return n=e.buffer.slice(t,t+4),String.fromCharCode.apply(null,new Uint8Array(n));var n}},40:{name:"Primary Platform",value:function(e,t){return r(e,t,4)},description:function(e){return Lt(e)}},48:{name:"Device Manufacturer",value:function(e,t){return r(e,t,4)},description:function(e){return Lt(e)}},52:{name:"Device Model Number",value:function(e,t){return r(e,t,4)}},64:{name:"Rendering Intent",value:function(e,t){return e.getUint32(t)},description:function(e){switch(e){case 0:return"Perceptual";case 1:return"Relative Colorimetric";case 2:return"Saturation";case 3:return"Absolute Colorimetric";default:return e}}},80:{name:"Profile Creator",value:function(e,t){return r(e,t,4)}}};function Lt(e){switch(e.toLowerCase()){case"appl":return"Apple";case"adbe":return"Adobe";case"msft":return"Microsoft";case"sunw":return"Sun Microsystems";case"sgi":return"Silicon Graphics";case"tgnt":return"Taligent";default:return e}}var kt=function(e,t){try{for(var n=t.reduce((function(e,t){return e+t.length}),0),o=new Uint8Array(n),a=0,u=function(e){return Array.isArray(e)?new DataView(Uint8Array.from(e).buffer).buffer:e.buffer}(e),c=function(e){var n=t.find((function(t){return t.chunkNumber===e}));if(!n)throw Error("ICC chunk ".concat(e," not found"));var r=u.slice(n.offset,n.offset+n.length),i=new Uint8Array(r);o.set(i,a),a+=i.length},f=1;f<=t.length;f++)c(f);return function(e){var t=e.buffer,n=e.getUint32();if(e.byteLength!==n)throw Error("ICC profile length not matching");if(e.length<84)throw Error("ICC profile too short");for(var o={},a=Object.keys(Rt),u=0;ut.length)return o;var y=r(e,v,4);if(y===Nt){var S=e.getUint32(v+8);if(S>h)return o;Wt(o,g,Vt(t.slice(v+12,v+S+11)))}else if(y===Gt){for(var b=e.getUint32(v+8),C=e.getUint32(v+12),A=v+16,I=[],P=0;Pe.byteLength)){var n=X.getLongAt(e,t);return{value:n,description:"".concat(n,"px")}}}function Yt(e,t){if(!(t+4+4>e.byteLength)){var n=X.getLongAt(e,t+4);return{value:n,description:"".concat(n,"px")}}}function _t(e,t){if(!(t+8+1>e.byteLength)){var n=X.getByteAt(e,t+8);return{value:n,description:"".concat(n)}}}function qt(e,t){if(!(t+9+1>e.byteLength)){var n=X.getByteAt(e,t+9);return{value:n,description:{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha"}[n]||"Unknown"}}}function Kt(e,t){if(!(t+10+1>e.byteLength)){var n=X.getByteAt(e,t+10);return{value:n,description:0===n?"Deflate/Inflate":"Unknown"}}}function Jt(e,t){if(!(t+11+1>e.byteLength)){var n=X.getByteAt(e,t+11);return{value:n,description:0===n?"Adaptive":"Unknown"}}}function $t(e,t){if(!(t+12+1>e.byteLength)){var n=X.getByteAt(e,t+12);return{value:n,description:{0:"Noninterlaced",1:"Adam7 Interlace"}[n]||"Unknown"}}}var Qt=function(e,t){return t.reduce((function(t,n){var r=n.offset,i=n.length,a=n.type,u=function(e,t,n,r){for(var i=[],a=[],u=[],c=[],f=Zt,s=0;s1&&void 0!==arguments[1]?arguments[1]:{}).length,n={method:"GET"};return Number.isInteger(t)&&t>=0&&(n.headers={range:"bytes=0-".concat(t-1)}),fetch(e,n).then((function(e){return e.arrayBuffer()}))}(e,t):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i={};Number.isInteger(t)&&t>=0&&(i.headers={range:"bytes=0-".concat(t-1)}),bn(e)(e,i,(function(e){if(e.statusCode>=200&&e.statusCode<=299){var t=[];e.on("data",(function(e){return t.push(Buffer.from(e))})),e.on("error",(function(e){return r(e)})),e.on("end",(function(){return n(Buffer.concat(t))}))}else r("Could not fetch file: ".concat(e.statusCode," ").concat(e.statusMessage)),e.resume()})).on("error",(function(e){return r(e)}))}))}(e,t):function(e){return/^data:[^;,]*(;base64)?,/.test(e)}(e)?Promise.resolve(function(e){var t=e.substring(e.indexOf(",")+1);if(-1!==e.indexOf(";base64")){if("undefined"!=typeof atob)return Uint8Array.from(atob(t),(function(e){return e.charCodeAt(0)})).buffer;if("undefined"==typeof Buffer)return;return void 0!==n(Buffer.from)?Buffer.from(t,"base64"):new Buffer(t,"base64")}var r=decodeURIComponent(t);return"undefined"!=typeof Buffer?void 0!==n(Buffer.from)?Buffer.from(r):new Buffer(r):Uint8Array.from(r,(function(e){return e.charCodeAt(0)})).buffer}(e)):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i=Cn();i.open(e,(function(o,a){o?r(o):i.stat(e,(function(o,u){if(o)r(o);else{var c=Math.min(u.size,void 0!==t?t:u.size),f=Buffer.alloc(c),s={buffer:f,length:c};i.read(a,s,(function(t){t?r(t):i.close(a,(function(t){t&&console.warn("Could not close file ".concat(e,":"),t),n(f)}))}))}}))}))}))}(e,t)}(e,t).then((function(e){return An(e,t)})):function(e){return"undefined"!=typeof window&&"undefined"!=typeof File&&e instanceof File}(e)?(r=e,new Promise((function(e,t){var n=new FileReader;n.onload=function(t){return e(t.target.result)},n.onerror=function(){return t(n.error)},n.readAsArrayBuffer(r)}))).then((function(e){return An(e,t)})):An(e,t);var r}function bn(e){return/^https:\/\//.test(e)?require("https").get:require("http").get}function Cn(){try{return require("fs")}catch(e){return}}function An(e,t){return function(e){try{return Buffer.isBuffer(e)}catch(e){return 0}}(e)&&(e=new Uint8Array(e).buffer),In(function(e){try{return new DataView(e)}catch(t){return new s(e)}}(e),t)}function In(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{expanded:0,includeUnknown:0},n=t.expanded,r=void 0===n?0:n,i=t.includeUnknown,u=void 0===i?0:i,c=0,f={},s=V(e),l=s.fileDataOffset,d=s.jfifDataOffset,p=s.tiffHeaderOffset,m=s.iptcDataOffset,g=s.xmpChunks,v=s.iccChunks,h=s.mpfDataOffset,y=s.pngHeaderOffset,S=s.pngTextChunks,b=s.pngChunkOffsets;if(Pn(l)){c=1;var C=Ae(e,l);r?f.file=C:f=a({},f,C)}if(Un(d)){c=1;var A=xe(e,d);r?f.jfif=A:f=a({},f,A)}if(wn(p)){c=1;var I=se(e,p,u);if(I.Thumbnail&&(f.Thumbnail=I.Thumbnail,delete I.Thumbnail),r?(f.exif=I,Tn(f)):f=a({},f,I),I["IPTC-NAA"]&&!Dn(m)){var P=je(I["IPTC-NAA"].value,0,u);r?f.iptc=P:f=a({},f,P)}if(I.ApplicationNotes&&!xn(g)){var U=tt(o(I.ApplicationNotes.value));r?f.xmp=U:(delete U._raw,f=a({},f,U))}if(I.ICC_Profile&&!Mn(v)){var w=kt(I.ICC_Profile.value,[{offset:0,length:I.ICC_Profile.value.length,chunkNumber:1,chunksTotal:1}]);r?f.icc=w:f=a({},f,w)}}if(Dn(m)){c=1;var T=je(e,m,u);r?f.iptc=T:f=a({},f,T)}if(xn(g)){c=1;var D=tt(e,g);r?f.xmp=D:(delete D._raw,f=a({},f,D))}if(Mn(v)){c=1;var x=kt(e,v);r?f.icc=x:f=a({},f,x)}if(On(h)){c=1;var M=le(e,h,u);r?f.mpf=M:f=a({},f,M)}if(Fn(y)){c=1;var O=Ht(e,y);r?(f.png=f.png?a({},f.png,O):O,f.pngFile=O):f=a({},f,O)}if(Rn(S)){c=1;var F=Qt(e,S);r?(f.png=f.png?a({},f.png,F):F,f.pngText=F):f=a({},f,F)}if(Ln(b)){c=1;var R=an(e,b);r?f.png=f.png?a({},f.png,R):R:f=a({},f,R)}var L=mn(e,f.Thumbnail,p);if(L?(c=1,f.Thumbnail=L):delete f.Thumbnail,!c)throw new vn.MetadataMissingError;return f}function Pn(e){return void 0!==e}function Un(e){return void 0!==e}function wn(e){return void 0!==e}function Tn(e){if(e.exif){if(e.exif.GPSLatitude&&e.exif.GPSLatitudeRef)try{e.gps=e.gps||{},e.gps.Latitude=p(e.exif.GPSLatitude.value),"S"===e.exif.GPSLatitudeRef.value.join("")&&(e.gps.Latitude=-e.gps.Latitude)}catch(e){}if(e.exif.GPSLongitude&&e.exif.GPSLongitudeRef)try{e.gps=e.gps||{},e.gps.Longitude=p(e.exif.GPSLongitude.value),"W"===e.exif.GPSLongitudeRef.value.join("")&&(e.gps.Longitude=-e.gps.Longitude)}catch(e){}if(e.exif.GPSAltitude&&e.exif.GPSAltitudeRef)try{e.gps=e.gps||{},e.gps.Altitude=e.exif.GPSAltitude.value[0]/e.exif.GPSAltitude.value[1],1===e.exif.GPSAltitudeRef.value&&(e.gps.Altitude=-e.gps.Altitude)}catch(e){}}}function Dn(e){return void 0!==e}function xn(e){return Array.isArray(e)&&e.length>0}function Mn(e){return Array.isArray(e)&&e.length>0}function On(e){return void 0!==e}function Fn(e){return void 0!==e}function Rn(e){return void 0!==e}function Ln(e){return void 0!==e}return t}()})); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ExifReader=t():e.ExifReader=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:1,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:1})}},t={};function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t,n){for(var r=[],i=0;i=8){var t=l(e.slice(0,8));if("ASCII\0\0\0"===t)return l(e.slice(8));if("JIS\0\0\0\0\0"===t)return"[JIS encoded text]";if("UNICODE\0"===t)return"[Unicode encoded text]";if("\0\0\0\0\0\0\0\0"===t)return"[Undefined encoding]"}return"Undefined"}function p(e){return e[0][0]/e[0][1]+e[1][0]/e[1][1]/60+e[2][0]/e[2][1]/3600}var m=18761,g=m,v=function(e,t){if(e.getUint16(t)===m)return m;if(19789===e.getUint16(t))return 19789;throw Error("Illegal byte order value. Faulty image.")},h=65505;function y(e,t){return 65472===e.getUint16(t)}function S(e,t){return 65474===e.getUint16(t)}function b(e,t){return 65506===e.getUint16(t)&&"ICC_PROFILE\0"===r(e,t+4,12)}function C(e,t){return 65506===e.getUint16(t)&&"MPF\0"===r(e,t+4,4)}function A(e,t){return 65504===e.getUint16(t)&&"JFIF"===r(e,t+4,4)&&0===e.getUint8(t+4+4)}function I(e,t){return e.getUint16(t)===h&&"Exif"===r(e,t+4,4)&&0===e.getUint8(t+4+4)}function P(e,t){return e.getUint16(t)===h&&function(e,t){return"http://ns.adobe.com/xap/1.0/\0"===r(e,t+4,29)}(e,t)}function U(e,t){return e.getUint16(t)===h&&function(e,t){return"http://ns.adobe.com/xmp/extension/\0"===r(e,t+4,35)}(e,t)}function w(e,t){return{dataOffset:e+33,length:t-31}}function T(e,t){return{dataOffset:e+79,length:t-77}}function D(e,t){return 65517===e.getUint16(t)&&"Photoshop 3.0"===r(e,t+4,13)&&0===e.getUint8(t+4+13)}function x(e,t){var n=e.getUint16(t);return n>=65504&&n<=65519||65534===n||65472===n||65474===n||65476===n||65499===n||65501===n||65498===n}function O(e,t){return 65535===e.getUint16(t)}var M="‰PNG\r\n\n",F="iTXt",R="pHYs",k="tIME";function E(e,t){return"IHDR"===r(e,t+4,4)}function L(e,t){return"iTXt"===r(e,t+4,4)&&"XML:com.adobe.xmp\0"===r(e,t+8,18)}function N(e,t){var n=r(e,t+4,4);return"tEXt"===n||"iTXt"===n}function G(e,t){return"eXIf"===r(e,t+4,4)}function B(e,t){var n=[R,k],i=r(e,t+4,4);return n.includes(i)}function j(e,t){t+=28;for(var n=0;n<2&&t=4&&function(e){var t=e.getUint16(0)===g;return 42===e.getUint16(2,t)}(e)}(e))return W({hasAppMarkers:1,tiffHeaderOffset:0},"tiff","TIFF");if(function(e){return!!e&&e.byteLength>=2&&65496===e.getUint16(0)}(e))return W(function(e){for(var t,n,r,i,o,a,u,c,f,s=2;s+4+5<=e.byteLength;){if(y(e,s))n=s+2;else if(S(e,s))r=s+2;else if(A(e,s))t=e.getUint16(s+2),i=s+2;else if(I(e,s))t=e.getUint16(s+2),o=s+10;else if(P(e,s))u||(u=[]),t=e.getUint16(s+2),u.push(w(s,t));else if(U(e,s))u||(u=[]),t=e.getUint16(s+2),u.push(T(s,t));else if(D(e,s))t=e.getUint16(s+2),a=s+18;else if(b(e,s)){var l=s+18,d=(t=e.getUint16(s+2))-16,p=e.getUint8(s+16),m=e.getUint8(s+17);c||(c=[]),c.push({offset:l,length:d,chunkNumber:p,chunksTotal:m})}else if(C(e,s))t=e.getUint16(s+2),f=s+8;else{if(!x(e,s)){if(O(e,s)){s++;continue}break}t=e.getUint16(s+2)}s+=2+t}return{hasAppMarkers:s>2,fileDataOffset:n||r,jfifDataOffset:i,tiffHeaderOffset:o,iptcDataOffset:a,xmpChunks:u,iccChunks:c,mpfDataOffset:f}}(e),"jpeg","JPEG");if(function(e){return!!e&&r(e,0,8)===M}(e))return W(function(e){for(var t={hasAppMarkers:0},n=8;n+4+4<=e.byteLength;){if(E(e,n))t.hasAppMarkers=1,t.pngHeaderOffset=n+8;else if(L(e,n)){var i=j(e,n);void 0!==i&&(t.hasAppMarkers=1,t.xmpChunks=[{dataOffset:i,length:e.getUint32(n+0)-(i-(n+8))}])}else if(N(e,n)){t.hasAppMarkers=1;var o=r(e,n+4,4);t.pngTextChunks||(t.pngTextChunks=[]),t.pngTextChunks.push({length:e.getUint32(n+0),type:o,offset:n+8})}else G(e,n)?(t.hasAppMarkers=1,t.tiffHeaderOffset=n+8):B(e,n)&&(t.hasAppMarkers=1,t.pngChunkOffsets||(t.pngChunkOffsets=[]),t.pngChunkOffsets.push(n+0));n+=e.getUint32(n+0)+4+4+4}return t}(e),"png","PNG");if(function(e){if(!e)return 0;var t=r(e,8,4);return"ftyp"===r(e,4,4)&&-1!==["heic","heix","hevc","hevx","heim","heis","hevm","hevs","mif1"].indexOf(t)}(e))return W(function(e){var t=function(e){for(var t=0;t+4+4<=e.byteLength;){var n=z(e,t);if(n>=8&&"meta"===r(e,t+4,4))return{offset:t,length:n};t+=n}return{offset:void 0,length:0}}(e),n=t.offset,i=t.length;if(void 0===n)return{hasAppMarkers:0};var o=Math.min(n+i,e.byteLength),a=function(e,t,n){for(var i={ilocOffset:void 0,exifItemOffset:void 0,colrOffset:void 0};t+4<=n&&(!i.ilocOffset||!i.exifItemOffset||!i.colrOffset);){var o=r(e,t,4);"iloc"===o?i.ilocOffset=t:"Exif"===o?i.exifItemOffset=t+-4:"colr"===o&&(i.colrOffset=t+-4),t++}return i}(e,n,o),u=a.exifItemOffset,c=a.ilocOffset,f=a.colrOffset,s=function(e,t,n,r){if(n&&t&&!(t+2>r)){var i=e.getUint16(t);for(n+=12;n+16<=r;){if(e.getUint16(n)===i){var o=e.getUint32(n+8);if(o+4<=e.byteLength)return o+(e.getUint32(o)+4)}n+=16}}}(e,u,c,o),l=function(e,t,n){if(t&&!(t+12>n)){var i=r(e,t+8,4);if("prof"===i||"rICC"===i)return[{offset:t+12,length:z(e,t)-12,chunkNumber:1,chunksTotal:1}]}}(e,f,o);return{hasAppMarkers:void 0!==s||void 0!==l,tiffHeaderOffset:s,iccChunks:l}}(e),"heic","HEIC");if(function(e){return!!e&&"RIFF"===r(e,0,4)&&"WEBP"===r(e,8,4)}(e))return W(function(e){for(var t,n,i,o,a=12,u=0;a+8=e[1]?"".concat(Math.round(e[0]/e[1])):0!==e[0]?"1/".concat(Math.round(e[1]/e[0])):"0/".concat(e[1])},FNumber:function(e){return"f/".concat(e[0]/e[1])},FocalLength:function(e){return e[0]/e[1]+" mm"},FocalPlaneResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},LightSource:function(e){return 1===e?"Daylight":2===e?"Fluorescent":3===e?"Tungsten (incandescent light)":4===e?"Flash":9===e?"Fine weather":10===e?"Cloudy weather":11===e?"Shade":12===e?"Daylight fluorescent (D 5700 – 7100K)":13===e?"Day white fluorescent (N 4600 – 5400K)":14===e?"Cool white fluorescent (W 3900 – 4500K)":15===e?"White fluorescent (WW 3200 – 3700K)":17===e?"Standard light A":18===e?"Standard light B":19===e?"Standard light C":20===e?"D55":21===e?"D65":22===e?"D75":23===e?"D50":24===e?"ISO studio tungsten":255===e?"Other light source":"Unknown"},MeteringMode:function(e){return 1===e?"Average":2===e?"CenterWeightedAverage":3===e?"Spot":4===e?"MultiSpot":5===e?"Pattern":6===e?"Partial":255===e?"Other":"Unknown"},ResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},Saturation:function(e){return 0===e?"Normal":1===e?"Low saturation":2===e?"High saturation":"Unknown"},SceneCaptureType:function(e){return 0===e?"Standard":1===e?"Landscape":2===e?"Portrait":3===e?"Night scene":"Unknown"},Sharpness:function(e){return 0===e?"Normal":1===e?"Soft":2===e?"Hard":"Unknown"},ShutterSpeedValue:function(e){var t=Math.pow(2,e[0]/e[1]);return t<=1?"".concat(Math.round(1/t)):"1/".concat(Math.round(t))},WhiteBalance:function(e){return 0===e?"Auto white balance":1===e?"Manual white balance":"Unknown"},XResolution:function(e){return""+Math.round(e[0]/e[1])},YResolution:function(e){return""+Math.round(e[0]/e[1])}},$={11:"ProcessingSoftware",254:{name:"SubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image",3:"Single page of multi-page reduced-resolution image",4:"Transparency mask",5:"Transparency mask of reduced-resolution image",6:"Transparency mask of multi-page image",7:"Transparency mask of reduced-resolution multi-page image",65537:"Alternate reduced-resolution image",4294967295:"Invalid"}[e]||"Unknown"}},255:{name:"OldSubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image"}[e]||"Unknown"}},256:"ImageWidth",257:"ImageLength",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",263:{name:"Thresholding",description:function(e){return{1:"No dithering or halftoning",2:"Ordered dither or halfton",3:"Randomized dither"}[e]||"Unknown"}},264:"CellWidth",265:"CellLength",266:{name:"FillOrder",description:function(e){return{1:"Normal",2:"Reversed"}[e]||"Unknown"}},269:"DocumentName",270:"ImageDescription",271:"Make",272:"Model",273:"StripOffsets",274:{name:"Orientation",description:function(e){return 1===e?"top-left":2===e?"top-right":3===e?"bottom-right":4===e?"bottom-left":5===e?"left-top":6===e?"right-top":7===e?"right-bottom":8===e?"left-bottom":"Undefined"}},277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",280:"MinSampleValue",281:"MaxSampleValue",282:{name:"XResolution",description:K.XResolution},283:{name:"YResolution",description:K.YResolution},284:"PlanarConfiguration",285:"PageName",286:{name:"XPosition",description:function(e){return""+Math.round(e[0]/e[1])}},287:{name:"YPosition",description:function(e){return""+Math.round(e[0]/e[1])}},290:{name:"GrayResponseUnit",description:function(e){return{1:"0.1",2:"0.001",3:"0.0001",4:"1e-05",5:"1e-06"}[e]||"Unknown"}},296:{name:"ResolutionUnit",description:K.ResolutionUnit},297:"PageNumber",301:"TransferFunction",305:"Software",306:"DateTime",315:"Artist",316:"HostComputer",317:"Predictor",318:{name:"WhitePoint",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},319:{name:"PrimaryChromaticities",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},321:"HalftoneHints",322:"TileWidth",323:"TileLength",330:"A100DataOffset",332:{name:"InkSet",description:function(e){return{1:"CMYK",2:"Not CMYK"}[e]||"Unknown"}},337:"TargetPrinter",338:{name:"ExtraSamples",description:function(e){return{0:"Unspecified",1:"Associated Alpha",2:"Unassociated Alpha"}[e]||"Unknown"}},339:{name:"SampleFormat",description:function(e){var t={1:"Unsigned",2:"Signed",3:"Float",4:"Undefined",5:"Complex int",6:"Complex float"};return Array.isArray(e)?e.map((function(e){return t[e]||"Unknown"})).join(", "):"Unknown"}},513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",529:{name:"YCbCrCoefficients",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join("/")}},530:"YCbCrSubSampling",531:{name:"YCbCrPositioning",description:function(e){return 1===e?"centered":2===e?"co-sited":"undefined "+e}},532:{name:"ReferenceBlackWhite",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join(", ")}},700:"ApplicationNotes",18246:"Rating",18249:"RatingPercent",33432:{name:"Copyright",description:function(e){return e.join("; ")}},33550:"PixelScale",33723:"IPTC-NAA",33920:"IntergraphMatrix",33922:"ModelTiePoint",34118:"SEMInfo",34264:"ModelTransform",34377:"PhotoshopSettings",34665:"Exif IFD Pointer",34675:"ICC_Profile",34735:"GeoTiffDirectory",34736:"GeoTiffDoubleParams",34737:"GeoTiffAsciiParams",34853:"GPS Info IFD Pointer",40091:"XPTitle",40092:"XPComment",40093:"XPAuthor",40094:"XPKeywords",40095:"XPSubject",42112:"GDALMetadata",42113:"GDALNoData",50341:"PrintIM",50707:"DNGBackwardVersion",50708:"UniqueCameraModel",50709:"LocalizedCameraModel",50721:"ColorMatrix1",50722:"ColorMatrix2",50723:"CameraCalibration1",50724:"CameraCalibration2",50725:"ReductionMatrix1",50726:"ReductionMatrix2",50727:"AnalogBalance",50728:"AsShotNeutral",50729:"AsShotWhiteXY",50730:"BaselineExposure",50731:"BaselineNoise",50732:"BaselineSharpness",50734:"LinearResponseLimit",50735:"CameraSerialNumber",50736:"DNGLensInfo",50739:"ShadowScale",50741:{name:"MakerNoteSafety",description:function(e){return{0:"Unsafe",1:"Safe"}[e]||"Unknown"}},50778:{name:"CalibrationIlluminant1",description:K.LightSource},50779:{name:"CalibrationIlluminant2",description:K.LightSource},50781:"RawDataUniqueID",50827:"OriginalRawFileName",50828:"OriginalRawFileData",50831:"AsShotICCProfile",50832:"AsShotPreProfileMatrix",50833:"CurrentICCProfile",50834:"CurrentPreProfileMatrix",50879:"ColorimetricReference",50885:"SRawType",50898:"PanasonicTitle",50899:"PanasonicTitle2",50931:"CameraCalibrationSig",50932:"ProfileCalibrationSig",50933:"ProfileIFD",50934:"AsShotProfileName",50936:"ProfileName",50937:"ProfileHueSatMapDims",50938:"ProfileHueSatMapData1",50939:"ProfileHueSatMapData2",50940:"ProfileToneCurve",50941:{name:"ProfileEmbedPolicy",description:function(e){return{0:"Allow Copying",1:"Embed if Used",2:"Never Embed",3:"No Restrictions"}[e]||"Unknown"}},50942:"ProfileCopyright",50964:"ForwardMatrix1",50965:"ForwardMatrix2",50966:"PreviewApplicationName",50967:"PreviewApplicationVersion",50968:"PreviewSettingsName",50969:"PreviewSettingsDigest",50970:{name:"PreviewColorSpace",description:function(e){return{1:"Gray Gamma 2.2",2:"sRGB",3:"Adobe RGB",4:"ProPhoto RGB"}[e]||"Unknown"}},50971:"PreviewDateTime",50972:"RawImageDigest",50973:"OriginalRawFileDigest",50981:"ProfileLookTableDims",50982:"ProfileLookTableData",51043:"TimeCodes",51044:"FrameRate",51058:"TStop",51081:"ReelName",51089:"OriginalDefaultFinalSize",51090:"OriginalBestQualitySize",51091:"OriginalDefaultCropSize",51105:"CameraLabel",51107:{name:"ProfileHueSatMapEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51108:{name:"ProfileLookTableEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51109:"BaselineExposureOffset",51110:{name:"DefaultBlackRender",description:function(e){return{0:"Auto",1:"None"}[e]||"Unknown"}},51111:"NewRawImageDigest",51112:"RawToPreviewGain"};function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n>31&1,e>>30&1,e>>29&1],n=[];return t[0]&&n.push("Dependent Parent Image"),t[1]&&n.push("Dependent Child Image"),t[2]&&n.push("Representative Image"),{value:t,description:n.join(", ")||"None"}}function ve(e){var t=e>>24&7;return{value:t,description:0===t?"JPEG":"Unknown"}}function he(e){var t=16777215&e;return{value:t,description:{196608:"Baseline MP Primary Image",65537:"Large Thumbnail (VGA equivalent)",65538:"Large Thumbnail (Full HD equivalent)",131073:"Multi-Frame Image (Panorama)",131074:"Multi-Frame Image (Disparity)",131075:"Multi-Frame Image (Multi-Angle)",0:"Undefined"}[t]||"Unknown"}}function ye(e){return 0===e}function Se(e,t,n,r,i,o){var a=Y.getTypeSize("SHORT"),u={},c=function(e,t,n){return t+Y.getTypeSize("SHORT")<=e.byteLength?Y.getShortAt(e,t,n):0}(e,r,i);r+=a;for(var f=0;fe.byteLength);f++){var s=be(e,t,n,r,i,o);void 0!==s&&(u[s.name]={id:s.id,value:s.value,description:s.description}),r+=12}if(r"}l===Y.tagTypes.ASCII&&(a=function(e){try{return e.map((function(e){return decodeURIComponent(escape(e))}))}catch(t){return e}}(a=function(e){for(var t=[],n=0,r=0;r5&&void 0!==arguments[5]?arguments[5]:0,a=[];o&&(r*=Y.typeSizes[n],n=Y.tagTypes.BYTE);for(var u=0;un)){var r=Y.getByteAt(e,t+7);return{value:r,description:""+r}}}(e,t,n);return{"Bits Per Sample":Pe(e,t,n),"Image Height":Ue(e,t,n),"Image Width":we(e,t,n),"Color Components":r,Subsampling:r&&Te(e,t,r.value,n)}};function Pe(e,t,n){if(!(3>n)){var r=Y.getByteAt(e,t+2);return{value:r,description:""+r}}}function Ue(e,t,n){if(!(5>n)){var r=Y.getShortAt(e,t+3);return{value:r,description:"".concat(r,"px")}}}function we(e,t,n){if(!(7>n)){var r=Y.getShortAt(e,t+5);return{value:r,description:"".concat(r,"px")}}}function Te(e,t,n,r){if(!(8+3*n>r)){for(var i=[],o=0;o1?De(i)+xe(i):""}}}function De(e){var t={1:"Y",2:"Cb",3:"Cr",4:"I",5:"Q"};return e.map((function(e){return t[e[0]]})).join("")}function xe(e){var t={17:"4:4:4 (1 1)",18:"4:4:0 (1 2)",20:"4:4:1 (1 4)",33:"4:2:2 (2 1)",34:"4:2:0 (2 2)",36:"4:2:1 (2 4)",65:"4:1:1 (4 1)",66:"4:1:0 (4 2)"};return 0===e.length||void 0===e[0][1]||void 0===t[e[0][1]]?"":t[e[0][1]]}var Oe=function(e,t){var n=function(e,t){return Y.getShortAt(e,t)}(e,t),r=function(e,t,n){if(!(15>n)){var r=Y.getByteAt(e,t+14);return{value:r,description:"".concat(r,"px")}}}(e,t,n),i=function(e,t,n){if(!(16>n)){var r=Y.getByteAt(e,t+15);return{value:r,description:"".concat(r,"px")}}}(e,t,n),o={"JFIF Version":Me(e,t,n),"Resolution Unit":Fe(e,t,n),XResolution:ke(e,t,n),YResolution:Ee(e,t,n),"JFIF Thumbnail Width":r,"JFIF Thumbnail Height":i};if(void 0!==r&&void 0!==i){var a=function(e,t,n,r){if(!(0===n||16+n>r))return{value:e.buffer.slice(t+16,t+16+n),description:"<24-bit RGB pixel data>"}}(e,t,3*r.value*i.value,n);a&&(o["JFIF Thumbnail"]=a)}for(var u in o)void 0===o[u]&&delete o[u];return o};function Me(e,t,n){if(!(9>n)){var r=Y.getByteAt(e,t+7),i=Y.getByteAt(e,t+7+1);return{value:256*r+i,description:r+"."+i}}}function Fe(e,t,n){if(!(10>n)){var r=Y.getByteAt(e,t+9);return{value:r,description:Re(r)}}}function Re(e){return 0===e?"None":1===e?"inches":2===e?"cm":"Unknown"}function ke(e,t,n){if(!(12>n)){var r=Y.getShortAt(e,t+10);return{value:r,description:""+r}}}function Ee(e,t,n){if(!(14>n)){var r=Y.getShortAt(e,t+12);return{value:r,description:""+r}}}var Le={iptc:{256:{name:"Model Version",description:function(e){return""+((e[0]<<8)+e[1])}},261:{name:"Destination",repeatable:1},276:{name:"File Format",description:function(e){return""+((e[0]<<8)+e[1])}},278:{name:"File Format Version",description:function(e){return""+((e[0]<<8)+e[1])}},286:"Service Identifier",296:"Envelope Number",306:"Product ID",316:"Envelope Priority",326:{name:"Date Sent",description:Ne},336:{name:"Time Sent",description:Ge},346:{name:"Coded Character Set",description:Be,encoding_name:Be},356:"UNO",376:{name:"ARM Identifier",description:function(e){return""+((e[0]<<8)+e[1])}},378:{name:"ARM Version",description:function(e){return""+((e[0]<<8)+e[1])}},512:{name:"Record Version",description:function(e){return""+((e[0]<<8)+e[1])}},515:"Object Type Reference",516:"Object Attribute Reference",517:"Object Name",519:"Edit Status",520:{name:"Editorial Update",description:function(e){return"01"===l(e)?"Additional Language":"Unknown"}},522:"Urgency",524:{name:"Subject Reference",repeatable:1,description:function(e){var t=l(e).split(":");return t[2]+(t[3]?"/"+t[3]:"")+(t[4]?"/"+t[4]:"")}},527:"Category",532:{name:"Supplemental Category",repeatable:1},534:"Fixture Identifier",537:{name:"Keywords",repeatable:1},538:{name:"Content Location Code",repeatable:1},539:{name:"Content Location Name",repeatable:1},542:"Release Date",547:"Release Time",549:"Expiration Date",550:"Expiration Time",552:"Special Instructions",554:{name:"Action Advised",description:function(e){var t=l(e);return"01"===t?"Object Kill":"02"===t?"Object Replace":"03"===t?"Object Append":"04"===t?"Object Reference":"Unknown"}},557:{name:"Reference Service",repeatable:1},559:{name:"Reference Date",repeatable:1},562:{name:"Reference Number",repeatable:1},567:{name:"Date Created",description:Ne},572:{name:"Time Created",description:Ge},574:{name:"Digital Creation Date",description:Ne},575:{name:"Digital Creation Time",description:Ge},577:"Originating Program",582:"Program Version",587:{name:"Object Cycle",description:function(e){var t=l(e);return"a"===t?"morning":"p"===t?"evening":"b"===t?"both":"Unknown"}},592:{name:"By-line",repeatable:1},597:{name:"By-line Title",repeatable:1},602:"City",604:"Sub-location",607:"Province/State",612:"Country/Primary Location Code",613:"Country/Primary Location Name",615:"Original Transmission Reference",617:"Headline",622:"Credit",627:"Source",628:"Copyright Notice",630:{name:"Contact",repeatable:1},632:"Caption/Abstract",634:{name:"Writer/Editor",repeatable:1},637:{name:"Rasterized Caption",description:function(e){return e}},642:"Image Type",643:{name:"Image Orientation",description:function(e){var t=l(e);return"P"===t?"Portrait":"L"===t?"Landscape":"S"===t?"Square":"Unknown"}},647:"Language Identifier",662:{name:"Audio Type",description:function(e){var t=l(e),n=t.charAt(0),r=t.charAt(1),i="";return"1"===n?i+="Mono":"2"===n&&(i+="Stereo"),"A"===r?i+=", actuality":"C"===r?i+=", question and answer session":"M"===r?i+=", music, transmitted by itself":"Q"===r?i+=", response to a question":"R"===r?i+=", raw sound":"S"===r?i+=", scener":"V"===r?i+=", voicer":"W"===r&&(i+=", wrap"),""!==i?i:t}},663:{name:"Audio Sampling Rate",description:function(e){return parseInt(l(e),10)+" Hz"}},664:{name:"Audio Sampling Resolution",description:function(e){var t=parseInt(l(e),10);return t+(1===t?" bit":" bits")}},665:{name:"Audio Duration",description:function(e){var t=l(e);return t.length>=6?t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2):t}},666:"Audio Outcue",698:"Short Document ID",699:"Unique Document ID",700:"Owner ID",712:{name:function(e){return 2===e.length?"ObjectData Preview File Format":"Record 2 destination"},description:function(e){if(2===e.length){var t=(e[0]<<8)+e[1];return 0===t?"No ObjectData":1===t?"IPTC-NAA Digital Newsphoto Parameter Record":2===t?"IPTC7901 Recommended Message Format":3===t?"Tagged Image File Format (Adobe/Aldus Image data)":4===t?"Illustrator (Adobe Graphics data)":5===t?"AppleSingle (Apple Computer Inc)":6===t?"NAA 89-3 (ANPA 1312)":7===t?"MacBinary II":8===t?"IPTC Unstructured Character Oriented File Format (UCOFF)":9===t?"United Press International ANPA 1312 variant":10===t?"United Press International Down-Load Message":11===t?"JPEG File Interchange (JFIF)":12===t?"Photo-CD Image-Pac (Eastman Kodak)":13===t?"Microsoft Bit Mapped Graphics File [*.BMP]":14===t?"Digital Audio File [*.WAV] (Microsoft & Creative Labs)":15===t?"Audio plus Moving Video [*.AVI] (Microsoft)":16===t?"PC DOS/Windows Executable Files [*.COM][*.EXE]":17===t?"Compressed Binary File [*.ZIP] (PKWare Inc)":18===t?"Audio Interchange File Format AIFF (Apple Computer Inc)":19===t?"RIFF Wave (Microsoft Corporation)":20===t?"Freehand (Macromedia/Aldus)":21===t?'Hypertext Markup Language "HTML" (The Internet Society)':22===t?"MPEG 2 Audio Layer 2 (Musicom), ISO/IEC":23===t?"MPEG 2 Audio Layer 3, ISO/IEC":24===t?"Portable Document File (*.PDF) Adobe":25===t?"News Industry Text Format (NITF)":26===t?"Tape Archive (*.TAR)":27===t?"Tidningarnas Telegrambyrå NITF version (TTNITF DTD)":28===t?"Ritzaus Bureau NITF version (RBNITF DTD)":29===t?"Corel Draw [*.CDR]":"Unknown format ".concat(t)}return l(e)}},713:{name:"ObjectData Preview File Format Version",description:function(e,t){var n={"00":{"00":"1"},"01":{"01":"1","02":"2","03":"3","04":"4"},"02":{"04":"4"},"03":{"01":"5.0","02":"6.0"},"04":{"01":"1.40"},"05":{"01":"2"},"06":{"01":"1"},11:{"01":"1.02"},20:{"01":"3.1","02":"4.0","03":"5.0","04":"5.5"},21:{"02":"2.0"}},r=l(e);if(t["ObjectData Preview File Format"]){var i=l(t["ObjectData Preview File Format"].value);if(n[i]&&n[i][r])return n[i][r]}return r}},714:"ObjectData Preview Data",1802:{name:"Size Mode",description:function(e){return e[0].toString()}},1812:{name:"Max Subfile Size",description:function(e){for(var t=0,n=0;n=8?t.substr(0,4)+"-"+t.substr(4,2)+"-"+t.substr(6,2):t}function Ge(e){var t=l(e),n=t;return t.length>=6&&(n=t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2),11===t.length&&(n+=t.substr(6,1)+t.substr(7,2)+":"+t.substr(9,2))),n}function Be(e){var t=l(e);return"%G"===t?"UTF-8":"%5"===t?"Windows-1252":"%/G"===t?"UTF-8 Level 1":"%/H"===t?"UTF-8 Level 2":"%/I"===t?"UTF-8 Level 3":"/A"===t?"ISO-8859-1":"/B"===t?"ISO-8859-2":"/C"===t?"ISO-8859-3":"/D"===t?"ISO-8859-4":"/@"===t?"ISO-8859-5":"/G"===t?"ISO-8859-6":"/F"===t?"ISO-8859-7":"/H"===t?"ISO-8859-8":"Unknown"}var je=function(e,t){var n=function(){if("undefined"!=typeof TextDecoder)return TextDecoder}();if("undefined"!=typeof n&&void 0!==e)try{return new n(e).decode(Uint8Array.from(t))}catch(e){}return function(e){try{return decodeURIComponent(escape(e))}catch(t){return e}}(t.map((function(e){return String.fromCharCode(e)})).join(""))},ze=function(e,t,n){try{if(Array.isArray(e))return Xe(new DataView(Uint8Array.from(e).buffer),{size:e.length},0,n);var r=function(e,t){for(;t+12<=e.byteLength;){var n=Ve(e,t);if(We(n))return{naaBlock:n,dataOffset:t+12};t+=12+n.size+He(n)}throw Error("No IPTC NAA resource block.")}(e,t);return Xe(e,r.naaBlock,r.dataOffset,n)}catch(e){return{}}};function Ve(e,t){if(943868237!==e.getUint32(t,0))throw Error("Not an IPTC resource block.");return{type:e.getUint16(t+4),size:e.getUint16(t+10)}}function We(e){return 1028===e.type}function He(e){return e.size%2!=0?1:0}function Xe(e,t,n,r){for(var i={},o=void 0,a=n+t.size;ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n1&&n.push(rt(e,t.slice(1))),n}(e,t),2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o=[],a=1,u=0;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(o.push(r.value),2!==o.length);a=1);}catch(e){u=1,i=e}finally{try{a||null==n.return||n.return()}finally{if(u)throw i}}return o}}(r)||function(e,t){if(e){if("string"==typeof e)return tt(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?tt(e,2):void 0}}(r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],a=i[1],u=it(n,o);if(a){var c=it(n,a);u||c||(delete n._raw,it(n,rt(e,t)))}return n};function rt(e,t){for(var n=t.reduce((function(e,t){return e+t.length}),0),r=new Uint8Array(n),i=0,o=0;o).+$/,"$1"),"application/xml");if("parsererror"===i.documentElement.nodeName)throw Error(i.documentElement.textContent);return{doc:i,raw:n}}(t),i=n.doc,o=n.raw;return e._raw=(e._raw||"")+o,a(e,dt(at(ot(i),1))),1}catch(e){return 0}}function ot(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:0,n=ut(e);return ct(n)?t?{}:ft(n[0]):st(n)}function ut(e){for(var t=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:void 0;if(Array.isArray(e)){var n=yt(e);return t&&"function"==typeof Ke[t]?Ke[t](e,n):n}if("object"===et(e))return St(e);try{return t&&"function"==typeof Ke[t]?Ke[t](e):decodeURIComponent(escape(e))}catch(t){return e}}function yt(e){return e.map((function(e){return void 0!==e.value?ht(e.value):ht(e)})).join(", ")}function St(e){var t=[];for(var n in e)t.push("".concat(bt(n),": ").concat(ht(e[n].value)));return t.join("; ")}function bt(e){return"CiAdrCity"===e?"CreatorCity":"CiAdrCtry"===e?"CreatorCountry":"CiAdrExtadr"===e?"CreatorAddress":"CiAdrPcode"===e?"CreatorPostalCode":"CiAdrRegion"===e?"CreatorRegion":"CiEmailWork"===e?"CreatorWorkEmail":"CiTelWork"===e?"CreatorWorkPhone":"CiUrlWork"===e?"CreatorWorkUrl":e}function Ct(e){var t={};for(var n in e)gt(n)||(t[vt(n)]=At(e[n],n));return t}function At(e,t){return It(e)?Pt(e,t):wt(e)?Tt(e,t):Dt(e)?xt(e,t):function(e){return void 0!==Ot(e.value)}(e)?function(e,t){var n=Ot(e.value).value["rdf:li"],r=Ut(e),i=[];return void 0===n?n=[]:Array.isArray(n)||(n=[n]),n.forEach((function(e){i.push(function(e){return It(e)?Pt(e):wt(e)?Tt(e).value:Dt(e)?xt(e).value:Mt(e)}(e))})),{value:i,attributes:r,description:ht(i,t)}}(e,t):Mt(e,t)}function It(e){return"Resource"===e.attributes["rdf:parseType"]&&void 0!==e.value["rdf:value"]||void 0!==e.value["rdf:Description"]&&void 0!==e.value["rdf:Description"].value["rdf:value"]}function Pt(e,t){var n=Ut(e);void 0!==e.value["rdf:Description"]&&(e=e.value["rdf:Description"]),a(n,Ut(e),function(e){var t={};for(var n in e.value)"rdf:value"===n||gt(n)||(t[vt(n)]=e.value[n].value);return t}(e));var r=function(e){return Ft(e.value["rdf:value"])||e.value["rdf:value"].value}(e);return{value:r,attributes:n,description:ht(r,t)}}function Ut(e){var t={};for(var n in e.attributes)"rdf:parseType"===n||"rdf:resource"===n||gt(n)||(t[vt(n)]=e.attributes[n]);return t}function wt(e){return"Resource"===e.attributes["rdf:parseType"]||void 0!==e.value["rdf:Description"]&&void 0===e.value["rdf:Description"].value["rdf:value"]}function Tt(e,t){var n={value:{},attributes:{}};return void 0!==e.value["rdf:Description"]&&(a(n.value,pt(e.value["rdf:Description"].attributes)),a(n.attributes,Ut(e)),e=e.value["rdf:Description"]),a(n.value,Ct(e.value)),n.description=ht(n.value,t),n}function Dt(e){return 0===Object.keys(e.value).length&&void 0===e.attributes["xml:lang"]&&void 0===e.attributes["rdf:resource"]}function xt(e,t){var n=pt(e.attributes);return{value:n,attributes:{},description:ht(n,t)}}function Ot(e){return e["rdf:Bag"]||e["rdf:Seq"]||e["rdf:Alt"]}function Mt(e,t){var n=Ft(e)||dt(e.value);return{value:n,attributes:Ut(e),description:ht(n,t)}}function Ft(e){return e.attributes&&e.attributes["rdf:resource"]}var Rt={desc:{name:"ICC Description"},cprt:{name:"ICC Copyright"},dmdd:{name:"ICC Device Model Description"},vued:{name:"ICC Viewing Conditions Description"},dmnd:{name:"ICC Device Manufacturer for Display"},tech:{name:"Technology"}},kt={4:{name:"Preferred CMM type",value:function(e,t){return r(e,t,4)},description:function(e){return null!==e?Et(e):""}},8:{name:"Profile Version",value:function(e,t){return e.getUint8(t).toString(10)+"."+(e.getUint8(t+1)>>4).toString(10)+"."+(e.getUint8(t+1)%16).toString(10)}},12:{name:"Profile/Device class",value:function(e,t){return r(e,t,4)},description:function(e){switch(e.toLowerCase()){case"scnr":return"Input Device profile";case"mntr":return"Display Device profile";case"prtr":return"Output Device profile";case"link":return"DeviceLink profile";case"abst":return"Abstract profile";case"spac":return"ColorSpace profile";case"nmcl":return"NamedColor profile";case"cenc":return"ColorEncodingSpace profile";case"mid ":return"MultiplexIdentification profile";case"mlnk":return"MultiplexLink profile";case"mvis":return"MultiplexVisualization profile";default:return e}}},16:{name:"Color Space",value:function(e,t){return r(e,t,4)}},20:{name:"Connection Space",value:function(e,t){return r(e,t,4)}},24:{name:"ICC Profile Date",value:function(e,t){return function(e,t){var n=e.getUint16(t),r=e.getUint16(t+2)-1,i=e.getUint16(t+4),o=e.getUint16(t+6),a=e.getUint16(t+8),u=e.getUint16(t+10);return new Date(Date.UTC(n,r,i,o,a,u))}(e,t).toISOString()}},36:{name:"ICC Signature",value:function(e,t){return n=e.buffer.slice(t,t+4),String.fromCharCode.apply(null,new Uint8Array(n));var n}},40:{name:"Primary Platform",value:function(e,t){return r(e,t,4)},description:function(e){return Et(e)}},48:{name:"Device Manufacturer",value:function(e,t){return r(e,t,4)},description:function(e){return Et(e)}},52:{name:"Device Model Number",value:function(e,t){return r(e,t,4)}},64:{name:"Rendering Intent",value:function(e,t){return e.getUint32(t)},description:function(e){switch(e){case 0:return"Perceptual";case 1:return"Relative Colorimetric";case 2:return"Saturation";case 3:return"Absolute Colorimetric";default:return e}}},80:{name:"Profile Creator",value:function(e,t){return r(e,t,4)}}};function Et(e){switch(e.toLowerCase()){case"appl":return"Apple";case"adbe":return"Adobe";case"msft":return"Microsoft";case"sunw":return"Sun Microsystems";case"sgi":return"Silicon Graphics";case"tgnt":return"Taligent";default:return e}}var Lt=function(e,t){try{for(var n=t.reduce((function(e,t){return e+t.length}),0),o=new Uint8Array(n),a=0,u=function(e){return Array.isArray(e)?new DataView(Uint8Array.from(e).buffer).buffer:e.buffer}(e),c=function(e){var n=t.find((function(t){return t.chunkNumber===e}));if(!n)throw Error("ICC chunk ".concat(e," not found"));var r=u.slice(n.offset,n.offset+n.length),i=new Uint8Array(r);o.set(i,a),a+=i.length},f=1;f<=t.length;f++)c(f);return function(e){var t=e.buffer,n=e.getUint32();if(e.byteLength!==n)throw Error("ICC profile length not matching");if(e.length<84)throw Error("ICC profile too short");for(var o={},a=Object.keys(kt),u=0;ut.length)return o;var y=r(e,v,4);if(y===Gt){var S=e.getUint32(v+8);if(S>h)return o;Ht(o,g,Wt(t.slice(v+12,v+S+11)))}else if(y===Bt){for(var b=e.getUint32(v+8),C=e.getUint32(v+12),A=v+16,I=[],P=0;Pe.byteLength)){var n=Y.getLongAt(e,t);return{value:n,description:"".concat(n,"px")}}}function _t(e,t){if(!(t+4+4>e.byteLength)){var n=Y.getLongAt(e,t+4);return{value:n,description:"".concat(n,"px")}}}function qt(e,t){if(!(t+8+1>e.byteLength)){var n=Y.getByteAt(e,t+8);return{value:n,description:"".concat(n)}}}function Jt(e,t){if(!(t+9+1>e.byteLength)){var n=Y.getByteAt(e,t+9);return{value:n,description:{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha"}[n]||"Unknown"}}}function Kt(e,t){if(!(t+10+1>e.byteLength)){var n=Y.getByteAt(e,t+10);return{value:n,description:0===n?"Deflate/Inflate":"Unknown"}}}function $t(e,t){if(!(t+11+1>e.byteLength)){var n=Y.getByteAt(e,t+11);return{value:n,description:0===n?"Adaptive":"Unknown"}}}function Qt(e,t){if(!(t+12+1>e.byteLength)){var n=Y.getByteAt(e,t+12);return{value:n,description:{0:"Noninterlaced",1:"Adam7 Interlace"}[n]||"Unknown"}}}var Zt=function(e,t){return t.reduce((function(t,n){var r=n.offset,i=n.length,a=n.type,u=function(e,t,n,r){for(var i=[],a=[],u=[],c=[],f=en,s=0;s1&&void 0!==arguments[1]?arguments[1]:{}).length,n={method:"GET"};return Number.isInteger(t)&&t>=0&&(n.headers={range:"bytes=0-".concat(t-1)}),fetch(e,n).then((function(e){return e.arrayBuffer()}))}(e,t):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i={};Number.isInteger(t)&&t>=0&&(i.headers={range:"bytes=0-".concat(t-1)}),In(e)(e,i,(function(e){if(e.statusCode>=200&&e.statusCode<=299){var t=[];e.on("data",(function(e){return t.push(Buffer.from(e))})),e.on("error",(function(e){return r(e)})),e.on("end",(function(){return n(Buffer.concat(t))}))}else r("Could not fetch file: ".concat(e.statusCode," ").concat(e.statusMessage)),e.resume()})).on("error",(function(e){return r(e)}))}))}(e,t):function(e){return/^data:[^;,]*(;base64)?,/.test(e)}(e)?Promise.resolve(function(e){var t=e.substring(e.indexOf(",")+1);if(-1!==e.indexOf(";base64")){if("undefined"!=typeof atob)return Uint8Array.from(atob(t),(function(e){return e.charCodeAt(0)})).buffer;if("undefined"==typeof Buffer)return;return void 0!==n(Buffer.from)?Buffer.from(t,"base64"):new Buffer(t,"base64")}var r=decodeURIComponent(t);return"undefined"!=typeof Buffer?void 0!==n(Buffer.from)?Buffer.from(r):new Buffer(r):Uint8Array.from(r,(function(e){return e.charCodeAt(0)})).buffer}(e)):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i=Pn();i.open(e,(function(o,a){o?r(o):i.stat(e,(function(o,u){if(o)r(o);else{var c=Math.min(u.size,void 0!==t?t:u.size),f=Buffer.alloc(c),s={buffer:f,length:c};i.read(a,s,(function(t){t?r(t):i.close(a,(function(t){t&&console.warn("Could not close file ".concat(e,":"),t),n(f)}))}))}}))}))}))}(e,t)}(e,t).then((function(e){return Un(e,t)})):function(e){return"undefined"!=typeof window&&"undefined"!=typeof File&&e instanceof File}(e)?(r=e,new Promise((function(e,t){var n=new FileReader;n.onload=function(t){return e(t.target.result)},n.onerror=function(){return t(n.error)},n.readAsArrayBuffer(r)}))).then((function(e){return Un(e,t)})):Un(e,t);var r}function In(e){return/^https:\/\//.test(e)?require("https").get:require("http").get}function Pn(){try{return require("fs")}catch(e){return}}function Un(e,t){return function(e){try{return Buffer.isBuffer(e)}catch(e){return 0}}(e)&&(e=new Uint8Array(e).buffer),wn(function(e){try{return new DataView(e)}catch(t){return new s(e)}}(e),t)}function wn(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{expanded:0,includeUnknown:0},n=t.expanded,r=void 0===n?0:n,i=t.includeUnknown,u=void 0===i?0:i,c=0,f={},s=V(e),l=s.fileType,d=s.fileDataOffset,p=s.jfifDataOffset,m=s.tiffHeaderOffset,g=s.iptcDataOffset,v=s.xmpChunks,h=s.iccChunks,y=s.mpfDataOffset,S=s.pngHeaderOffset,b=s.pngTextChunks,C=s.pngChunkOffsets,A=s.vp8xChunkOffset;if(Tn(d)){c=1;var I=Ie(e,d);r?f.file=I:f=a({},f,I)}if(Dn(p)){c=1;var P=Oe(e,p);r?f.jfif=P:f=a({},f,P)}if(xn(m)){c=1;var U=le(e,m,u);if(U.Thumbnail&&(f.Thumbnail=U.Thumbnail,delete U.Thumbnail),r?(f.exif=U,On(f)):f=a({},f,U),U["IPTC-NAA"]&&!Mn(g)){var w=ze(U["IPTC-NAA"].value,0,u);r?f.iptc=w:f=a({},f,w)}if(U.ApplicationNotes&&!Fn(v)){var T=nt(o(U.ApplicationNotes.value));r?f.xmp=T:(delete T._raw,f=a({},f,T))}if(U.ICC_Profile&&!Rn(h)){var D=Lt(U.ICC_Profile.value,[{offset:0,length:U.ICC_Profile.value.length,chunkNumber:1,chunksTotal:1}]);r?f.icc=D:f=a({},f,D)}}if(Mn(g)){c=1;var x=ze(e,g,u);r?f.iptc=x:f=a({},f,x)}if(Fn(v)){c=1;var O=nt(e,v);r?f.xmp=O:(delete O._raw,f=a({},f,O))}if(Rn(h)){c=1;var M=Lt(e,h);r?f.icc=M:f=a({},f,M)}if(kn(y)){c=1;var F=de(e,y,u);r?f.mpf=F:f=a({},f,F)}if(En(S)){c=1;var R=Xt(e,S);r?(f.png=f.png?a({},f.png,R):R,f.pngFile=R):f=a({},f,R)}if(Ln(b)){c=1;var k=Zt(e,b);r?(f.png=f.png?a({},f.png,k):k,f.pngText=k):f=a({},f,k)}if(Nn(C)){c=1;var E=un(e,C);r?f.png=f.png?a({},f.png,E):E:f=a({},f,E)}if(Gn(A)){c=1;var L=mn(e,A);r?f.riff=f.riff?a({},f.riff,L):L:f=a({},f,L)}var N=hn(e,f.Thumbnail,m);if(N?(c=1,f.Thumbnail=N):delete f.Thumbnail,l&&(r?(f.file||(f.file={}),f.file.FileType=l):f.FileType=l),!c)throw new Sn.MetadataMissingError;return f}function Tn(e){return void 0!==e}function Dn(e){return void 0!==e}function xn(e){return void 0!==e}function On(e){if(e.exif){if(e.exif.GPSLatitude&&e.exif.GPSLatitudeRef)try{e.gps=e.gps||{},e.gps.Latitude=p(e.exif.GPSLatitude.value),"S"===e.exif.GPSLatitudeRef.value.join("")&&(e.gps.Latitude=-e.gps.Latitude)}catch(e){}if(e.exif.GPSLongitude&&e.exif.GPSLongitudeRef)try{e.gps=e.gps||{},e.gps.Longitude=p(e.exif.GPSLongitude.value),"W"===e.exif.GPSLongitudeRef.value.join("")&&(e.gps.Longitude=-e.gps.Longitude)}catch(e){}if(e.exif.GPSAltitude&&e.exif.GPSAltitudeRef)try{e.gps=e.gps||{},e.gps.Altitude=e.exif.GPSAltitude.value[0]/e.exif.GPSAltitude.value[1],1===e.exif.GPSAltitudeRef.value&&(e.gps.Altitude=-e.gps.Altitude)}catch(e){}}}function Mn(e){return void 0!==e}function Fn(e){return Array.isArray(e)&&e.length>0}function Rn(e){return Array.isArray(e)&&e.length>0}function kn(e){return void 0!==e}function En(e){return void 0!==e}function Ln(e){return void 0!==e}function Nn(e){return void 0!==e}function Gn(e){return void 0!==e}return t}()})); //# sourceMappingURL=exif-reader.js.map \ No newline at end of file diff --git a/exif-reader.js.map b/exif-reader.js.map index faca403..db41afb 100644 --- a/exif-reader.js.map +++ b/exif-reader.js.map @@ -1 +1 @@ -{"version":3,"file":"exif-reader.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAoB,WAAID,IAExBD,EAAiB,WAAIC,GACtB,CATD,CASmB,oBAATK,KAAuBA,KAAOC,MAAM,WAC9C,O,wBCTA,IAAIC,EAAsB,CCA1BA,EAAwB,SAASN,EAASO,GACzC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAET,EAASQ,IAC5EE,OAAOC,eAAeX,EAASQ,EAAK,CAAEI,WAAY,EAAMC,IAAKN,EAAWC,IAG3E,ECPAF,EAAwB,SAASQ,EAAKC,GAAQ,OAAOL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,EAAO,ECCtGT,EAAwB,SAASN,GACX,oBAAXmB,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeX,EAASmB,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeX,EAAS,aAAc,CAAEqB,MAAO,GACvD,G,2OCFO,SAASC,EAAsBC,EAAUC,EAAQC,GAEpD,IADA,IAAMC,EAAQ,GACLC,EAAI,EAAGA,EAAIF,GAAUD,EAASG,EAAIJ,EAASK,WAAYD,IAC5DD,EAAMG,KAAKN,EAASO,SAASN,EAASG,IAE1C,OAAOI,EAAwBL,EAClC,CAEM,SAASM,EAA6BT,EAAUC,EAAQC,GAE3D,IADA,IAAMC,EAAQ,GACLC,EAAI,EAAGA,EAAIF,GAAUD,EAASG,EAAIJ,EAASK,WAAYD,GAAK,EACjED,EAAMG,KAAKN,EAASU,UAAUT,EAASG,IAE3C,OAAOI,EAAwBL,EAClC,CAEM,SAASK,EAAwBG,GACpC,OAAOA,EAAUC,KAAI,SAACC,GAAD,OAAcC,OAAOC,aAAaF,EAAlC,IAA6CG,KAAK,GAC1E,CAMM,SAASC,IACZ,IAAK,IAAIb,EAAI,EAAGA,EAAIc,UAAUhB,OAAQE,IAClC,IAAK,IAAMe,KAAYD,UAAUd,GAC7Bc,UAAU,GAAGC,GAAYD,UAAUd,GAAGe,GAI9C,OAAOD,UAAU,EACpB,CAEM,SAASE,EAAUC,EAAQpC,EAAKqC,GACnC,IAAIC,EAAc,EAClBpC,OAAOC,eAAeiC,EAAQpC,EAAK,CAC/BK,IAD+B,WAW3B,OATKiC,IACDA,EAAc,EACdpC,OAAOC,eAAeiC,EAAQpC,EAAK,CAC/BuC,aAAc,EACdnC,WAAY,EACZS,MAAOwB,EAAYG,MAAMJ,GACzBK,SAAU,KAGXL,EAAOpC,EACjB,EACDuC,aAAc,EACdnC,WAAY,GAEnB,CAEM,SAASsC,EAAeC,GAC3B,MAAoB,oBAATC,KACc,iBAAVD,EAEAC,KAAKD,GAGTC,KAAKC,MAAMrC,UAAUsC,OAAOpC,KAAK,IAAIqC,WAAWJ,IAAQ,SAACK,EAAMC,GAAP,OAAgBD,EAAOnB,OAAOC,aAAamB,EAA3C,GAAkD,KAE/F,oBAAXC,YAGgBC,IAAvB,EAAOD,OAAOE,MACPF,OAAOE,KAAKT,GAAOU,SAAS,UAE/B,IAAIH,OAAOP,GAAQU,SAAS,eANpC,CAOH,C,+WC1EoBC,EAAAA,WACjB,WAAYC,GACR,G,4FADgB,SAmCxB,SAAiCA,GAC7B,MAAyB,WAAlB,EAAOA,SACWJ,IAAlBI,EAAOtC,aACckC,IAArBI,EAAOC,gBACiBL,IAAxBI,EAAOE,mBACiBN,IAAxBI,EAAOG,mBACiBP,IAAxBI,EAAOI,mBACiBR,IAAxBI,EAAOK,mBACgBT,IAAvBI,EAAOM,kBACgBV,IAAvBI,EAAOO,WACjB,CA5CWC,CAAwBR,GACxB,MAAUS,MAAM,gDAGpBnE,KAAK0D,OAASA,EACd1D,KAAKuB,WAAavB,KAAK0D,OAAOtC,MACjC,C,sCAED,SAASD,GACL,OAAOnB,KAAK0D,OAAOC,UAAUxC,EAChC,G,uBAED,SAAUA,EAAQiD,GACd,OAAIA,EACOpE,KAAK0D,OAAOE,aAAazC,GAE7BnB,KAAK0D,OAAOG,aAAa1C,EACnC,G,uBAED,SAAUA,EAAQiD,GACd,OAAIA,EACOpE,KAAK0D,OAAOI,aAAa3C,GAE7BnB,KAAK0D,OAAOK,aAAa5C,EACnC,G,sBAED,SAASA,EAAQiD,GACb,OAAIA,EACOpE,KAAK0D,OAAOM,YAAY7C,GAE5BnB,KAAK0D,OAAOO,YAAY9C,EAClC,M,mLAjCgBsC,GCId,SAASY,EAAerD,GAC3B,OAAOA,EAAMc,KAAI,SAACC,GAAD,OAAcC,OAAOC,aAAaF,EAAlC,IAA6CG,KAAK,GACtE,CAEM,SAASoC,EAAiBtD,GAC7B,GAAIA,EAAMI,QAAU,EAAG,CACnB,IAAMmD,EAAWF,EAAerD,EAAMwD,MAAM,EAAG,IAE/C,GAAiB,gBAAbD,EACA,OAAOF,EAAerD,EAAMwD,MAAM,IAC/B,GAAiB,kBAAbD,EACP,MAAO,qBACJ,GAAiB,cAAbA,EACP,MAAO,yBACJ,GAAiB,qBAAbA,EACP,MAAO,sBAEd,CAED,MAAO,WACV,CAEM,SAASE,EAAsBzD,GAClC,OAAQA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAOA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAM,GAAMA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAM,IACzG,CCxBD,IAAM0D,EAAgB,MAGtB,EAEIA,EAFJ,EAMA,SAAsBxD,EAAUyD,GAC5B,GAAIzD,EAASU,UAAU+C,KAAsBD,EACzC,OAAOA,EACJ,GAXQ,QAWJxD,EAASU,UAAU+C,GAC1B,OAZW,MAcf,MAAUR,MAAM,0CACnB,ECmBKS,EAAc,MA+FpB,SAASC,EAAa3D,EAAU4D,GAC5B,OAxGgB,QAwGR5D,EAASU,UAAUkD,EAC9B,CAED,SAASC,EAAa7D,EAAU4D,GAC5B,OA3GgB,QA2GR5D,EAASU,UAAUkD,EAC9B,CAED,SAASE,EAAgB9D,EAAU4D,GAG/B,OAzGgB,QAyGR5D,EAASU,UAAUkD,IAxHH,kBAyHhB7D,EAAsBC,EAAU4D,EAnItB,EAgIKG,GAI1B,CAED,SAASC,EAAgBhE,EAAU4D,GAG/B,OAhHgB,QAgHR5D,EAASU,UAAUkD,IA3HH,UA4HhB7D,EAAsBC,EAAU4D,EA1ItB,EAuIKK,EAI1B,CAED,SAASC,EAAiBlE,EAAU4D,GAGhC,OAzHgB,QAyHR5D,EAASU,UAAUkD,IA9GF,SA+GjB7D,EAAsBC,EAAU4D,EAjJtB,EA8IKO,IAI2D,IAA1EnE,EAASO,SAASqD,EAlJR,EA8IKO,EAK1B,CAED,SAASC,EAAiBpE,EAAU4D,GAGhC,OAAQ5D,EAASU,UAAUkD,KAAuBF,GArHzB,SAsHjB3D,EAAsBC,EAAU4D,EAzJtB,EAsJKO,IAI2D,IAA1EnE,EAASO,SAASqD,EA1JR,EAsJKO,EAK1B,CAED,SAASE,EAAgBrE,EAAU4D,GAC/B,OAAQ5D,EAASU,UAAUkD,KAAuBF,GAItD,SAAyB1D,EAAU4D,GAE/B,MAhIwB,mCAgIjB7D,EAAsBC,EAAU4D,EApKrB,EAmKKU,GAE1B,CANUC,CAAgBvE,EAAU4D,EACpC,CAOD,SAASY,EAAwBxE,EAAU4D,GACvC,OAAQ5D,EAASU,UAAUkD,KAAuBF,GAItD,SAAiC1D,EAAU4D,GAEvC,MAzIiC,yCAyI1B7D,EAAsBC,EAAU4D,EA9KrB,EA6KKa,GAE1B,CANUC,CAAwB1E,EAAU4D,EAC5C,CAOD,SAASe,EAAmBf,EAAmBgB,GAC3C,MAAO,CACHC,WAAYjB,EA9KI,GA+KhB1D,OAAQ0E,EAAc,GAE7B,CAED,SAASE,EAA2BlB,EAAmBgB,GACnD,MAAO,CACHC,WAAYjB,EApLa,GAqLzB1D,OAAQ0E,EAAc,GAE7B,CAED,SAASG,EAAuB/E,EAAU4D,GAGtC,OAxKiB,QAwKT5D,EAASU,UAAUkD,IA5JD,kBA6JlB7D,EAAsBC,EAAU4D,EAnMtB,EAgMKoB,KAI2D,IAA1EhF,EAASO,SAASqD,EApMR,EAgMKoB,GAK1B,CAED,SAASC,EAAYjF,EAAU4D,GAC3B,IAAMsB,EAAYlF,EAASU,UAAUkD,GACrC,OAASsB,GAlLO,OAkLuBA,GA9KtB,OACE,QA8KXA,GA1LQ,QA2LRA,GA1LQ,QA2LRA,GA1LO,QA2LPA,GA1LO,QA2LPA,GA1LO,QA2LPA,GA1LO,QA2LPA,CACX,CAED,SAASC,EAAWnF,EAAU4D,GAC1B,OApLc,QAoLP5D,EAASU,UAAUkD,EAC7B,CC3ND,IAKMwB,EAAS,cAQFC,EAAY,OACZC,EAAY,OACZC,EAAY,OA4DzB,SAASC,EAAsBxF,EAAUC,GAErC,MADoC,SAC7BF,EAAsBC,EAAUC,EAvEb,EACK,EAuElC,CAED,SAASwF,EAAczF,EAAUC,GAE7B,MAD0C,SAClCF,EAAsBC,EAAUC,EA5Ed,EACK,IAIZ,wBAwEXF,EAAsBC,EAAUC,EAzEPyF,EAyEuCC,GAC3E,CAED,SAASC,EAAe5F,EAAUC,GAC9B,IAEM4F,EAAY9F,EAAsBC,EAAUC,EAnFxB,EACK,GAmF/B,MAH4B,SAGrB4F,GAFqB,SAEgBA,CAC/C,CAED,SAASC,EAAe9F,EAAUC,GAC9B,MA9EqB,SA8EdF,EAAsBC,EAAUC,EAxFb,EACK,EAwFlC,CAED,SAAS8F,EAAW/F,EAAUC,GAC1B,IAAM+F,EAA4B,CAACV,EAAWC,GACxCM,EAAY9F,EAAsBC,EAAUC,EA7FxB,EACK,GA6F/B,OAAO+F,EAA0BC,SAASJ,EAC7C,CAED,SAASK,EAAoBlG,EAAUC,GAInCA,GAAUkG,GAGV,IADA,IAAIC,EAAyB,EACtBA,EAAyB,GAAKnG,EAASD,EAASK,YACjB,IAA9BL,EAASO,SAASN,IAClBmG,IAEJnG,IAEJ,KAAImG,EAAyB,GAG7B,OAAOnG,CACV,CClDD,SAASoG,EAAcrG,EAAUC,GAC7B,IAEMqG,EAAatG,EAASuG,UAAUtG,GACtC,OAcJ,SAA4BqG,GACxB,OAAsB,IAAfA,CACV,CAhBOE,CAAmBF,GACZtG,EAASK,WAAaJ,EAiBrC,SAAyBqG,GACrB,OAAsB,IAAfA,CACV,CAjBOG,CAAgBH,IAmBxB,SAA0BtG,EAAUC,GAEhC,OAAkE,IAA3DD,EAASuG,UAAUtG,EADQ,EAErC,CArBWyG,CAAiB1G,EAAUC,GAGpBD,EAASuG,UAAUtG,EAVI,IAc/BqG,CACV,CCxFD,ICIA,EAIA,SAAyBtG,GACrB,GCJJ,SAAoBA,GAGhB,QAASA,GAAaA,EAASK,YAFK,GAKxC,SAAuBL,GACnB,IAGMkD,EAAelD,EAASU,UAAU,KAAOiG,EAC/C,OAJgB,KAIT3G,EAASU,UAHO,EAGmBwC,EAC7C,CATgF0D,CAAc5G,EAC9F,CDA6B6G,CAAgB7G,GACtC,MCaO,CACH8G,cAAe,EACfrD,iBALwB,GDPhC,GJmCJ,SAAoBzD,GAChB,QAASA,GAAaA,EAASK,YA5CC,GACpB,QA2CkEL,EAASU,UAAU,EACpG,CIrC6BqG,CAAgB/G,GACtC,OJsCR,SAAyBA,GAYrB,IAXA,IACI4E,EACAoC,EACAC,EACAC,EACAzD,EACA0D,EACAC,EACAC,EACAC,EATA1D,EA9Ca,EAyDVA,EAxDW,EAwDyB,GAAK5D,EAASK,YAAY,CACjE,GAA0BsD,EAAa3D,EAAU4D,GAC7CoD,EAAiBpD,EAzDL,OA0DT,GAA0BC,EAAa7D,EAAU4D,GACpDqD,EAAiBrD,EA3DL,OA4DT,GAA0BM,EAAiBlE,EAAU4D,GACxDgB,EAAc5E,EAASU,UAAUkD,EA7DrB,GA8DZsD,EAAiBtD,EA7DJ,OA8DV,GAA0BQ,EAAiBpE,EAAU4D,GACxDgB,EAAc5E,EAASU,UAAUkD,EAhErB,GAiEZH,EAAmBG,EA/DJ,QAgEZ,GAAyBS,EAAgBrE,EAAU4D,GACjDwD,IACDA,EAAY,IAEhBxC,EAAc5E,EAASU,UAAUkD,EAtErB,GAuEZwD,EAAU9G,KAAKqE,EAAmBf,EAAmBgB,SAClD,GAAyBJ,EAAwBxE,EAAU4D,GACzDwD,IACDA,EAAY,IAEhBxC,EAAc5E,EAASU,UAAUkD,EA5ErB,GA6EZwD,EAAU9G,KAAKwE,EAA2BlB,EAAmBgB,SAC1D,GAA0BG,EAAuB/E,EAAU4D,GAC9DgB,EAAc5E,EAASU,UAAUkD,EA/ErB,GAgFZuD,EAAiBvD,EA7EJ,QA8EV,GAAyBE,EAAgB9D,EAAU4D,GAAoB,CAE1E,IAAM2D,EAAgB3D,EA7EL,GA8EX4D,GAFN5C,EAAc5E,EAASU,UAAUkD,EAlFrB,IAoFwB,GAE9B6D,EAAiBzH,EAASO,SAASqD,EA5ErB8D,IA6EdC,EAAiB3H,EAASO,SAASqD,EA5ErBgE,IA6EfP,IACDA,EAAY,IAEhBA,EAAU/G,KAAK,CAACL,OAAQsH,EAAerH,OAAQsH,EAAeK,YAAaJ,EAAgBK,YAAaH,GAC3G,MAAM,GAAyB3D,EAAgBhE,EAAU4D,GACtDgB,EAAc5E,EAASU,UAAUkD,EA7FrB,GA8FZ0D,EAAgB1D,EAvFJ,MAwFT,KAAIqB,EAAYjF,EAAU4D,GAE1B,IAAIuB,EAAWnF,EAAU4D,GAAoB,CAChDA,IACA,QACH,CACG,KACH,CANGgB,EAAc5E,EAASU,UAAUkD,EAhGrB,EAsGf,CACDA,GAvGgB,EAuGuBgB,CAC1C,CAED,MAAO,CACHkC,cAAelD,EA7GF,EA8GbmE,eAAgBf,GAAkBC,EAClCC,eAAAA,EACAzD,iBAAAA,EACA0D,eAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,cAAAA,EAEP,CI/GcP,CAAqB/G,GAGhC,GHGJ,SAAmBA,GACf,QAASA,GAAYD,EAAsBC,EAAU,EAAGoF,KAAmBA,CAC9E,CGL4B4C,CAAchI,GACnC,OHMR,SAAwBA,GASpB,IARA,IAEMiI,EAAU,CACZnB,cAAe,GAGf7G,EAASmF,EAENnF,EAzBmB,EACK,GAwBgCD,EAASK,YAAY,CAChF,GAA8BmF,EAAsBxF,EAAUC,GAC1DgI,EAAQnB,cAAgB,EACxBmB,EAAQC,gBAAkBjI,EAxBDyF,OAyBtB,GAAyBD,EAAczF,EAAUC,GAAS,CAC7D,IAAM4E,EAAaqB,EAAoBlG,EAAUC,QAC9BmC,IAAfyC,IACAoD,EAAQnB,cAAgB,EACxBmB,EAAQb,UAAY,CAAC,CACjBvC,WAAAA,EACA3E,OAAQF,EAASuG,UAAUtG,EAjCR,IAiC6C4E,GAAc5E,EA/B7DyF,MAkC5B,MAAM,GAAIE,EAAe5F,EAAUC,GAAS,CACzCgI,EAAQnB,cAAgB,EACxB,IAAMjB,EAAY9F,EAAsBC,EAAUC,EArCzByF,EAFF,GAwClBuC,EAAQE,gBACTF,EAAQE,cAAgB,IAE5BF,EAAQE,cAAc7H,KAAK,CACvBJ,OAAQF,EAASuG,UAAUtG,EA3CJ,GA4CvBmI,KAAMvC,EACN5F,OAAQA,EA3CayF,GA6C5B,MAAUI,EAAe9F,EAAUC,IAChCgI,EAAQnB,cAAgB,EACxBmB,EAAQxE,iBAAmBxD,EA/CFyF,GAgDlBK,EAAW/F,EAAUC,KAC5BgI,EAAQnB,cAAgB,EACnBmB,EAAQI,kBACTJ,EAAQI,gBAAkB,IAE9BJ,EAAQI,gBAAgB/H,KAAKL,EAvDF,IA0D/BA,GAAUD,EAASuG,UAAUtG,EA1DE,GAFT,EACK,EAgBV,CA+CpB,CAED,OAAOgI,CACV,CGzDcD,CAAmBhI,GAG9B,GFhBJ,SAAoBA,GAChB,IAAKA,EACD,OAAO,EAGX,IAKMsI,EAAiBvI,EAAsBC,EAAUuI,EAFvB,GAIhC,MAPgB,SAORxI,EAAsBC,EANP,EAMiCwI,KACD,IAN7B,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAMjEC,QAAQH,EACrC,CEE6BI,CAAgB1I,GACtC,OFDR,SAAyBA,GAEjB,MAoBR,SAAsBA,GAQlB,IAPA,IAKIC,EAAS,EAENA,EAPkB,EACF,GAM8BD,EAASK,YAAY,CACtE,IAAMiG,EAAaD,EAAcrG,EAAUC,GAC3C,GAAIqG,GAPgB,GASC,SADAvG,EAAsBC,EAAUC,EAPhC,EAFF,GAWX,MAAO,CACHA,OAAAA,EACAC,OAAQoG,GAKpBrG,GAAUqG,CACb,CAED,MAAO,CACHrG,YAAQmC,EACRlC,OAAQ,EAEf,CA/CwDyI,CAAa3I,GAA/C4I,EAAf,EAAO3I,OAA4B4I,EAAnC,EAA2B3I,OAC3B,QAAmBkC,IAAfwG,EACA,MAAO,CAAC9B,cAAe,GAG3B,IAAMgC,EAAgBC,KAAKC,IAAIJ,EAAaC,EAAY7I,EAASK,YACjE,EA0ER,SAAuBL,EAAUC,EAAQ6I,GASrC,IARA,IAEMb,EAAU,CACZgB,gBAAY7G,EACZ8G,oBAAgB9G,EAChB+G,gBAAY/G,GAGRnC,EARY,GAQY6I,KACvBb,EAAQgB,aAAehB,EAAQiB,iBAAmBjB,EAAQkB,aAAa,CAC5E,IAAMC,EAAWrJ,EAAsBC,EAAUC,EAVjC,GAWwB,SAAbmJ,EACvBnB,EAAQgB,WAAahJ,EACsB,SAAbmJ,EAC9BnB,EAAQiB,eAAiBjJ,GAbH,EAcoB,SAAbmJ,IAC7BnB,EAAQkB,WAAalJ,GAfC,GAkB1BA,GACH,CAED,OAAOgI,CACV,CAlGwDoB,CAAcrJ,EAAU4I,EAAYE,GAA9EI,EAAP,EAAOA,eAAgBD,EAAvB,EAAuBA,WAAYE,EAAnC,EAAmCA,WAE7BG,EAkGd,SAAwBtJ,EAAUkJ,EAAgBjJ,EAAQ6I,GAQtD,GAAK7I,GAAWiJ,KAAmBA,EAPL,EAO8CJ,GAA5E,CAIA,IAAMS,EAAgBvJ,EAASU,UAAUwI,GAGzC,IAFAjJ,GAXyB,GAalBA,EATgB,IASW6I,GAAe,CAE7C,GADkB9I,EAASU,UAAUT,KACnBsJ,EAAe,CAC7B,IAAMC,EAAcxJ,EAASuG,UAAUtG,EAfnB,GAgBpB,GAAIuJ,EAfc,GAeqBxJ,EAASK,WAG5C,OAAOmJ,GAFYxJ,EAASuG,UAAUiD,GAfhB,EAmB7B,CACDvJ,GAnBmB,EAoBtB,CAhBA,CAmBJ,CA/H0BwJ,CAAezJ,EAAUkJ,EAAgBD,EAAYH,GAClEzB,EAgId,SAAuBrH,EAAUC,EAAQ6I,GAKrC,GAAK7I,KAAWA,EAFY,GAEmB6I,GAA/C,CAIA,IAAMY,EAAY3J,EAAsBC,EAAUC,EARzB,EACF,GAQvB,GAAmB,SAAdyJ,GAAwC,SAAdA,EAI/B,MAAO,CAAC,CACJzJ,OAAQA,EAZgB,GAaxBC,OAAQmG,EAAcrG,EAAUC,GAbR,GAcxB4H,YAAa,EACbC,YAAa,GAXhB,CAaJ,CApJyB6B,CAAc3J,EAAUmJ,EAAYL,GACtD,MAAO,CACHhC,mBAA+B1E,IAAfkH,QAA4ClH,IAAdiF,EAC9C5D,iBAAkB6F,EAClBjC,UAAAA,EAKX,CEnBcqB,CAAqB1I,GAGhC,GDpBJ,SAAoBA,GAMhB,QAASA,GAJO,SAIKD,EAAsBC,EALpB,EAK8C4J,IAFjD,SAGb7J,EAAsBC,EAJF,EAIgC6J,EAC9D,CCY6BC,CAAgB9J,GACtC,ODXR,SAAqBA,GAYjB,IAXA,IAOIyD,EACA2D,EACAC,EAJApH,EAL2B,GAM3B6G,EAAgB,EAKb7G,EARmB,EAQUD,EAASK,YAAY,CACrD,IAAM0J,EAAUhK,EAAsBC,EAAUC,EAAQ,GAClD+J,EAAYhK,EAASuG,UAAUtG,EAZf,EAY2C,GAE1B,SAAZ8J,GACvBjD,EAAgB,EAEZrD,EAhBY,aAeZ1D,EAAsBC,EAAUC,EAdlB,EAc8CgK,GACzChK,EAfL,EAekCgK,EAE7BhK,EAjBL,GAmBuB,SAAZ8J,GAC7BjD,EAAgB,EAChBM,EAAY,CAAC,CACTvC,WAAY5E,EAtBE,EAuBdC,OAAQ8J,KAE6B,SAAZD,IAC7BjD,EAAgB,EAChBO,EAAY,CAAC,CACTpH,OAAQA,EA5BM,EA6BdC,OAAQ8J,EACRnC,YAAa,EACbC,YAAa,KAIrB7H,GAnCsB,GAmCS+J,EAAY,GAAM,EAAIA,EAAYA,EAAY,EAChF,CAED,MAAO,CACHlD,cAAAA,EACArD,iBAAAA,EACA2D,UAAAA,EACAC,UAAAA,EAEP,CCrCcyC,CAAiB9J,GAG5B,MAAUiD,MAAM,uBACnB,EE/BKiH,EAAY,CACd,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,GAAI,EACJ,GAAI,GAGFC,EAAW,CACb,KAAQ,EACR,MAAS,EACT,MAAS,EACT,KAAQ,EACR,SAAY,EACZ,UAAa,EACb,MAAS,EACT,UAAa,GACb,IAAO,IAGX,GACIC,cAeJ,SAAuBzJ,GACnB,OAAOA,EAAUC,KAAI,SAACC,GAAD,OAAcC,OAAOC,aAAaF,EAAlC,GACxB,EAhBGwJ,UAAAA,EACAC,WAqBJ,SAAoBtK,EAAUC,GAC1B,OAAOD,EAASO,SAASN,EAC5B,EAtBGsK,WAwBJ,SAAoBvK,EAAUC,EAAQuK,GAClC,OAAOxK,EAASU,UAAUT,EAAQuK,IAAc7D,EACnD,EAzBG8D,UAAAA,EACAC,cA8BJ,SAAuB1K,EAAUC,EAAQuK,GACrC,MAAO,CAACC,EAAUzK,EAAUC,EAAQuK,GAAYC,EAAUzK,EAAUC,EAAS,EAAGuK,GACnF,EA/BGG,eAiCJ,SAAwB3K,EAAUC,GAC9B,OAAOoK,EAAUrK,EAAUC,EAC9B,EAlCG2K,WAAAA,EACAC,eAuCJ,SAAwB7K,EAAUC,EAAQuK,GACtC,MAAO,CAACI,EAAW5K,EAAUC,EAAQuK,GAAYI,EAAW5K,EAAUC,EAAS,EAAGuK,GACrF,EAxCGM,gBA0CJ,SAAyB9K,EAAUC,EAAQuK,GACvC,OAAOC,EAAUzK,EAAUC,EAAQuK,EACtC,EA3CGN,UAAAA,EACAC,SAAAA,EACAY,YA2CJ,SAAqBC,GACjB,QAA2B5I,IAAvB+H,EAASa,GACT,MAAU/H,MAAM,uBAGpB,OAAOiH,EAAUC,EAASa,GAC7B,GA1CD,SAASX,EAAUrK,EAAUC,GACzB,OAAOD,EAASO,SAASN,EAC5B,CAUD,SAASwK,EAAUzK,EAAUC,EAAQuK,GACjC,OAAOxK,EAASuG,UAAUtG,EAAQuK,IAAc7D,EACnD,CAUD,SAASiE,EAAW5K,EAAUC,EAAQuK,GAClC,OAAOxK,EAASiL,SAAShL,EAAQuK,IAAc7D,EAClD,CCxED,OACIuE,cAAe,SAACpL,GAAD,OAAWiJ,KAAKoC,IAAIpC,KAAKqC,KAAK,GAAItL,EAAM,GAAKA,EAAM,IAAIuL,QAAQ,EAA/D,EACfC,WAFW,SAEAxL,GACP,OAAc,IAAVA,EACO,OACU,QAAVA,EACA,eAEJ,SACV,EACDyL,wBAVW,SAUazL,GACpB,OAAOA,EAAMc,KAAI,SAAC4K,GACd,OAAkB,KAAdA,EACO,IACc,KAAdA,EACA,KACc,KAAdA,EACA,KACc,KAAdA,EACA,IACc,KAAdA,EACA,IACc,KAAdA,EACA,SADJ,CAGV,IAAExK,KAAK,GACX,EACDyK,SA3BW,SA2BF3L,GACL,OAAc,IAAVA,EACO,SACU,IAAVA,EACA,OACU,IAAVA,EACA,OAEJ,SACV,EACD4L,eArCW,SAqCI5L,GACX,OAAc,IAAVA,EACO,iBACU,IAAVA,EACA,iBAEJ,SACV,EACD6L,aA7CW,SA6CE7L,GACT,OAAc,IAAVA,EACO,gBACU,IAAVA,EACA,kBACU,IAAVA,EACA,eAEJ,SACV,EACD8L,gBAvDW,SAuDK9L,GACZ,OAAc,IAAVA,EACO,YACU,IAAVA,EACA,SACU,IAAVA,EACA,iBACU,IAAVA,EACA,oBACU,IAAVA,EACA,mBACU,IAAVA,EACA,mBACU,IAAVA,EACA,iBACU,IAAVA,EACA,gBACU,IAAVA,EACA,iBACU,IAAVA,EACA,OAEJ,SACV,EACD+L,aA/EW,SA+EE/L,GACT,OAAIA,EAAM,IAAMA,EAAM,GAClB,UAAUiJ,KAAK+C,MAAMhM,EAAM,GAAKA,EAAM,KAEzB,IAAbA,EAAM,GACN,YAAYiJ,KAAK+C,MAAMhM,EAAM,GAAKA,EAAM,KAE5C,YAAYA,EAAM,GACrB,EACDiM,QAAS,SAACjM,GAAD,kBAAgBA,EAAM,GAAKA,EAAM,GAAjC,EACTkM,YAAa,SAAClM,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,KAAnC,EACbmM,yBA1FW,SA0FcnM,GACrB,OAAc,IAAVA,EACO,SACU,IAAVA,EACA,cAEJ,SACV,EACDoM,YAAa,SAACpM,GACV,OAAc,IAAVA,EACO,WACU,IAAVA,EACA,cACU,IAAVA,EACA,gCACU,IAAVA,EACA,QACU,IAAVA,EACA,eACU,KAAVA,EACA,iBACU,KAAVA,EACA,QACU,KAAVA,EACA,wCACU,KAAVA,EACA,yCACU,KAAVA,EACA,0CACU,KAAVA,EACA,sCACU,KAAVA,EACA,mBACU,KAAVA,EACA,mBACU,KAAVA,EACA,mBACU,KAAVA,EACA,MACU,KAAVA,EACA,MACU,KAAVA,EACA,MACU,KAAVA,EACA,MACU,KAAVA,EACA,sBACU,MAAVA,EACA,qBAEJ,SACV,EACDqM,aA9IW,SA8IErM,GACT,OAAc,IAAVA,EACO,UACU,IAAVA,EACA,wBACU,IAAVA,EACA,OACU,IAAVA,EACA,YACU,IAAVA,EACA,UACU,IAAVA,EACA,UACU,MAAVA,EACA,QAEJ,SACV,EACDsM,eAhKW,SAgKItM,GACX,OAAc,IAAVA,EACO,SAEG,IAAVA,EACO,cAEJ,SACV,EACDuM,WAzKW,SAyKAvM,GACP,OAAc,IAAVA,EACO,SACU,IAAVA,EACA,iBACU,IAAVA,EACA,kBAEJ,SACV,EACDwM,iBAnLW,SAmLMxM,GACb,OAAc,IAAVA,EACO,WACU,IAAVA,EACA,YACU,IAAVA,EACA,WACU,IAAVA,EACA,cAEJ,SACV,EACDyM,UA/LW,SA+LDzM,GACN,OAAc,IAAVA,EACO,SACU,IAAVA,EACA,OACU,IAAVA,EACA,OAEJ,SACV,EACD0M,kBAzMW,SAyMO1M,GACd,IAAM2M,EAAc1D,KAAKoC,IAAI,EAAGrL,EAAM,GAAKA,EAAM,IACjD,OAAI2M,GAAe,EACf,UAAU1D,KAAK+C,MAAM,EAAIW,IAE7B,YAAY1D,KAAK+C,MAAMW,GAC1B,EACDC,aAhNW,SAgNE5M,GACT,OAAc,IAAVA,EACO,qBACU,IAAVA,EACA,uBAEJ,SACV,EACD6M,YAAa,SAAC7M,GAAD,MAAW,GAAKiJ,KAAK+C,MAAMhM,EAAM,GAAKA,EAAM,GAA5C,EACb8M,YAAa,SAAC9M,GAAD,MAAW,GAAKiJ,KAAK+C,MAAMhM,EAAM,GAAKA,EAAM,GAA5C,GCvNjB,GACI,GAAQ,qBACR,IAAQ,CACJ+M,KAAM,cACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAK,wBACL,EAAK,2BACL,EAAK,kCACL,EAAK,qDACL,EAAK,oBACL,EAAK,gDACL,EAAK,wCACL,EAAK,2DACL,MAAS,qCACT,WAAY,WACbA,IAAU,SAXA,GAajB,IAAQ,CACJ+M,KAAM,iBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,wBACH,EAAG,2BACH,EAAG,mCACJA,IAAU,SAJA,GAMjB,IAAQ,aACR,IAAQ,cACR,IAAQ,gBACR,IAAQ,cACR,IAAQ,4BACR,IAAQ,CACJ+M,KAAM,eACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,6BACH,EAAG,4BACH,EAAG,qBACJA,IAAU,SAJA,GAMjB,IAAQ,YACR,IAAQ,aACR,IAAQ,CACJ+M,KAAM,YACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,SACH,EAAG,YACJA,IAAU,SAHA,GAKjB,IAAQ,eACR,IAAQ,mBACR,IAAQ,OACR,IAAQ,QACR,IAAQ,eACR,IAAQ,CACJ+M,KAAM,cACNC,YAAa,SAAChN,GACV,OAAc,IAAVA,EACO,WAEG,IAAVA,EACO,YAEG,IAAVA,EACO,eAEG,IAAVA,EACO,cAEG,IAAVA,EACO,WAEG,IAAVA,EACO,YAEG,IAAVA,EACO,eAEG,IAAVA,EACO,cAEJ,WACV,GAEL,IAAQ,kBACR,IAAQ,eACR,IAAQ,kBACR,IAAQ,iBACR,IAAQ,iBACR,IAAQ,CACJ,KAAQ,cACR,YAAeiN,EAAAA,aAEnB,IAAQ,CACJ,KAAQ,cACR,YAAeA,EAAAA,aAEnB,IAAQ,sBACR,IAAQ,WACR,IAAQ,CACJ,KAAQ,YACR,YAAe,SAACjN,GACZ,MAAO,GAAKiJ,KAAK+C,MAAMhM,EAAM,GAAKA,EAAM,GAC3C,GAEL,IAAQ,CACJ,KAAQ,YACR,YAAe,SAACA,GACZ,MAAO,GAAKiJ,KAAK+C,MAAMhM,EAAM,GAAKA,EAAM,GAC3C,GAEL,IAAQ,CACJ+M,KAAM,mBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,MACH,EAAG,QACH,EAAG,SACH,EAAG,QACH,EAAG,SACJA,IAAU,SANA,GAQjB,IAAQ,CACJ+M,KAAM,iBACNC,YAAaC,EAAAA,gBAEjB,IAAQ,aACR,IAAQ,mBACR,IAAQ,WACR,IAAQ,WACR,IAAQ,SACR,IAAQ,eACR,IAAQ,YACR,IAAQ,CACJ,KAAQ,aACR,YAAe,SAACC,GACZ,OAAOA,EAAOpM,KAAI,SAACd,GAAD,gBAAcA,EAAM,GAApB,YAA0BA,EAAM,GAAhC,IAAsCkB,KAAK,KAChE,GAEL,IAAQ,CACJ,KAAQ,wBACR,YAAe,SAACgM,GACZ,OAAOA,EAAOpM,KAAI,SAACd,GAAD,gBAAcA,EAAM,GAApB,YAA0BA,EAAM,GAAhC,IAAsCkB,KAAK,KAChE,GAEL,IAAQ,gBACR,IAAQ,YACR,IAAQ,aACR,IAAQ,iBACR,IAAQ,CACJ6L,KAAM,SACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,OACH,EAAG,YACJA,IAAU,SAHA,GAKjB,IAAQ,gBACR,IAAQ,CACJ+M,KAAM,eACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,cACH,EAAG,mBACH,EAAG,sBACJA,IAAU,SAJA,GAMjB,IAAQ,CACJ+M,KAAM,eACNC,YAAa,SAAChN,GACV,IAAMmN,EAAU,CACZ,EAAG,WACH,EAAG,SACH,EAAG,QACH,EAAG,YACH,EAAG,cACH,EAAG,iBAEP,OAAKnL,MAAMoL,QAAQpN,GAGZA,EAAMc,KAAI,SAACuM,GAAD,OAAYF,EAAQE,IAAW,SAA/B,IAA0CnM,KAAK,MAFrD,SAGd,GAEL,IAAQ,wBACR,IAAQ,8BACR,IAAQ,CACJ,KAAQ,oBACR,YAAe,SAACgM,GACZ,OAAOA,EAAOpM,KAAI,SAACd,GAAD,MAAW,GAAKA,EAAM,GAAKA,EAAM,EAAjC,IAAqCkB,KAAK,IAC/D,GAEL,IAAQ,mBACR,IAAQ,CACJ6L,KAAM,mBACNC,YAAa,SAAChN,GACV,OAAc,IAAVA,EACO,WAEG,IAAVA,EACO,WAEJ,aAAeA,CACzB,GAEL,IAAQ,CACJ,KAAQ,sBACR,YAAe,SAACkN,GACZ,OAAOA,EAAOpM,KAAI,SAACd,GAAD,MAAW,GAAKA,EAAM,GAAKA,EAAM,EAAjC,IAAqCkB,KAAK,KAC/D,GAEL,IAAQ,mBACR,MAAQ,SACR,MAAQ,gBACR,MAAQ,CACJ6L,KAAM,YACNC,YAAa,SAAChN,GAAD,OAAWA,EAAMkB,KAAK,KAAtB,GAEjB,MAAQ,aACR,MAAQ,WACR,MAAQ,mBACR,MAAQ,gBACR,MAAQ,UACR,MAAQ,iBACR,MAAQ,oBACR,MAAQ,mBACR,MAAQ,cACR,MAAQ,mBACR,MAAQ,sBACR,MAAQ,qBACR,MAAQ,uBACR,MAAQ,UACR,MAAQ,YACR,MAAQ,WACR,MAAQ,aACR,MAAQ,YACR,MAAQ,eACR,MAAQ,aACR,MAAQ,UACR,MAAQ,qBACR,MAAQ,oBACR,MAAQ,uBACR,MAAQ,eACR,MAAQ,eACR,MAAQ,qBACR,MAAQ,qBACR,MAAQ,mBACR,MAAQ,mBACR,MAAQ,gBACR,MAAQ,gBACR,MAAQ,gBACR,MAAQ,mBACR,MAAQ,gBACR,MAAQ,oBACR,MAAQ,sBACR,MAAQ,qBACR,MAAQ,cACR,MAAQ,cACR,MAAQ,CACJ6L,KAAM,kBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,SACH,EAAG,QACJA,IAAU,SAHA,GAKjB,MAAQ,CACJ+M,KAAM,yBACNC,YAAaC,EAAAA,aAEjB,MAAQ,CACJF,KAAM,yBACNC,YAAaC,EAAAA,aAEjB,MAAQ,kBACR,MAAQ,sBACR,MAAQ,sBACR,MAAQ,mBACR,MAAQ,yBACR,MAAQ,oBACR,MAAQ,0BACR,MAAQ,wBACR,MAAQ,WACR,MAAQ,iBACR,MAAQ,kBACR,MAAQ,uBACR,MAAQ,wBACR,MAAQ,aACR,MAAQ,oBACR,MAAQ,cACR,MAAQ,uBACR,MAAQ,wBACR,MAAQ,wBACR,MAAQ,mBACR,MAAQ,CACJF,KAAM,qBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,gBACH,EAAG,gBACH,EAAG,cACH,EAAG,mBACJA,IAAU,SALA,GAOjB,MAAQ,mBACR,MAAQ,iBACR,MAAQ,iBACR,MAAQ,yBACR,MAAQ,4BACR,MAAQ,sBACR,MAAQ,wBACR,MAAQ,CACJ+M,KAAM,oBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,iBACH,EAAG,OACH,EAAG,YACH,EAAG,gBACJA,IAAU,SALA,GAOjB,MAAQ,kBACR,MAAQ,iBACR,MAAQ,wBACR,MAAQ,uBACR,MAAQ,uBACR,MAAQ,YACR,MAAQ,YACR,MAAQ,QACR,MAAQ,WACR,MAAQ,2BACR,MAAQ,0BACR,MAAQ,0BACR,MAAQ,cACR,MAAQ,CACJ+M,KAAM,2BACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,SACH,EAAG,QACJA,IAAU,SAHA,GAKjB,MAAQ,CACJ+M,KAAM,2BACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,SACH,EAAG,QACJA,IAAU,SAHA,GAKjB,MAAQ,yBACR,MAAQ,CACJ+M,KAAM,qBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,OACH,EAAG,QACJA,IAAU,SAHA,GAKjB,MAAQ,oBACR,MAAQ,oB,4MC7VZ,I,EAAA,IACI,EAAQ,CACJ,KAAQ,eACR,YAAe,SAACA,GACZ,OAAiB,IAAbA,EAAM,IAAyB,IAAbA,EAAM,IAAyB,IAAbA,EAAM,IAAyB,IAAbA,EAAM,GACrD,cAEJ,SACV,GAEL,EAAQ,CACJ,KAAQ,iBACR,YAAe,SAACA,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,iBAEJ,SACV,GAEL,EAAQ,CACJ,KAAQ,cACR,YAAe7J,GAEnB,EAAQ,CACJ,KAAQ,kBACR,YAAe,SAACzD,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,iBAEJ,SACV,GAEL,EAAQ,CACJ,KAAQ,eACR,YAAe7J,GAEnB,EAAQ,CACJ,KAAQ,iBACR,YAAe,SAACzD,GACZ,OAAc,IAAVA,EACO,YACU,IAAVA,EACA,uCAEJ,SACV,GAEL,EAAQ,CACJ,KAAQ,cACR,YAAe,SAACA,GACZ,OAAQA,EAAM,GAAKA,EAAM,GAAM,IAClC,GAEL,EAAQ,CACJ,KAAQ,eACR,YAAe,SAACkN,GACZ,OAAOA,EAAOpM,KAAI,YAA8B,I,EAAA,K,4CAAA,I,owBACtCyM,EADsC,UAE5C,MAAI,YAAYC,KAAZ,UAAoBD,IACpB,WAAWA,GAERA,CACV,IAAErM,KAAK,IACX,GAEL,EAAQ,gBACR,EAAQ,CACJ,KAAQ,YACR,YAAe,SAAClB,GACZ,IAAMyN,EAASzN,EAAMkB,KAAK,IAC1B,MAAe,MAAXuM,EACO,0BACW,MAAXA,EACA,+BAEJ,SACV,GAEL,GAAQ,CACJ,KAAQ,iBACR,YAAe,SAACzN,GACZ,IAAM0N,EAAO1N,EAAMkB,KAAK,IACxB,MAAa,MAATwM,EACO,4BACS,MAATA,EACA,4BAEJ,SACV,GAEL,GAAQ,SACR,GAAQ,CACJ,KAAQ,cACR,YAAe,SAAC1N,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,sBACQ,MAARA,EACA,iBACQ,MAARA,EACA,QAEJ,SACV,GAEL,GAAQ,WACR,GAAQ,CACJ,KAAQ,cACR,YAAe,SAACtN,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,qBAEJ,SACV,GAEL,GAAQ,WACR,GAAQ,CACJ,KAAQ,qBACR,YAAe,SAACtN,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,qBAEJ,SACV,GAEL,GAAQ,kBACR,GAAQ,cACR,GAAQ,CACJ,KAAQ,qBACR,YAAe,SAACtN,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,iBAEJ,SACV,GAEL,GAAQ,CACJ,KAAQ,kBACR,YAAe,SAACtN,GACZ,OAAQA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAOA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAM,GAAMA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAM,IACzG,GAEL,GAAQ,CACJ,KAAQ,sBACR,YAAe,SAACA,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,iBAEJ,SACV,GAEL,GAAQ,CACJ,KAAQ,mBACR,YAAe,SAACtN,GACZ,OAAQA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAOA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAM,GAAMA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAM,IACzG,GAEL,GAAQ,CACJ,KAAQ,oBACR,YAAe,SAACA,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,iBACQ,MAARA,EACA,qBAEJ,SACV,GAEL,GAAQ,iBACR,GAAQ,CACJ,KAAQ,qBACR,YAAe,SAACtN,GACZ,IAAMsN,EAAMtN,EAAMkB,KAAK,IACvB,MAAY,MAARoM,EACO,aACQ,MAARA,EACA,QACQ,MAARA,EACA,QAEJ,SACV,GAEL,GAAQ,kBACR,GAAQ,CACJ,KAAQ,sBACR,YAAehK,GAEnB,GAAQ,CACJ,KAAQ,qBACR,YAAeA,GAEnB,GAAQ,eACR,GAAQ,CACJ,KAAQ,kBACR,YAAe,SAACtD,GACZ,OAAc,IAAVA,EACO,8CACU,IAAVA,EACA,kCAEJ,SACV,GAEL,GAAQ,wBC/NZ,IACI,EAAQ,wBACR,EAAQ,CACJ+M,KAAM,0BACNC,YAAa,SAAChN,GAAD,OAAWqD,EAAerD,EAA1B,GAEjB,KAAQ,yBACR,KAAQ,oBACR,KAAQ,sBCRZ,IACI,MAAQ,CACJ,KAAQ,aACR,YAAe,SAACA,GAAD,OAAWqD,EAAerD,EAA1B,GAEnB,MAAQ,iBACR,MAAQ,UACR,MAAQ,eACR,MAAQ,e,sHCFZ,IAAM2N,GAAsBxM,EAAa,CAAC,EAAGyM,ECL7C,CACI,MAAQ,CACJ,KAAQ,eACR,YAAeX,EAAAA,cAEnB,MAAQ,CACJ,KAAQ,UACR,YAAeA,EAAAA,SAEnB,MAAQ,CACJ,KAAQ,kBACR,YAAeA,EAAAA,iBAEnB,MAAQ,sBACR,MAAQ,kBACR,MAAQ,CACJ,KAAQ,OACR,YAAe,iBAAM,uBAAN,GAEnB,MAAQ,iBACR,MAAQ,gBACR,MAAQ,CACJF,KAAM,kBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,8BACH,EAAG,6BACH,EAAG,YACH,EAAG,6DACH,EAAG,4CACH,EAAG,2CACH,EAAG,yEACJA,IAAU,SARA,GAUjB,MAAQ,4BACR,MAAQ,2BACR,MAAQ,WACR,MAAQ,sBACR,MAAQ,sBACR,MAAQ,CACJ,KAAQ,cACR,YAAe,SAACA,GAAD,OAAWqD,EAAerD,EAA1B,GAEnB,MAAQ,mBACR,MAAQ,oBACR,MAAQ,uBACR,MAAQ,aACR,MAAQ,qBACR,MAAQ,sBACR,MAAQ,CACJ,KAAQ,0BACR,YAAeiN,EAAAA,yBAEnB,MAAQ,yBACR,MAAQ,CACJ,KAAQ,oBACR,YAAeA,EAAAA,mBAEnB,MAAQ,CACJ,KAAQ,gBACR,YAAeA,EAAAA,eAEnB,MAAQ,kBACR,MAAQ,oBACR,MAAQ,CACJ,KAAQ,mBACR,YAAe,SAACjN,GACZ,OAAOiJ,KAAKoC,IAAIpC,KAAKqC,KAAK,GAAItL,EAAM,GAAKA,EAAM,IAAIuL,QAAQ,EAC9D,GAEL,MAAQ,CACJ,KAAQ,kBACR,YAAe,SAACvL,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,IAAnC,GAEnB,MAAQ,CACJ,KAAQ,eACR,YAAeiN,EAAAA,cAEnB,MAAQ,CACJ,KAAQ,cACRD,YAAaC,EAAAA,aAEjB,MAAQ,CACJ,KAAQ,QACR,YAAe,SAACjN,GACZ,OAAc,IAAVA,EACO,qBACU,IAAVA,EACA,cACU,IAAVA,EACA,mCACU,IAAVA,EACA,+BACU,IAAVA,EACA,qCACU,KAAVA,EACA,gEACU,KAAVA,EACA,4DACU,KAAVA,EACA,4CACU,KAAVA,EACA,gCACU,KAAVA,EACA,yBACU,KAAVA,EACA,oDACU,KAAVA,EACA,gDACU,KAAVA,EACA,oBACU,KAAVA,EACA,sCACU,KAAVA,EACA,iEACU,KAAVA,EACA,6DACU,KAAVA,EACA,6DACU,KAAVA,EACA,wFACU,KAAVA,EACA,oFACU,KAAVA,EACA,iDACU,KAAVA,EACA,4EACU,KAAVA,EACA,wEAEJ,SACV,GAEL,MAAQ,CACJ,KAAQ,cACR,YAAeiN,EAAAA,aAEnB,MAAQ,cACR,MAAQ,CACJF,KAAM,yBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAK,eACL,EAAK,aACL,EAAK,SACL,EAAK,aACL,EAAK,gBACNA,IAAU,SANA,GAQjB,MAAQ,eACR,MAAQ,CACJ,KAAQ,cACR,YAAe,SAACA,GACZ,OAAqB,IAAjBA,EAAMI,OACN,uBAAuBJ,EAAM,GAA7B,gBAAuCA,EAAM,IACrB,IAAjBA,EAAMI,OACb,qBAAqBJ,EAAM,GAA3B,gBAAqCA,EAAM,GAA3C,uBAA4DA,EAAM,IAC1C,IAAjBA,EAAMI,OACb,wBAAwBJ,EAAM,GAA9B,gBAAwCA,EAAM,GAA9C,oBAA4DA,EAAM,GAAlE,qBAAiFA,EAAM,IAEpF,SACV,GAEL,MAAQ,CACJ,KAAQ,YACR,YAAe,iBAAM,uBAAN,GAEnB,MAAQ,CACJ,KAAQ,cACR,YAAesD,GAEnB,MAAQ,aACR,MAAQ,qBACR,MAAQ,sBACR,MAAQ,CACJ,KAAQ,qBACR,YAAe,SAACtD,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,KAAnC,GAEnB,MAAQ,CACJ,KAAQ,WACR,YAAe,SAACA,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,IAAnC,GAEnB,MAAQ,CACJ,KAAQ,WACR,YAAe,SAACA,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,MAAnC,GAEnB,MAAQ,CACJ,KAAQ,aACR,YAAe,SAACA,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,IAAnC,GAEnB,MAAQ,CACJ,KAAQ,eACR,YAAe,SAACA,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,OAAnC,GAEnB,MAAQ,CACJ,KAAQ,uBACR,YAAe,SAACA,GAAD,OAAYA,EAAM,GAAKA,EAAM,GAAM,IAAnC,GAEnB,MAAQ,CACJ,KAAQ,kBACR,YAAe,SAACA,GAAD,OAAWA,EAAMc,KAAI,SAACC,GAAD,OAAcC,OAAOC,aAAaF,EAAlC,IAA6CG,KAAK,GAAvE,GAEnB,MAAQ,CACJ,KAAQ,aACR,YAAe+L,EAAAA,YAEnB,MAAQ,kBACR,MAAQ,kBACR,MAAQ,mBACR,MAAQ,+BACR,MAAQ,cACR,MAAQ,CACJ,KAAQ,2BACR,YAAe,iBAAM,sBAAN,GAEnB,MAAQ,wBACR,MAAQ,wBACR,MAAQ,CACJ,KAAQ,2BACR,YAAeA,EAAAA,0BAEnB,MAAQ,CACJ,KAAQ,kBACR,YAAe,gB,EAAA,K,4CAAA,I,owBAAEY,EAAF,KAAKC,EAAL,wBAAkBD,EAAlB,gBAA2BC,EAA3B,GAEnB,MAAQ,gBACR,MAAQ,CACJ,KAAQ,gBACR,YAAe,SAAC9N,GACZ,OAAc,IAAVA,EACO,YACU,IAAVA,EACA,6BACU,IAAVA,EACA,6BACU,IAAVA,EACA,+BACU,IAAVA,EACA,+BACU,IAAVA,EACA,mBACU,IAAVA,EACA,iCAEJ,SACV,GAEL,MAAQ,CACJ,KAAQ,aACR,YAAe,SAACA,GACZ,OAAc,IAAVA,EACO,MAEJ,SACV,GAEL,MAAQ,CACJ,KAAQ,YACR,YAAe,SAACA,GACZ,OAAc,IAAVA,EACO,gCAEJ,SACV,GAEL,MAAQ,CACJ,KAAQ,aACR,YAAe,iBAAM,8BAAN,GAEnB,MAAQ,CACJ,KAAQ,iBACR,YAAeiN,EAAAA,gBAEnB,MAAQ,CACJ,KAAQ,eACR,YAAeA,EAAAA,cAEnB,MAAQ,CACJ,KAAQ,eACR,YAAeA,EAAAA,cAEnB,MAAQ,CACJ,KAAQ,mBACR,YAAe,SAACjN,GACZ,OAAiB,IAAbA,EAAM,GACC,4BAEJ,GAAMA,EAAM,GAAKA,EAAM,EACjC,GAEL,MAAQ,CACJ,KAAQ,wBACR,YAAe,SAACA,GACZ,OAAc,IAAVA,EACO,UAEJA,CACV,GAEL,MAAQ,CACJ,KAAQ,mBACR,YAAeiN,EAAAA,kBAEnB,MAAQ,CACJ,KAAQ,cACR,YAAe,SAACjN,GACZ,OAAc,IAAVA,EACO,OACU,IAAVA,EACA,cACU,IAAVA,EACA,eACU,IAAVA,EACA,gBACU,IAAVA,EACA,iBAEJ,SACV,GAEL,MAAQ,CACJ,KAAQ,WACR,YAAeiN,EAAAA,UAEnB,MAAQ,CACJ,KAAQ,aACR,YAAeA,EAAAA,YAEnB,MAAQ,CACJ,KAAQ,YACR,YAAeA,EAAAA,WAEnB,MAAQ,CACJ,KAAQ,2BACR,YAAe,iBAAM,kCAAN,GAEnB,MAAQ,CACJ,KAAQ,uBACR,YAAe,SAACjN,GACZ,OAAc,IAAVA,EACO,QACU,IAAVA,EACA,aACU,IAAVA,EACA,eAEJ,SACV,GAEL,MAAQ,gBACR,MAAQ,kBACR,MAAQ,mBACR,MAAQ,CACJ,KAAQ,oBACR,YAAe,SAACA,GACZ,IAAM+N,EAAe,GAAH,OAAM/N,EAAM,GAAG,GAAKA,EAAM,GAAG,GAA7B,YAAmCA,EAAM,GAAG,GAAKA,EAAM,GAAG,GAA1D,OAClB,OAAoB,IAAhBA,EAAM,GAAG,GACT,UAAU+N,EAAV,QAEJ,UAAUA,EAAV,cAA4B,GAAM/N,EAAM,GAAG,GAAKA,EAAM,GAAG,IAAOA,EAAM,GAAG,GAAKA,EAAM,GAAG,KAC1F,GAEL,MAAQ,WACR,MAAQ,YACR,MAAQ,mBACR,MAAQ,CACJ+M,KAAM,iBACNC,YAAa,SAAChN,GAAD,MAAY,CACrB,EAAG,wBACH,EAAG,0BACH,EAAG,2CACJA,IAAU,SAJA,GAMjB,MAAQ,oCACR,MAAQ,sCACR,MAAQ,QACR,MAAQ,UACR,MAAQ,eACR,KAAQ,YACR,MAAQ,eACR,MAAQ,OACR,MAAQ,UACR,MAAQ,YACR,MAAQ,eACR,MAAQ,WACR,MAAQ,UACR,MAAQ,aACR,MAAQ,WACR,MAAQ,aACR,MAAQ,YACR,MAAQ,aACR,MAAQ,gBD9XCgO,GAAe,MAEfC,GAAgB,OAEhBC,GAA4B,mBAGzC,YACKF,GAAeL,IADpB,KAN4B,MAQRC,GAFpB,KAGKK,GAAgBN,IAHrB,KAJ4B,MAQRQ,IAJpB,KAKKD,GAA4BE,IALjC,KAF4B,MAQYC,IANxC,GENMC,GAAgB,CAClB,EAAGC,EAAAA,UACH,EAAGA,EAAAA,WACH,EAAGA,EAAAA,WACH,EAAGA,EAAAA,UACH,EAAGA,EAAAA,cACH,EAAGA,EAAAA,eACH,EAAGA,EAAAA,WACH,GAAIA,EAAAA,eACJ,GAAIA,EAAAA,iBAGR,GAKA,SAAcrO,EAAUyD,EAAkB6K,GACtC,IAAM9D,EAAY7D,EAAuB3G,EAAUyD,GAC/C8K,EAQR,SAAoBvO,EAAUyD,EAAkB+G,EAAW8D,GACvD,OAAOE,GAAQxO,EAAU8N,GAAcrK,EAAkBgL,GAAgBzO,EAAUyD,EAAkB+G,GAAYA,EAAW8D,EAC/H,CAVcI,CAAW1O,EAAUyD,EAAkB+G,EAAW8D,GAK7D,OA2BJ,SAAiCC,EAAMvO,EAAUyD,EAAkB+G,EAAW8D,GAC1E,YAA+ClM,IAA3CmM,EAAKI,gCACE1N,EAAasN,EAAMC,GAAQxO,EAAUgO,GAA2BvK,EAAkBA,EAAmB8K,EAAKI,gCAAkC7O,MAAO0K,EAAW8D,IAGlKC,CACV,CAnCUK,CADPL,EAsBJ,SAAoBA,EAAMvO,EAAUyD,EAAkB+G,EAAW8D,GAC7D,YAAuClM,IAAnCmM,EAAKM,wBACE5N,EAAasN,EAAMC,GAAQxO,EF3Cd,ME2CsCyD,EAAkBA,EAAmB8K,EAAKM,wBAA0B/O,MAAO0K,EAAW8D,IAG7IC,CACV,CA5BUO,CADPP,EAeJ,SAAqBA,EAAMvO,EAAUyD,EAAkB+G,EAAW8D,GAC9D,YAAmClM,IAA/BmM,EAAKQ,oBACE9N,EAAasN,EAAMC,GAAQxO,EAAU+N,GAAetK,EAAkBA,EAAmB8K,EAAKQ,oBAAsBjP,MAAO0K,EAAW8D,IAG1IC,CACV,CArBUS,CAAYT,EAAMvO,EAAUyD,EAAkB+G,EAAW8D,GACxCtO,EAAUyD,EAAkB+G,EAAW8D,GAC1BtO,EAAUyD,EAAkB+G,EAAW8D,EAG/E,EAbD,GA+CA,SAAiBtO,EAAU6E,EAAYyJ,GACnC,IAAM9D,EAAY7D,EAAuB3G,EAAU6E,GAEnD,OAGJ,SAAsB7E,EAAU6E,EAAY0J,EAAM/D,GAC9C,IAAMyE,EAAa,GAEnB,IAAKV,EAAI,QACL,OAAOA,EAIX,IADA,IAAMW,EAAS,GACN9O,EAAI,EAAGA,EAAI2I,KAAKoG,KAAKZ,EAAI,QAAYzO,MAAMI,OAAS+O,GAAa7O,IAAK,CAC3E8O,EAAO9O,GAAK,CAAC,EAEb,IAAMgP,EAAaC,GAAoBd,EAAI,QAAYzO,MAAOM,EAAI6O,EAAYZ,EAAAA,YAAkB,QAAS7D,GACzG0E,EAAO9O,GAAP,WAA0BkP,GAAcF,GACxCF,EAAO9O,GAAP,YAA2BmP,GAAeH,GAC1CF,EAAO9O,GAAP,UAAyBoP,GAAaJ,GAEtC,IAAMK,EAAYJ,GAAoBd,EAAI,QAAYzO,MAAOM,EAAI6O,EAAa,EAAGZ,EAAAA,YAAkB,QAAS7D,GAC5G0E,EAAO9O,GAAP,UAAyB,CACrBN,MAAO2P,EACP3C,YAAa,GAAK2C,GAGtB,IAAMC,EAAcC,GAAuBvP,GAAK,EAAIiP,GAAoBd,EAAI,QAAYzO,MAAOM,EAAI6O,EAAa,EAAGZ,EAAAA,YAAkB,QAAS7D,GAAa3F,EAC3JqK,EAAO9O,GAAP,YAA2B,CACvBN,MAAO4P,EACP5C,YAAa,GAAK4C,GAGtB,IAAME,EACFP,GAAoBd,EAAI,QAAYzO,MAAOM,EAAI6O,EAAa,GAAIZ,EAAAA,YAAkB,SAAU7D,GAChG0E,EAAO9O,GAAP,2BAA0C,CACtCN,MAAO8P,EACP9C,YAAa,GAAK8C,GAGtB,IAAMC,EACFR,GAAoBd,EAAI,QAAYzO,MAAOM,EAAI6O,EAAa,GAAIZ,EAAAA,YAAkB,SAAU7D,GAChG0E,EAAO9O,GAAP,2BAA0C,CACtCN,MAAO+P,EACP/C,YAAa,GAAK+C,GAGtBX,EAAO9O,GAAGwB,MAAQ5B,EAASwC,OAAOc,MAAMoM,EAAaA,EAAcD,GACnErO,EAAU8N,EAAO9O,GAAI,UAAU,WAC3B,OAAOuB,EAAe7C,KAAK8C,MAC9B,GACJ,CAID,OAFA2M,EAAI,OAAaW,EAEVX,CACV,CAtDUuB,CAAa9P,EAAU6E,EADjB2J,GAAQxO,EFzDG,MEyDqB6E,EAAY4J,GAAgBzO,EAAU6E,EAAY2F,GAAYA,EAAW8D,GACtE9D,EACnD,EAhCD,SAASiE,GAAgBzO,EAAUyD,EAAkB+G,GACjD,OAAO/G,EAAmB4K,EAAAA,UAAgBrO,EAAUyD,EAAmB,EAAG+G,EAC7E,CAqFD,SAAS6E,GAAoBU,EAAS9P,EAAQ+P,EAAMxF,GAChD,GAAIA,IAAc7D,EAAyB,CAEvC,IADA,IAAI7G,EAAQ,EACHM,EAAI,EAAGA,EAAI4P,EAAM5P,IACtBN,GAASiQ,EAAQ9P,EAASG,IAAO,EAAIA,EAEzC,OAAON,CACV,CAGD,IADA,IAAIA,EAAQ,EACHM,EAAI,EAAGA,EAAI4P,EAAM5P,IACtBN,GAASiQ,EAAQ9P,EAASG,IAAO,GAAK4P,EAAO,EAAI5P,GAErD,OAAON,CACV,CAED,SAASwP,GAAcF,GACnB,IAAMa,EAAQ,CACTb,GAAc,GAAM,EACpBA,GAAc,GAAM,EACpBA,GAAc,GAAM,GAGnBc,EAAmB,GAYzB,OAVID,EAAM,IACNC,EAAiB5P,KAAK,0BAEtB2P,EAAM,IACNC,EAAiB5P,KAAK,yBAEtB2P,EAAM,IACNC,EAAiB5P,KAAK,wBAGnB,CACHR,MAAOmQ,EACPnD,YAAaoD,EAAiBlP,KAAK,OAAS,OAEnD,CAED,SAASuO,GAAeH,GACpB,IAAMe,EAAcf,GAAc,GAAK,EACvC,MAAO,CACHtP,MAAOqQ,EACPrD,YAA6B,IAAhBqD,EAAoB,OAAS,UAEjD,CAED,SAASX,GAAaJ,GAClB,IAAMhH,EAAoB,SAAbgH,EAWb,MAAO,CACHtP,MAAOsI,EACP0E,YAZiB,CACjB,OAAS,4BACT,MAAS,mCACT,MAAS,uCACT,OAAS,+BACT,OAAS,gCACT,OAAS,kCACT,EAAK,aAKqB1E,IAAS,UAE1C,CAED,SAASuH,GAAuBvP,GAC5B,OAAa,IAANA,CACV,CAED,SAASoO,GAAQxO,EAAUoQ,EAAS3M,EAAkBxD,EAAQuK,EAAW8D,GACrE,IAAM+B,EAAmBhC,EAAAA,YAAkB,SAGrCE,EAAO,CAAC,EACR+B,EA8BV,SAA2BtQ,EAAUC,EAAQuK,GACzC,OAAIvK,EAASoO,EAAAA,YAAkB,UAAYrO,EAASK,WACzCgO,EAAAA,WAAiBrO,EAAUC,EAAQuK,GAEvC,CACV,CAnC0B+F,CAAkBvQ,EAAUC,EAAQuK,GAE3DvK,GAAUoQ,EACV,IAAK,IAAIG,EAAa,EAAGA,EAAaF,KAC9BrQ,EAPW,GAOWD,EAASK,YADemQ,IAAc,CAKhE,IAAMC,EAAMC,GAAQ1Q,EAAUoQ,EAAS3M,EAAkBxD,EAAQuK,EAAW8D,QAChElM,IAARqO,IACAlC,EAAKkC,EAAI5D,MAAQ,CACb,GAAM4D,EAAIE,GACV,MAASF,EAAI3Q,MACb,YAAe2Q,EAAI3D,cAI3B7M,GApBe,EAqBlB,CAED,GAAgCA,EAASD,EAASK,WAAagO,EAAAA,YAAkB,QAAU,CACvF,IAAMuC,EAAgBvC,EAAAA,UAAgBrO,EAAUC,EAAQuK,GAClC,IAAlBoG,GAAuBR,IAAYtC,KACnCS,EAAI,UAAgBC,GAAQxO,EFzNZ,MEyNoCyD,EAAkBA,EAAmBmN,EAAepG,EAAW,GAE1H,CAED,OAAO+D,CACV,CASD,SAASmC,GAAQ1Q,EAAUoQ,EAAS3M,EAAkBxD,EAAQuK,EAAW8D,GACrE,IAQIuC,EAPEC,EAAkBzC,EAAAA,YAAkB,SACpC0C,EAAmBD,EAAkBzC,EAAAA,YAAkB,SACvD2C,EAAmBD,EAAmB1C,EAAAA,YAAkB,QAExD4C,EAAU5C,EAAAA,WAAiBrO,EAAUC,EAAQuK,GAC7C0G,EAAU7C,EAAAA,WAAiBrO,EAAUC,EAAS6Q,EAAiBtG,GAC/D2G,EAAW9C,EAAAA,UAAgBrO,EAAUC,EAAS8Q,EAAkBvG,GAGtE,QAAiCpI,IAA7BiM,EAAAA,UAAgB6C,KAA4B5C,QAAiDlM,IAA/BgP,GAAShB,GAASa,IAApF,CAIA,GA6CJ,SAAkCC,EAASC,GACvC,OAAO9C,EAAAA,UAAgB6C,GAAWC,GAAY9C,EAAAA,YAAkB,OACnE,CA/COgD,CAAyBH,EAASC,GAClCN,EAAWS,GAAYtR,EAAUC,EAAS+Q,EAAkBE,EAASC,EAAU3G,OAC5E,CACH,IAAM+G,EAAiBlD,EAAAA,UAAgBrO,EAAUC,EAAS+Q,EAAkBxG,GAKxEqG,EA8DZ,SAAgC7Q,EAAUyD,EAAkB8N,EAAgBL,EAASC,GACjF,OAAO1N,EAAmB8N,EAAiBlD,EAAAA,UAAgB6C,GAAWC,GAAYnR,EAASK,UAC9F,CApEWmR,CAAuBxR,EAAUyD,EAAkB8N,EAAgBL,EAASC,GAEjEG,GAAYtR,EAAUyD,EAAmB8N,EAAgBL,EAASC,EAAU3G,EApBrE,QAmBIyG,GAGX,gBAElB,CAEGC,IAAY7C,EAAAA,SAAAA,QAEZwC,EA8ER,SAA0BY,GACtB,IACI,OAAOA,EAAW7Q,KAAI,SAACd,GAAD,OAAW4R,mBAAmBC,OAAO7R,GAArC,GAGzB,CAFC,MAAO8R,GACL,OAAOH,CACV,CACJ,CApFkBI,CADXhB,EA6DR,SAAuCiB,GAInC,IAHA,IAAMjB,EAAW,GACbzQ,EAAI,EAEC2R,EAAI,EAAGA,EAAID,EAAO5R,OAAQ6R,IACb,OAAdD,EAAOC,SAIS3P,IAAhByO,EAASzQ,KACTyQ,EAASzQ,GAAK,IAElByQ,EAASzQ,IAAM0R,EAAOC,IANlB3R,IASR,OAAOyQ,CACV,CA7EkBmB,CAA8BnB,KAI7C,IAAIoB,EAAU,aAAH,OAAgBhB,GACvBiB,EAAiBrB,EAErB,QAAmCzO,IAA/BgP,GAAShB,GAASa,GAClB,QAA4C7O,IAAvCgP,GAAShB,GAASa,GAAlB,WAAoG7O,IAA9CgP,GAAShB,GAASa,GAAlB,YAA0D,CACjHgB,EAAUb,GAAShB,GAASa,GAAlB,KACV,IACIiB,EAAiBd,GAAShB,GAASa,GAAlB,YAA0CJ,EAG9D,CAFC,MAAOe,GACLM,EAAiBC,GAA2BtB,EAC/C,CACJ,MAAWK,IAAY7C,EAAAA,SAAAA,UAAgC6C,IAAY7C,EAAAA,SAAAA,WAChE4D,EAAUb,GAAShB,GAASa,GAC5BiB,EAAiB,GAAMrB,EAAS,GAAKA,EAAS,KAE9CoB,EAAUb,GAAShB,GAASa,GAC5BiB,EAAiBC,GAA2BtB,IAIpD,MAAO,CACHF,GAAIM,EACJpE,KAAMoF,EACNnS,MAAO+Q,EACP/D,YAAaoF,EA3ChB,CA6CJ,CAMD,SAASZ,GAAYtR,EAAUC,EAAQmI,EAAMgK,EAAO5H,GAAkC,IAAvB6H,EAAuB,uDAAP,EACvEvS,EAAQ,GAERuS,IACAD,GAAgB/D,EAAAA,UAAgBjG,GAChCA,EAAOiG,EAAAA,SAAAA,MAEX,IAAK,IAAIiE,EAAa,EAAGA,EAAaF,EAAOE,IACzCxS,EAAMQ,KAAK8N,GAAchG,GAAMpI,EAAUC,EAAQuK,IACjDvK,GAAUoO,EAAAA,UAAgBjG,GAS9B,OANIA,IAASiG,EAAAA,SAAAA,MACTvO,EAAQuO,EAAAA,cAAoBvO,GACJ,IAAjBA,EAAMI,SACbJ,EAAQA,EAAM,IAGXA,CACV,CAgCD,SAASqS,GAA2BtB,GAChC,OAAIA,aAAoB/O,MACb+O,EAAS7P,KAAK,MAElB6P,CACV,CCxWD,OAIA,SAAc7Q,EAAU+H,GACpB,IAAM7H,EAWV,SAAmBF,EAAU+H,GACzB,OAAOsG,EAAAA,WAAiBrO,EAAU+H,EACrC,CAbkBwK,CAAUvS,EAAU+H,GAC7ByK,EA2DV,SAAoCxS,EAAU+H,EAAgB7H,GAI1D,KAAIuS,EAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAPzB,GAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAKhN,EALrB,CAOJ,CAxEmC4S,CAA2B1S,EAAU+H,EAAgB7H,GACrF,MAAO,CACH,kBAAmByS,GAAiB3S,EAAU+H,EAAgB7H,GAC9D,eAAgB0S,GAAe5S,EAAU+H,EAAgB7H,GACzD,cAAe2S,GAAc7S,EAAU+H,EAAgB7H,GACvD,mBAAoBsS,EACpB,YAAeA,GAA2BM,GAAe9S,EAAU+H,EAAgByK,EAAwB1S,MAAOI,GAEzH,EAMD,SAASyS,GAAiB3S,EAAU+H,EAAgB7H,GAIhD,KAAIuS,EAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAPzB,GAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAKhN,EALrB,CAOJ,CAED,SAAS8S,GAAe5S,EAAU+H,EAAgB7H,GAI9C,KAAIuS,EAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,WAAiBrO,EAAU+H,EAP1B,GAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,EAAL,MALd,CAOJ,CAED,SAAS+S,GAAc7S,EAAU+H,EAAgB7H,GAI7C,KAAIuS,EAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,WAAiBrO,EAAU+H,EAP1B,GAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,EAAL,MALd,CAOJ,CAiBD,SAASgT,GAAe9S,EAAU+H,EAAgByK,EAAyBtS,GAIvE,KAHe,EACF,EAAIsS,EAEGtS,GAApB,CAMA,IAFA,IAAM6S,EAAa,GAEV3S,EAAI,EAAGA,EAAIoS,EAAyBpS,IAAK,CAC9C,IAAM4S,EAAkBjL,EAVb,EAU2C,EAAJ3H,EAClD2S,EAAWzS,KAAK,CACZ+N,EAAAA,UAAgBrO,EAAUgT,GAC1B3E,EAAAA,UAAgBrO,EAAUgT,EAAkB,GAC5C3E,EAAAA,UAAgBrO,EAAUgT,EAAkB,IAEnD,CAED,MAAO,CACHlT,MAAOiT,EACPjG,YAAaiG,EAAW7S,OAAS,EAAI+S,GAAgBF,GAAcG,GAAgBH,GAAc,GAfpG,CAiBJ,CAED,SAASE,GAAgBF,GACrB,IAAMI,EAAM,CACR,EAAM,IACN,EAAM,KACN,EAAM,KACN,EAAM,IACN,EAAM,KAGV,OAAOJ,EAAWnS,KAAI,SAACwS,GAAD,OAAgBD,EAAIC,EAAW,GAA/B,IAAoCpS,KAAK,GAClE,CAED,SAASkS,GAAgBH,GACrB,IAAMM,EAAQ,CACV,GAAM,cACN,GAAM,cACN,GAAM,cACN,GAAM,cACN,GAAM,cACN,GAAM,cACN,GAAM,cACN,GAAM,eAGV,OAA0B,IAAtBN,EAAW7S,aAAqCkC,IAArB2Q,EAAW,GAAG,SAAgD3Q,IAA5BiR,EAAMN,EAAW,GAAG,IAC1E,GAGJM,EAAMN,EAAW,GAAG,GAC9B,CCtID,OAIA,SAAc/S,EAAUkH,GACpB,IAAMhH,EA4BV,SAAmBF,EAAUkH,GACzB,OAAOmH,EAAAA,WAAiBrO,EAAUkH,EACrC,CA9BkBqL,CAAUvS,EAAUkH,GAC7BoM,EAyGV,SAA2BtT,EAAUkH,EAAgBhH,GAIjD,KAAIuS,GAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,UAAgBrO,EAAUkH,EAPzB,IAQf,MAAO,CACHpH,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,EAAL,MALd,CAOJ,CAtH0ByT,CAAkBvT,EAAUkH,EAAgBhH,GAC7DsT,EAuHV,SAA4BxT,EAAUkH,EAAgBhH,GAIlD,KAAIuS,GAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,UAAgBrO,EAAUkH,EAPzB,IAQf,MAAO,CACHpH,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,EAAL,MALd,CAOJ,CApI2B2T,CAAmBzT,EAAUkH,EAAgBhH,GAC/DqO,EAAO,CACT,eAAgBmF,GAAW1T,EAAUkH,EAAgBhH,GACrD,kBAAmByT,GAAkB3T,EAAUkH,EAAgBhH,GAC/D,YAAe0T,GAAe5T,EAAUkH,EAAgBhH,GACxD,YAAe2T,GAAe7T,EAAUkH,EAAgBhH,GACxD,uBAAwBoT,EACxB,wBAAyBE,GAG7B,QAAuBpR,IAAnBkR,QAAoDlR,IAApBoR,EAA+B,CAC/D,IAAMM,EA2Hd,SAAsB9T,EAAUkH,EAAgB6M,EAAiB7T,GAG7D,KAAwB,IAApB6T,GAFW,GAEuBA,EAAkB7T,GAKxD,MAAO,CACHJ,MAFUE,EAASwC,OAAOc,MAAM4D,EANrB,GAM8CA,EAN9C,GAMwE6M,GAGnFjH,YAAa,0BAEpB,CAvIyBkH,CAAahU,EAAUkH,EAAgB,EAAIoM,EAAexT,MAAQ0T,EAAgB1T,MAAOI,GACvG4T,IACAvF,EAAK,kBAAoBuF,EAEhC,CAED,IAAK,IAAM7B,KAAW1D,OACInM,IAAlBmM,EAAK0D,WACE1D,EAAK0D,GAIpB,OAAO1D,CACV,EAMD,SAASmF,GAAW1T,EAAUkH,EAAgBhH,GAI1C,KAAIuS,EAAgBvS,GAApB,CAIA,IAAM+T,EAAe5F,EAAAA,UAAgBrO,EAAUkH,EAPhC,GAQTgN,EAAe7F,EAAAA,UAAgBrO,EAAUkH,EARhC,EAQ0D,GACzE,MAAO,CACHpH,MAAsB,IAAfmU,EAAuBC,EAC9BpH,YAAamH,EAAe,IAAMC,EANrC,CAQJ,CAED,SAASP,GAAkB3T,EAAUkH,EAAgBhH,GAIjD,KAAIuS,GAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,UAAgBrO,EAAUkH,EAPzB,GAQf,MAAO,CACHpH,MAAAA,EACAgN,YAAaqH,GAA6BrU,GAL7C,CAOJ,CAED,SAASqU,GAA6BrU,GAClC,OAAc,IAAVA,EACO,OAEG,IAAVA,EACO,SAEG,IAAVA,EACO,KAEJ,SACV,CAED,SAAS8T,GAAe5T,EAAUkH,EAAgBhH,GAI9C,KAAIuS,GAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,WAAiBrO,EAAUkH,EAP1B,IAQf,MAAO,CACHpH,MAAAA,EACAgN,YAAa,GAAKhN,EALrB,CAOJ,CAED,SAAS+T,GAAe7T,EAAUkH,EAAgBhH,GAI9C,KAAIuS,GAAgBvS,GAApB,CAIA,IAAMJ,EAAQuO,EAAAA,WAAiBrO,EAAUkH,EAP1B,IAQf,MAAO,CACHpH,MAAAA,EACAgN,YAAa,GAAKhN,EALrB,CAOJ,CC7GD,QACI,KAAQ,CACJ,IAAQ,CACJ,KAAQ,gBACR,YAAe,SAACA,GACZ,MAAO,KAAEA,EAAM,IAAM,GAAKA,EAAM,GACnC,GAEL,IAAQ,CACJ,KAAQ,cACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,cACR,YAAe,SAACA,GACZ,MAAO,KAAEA,EAAM,IAAM,GAAKA,EAAM,GACnC,GAEL,IAAQ,CACJ,KAAQ,sBACR,YAAe,SAACA,GACZ,MAAO,KAAEA,EAAM,IAAM,GAAKA,EAAM,GACnC,GAEL,IAAQ,qBACR,IAAQ,kBACR,IAAQ,aACR,IAAQ,oBACR,IAAQ,CACJ,KAAQ,YACR,YAAesU,IAEnB,IAAQ,CACJ,KAAQ,YACR,YAAeC,IAEnB,IAAQ,CACJ,KAAQ,sBACR,YAAeC,GACf,cAAiBA,IAErB,IAAQ,MACR,IAAQ,CACJ,KAAQ,iBACR,YAAe,SAACxU,GACZ,MAAO,KAAEA,EAAM,IAAM,GAAKA,EAAM,GACnC,GAEL,IAAQ,CACJ,KAAQ,cACR,YAAe,SAACA,GACZ,MAAO,KAAEA,EAAM,IAAM,GAAKA,EAAM,GACnC,GAEL,IAAQ,CACJ,KAAQ,iBACR,YAAe,SAACA,GACZ,MAAO,KAAEA,EAAM,IAAM,GAAKA,EAAM,GACnC,GAEL,IAAQ,wBACR,IAAQ,6BACR,IAAQ,cACR,IAAQ,cACR,IAAQ,CACJ,KAAQ,mBACR,YAAe,SAACA,GACZ,MAA8B,OAA1BqD,EAAerD,GACR,sBAEJ,SACV,GAEL,IAAQ,UACR,IAAQ,CACJ,KAAQ,oBACR,WAAc,EACd,YAAe,SAACA,GACZ,IAAMyU,EAAQpR,EAAerD,GAAO0U,MAAM,KAC1C,OAAOD,EAAM,IAAMA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAAOA,EAAM,GAAK,IAAMA,EAAM,GAAK,GACrF,GAEL,IAAQ,WACR,IAAQ,CACJ,KAAQ,wBACR,WAAc,GAElB,IAAQ,qBACR,IAAQ,CACJ,KAAQ,WACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,wBACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,wBACR,WAAc,GAElB,IAAQ,eACR,IAAQ,eACR,IAAQ,kBACR,IAAQ,kBACR,IAAQ,uBACR,IAAQ,CACJ,KAAQ,iBACR,YAAe,SAACzU,GACZ,IAAMgS,EAAS3O,EAAerD,GAC9B,MAAe,OAAXgS,EACO,cACW,OAAXA,EACA,iBACW,OAAXA,EACA,gBACW,OAAXA,EACA,mBAEJ,SACV,GAEL,IAAQ,CACJ,KAAQ,oBACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,iBACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,mBACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,eACR,YAAesC,IAEnB,IAAQ,CACJ,KAAQ,eACR,YAAeC,IAEnB,IAAQ,CACJ,KAAQ,wBACR,YAAeD,IAEnB,IAAQ,CACJ,KAAQ,wBACR,YAAeC,IAEnB,IAAQ,sBACR,IAAQ,kBACR,IAAQ,CACJ,KAAQ,eACR,YAAe,SAACvU,GACZ,IAAMgS,EAAS3O,EAAerD,GAC9B,MAAe,MAAXgS,EACO,UACW,MAAXA,EACA,UACW,MAAXA,EACA,OAEJ,SACV,GAEL,IAAQ,CACJ,KAAQ,UACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,gBACR,WAAc,GAElB,IAAQ,OACR,IAAQ,eACR,IAAQ,iBACR,IAAQ,gCACR,IAAQ,gCACR,IAAQ,kCACR,IAAQ,WACR,IAAQ,SACR,IAAQ,SACR,IAAQ,mBACR,IAAQ,CACJ,KAAQ,UACR,WAAc,GAElB,IAAQ,mBACR,IAAQ,CACJ,KAAQ,gBACR,WAAc,GAElB,IAAQ,CACJ,KAAQ,qBACR,YAAe,SAAChS,GAAD,OAAWA,CAAX,GAEnB,IAAQ,aACR,IAAQ,CACJ,KAAQ,oBACR,YAAe,SAACA,GACZ,IAAMgS,EAAS3O,EAAerD,GAC9B,MAAe,MAAXgS,EACO,WACW,MAAXA,EACA,YACW,MAAXA,EACA,SAEJ,SACV,GAEL,IAAQ,sBACR,IAAQ,CACJ,KAAQ,aACR,YAAe,SAAChS,GACZ,IAAM2U,EAActR,EAAerD,GAC7B4U,EAAaD,EAAYE,OAAO,GAChCC,EAAaH,EAAYE,OAAO,GAClC7H,EAAc,GA0BlB,MAxBmB,MAAf4H,EACA5H,GAAe,OACO,MAAf4H,IACP5H,GAAe,UAGA,MAAf8H,EACA9H,GAAe,cACO,MAAf8H,EACP9H,GAAe,gCACO,MAAf8H,EACP9H,GAAe,iCACO,MAAf8H,EACP9H,GAAe,2BACO,MAAf8H,EACP9H,GAAe,cACO,MAAf8H,EACP9H,GAAe,WACO,MAAf8H,EACP9H,GAAe,WACO,MAAf8H,IACP9H,GAAe,UAGC,KAAhBA,EACOA,EAEJ2H,CACV,GAEL,IAAQ,CACJ,KAAQ,sBACR,YAAe,SAAC3U,GAAD,OAAW+U,SAAS1R,EAAerD,GAAQ,IAAM,KAAjD,GAEnB,IAAQ,CACJ,KAAQ,4BACR,YAAe,SAACA,GACZ,IAAMgV,EAAOD,SAAS1R,EAAerD,GAAQ,IAC7C,OAAOgV,GAAiB,IAATA,EAAa,OAAS,QACxC,GAEL,IAAQ,CACJ,KAAQ,iBACR,YAAe,SAAChV,GACZ,IAAMiV,EAAW5R,EAAerD,GAChC,OAAIiV,EAAS7U,QAAU,EACZ6U,EAASC,OAAO,EAAG,GAAK,IAAMD,EAASC,OAAO,EAAG,GAAK,IAAMD,EAASC,OAAO,EAAG,GAEnFD,CACV,GAEL,IAAQ,eACR,IAAQ,oBACR,IAAQ,qBACR,IAAQ,WACR,IAAQ,CACJ,KAAQ,SAACjV,GACL,OAAqB,IAAjBA,EAAMI,OACC,iCAEJ,sBACV,EACD,YAAe,SAACJ,GACZ,GAAqB,IAAjBA,EAAMI,OAAc,CACpB,IAAM+U,GAAYnV,EAAM,IAAM,GAAKA,EAAM,GACzC,OAAiB,IAAbmV,EACO,gBACa,IAAbA,EACA,8CACa,IAAbA,EACA,sCACa,IAAbA,EACA,oDACa,IAAbA,EACA,oCACa,IAAbA,EACA,mCACa,IAAbA,EACA,uBACa,IAAbA,EACA,eACa,IAAbA,EACA,2DACa,IAAbA,EACA,+CACa,KAAbA,EACA,+CACa,KAAbA,EACA,+BACa,KAAbA,EACA,qCACa,KAAbA,EACA,6CACa,KAAbA,EACA,yDACa,KAAbA,EACA,8CACa,KAAbA,EACA,iDACa,KAAbA,EACA,8CACa,KAAbA,EACA,0DACa,KAAbA,EACA,oCACa,KAAbA,EACA,8BACa,KAAbA,EACA,0DACa,KAAbA,EACA,0CACa,KAAbA,EACA,gCACa,KAAbA,EACA,uCACa,KAAbA,EACA,mCACa,KAAbA,EACA,uBACa,KAAbA,EACA,sDACa,KAAbA,EACA,2CACa,KAAbA,EACA,qBAEX,yBAAyBA,EAC5B,CACD,OAAO9R,EAAerD,EACzB,GAEL,IAAQ,CACJ,KAAQ,yCACR,YAAe,SAACA,EAAOyO,GAEnB,IAAM2G,EAAiB,CACnB,KAAM,CAAC,KAAM,KACb,KAAM,CAAC,KAAM,IAAK,KAAM,IAAK,KAAM,IAAK,KAAM,KAC9C,KAAM,CAAC,KAAM,KACb,KAAM,CAAC,KAAM,MAAO,KAAM,OAC1B,KAAM,CAAC,KAAM,QACb,KAAM,CAAC,KAAM,KACb,KAAM,CAAC,KAAM,KACb,GAAM,CAAC,KAAM,QACb,GAAM,CAAC,KAAM,MAAO,KAAM,MAAO,KAAM,MAAO,KAAM,OACpD,GAAM,CAAC,KAAM,QAEXT,EAActR,EAAerD,GAEnC,GAAIyO,EAAK,kCAAmC,CACxC,IAAM4G,EAA8BhS,EAAeoL,EAAK,kCAAkCzO,OAC1F,GAAIoV,EAAeC,IACZD,EAAeC,GAA6BV,GAC/C,OAAOS,EAAeC,GAA6BV,EAE1D,CAED,OAAOA,CACV,GAEL,IAAQ,0BACR,KAAQ,CACJ,KAAQ,YACR,YAAe,SAAC3U,GACZ,OAAQA,EAAM,GAAIwC,UACrB,GAEL,KAAQ,CACJ,KAAQ,mBACR,YAAe,SAACxC,GAEZ,IADA,IAAIsV,EAAI,EACChV,EAAI,EAAGA,EAAIN,EAAMI,OAAQE,IAC9BgV,GAAKA,GAAK,GAAKtV,EAAMM,GAEzB,OAAOgV,EAAE9S,UACZ,GAEL,KAAQ,CACJ,KAAQ,4BACR,YAAe,SAACxC,GAEZ,IADA,IAAIsV,EAAI,EACChV,EAAI,EAAGA,EAAIN,EAAMI,OAAQE,IAC9BgV,GAAKA,GAAK,GAAKtV,EAAMM,GAEzB,OAAOgV,EAAE9S,UACZ,GAEL,KAAQ,CACJ,KAAQ,0BACR,YAAe,SAACxC,GAEZ,IADA,IAAIsV,EAAI,EACChV,EAAI,EAAGA,EAAIN,EAAMI,OAAQE,IAC9BgV,GAAKA,GAAK,GAAKtV,EAAMM,GAEzB,OAAOgV,EAAE9S,UACZ,KAKb,SAAS8R,GAAgBtU,GACrB,IAAMuV,EAAOlS,EAAerD,GAE5B,OAAIuV,EAAKnV,QAAU,EACRmV,EAAKL,OAAO,EAAG,GAAK,IAAMK,EAAKL,OAAO,EAAG,GAAK,IAAMK,EAAKL,OAAO,EAAG,GAGvEK,CACV,CAED,SAAShB,GAAgBvU,GACrB,IAAMwV,EAAOnS,EAAerD,GACxByV,EAAaD,EASjB,OAPIA,EAAKpV,QAAU,IACfqV,EAAaD,EAAKN,OAAO,EAAG,GAAK,IAAMM,EAAKN,OAAO,EAAG,GAAK,IAAMM,EAAKN,OAAO,EAAG,GAC5D,KAAhBM,EAAKpV,SACLqV,GAAcD,EAAKN,OAAO,EAAG,GAAKM,EAAKN,OAAO,EAAG,GAAK,IAAMM,EAAKN,OAAO,EAAG,KAI5EO,CACV,CAED,SAASjB,GAAgBxU,GACrB,IAAMgS,EAAS3O,EAAerD,GAC9B,MAAe,QAAXgS,EACO,QACW,QAAXA,EACA,eACW,SAAXA,EACA,gBACW,SAAXA,EACA,gBACW,SAAXA,EACA,gBACW,QAAXA,EACA,aACW,QAAXA,EACA,aACW,QAAXA,EACA,aACW,QAAXA,EACA,aACW,QAAXA,EACA,aACW,QAAXA,EACA,aACW,QAAXA,EACA,aACW,QAAXA,EACA,aAEJ,SACV,CC5dD,ICIA,GAKA,SAAgBzO,EAAUwN,GACtB,IAAM2E,EDNV,WACI,GAA2B,oBAAhBC,YACP,OAAOA,WAId,CCAmBA,GAChB,GAAwB,oBAAZD,QAA0CpT,IAAbiB,EACrC,IACI,OAAO,IAAImS,EAAQnS,GAAUqS,OAAO1T,WAAWK,KAAKwO,GAGvD,CAFC,MAAOe,GAER,CAIL,OAGJ,SAA0BH,GACtB,IACI,OAAOC,mBAAmBC,OAAOF,GAGpC,CAFC,MAAOG,GACL,OAAOH,CACV,CACJ,CATUI,CADahB,EAASjQ,KAAI,SAACC,GAAD,OAAcC,OAAOC,aAAaF,EAAlC,IAA6CG,KAAK,IAEtF,ECZD,GAIA,SAAchB,EAAU6E,EAAYyJ,GAChC,IACI,GAAIxM,MAAMoL,QAAQlN,GACd,OAAO2V,GAAU,IAAIpT,SAASP,WAAWK,KAAKrC,GAAUwC,QAAS,CAACwN,KAAMhQ,EAASE,QAAS,EAAGoO,GAEjG,MAOR,SAA6BtO,EAAU6E,GACnC,KAAOA,EArBwB+Q,IAqBmB5V,EAASK,YAAY,CACnE,IAAMwV,EAAgBC,GAAiB9V,EAAU6E,GACjD,GAAIkR,GAAmBF,GACnB,MAAO,CAACG,SAAUH,EAAehR,WAAYA,EAxBtB+Q,IA0B3B/Q,GA1B2B+Q,GA0BgBC,EAAc7F,KAAOiG,GAAgBJ,EACnF,CACD,MAAU5S,MAAM,8BACnB,CAhBqDiT,CAAoBlW,EAAU6E,GAC5E,OAAO8Q,GAAU3V,EADjB,EAAOgW,SAAP,EAAiBnR,WACmCyJ,EAGvD,CAFC,MAAOsD,GACL,MAAO,CAAC,CACX,CACJ,EAaD,SAASkE,GAAiB9V,EAAU6E,GAGhC,GApCe,YAoCX7E,EAASuG,UAAU1B,EAAY,GAC/B,MAAU5B,MAAM,+BAGpB,MAAO,CACHmF,KAAMpI,EAASU,UAAUmE,EAxCT,GAyChBmL,KAAMhQ,EAASU,UAAUmE,EARM,IAUtC,CAED,SAASkR,GAAmBF,GACxB,OA5C4B,OA4CrBA,EAAczN,IACxB,CAED,SAAS6N,GAAgBJ,GACrB,OAAIA,EAAc7F,KAAO,GAAM,EACpB,EAEJ,CACV,CAED,SAAS2F,GAAU3V,EAAUgW,EAAUnR,EAAYyJ,GAM/C,IALA,IAAMC,EAAO,CAAC,EACVlL,OAAWjB,EAET+T,EAAmBtR,EAAamR,EAAQ,KAEtCnR,EAAasR,GAAsBtR,EAAa7E,EAASK,YAAa,CAC1E,MAAuBqQ,GAAQ1Q,EAAU6E,EAAY0J,EAAMlL,EAAUiL,GAA9DmC,EAAP,EAAOA,IAAK2F,EAAZ,EAAYA,QAEZ,GAAY,OAAR3F,EACA,MAGAA,IACI,aAAcA,IACdpN,EAAWoN,EAAIpN,eAGKjB,IAAnBmM,EAAKkC,EAAI5D,YAA+CzK,IAAtBqO,EAAG,WACtClC,EAAKkC,EAAI5D,MAAQ,CACb8D,GAAIF,EAAIE,GACR7Q,MAAO2Q,EAAI3Q,MACXgN,YAAa2D,EAAI3D,cAGfyB,EAAKkC,EAAI5D,gBAAiB/K,QAC5ByM,EAAKkC,EAAI5D,MAAQ,CAAC,CACd8D,GAAIpC,EAAKkC,EAAI5D,MAAM8D,GACnB7Q,MAAOyO,EAAKkC,EAAI5D,MAAM/M,MACtBgN,YAAayB,EAAKkC,EAAI5D,MAAMC,eAGpCyB,EAAKkC,EAAI5D,MAAMvM,KAAK,CAChBqQ,GAAIF,EAAIE,GACR7Q,MAAO2Q,EAAI3Q,MACXgN,YAAa2D,EAAI3D,gBAK7BjI,GA7FgB,EA6FgBuR,CACnC,CAED,OAAO7H,CACV,CAED,SAASmC,GAAQ1Q,EAAU6E,EAAY0J,EAAMlL,EAAUiL,GAInD,GA6BJ,SAA2BtO,EAAU6E,GAEjC,OADsB,KACf7E,EAASO,SAASsE,EAC5B,CAhCOwR,CAAkBrW,EAAU6E,GAC5B,MAAO,CAAC4L,IAAK,KAAM2F,QAAS,GAGhC,IAAMnF,EAAUjR,EAASU,UAAUmE,EAPX,GAQlBuR,EAAUpW,EAASU,UAAUmE,EAPX,GASxB,IAAKyJ,IAAmBgI,GAAAA,KAAqBrF,GACzC,MAAO,CAACR,SAAKrO,EAAWgU,QAAAA,GAG5B,IAAMvF,EAuBV,SAAqB7Q,EAAUC,EAAQ+P,GAGnC,IAFA,IAAMlQ,EAAQ,GAELwS,EAAa,EAAGA,EAAatC,EAAMsC,IACxCxS,EAAMQ,KAAKN,EAASO,SAASN,EAASqS,IAG1C,OAAOxS,CACV,CA/BoBwR,CAAYtR,EAAU6E,EAlHnB,EAkHiDuR,GAE/D3F,EAAM,CACRE,GAAIM,EACJpE,KAAM0J,GAAWD,GAAAA,KAAqBrF,GAAUA,EAASJ,GACzD/Q,MAAO+Q,EACP/D,YAAa0J,GAAkBF,GAAAA,KAAqBrF,GAAUJ,EAAUtC,EAAMlL,IASlF,OA6DJ,SAAyB4N,GACrB,OAAOqF,GAAAA,KAAqBrF,IAAYqF,GAAAA,KAAqBrF,GAArB,UAC3C,CAtEOwF,CAAgBxF,KAChBR,EAAG,WAAiB,GAuE5B,SAA6BQ,GACzB,OAAOqF,GAAAA,KAAqBrF,SAA+D7O,IAAnDkU,GAAAA,KAAqBrF,GAArB,aAC3C,CAvEOyF,CAAoBzF,KACpBR,EAAG,SAAe6F,GAAAA,KAAqBrF,GAArB,cAA+CJ,IAG9D,CAACJ,IAAAA,EAAK2F,QAAAA,EAChB,CAiBD,SAASG,GAAW9F,EAAKQ,EAASJ,GAC9B,OAAKJ,EAYT,SAAmBA,GACf,MAAsB,iBAARA,CACjB,CAXOkG,CAAUlG,GACHA,EAYf,SAAwBA,GACpB,MAAgC,mBAAjBA,EAAG,IACrB,CAZOmG,CAAenG,GACRA,EAAG,KAASI,GAEhBJ,EAAG,KARN,oBAAoBQ,EAS3B,CAUD,SAASuF,GAAkB/F,EAAKI,EAAUtC,EAAMlL,GAC5C,GAiBJ,SAAgCoN,GAC5B,OAAOA,QAA8BrO,IAAvBqO,EAAG,WACpB,CAnBOoG,CAAuBpG,GACvB,IACI,OAAOA,EAAG,YAAgBI,EAAUtC,EAGvC,CAFC,MAAOqD,GAER,CAEL,OAMJ,SAAwBnB,EAAKI,GACzB,OAAOJ,GAAOI,aAAoB/O,KACrC,CAROgV,CAAerG,EAAKI,GACbkG,GAAkB1T,EAAUwN,GAEhCA,CACV,C,uGCzLD,QACI,mBADW,SACQ/Q,GACf,MAAc,MAAVA,EACO,sBAEG,MAAVA,EACO,oBAEG,MAAVA,EACO,aAEG,MAAVA,EACO,kBAEG,MAAVA,EACO,sCAEG,MAAVA,EACO,eAEG,MAAVA,EACO,qCAEG,MAAVA,EACO,gBAEJA,CACV,EACD,sBAAuB,SAACA,GAAD,OAAWiN,EAAAA,eAA8B8H,SAAS/U,EAAO,IAAzD,EACvB,mBAAoB,SAACA,GAAD,OAAWkX,GAASjK,EAAAA,YAA4BjN,EAAhD,EACpB,mBAAoB,SAACA,GAAD,OAAWkX,GAASjK,EAAAA,YAA4BjN,EAAhD,EACpB,qBAAsB,SAACA,GAAD,OAAWkX,GAASjK,EAAAA,cAA8BjN,EAAlD,EACtB,mBAAoBmX,GACpB,oBAAqBA,GACrB,eAAgB,SAACnX,GAAD,OAAWkX,GAASjK,EAAAA,QAAwBjN,EAA5C,EAChB,mBAAoB,SAACA,GAAD,OAAWkX,GAASjK,EAAAA,YAA4BjN,EAAhD,EACpB,gCAAiC,SAACA,GAAD,OAAWiN,EAAAA,yBAAwC8H,SAAS/U,EAAO,IAAnE,EACjC,kBAAmB,SAACA,GAAD,OAAWiN,EAAAA,WAiClC,SAAqBjN,GACjB,MAA8B,OAA1BA,EAAMoX,UAAU,EAAG,GACZrC,SAAS/U,EAAMoX,UAAU,GAAI,IAEjCrC,SAAS/U,EAAO,GAC1B,CAtC2DqX,CAAYrX,GAAjD,EACnB,+BAtCW,SAsCoBA,EAAOgN,GAClC,GAAI,mBAAmBQ,KAAKR,GAAc,CACtC,IAAMsK,EAAUtK,EAAY0H,MAAM,MAAM5T,KAAI,SAACyW,GAAD,OAAYA,EAAOC,WAAW,EAA9B,IAC5C,OAAOvK,EAAAA,wBAAuCqK,EACjD,CACD,OAAOtK,CACV,EACD,gBAAiB,SAAChN,GAAD,OAAWiN,EAAAA,SAAwB8H,SAAS/U,EAAO,IAAnD,EACjB,sBAAuB,SAACA,GAAD,OAAWiN,EAAAA,eAA8B8H,SAAS/U,EAAO,IAAzD,EACvB,oBAAqB,SAACA,GAAD,OAAWiN,EAAAA,aAA4B8H,SAAS/U,EAAO,IAAvD,EACrB,uBAAwB,SAACA,GAAD,OAAWiN,EAAAA,gBAA+B8H,SAAS/U,EAAO,IAA1D,EACxB,oBAjDW,SAiDSA,GAChB,OAAIyX,GAAWzX,GACJiN,EAAAA,aAA4BjN,EAAM0U,MAAM,KAAK5T,KAAI,SAACyW,GAAD,OAAYxC,SAASwC,EAAQ,GAA7B,KAErDvX,CACV,EACD,oBAAqB,SAACA,GAAD,OAAWiN,EAAAA,aAA4B8H,SAAS/U,EAAO,IAAvD,EACrB,kBAAmB,SAACA,GAAD,OAAWiN,EAAAA,WAA0B8H,SAAS/U,EAAO,IAArD,EACnB,wBAAyB,SAACA,GAAD,OAAWiN,EAAAA,iBAAgC8H,SAAS/U,EAAO,IAA3D,EACzB,iBAAkB,SAACA,GAAD,OAAWiN,EAAAA,UAAyB8H,SAAS/U,EAAO,IAApD,EAClB,yBAA0B,SAACA,GAAD,OAAWkX,GAASjK,EAAAA,kBAAkCjN,EAAtD,EAC1B,oBAAqB,SAACA,GAAD,OAAWiN,EAAAA,aAA4B8H,SAAS/U,EAAO,IAAvD,GAGzB,SAASkX,GAASQ,EAAM1X,GACpB,OAAIyX,GAAWzX,GACJ0X,EAAK1X,EAAM0U,MAAM,MAErB1U,CACV,CASD,SAASyX,GAAWzX,GAChB,MAAO,iBAAiBwN,KAAKxN,EAChC,CAED,SAASmX,GAAkBnX,GACvB,I,EAAA,K,4CAAuCA,EAAM0U,MAAM,O,swBAA5CiD,EAAP,KAAsBC,EAAtB,KACA,QAAuBtV,IAAlBqV,QAAmDrV,IAAlBsV,EAA8B,CAChE,IAAMC,EAAUC,WAAWH,GACrBI,EAAUD,WAAWF,GACrBtK,EAAMsK,EAAc/C,OAAO+C,EAAcxX,OAAS,GACxD,IAAM4X,OAAOC,MAAMJ,KAAeG,OAAOC,MAAMF,GAC3C,MAAO,IAAMF,EAAUE,EAAU,IAAMzK,CAE9C,CACD,OAAOtN,CACV,C,gVC1FD,OAIA,SAAcE,EAAUgY,GACpB,IAAMzJ,EAAO,CAAC,EAEd,GAAwB,iBAAbvO,EAEP,OADAiY,GAAS1J,EAAMvO,GACRuO,EAGX,I,EAAA,G,EAuBJ,SAA+BvO,EAAUgY,GACrC,GAAsB,IAAlBA,EAAO9X,OACP,MAAO,GAGX,IAAMgY,EAAiB,CAACC,GAAcnY,EAAUgY,EAAO1U,MAAM,EAAG,KAKhE,OAJI0U,EAAO9X,OAAS,GAChBgY,EAAe5X,KAAK6X,GAAcnY,EAAUgY,EAAO1U,MAAM,KAGtD4U,CACV,CAlCsCE,CAAsBpY,EAAUgY,GAAnE,E,ozBAAOK,EAAP,KAAoBC,EAApB,KAEMC,EAAkBN,GAAS1J,EAAM8J,GAEvC,GAAIC,EAAa,CACb,IAAME,EAAkBP,GAAS1J,EAAM+J,GAElCC,GAAoBC,WAKdjK,EAAKkK,KACZR,GAAS1J,EAAM4J,GAAcnY,EAAUgY,IAE9C,CAED,OAAOzJ,CACV,EAkBD,SAAS4J,GAAcnY,EAAUgY,GAK7B,IAJA,IAAMU,EAAcV,EAAOjW,QAAO,SAACiO,EAAM2I,GAAP,OAAiB3I,EAAO2I,EAAMzY,MAA9B,GAAsC,GAClE0Y,EAAiB,IAAI5W,WAAW0W,GAClCzY,EAAS,EAEJG,EAAI,EAAGA,EAAI4X,EAAO9X,OAAQE,IAAK,CACpC,IAAMuY,EAAQX,EAAO5X,GACfkD,EAAQtD,EAASwC,OAAOc,MAAMqV,EAAM9T,WAAY8T,EAAM9T,WAAa8T,EAAMzY,QAC/E0Y,EAAeC,IAAI,IAAI7W,WAAWsB,GAAQrD,GAC1CA,GAAU0Y,EAAMzY,MACnB,CAED,OAAO,IAAIqC,SAASqW,EAAepW,OACtC,CAED,SAASyV,GAAS1J,EAAMuK,GACpB,IACI,MAWR,SAAqBA,GACjB,IAAMC,EC7EV,WACI,GAAyB,oBAAdC,UACP,OAAO,IAAIA,UAEf,IAEI,OAAO,IAAKC,QAAwB,kBAA7B,WAA0D,CAC7DC,aAAc,CACVtH,MAAO,WACH,MAAU3O,MAAM,aACnB,IAKZ,CAFC,MAAO2O,GACL,MACH,CACJ,CD6DqBoH,GAClB,IAAKD,EAED,MADAI,QAAQC,KAAK,mFACHnW,QAGd,IAAMoW,EAAqC,iBAAlBP,EAA6BA,EAAgB/Y,EAAsB+Y,EAAe,EAAGA,EAAczY,YACtHiZ,EAAMP,EAAUQ,gBAA8BF,EAanCG,QAAQ,wBAAyB,MAAMA,QAAQ,8BAA+B,MAb/B,mBAEhE,GAAqC,gBAAjCF,EAAIG,gBAAgBC,SACpB,MAAUzW,MAAMqW,EAAIG,gBAAgBE,aAGxC,MAAO,CACHL,IAAAA,EACAM,IAAKP,EAEZ,CA7B0BQ,CAAYf,GAAxBQ,EAAP,EAAOA,IAAKM,EAAZ,EAAYA,IAKZ,OAJArL,EAAKkK,MAAQlK,EAAKkK,MAAQ,IAAMmB,EAGhC3Y,EAAasN,EAAMuL,GAAeC,GAFtBC,GAAOV,GAEoC,KAChD,CAGV,CAFC,MAAO1H,GACL,OAAO,CACV,CACJ,CA0BD,SAASoI,GAAOC,GACZ,IAAK,IAAI7Z,EAAI,EAAGA,EAAI6Z,EAAKC,WAAWha,OAAQE,IAAK,CAC7C,GAAmC,cAA/B6Z,EAAKC,WAAW9Z,GAAG6R,QACnB,OAAO+H,GAAOC,EAAKC,WAAW9Z,IAElC,GAAmC,YAA/B6Z,EAAKC,WAAW9Z,GAAG6R,QACnB,OAAOgI,EAAKC,WAAW9Z,EAE9B,CAED,MAAU6C,OACb,CAED,SAAS8W,GAAgBE,GAAyB,IAAnBE,EAAmB,uDAAP,EACjCD,EAAaE,GAAcH,GAEjC,OAAII,GAAmBH,GACfC,EACO,CAAC,EAELG,GAAaJ,EAAW,IAG5BK,GAAqBL,EAC/B,CAED,SAASE,GAAcH,GAGnB,IAFA,IAAMO,EAAW,GAERpa,EAAI,EAAGA,EAAI6Z,EAAKC,WAAWha,OAAQE,IACxCoa,EAASla,KAAK2Z,EAAKC,WAAW9Z,IAGlC,OAAOoa,CACV,CAED,SAASH,GAAmBI,GACxB,OAAyB,IAAjBA,EAAMva,QAAwC,UAAtBua,EAAM,GAAGf,QAC5C,CAED,SAASY,GAAaL,GAClB,OAAOA,EAAKS,SACf,CAED,SAASH,GAAqBE,GAC1B,IAAMD,EAAW,CAAC,EAiBlB,OAfAC,EAAME,SAAQ,SAACV,GACX,GAiBR,SAAmBA,GACf,OAAQA,EAAKP,UAAgC,UAAlBO,EAAKP,QACnC,CAnBWkB,CAAUX,GAAO,CACjB,IAAMY,EAoBlB,SAA4BZ,GACxB,MAAO,CACH7K,WAAY0L,GAAcb,GAC1Bna,MAAOia,GAAgBE,GAE9B,CAzB+Bc,CAAmBd,QAEP7X,IAA5BoY,EAASP,EAAKP,WACT5X,MAAMoL,QAAQsN,EAASP,EAAKP,aAC7Bc,EAASP,EAAKP,UAAY,CAACc,EAASP,EAAKP,YAE7Cc,EAASP,EAAKP,UAAUpZ,KAAKua,IAE7BL,EAASP,EAAKP,UAAYmB,CAEjC,CACJ,IAEML,CACV,CAaD,SAASM,GAAcE,GAGnB,IAFA,IAAM5L,EAAa,CAAC,EAEXhP,EAAI,EAAGA,EAAI4a,EAAQ5L,WAAWlP,OAAQE,IAC3CgP,EAAW4L,EAAQ5L,WAAWhP,GAAGsZ,UAAYhI,mBAAmBC,OAAOqJ,EAAQ5L,WAAWhP,GAAGN,QAGjG,OAAOsP,CACV,CAED,SAAS0K,GAAemB,GACpB,IAAM1M,EAAO,CAAC,EAEd,GAAyB,iBAAd0M,EACP,OAAOA,EAGX,IAAK,IAAMvB,KAAYuB,EAAW,CAC9B,IAAIR,EAAQQ,EAAUvB,GAEjB5X,MAAMoL,QAAQuN,KACfA,EAAQ,CAACA,IAGbA,EAAME,SAAQ,SAACV,GACXhZ,EAAasN,EAAM2M,GAA0BjB,EAAK7K,aACxB,WAAtB,GAAO6K,EAAKna,QACZmB,EAAasN,EAAM4M,GAAwBlB,EAAKna,OAEvD,GACJ,CAED,OAAOyO,CACV,CAED,SAAS2M,GAA0B9L,GAC/B,IAAMb,EAAO,CAAC,EAEd,IAAK,IAAM1B,KAAQuC,EACXgM,GAAevO,KACf0B,EAAK8M,GAAaxO,IAAS,CACvB/M,MAAOsP,EAAWvC,GAClBuC,WAAY,CAAC,EACbtC,YAAawO,GAAelM,EAAWvC,GAAOA,KAK1D,OAAO0B,CACV,CAED,SAAS6M,GAAevO,GACpB,MAAiB,kBAATA,IAA+B0O,GAAsB1O,EAChE,CAED,SAAS0O,GAAsB1O,GAC3B,MAA8B,UAAvBA,EAAK2H,MAAM,KAAK,EAC1B,CAED,SAAS6G,GAAaxO,GAClB,MAAI,mCAAmCS,KAAKT,GACjC,gBAEJA,EAAK2H,MAAM,KAAK,EAC1B,CAED,SAAS8G,GAAexb,GAAyB,IAAlB+M,EAAkB,4DAAXzK,EAClC,GAAIN,MAAMoL,QAAQpN,GAAQ,CACtB,IAAM0b,EAAmBC,GAAsB3b,GAC/C,OAAK+M,GAAuC,mBAAtB6O,GAAY7O,GACvB6O,GAAY7O,GAAM/M,EAAO0b,GAE7BA,CACV,CACD,GAAqB,WAAjB,GAAO1b,GACP,OAAO6b,GAAuB7b,GAGlC,IACI,OAAK+M,GAAuC,mBAAtB6O,GAAY7O,GACvB6O,GAAY7O,GAAM/M,GAEtB4R,mBAAmBC,OAAO7R,GAGpC,CAFC,MAAO8R,GACL,OAAO9R,CACV,CACJ,CAED,SAAS2b,GAAsB3b,GAC3B,OAAOA,EAAMc,KAAI,SAACgb,GACd,YAAmBxZ,IAAfwZ,EAAK9b,MACEwb,GAAeM,EAAK9b,OAExBwb,GAAeM,EACzB,IAAE5a,KAAK,KACX,CAED,SAAS2a,GAAuB7b,GAC5B,IAAM+b,EAAe,GAErB,IAAK,IAAM5c,KAAOa,EACd+b,EAAavb,KAAb,UAAqBwb,GAAgB7c,GAArC,aAA8Cqc,GAAexb,EAAMb,GAAKa,SAG5E,OAAO+b,EAAa7a,KAAK,KAC5B,CAED,SAAS8a,GAAgB7c,GACrB,MAAY,cAARA,EACO,cAEC,cAARA,EACO,iBAEC,gBAARA,EACO,iBAEC,eAARA,EACO,oBAEC,gBAARA,EACO,gBAEC,gBAARA,EACO,mBAEC,cAARA,EACO,mBAEC,cAARA,EACO,iBAEJA,CACV,CAED,SAASkc,GAAwBY,GAC7B,IAAMxN,EAAO,CAAC,EAEd,IAAK,IAAM1B,KAAQkP,EACVR,GAAsB1O,KACvB0B,EAAK8M,GAAaxO,IAASmP,GAAeD,EAASlP,GAAOA,IAIlE,OAAO0B,CACV,CAED,SAASyN,GAAe/B,EAAMpN,GAC1B,OAAIoP,GAA8BhC,GACvBiC,GAAgCjC,EAAMpN,GAE7CsP,GAAiClC,GAC1BmC,GAAmCnC,EAAMpN,GAEhDwP,GAAmBpC,GACZqC,GAA4BrC,EAAMpN,GAmGjD,SAAiBoN,GACb,YAAqC7X,IAA9Bma,GAActC,EAAKna,MAC7B,CAnGOoN,CAAQ+M,GAyGhB,SAA0BA,EAAMpN,GAC5B,IAAI2P,EAAQD,GAActC,EAAKna,OAAOA,MAAM,UACtCsP,EAAaqN,GAAoBxC,GACjCna,EAAQ,GAYd,YAVcsC,IAAVoa,EACAA,EAAQ,GACA1a,MAAMoL,QAAQsP,KACtBA,EAAQ,CAACA,IAGbA,EAAM7B,SAAQ,SAACiB,GACX9b,EAAMQ,KAUd,SAAyBsb,GACrB,OAAIK,GAA8BL,GACvBM,GAAgCN,GAEvCO,GAAiCP,GAC1BQ,GAAmCR,GAAM9b,MAEhDuc,GAAmBT,GACZU,GAA4BV,GAAM9b,MAGtC4c,GAAuBd,EACjC,CAtBkBe,CAAgBf,GAC9B,IAEM,CACH9b,MAAAA,EACAsP,WAAAA,EACAtC,YAAawO,GAAexb,EAAO+M,GAE1C,CA5Hc+P,CAAiB3C,EAAMpN,GAE3B6P,GAAuBzC,EAAMpN,EACvC,CAED,SAASoP,GAA8BhC,GACnC,MAA8C,aAArCA,EAAK7K,WAAW,uBAAiEhN,IAA5B6X,EAAKna,MAAM,mBAC9BsC,IAAlC6X,EAAKna,MAAM,yBAA2FsC,IAArD6X,EAAKna,MAAM,mBAAmBA,MAAM,YACjG,CAED,SAASoc,GAAgCjC,EAAMpN,GAC3C,IAAMuC,EAAaqN,GAAoBxC,QAED7X,IAAlC6X,EAAKna,MAAM,qBACXma,EAAOA,EAAKna,MAAM,oBAGtBmB,EAAamO,EAAYqN,GAAoBxC,GAuBjD,SAAuCA,GACnC,IAAM7K,EAAa,CAAC,EAEpB,IAAK,IAAMvC,KAAQoN,EAAKna,MACN,cAAT+M,GAA2B0O,GAAsB1O,KAClDuC,EAAWiM,GAAaxO,IAASoN,EAAKna,MAAM+M,GAAM/M,OAI1D,OAAOsP,CACV,CAjCuDyN,CAA8B5C,IAElF,IAAMna,EAiCV,SAAuBma,GACnB,OAAO6C,GAAY7C,EAAKna,MAAM,eAAiBma,EAAKna,MAAM,aAAaA,KAC1E,CAnCiBid,CAAc9C,GAE5B,MAAO,CACHna,MAAAA,EACAsP,WAAAA,EACAtC,YAAawO,GAAexb,EAAO+M,GAE1C,CAED,SAAS4P,GAAoBxC,GACzB,IAAM7K,EAAa,CAAC,EAEpB,IAAK,IAAMvC,KAAQoN,EAAK7K,WACN,kBAATvC,GAAuC,iBAATA,GAA8B0O,GAAsB1O,KACnFuC,EAAWiM,GAAaxO,IAASoN,EAAK7K,WAAWvC,IAIzD,OAAOuC,CACV,CAkBD,SAAS+M,GAAiClC,GACtC,MAA6C,aAArCA,EAAK7K,WAAW,uBACmBhN,IAAlC6X,EAAKna,MAAM,yBAA2FsC,IAArD6X,EAAKna,MAAM,mBAAmBA,MAAM,YACjG,CAED,SAASsc,GAAmCnC,EAAMpN,GAC9C,IAAM4D,EAAM,CACR3Q,MAAO,CAAC,EACRsP,WAAY,CAAC,GAajB,YAVsChN,IAAlC6X,EAAKna,MAAM,qBACXmB,EAAawP,EAAI3Q,MAAOob,GAA0BjB,EAAKna,MAAM,mBAAmBsP,aAChFnO,EAAawP,EAAIrB,WAAYqN,GAAoBxC,IACjDA,EAAOA,EAAKna,MAAM,oBAGtBmB,EAAawP,EAAI3Q,MAAOqb,GAAwBlB,EAAKna,QAErD2Q,EAAI3D,YAAcwO,GAAe7K,EAAI3Q,MAAO+M,GAErC4D,CACV,CAED,SAAS4L,GAAmBpC,GACxB,OAA2C,IAAnC9a,OAAO6d,KAAK/C,EAAKna,OAAOI,aACQkC,IAAhC6X,EAAK7K,WAAW,kBACoBhN,IAApC6X,EAAK7K,WAAW,eAC3B,CAED,SAASkN,GAA4BrC,EAAMpN,GACvC,IAAM/M,EAAQob,GAA0BjB,EAAK7K,YAE7C,MAAO,CACHtP,MAAAA,EACAsP,WAAY,CAAC,EACbtC,YAAawO,GAAexb,EAAO+M,GAE1C,CAMD,SAAS0P,GAAczc,GACnB,OAAOA,EAAM,YAAcA,EAAM,YAAcA,EAAM,UACxD,CAsCD,SAAS4c,GAAuBzC,EAAMpN,GAClC,IAAM/M,EAAQgd,GAAY7C,IAASH,GAAeG,EAAKna,OAEvD,MAAO,CACHA,MAAAA,EACAsP,WAAYqN,GAAoBxC,GAChCnN,YAAawO,GAAexb,EAAO+M,GAE1C,CAED,SAASiQ,GAAY7C,GACjB,OAAOA,EAAK7K,YAAc6K,EAAK7K,WAAW,eAC7C,CExeM,IAAM6N,GAAU,CACnB,KAAQ,CACJ,KAAQ,mBAEZ,KAAQ,CACJ,KAAQ,iBAEZ,KAAQ,CACJ,KAAQ,gCAEZ,KAAQ,CACJ,KAAQ,sCAEZ,KAAQ,CACJ,KAAQ,uCAEZ,KAAQ,CACJ,KAAQ,eAIHC,GAAa,CACtB,EAAG,CACC,KAAQ,qBACR,MAAS,SAACld,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,EACT,YAAe,SAACH,GAAD,OAAqB,OAAVA,EAAiBqd,GAAUrd,GAAS,EAA/C,GAEnB,EAAG,CACC,KAAQ,kBACR,MAAS,SAACE,EAAUC,GAChB,OAAQD,EAASO,SAASN,GAASqC,SAAS,IAAM,KAC/CtC,EAASO,SAASN,EAAS,IAAM,GAAGqC,SAAS,IAAM,KACnDtC,EAASO,SAASN,EAAS,GAAK,IAAIqC,SAAS,GACnD,GAEL,GAAI,CACA,KAAQ,uBACR,MAAS,SAACtC,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,EACT,YAAe,SAACH,GACZ,OAAQA,EAAMsd,eACV,IAAK,OAAQ,MAAO,uBACpB,IAAK,OAAQ,MAAO,yBACpB,IAAK,OAAQ,MAAO,wBACpB,IAAK,OAAQ,MAAO,qBACpB,IAAK,OAAQ,MAAO,mBACpB,IAAK,OAAQ,MAAO,qBACpB,IAAK,OAAQ,MAAO,qBACpB,IAAK,OAAQ,MAAO,6BACpB,IAAK,OAAQ,MAAO,kCACpB,IAAK,OAAQ,MAAO,wBACpB,IAAK,OAAQ,MAAO,iCACpB,QAAS,OAAOtd,EAEvB,GAEL,GAAI,CACA,KAAQ,cACR,MAAS,SAACE,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,GAEb,GAAI,CACA,KAAQ,mBACR,MAAS,SAACD,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,GAEb,GAAI,CACA,KAAQ,mBACR,MAAS,SAACD,EAAUC,GAAX,OAwCjB,SAAmBD,EAAUC,GACzB,IAAMod,EAAOrd,EAASU,UAAUT,GAC1Bqd,EAAQtd,EAASU,UAAUT,EAAS,GAAK,EACzCsd,EAAMvd,EAASU,UAAUT,EAAS,GAClCud,EAAQxd,EAASU,UAAUT,EAAS,GACpC4X,EAAU7X,EAASU,UAAUT,EAAS,GACtCwd,EAAUzd,EAASU,UAAUT,EAAS,IAC5C,OAAO,IAAIyd,KAAKA,KAAKC,IAAIN,EAAMC,EAAOC,EAAKC,EAAO3F,EAAS4F,GAC9D,CAhDsCG,CAAU5d,EAAUC,GAAQ4d,aAAlD,GAEb,GAAI,CACA,KAAQ,gBACR,MAAS,SAAC7d,EAAUC,GAAX,OA8CMqD,EA9C8BtD,EAASwC,OAAOc,MAAMrD,EAAQA,EAAS,GA+CjFa,OAAOC,aAAaU,MAAM,KAAM,IAAIO,WAAWsB,IAD1D,IAAuBA,CA9CN,GAEb,GAAI,CACA,KAAQ,mBACR,MAAS,SAACtD,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,EACT,YAAe,SAACH,GAAD,OAAWqd,GAAUrd,EAArB,GAEnB,GAAI,CACA,KAAQ,sBACR,MAAS,SAACE,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,EACT,YAAe,SAACH,GAAD,OAAWqd,GAAUrd,EAArB,GAEnB,GAAI,CACA,KAAQ,sBACR,MAAS,SAACE,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,GAEb,GAAI,CACA,KAAQ,mBACR,MAAS,SAACD,EAAUC,GAAX,OAAsBD,EAASuG,UAAUtG,EAAzC,EACT,YAAe,SAACH,GACZ,OAAQA,GACJ,KAAK,EAAG,MAAO,aACf,KAAK,EAAG,MAAO,wBACf,KAAK,EAAG,MAAO,aACf,KAAK,EAAG,MAAO,wBACf,QAAS,OAAOA,EAEvB,GAGL,GAAI,CACA,KAAQ,kBACR,MAAS,SAACE,EAAUC,GAAX,OAAsBF,EAAsBC,EAAUC,EAAQ,EAA9D,IAkBjB,SAASkd,GAAUrd,GACf,OAAQA,EAAMsd,eACV,IAAK,OAAQ,MAAO,QACpB,IAAK,OAAQ,MAAO,QACpB,IAAK,OAAQ,MAAO,YACpB,IAAK,OAAQ,MAAO,mBACpB,IAAK,MAAO,MAAO,mBACnB,IAAK,OAAQ,MAAO,WACpB,QAAS,OAAOtd,EAEvB,CCjID,OAiBA,SAAcE,EAAU8d,GACpB,IAOI,IANA,IAAMC,EAAwBD,EAAQ/b,QAAO,SAACic,EAAKC,GAAN,OAAcD,EAAMC,EAAI/d,MAAxB,GAAgC,GAEvEge,EAAgB,IAAIlc,WAAW+b,GACjC9d,EAAS,EACPuC,EAqBd,SAAmBxC,GACf,OAAI8B,MAAMoL,QAAQlN,GACN,IAAIuC,SAASP,WAAWK,KAAKrC,GAAUwC,QAASA,OAErDxC,EAASwC,MACnB,CA1BsB2b,CAAUne,GALzB,WAOS6H,GACL,IAAMuW,EAAeN,EAAQO,MAAK,SAAC1Q,GAAD,OAAOA,EAAE9F,cAAgBA,CAAzB,IAClC,IAAKuW,EACD,MAAUnb,MAAJ,oBAAuB4E,EAAvB,eAGV,IAAM5F,EAAOO,EAAOc,MAAM8a,EAAane,OAAQme,EAAane,OAASme,EAAale,QAC5Eoe,EAAY,IAAItc,WAAWC,GAEjCic,EAAcrF,IAAIyF,EAAWre,GAC7BA,GAAUqe,EAAUpe,MAjBxB,EAOS2H,EAAc,EAAGA,GAAeiW,EAAQ5d,OAAQ2H,IAAe,EAA/DA,GAaT,OAqBD,SAAmB7H,GACtB,IAAMwC,EAASxC,EAASwC,OAElBtC,EAASF,EAASuG,YACxB,GAAIvG,EAASK,aAAeH,EACxB,MAAU+C,MAAM,mCAGpB,GAAIjD,EAASE,OA/Da,GAgEtB,MAAU+C,MAAM,yBAMpB,IAHA,IAAMsL,EAAO,CAAC,EAERgQ,EAAiBpf,OAAO6d,KAAKE,IAC1B9c,EAAI,EAAGA,EAAIme,EAAere,OAAQE,IAAK,CAC5C,IAAMH,EAASse,EAAene,GACxBoe,EAAetB,GAAWjd,GAC1BH,EAAQ0e,EAAa1e,MAAME,EAAU6U,SAAS5U,EAAQ,KACxD6M,EAAchN,EACd0e,EAAa1R,cACbA,EAAc0R,EAAa1R,YAAYhN,IAG3CyO,EAAKiQ,EAAa3R,MAAQ,CACtB/M,MAAAA,EACAgN,YAAAA,EAEP,CAGD,GADkB2R,GAAcjc,EAAOc,MAAM,GAAI,OAC/Bob,GACd,MAAUzb,MAAM,kCAIpB,GA5CJ,SAAgCT,GAC5B,OAAOA,EAAOtC,OAAUye,GAC3B,CA0COC,CAAuBpc,GACvB,OAAO+L,EAMX,IAHA,IAAM4C,EAAWnR,EAASuG,UAAU,KAChCsY,EAAkB,IAEbze,EAAI,EAAGA,EAAI+Q,EAAU/Q,IAAK,CAC/B,GAAI0e,GAAYtc,EAAQqc,GAEpB,OAAOtQ,EAEX,IAAMwQ,EAAehf,EAAsBC,EAAU6e,EAAiB,GAChEG,EAAYhf,EAASuG,UAAUsY,EAAkB,GACjDzI,EAAUpW,EAASuG,UAAUsY,EAAkB,GAErD,GAAIG,EAAYxc,EAAOtC,OAEnB,OAAOqO,EAEX,IAAM2C,EAAUnR,EAAsBC,EAAUgf,EAAW,GAE3D,GAAI9N,IAAY+N,GAAe,CAC3B,IAAMC,EAAelf,EAASuG,UAAUyY,EAAY,GACpD,GAAIE,EAAe9I,EAEf,OAAO7H,EAIX4Q,GAAO5Q,EAAMwQ,EADDN,GAAcjc,EAAOc,MAAM0b,EAAY,GAAIA,EAAYE,EAAe,KAErF,MAAM,GAAIhO,IAAYkO,GAAuC,CAK1D,IAJA,IAAMC,EAAarf,EAASuG,UAAUyY,EAAY,GAC5CM,EAAatf,EAASuG,UAAUyY,EAAY,IAC9C/e,EAAS+e,EAAY,GACnBO,EAAM,GACHC,EAAY,EAAGA,EAAYH,EAAYG,IAAa,CACzD,IAAMC,EAAe1f,EAAsBC,EAAUC,EAAS,EAAG,GAC3Dyf,EAAc3f,EAAsBC,EAAUC,EAAS,EAAG,GAC1D0f,EAAa3f,EAASuG,UAAUtG,EAAS,GACzC2f,EAAa5f,EAASuG,UAAUtG,EAAS,GAEzC4f,EAAOpf,EAA6BT,EAAUgf,EAAYY,EAAYD,GAC5EJ,EAAIjf,KAAK,CAACmf,aAAAA,EAAcC,YAAAA,EAAaG,KAAAA,IACrC5f,GAAUqf,CACb,CACD,GAAmB,IAAfD,EACAF,GAAO5Q,EAAMwQ,EAAcQ,EAAI,GAAGM,UAC/B,CAEH,IADA,IAAMC,EAAS,CAAC,EACPC,EAAW,EAAGA,EAAWR,EAAIrf,OAAQ6f,IAC1CD,EAAO,GAAD,OAAIP,EAAIQ,GAAUN,aAAlB,YAAkCF,EAAIQ,GAAUL,cAAiBH,EAAIQ,GAAUF,KAEzFV,GAAO5Q,EAAMwQ,EAAce,EAC9B,CACJ,MAAU5O,IAAY8O,GAEnBb,GAAO5Q,EAAMwQ,EADDN,GAAcjc,EAAOc,MAAM0b,EAAY,EAAGA,EAAY5I,EAAU,KAErElF,IAAY+O,IAEnBd,GAAO5Q,EAAMwQ,EADDN,GAAcjc,EAAOc,MAAM0b,EAAY,EAAGA,EAAY,MAGtEH,GAAoC,EACvC,CAED,OAAOtQ,CACV,CA3HcoH,CAAU,IAAIpT,SAAS2b,EAAc1b,QAG/C,CAFC,MAAOoP,GACL,MAAO,CAAC,CACX,CACJ,EApCK8M,GAAgB,OAChBO,GAAgB,OAChBG,GAAwC,OACxCY,GAAgB,OAChBC,GAAqB,OA6C3B,SAASnB,GAAYtc,EAAQqc,GACzB,OAAOrc,EAAOtC,OAAS2e,EA7CO,EA8CjC,CA0GD,SAASJ,GAAcnb,GACnB,OAAOxC,OAAOC,aAAaU,MAAM,KAAM,IAAIO,WAAWsB,GACzD,CAED,SAAS6b,GAAO5Q,EAAMwQ,EAAcjf,GAC5Bmd,GAAQ8B,GACRxQ,EAAK0O,GAAQ8B,GAAclS,MAAQ,CAAC/M,MAAAA,EAAOgN,YAAahN,GAExDyO,EAAKwQ,GAAgB,CAACjf,MAAAA,EAAOgN,YAAahN,EAEjD,CC7KD,OAIA,SAAcE,EAAU+H,GACpB,MAAO,CACH,cAAe8K,GAAc7S,EAAU+H,GACvC,eAAgB6K,GAAe5S,EAAU+H,GACzC,YAAamY,GAAYlgB,EAAU+H,GACnC,aAAcoY,GAAangB,EAAU+H,GACrC,YAAeqY,GAAepgB,EAAU+H,GACxC,OAAUsY,GAAUrgB,EAAU+H,GAC9B,UAAauY,GAAatgB,EAAU+H,GAE3C,EAED,SAAS8K,GAAc7S,EAAU+H,GAI7B,KAAIA,EAHW,EACF,EAEwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,GACxC,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,EAAL,MALd,CAOJ,CAED,SAAS8S,GAAe5S,EAAU+H,GAI9B,KAAIA,EAHW,EACF,EAEwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAPzB,GAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,EAAL,MALd,CAOJ,CAED,SAASogB,GAAYlgB,EAAU+H,GAI3B,KAAIA,EAHW,EACF,EAEwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAPzB,GAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAa,GAAF,OAAKhN,GALnB,CAOJ,CAED,SAASqgB,GAAangB,EAAU+H,GAW5B,KAAIA,EAVW,EACF,EASwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAdzB,GAef,MAAO,CACHjI,MAAAA,EACAgN,YAfgB,CAChB,EAAG,YACH,EAAG,MACH,EAAG,UACH,EAAG,uBACH,EAAG,kBAUsBhN,IAAU,UALtC,CAOJ,CAED,SAASsgB,GAAepgB,EAAU+H,GAI9B,KAAIA,EAHW,GACF,EAEwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAPzB,IAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAuB,IAAVhN,EAAc,kBAAoB,UALlD,CAOJ,CAED,SAASugB,GAAUrgB,EAAU+H,GAIzB,KAAIA,EAHW,GACF,EAEwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAPzB,IAQf,MAAO,CACHjI,MAAAA,EACAgN,YAAuB,IAAVhN,EAAc,WAAa,UAL3C,CAOJ,CAED,SAASwgB,GAAatgB,EAAU+H,GAQ5B,KAAIA,EAPW,GACF,EAMwB/H,EAASK,YAA9C,CAIA,IAAMP,EAAQuO,EAAAA,UAAgBrO,EAAU+H,EAXzB,IAYf,MAAO,CACHjI,MAAAA,EACAgN,YAZoB,CACpB,EAAG,gBACH,EAAG,mBAU0BhN,IAAU,UAL1C,CAOJ,CChID,OAWA,SAAcE,EAAUmI,GACpB,OAAOA,EAAcpG,QAAO,SAACwM,EAAD,GAAkC,IAA1BtO,EAA0B,EAA1BA,OAAQC,EAAkB,EAAlBA,OAAQkI,EAAU,EAAVA,KAChD,EAWR,SAAyBpI,EAAUC,EAAQC,EAAQkI,GAO/C,IANA,IAAMmY,EAAe,GACfC,EAAY,GACZC,EAAyB,GACzBC,EAAa,GACfC,EAAeC,GAEVxgB,EAAI,EAAGA,EAAIF,GAAUD,EAASG,EAAIJ,EAASK,WAAYD,IAAK,CACjE,GAAIugB,IAAiBE,GAAmB,CAEpC,GAAwB,IADA7gB,EAASO,SAASN,EAASG,GAE/C,MAAO,CAAC,EAEZA,GA5BuB,EA6BvBugB,EAAeG,GAAgB1Y,EAAMuY,EACxC,CACD,IAAMze,EAAOlC,EAASO,SAASN,EAASG,GAC3B,IAAT8B,EACAye,EAAeG,GAAgB1Y,EAAMuY,GAC9BA,IAAiBC,GACxBL,EAAajgB,KAAK4B,GACXye,IAAiBI,GACxBP,EAAUlgB,KAAK4B,GACRye,IAAiBK,GACxBP,EAAuBngB,KAAK4B,GAE5Bwe,EAAWpgB,KAAK4B,EAEvB,CAED,IAAM+e,EAAYzgB,EAAwBkgB,GAE1C,MAAO,CACH7T,KAAMqU,GAAQ9Y,EAAMoY,EAAWD,GAC/BzgB,MAAOmhB,EACPnU,YAAa1E,IAAS/C,EAAY0R,GAAkB,QAAS2J,GAAcO,EAElF,CAhD0CE,CAAgBnhB,EAAUC,EAAQC,EAAQkI,GAAtEyE,EAAP,EAAOA,KAAM/M,EAAb,EAAaA,MAAOgN,EAApB,EAAoBA,YAOpB,OANID,IACA0B,EAAK1B,GAAQ,CACT/M,MAAAA,EACAgN,YAAAA,IAGDyB,CACV,GAAE,CAAC,EACP,EAlBKqS,GAAgB,gBAChBC,GAAoB,oBACpBE,GAAa,aACbC,GAA2B,2BAwDjC,SAASF,GAAgB1Y,EAAMuY,GAC3B,OAAIA,IAAiBC,IAAiBxY,IAAS/C,EACpCwb,GAEPF,IAAiBE,GACVE,GAEPJ,IAAiBI,GACVC,GA/DI,YAkElB,CAED,SAASE,GAAQ9Y,EAAMoY,EAAWD,GAC9B,IAAM1T,EAAOrM,EAAwB+f,GACrC,G1BjEqB,S0BiEjBnY,GAA2C,IAArBoY,EAAUtgB,OAChC,OAAO2M,EAEX,IAAMuU,EAAO5gB,EAAwBggB,GACrC,gBAAU3T,EAAV,aAAmBuU,EAAnB,IACH,CCnFD,OAIA,SAAcphB,EAAUqhB,GAGpB,IAFA,IAAM9S,EAAO,CAAC,EAELnO,EAAI,EAAGA,EAAIihB,EAAanhB,OAAQE,IAAK,CAC1C,IAAMkhB,EAAcjT,EAAAA,UAAgBrO,EAAUqhB,EAAajhB,G3BC5B,G2BAzByF,EAAY9F,EAAsBC,EAAUqhB,EAAajhB,G3BFzC,EACK,G2BGvByF,IAAcP,GACdiJ,EAAK,qBAAuBgT,GAAkBvhB,EAAUqhB,EAAajhB,GAAIkhB,GACzE/S,EAAK,qBAAuBiT,GAAkBxhB,EAAUqhB,EAAajhB,GAAIkhB,GACzE/S,EAAK,eAAiBkT,GAAczhB,EAAUqhB,EAAajhB,GAAIkhB,IACxDzb,IAAcN,IACrBgJ,EAAK,eAAiBmT,GAAc1hB,EAAUqhB,EAAajhB,GAAIkhB,GAEtE,CAED,OAAO/S,CACV,EAED,SAASgT,GAAkBvhB,EAAU2hB,EAAaL,GAI9C,GAAKM,GAAgB5hB,EAAU2hB,EAAaL,EAHzB,EACF,GAEjB,CAIA,IAAMxhB,EAAQuO,EAAAA,UAAgBrO,EAAU2hB,E3BpBPjc,E2Bad,GASnB,MAAO,CACH5F,MAAAA,EACAgN,YAAa,GAAKhN,EANrB,CAQJ,CAED,SAAS0hB,GAAkBxhB,EAAU2hB,EAAaL,GAI9C,GAAKM,GAAgB5hB,EAAU2hB,EAAaL,EAHzB,EACF,GAEjB,CAIA,IAAMxhB,EAAQuO,EAAAA,UAAgBrO,EAAU2hB,E3BpCPjc,E2B6Bd,GASnB,MAAO,CACH5F,MAAAA,EACAgN,YAAa,GAAKhN,EANrB,CAQJ,CAED,SAAS2hB,GAAczhB,EAAU2hB,EAAaL,GAI1C,GAAKM,GAAgB5hB,EAAU2hB,EAAaL,EAHzB,EACF,GAEjB,CAIA,IAAMxhB,EAAQuO,EAAAA,UAAgBrO,EAAU2hB,E3BpDPjc,E2B6Cd,GASnB,MAAO,CACH5F,MAAAA,EACAgN,YAAuB,IAAVhN,EAAc,SAAW,UANzC,CAQJ,CAED,SAAS4hB,GAAc1hB,EAAU2hB,EAAaL,GAG1C,GAAKM,GAAgB5hB,EAAU2hB,EAAaL,EAAa,EAFnC,GAEtB,CAIA,IAAMjE,EAAOhP,EAAAA,WAAiBrO,EAAU2hB,E3BnEPjc,G2BoE3B4X,EAAQjP,EAAAA,UAAgBrO,EAAU2hB,E3BpEPjc,E2BoE6C,GACxE6X,EAAMlP,EAAAA,UAAgBrO,EAAU2hB,E3BrELjc,E2BqE2C,GACtE8X,EAAQnP,EAAAA,UAAgBrO,EAAU2hB,E3BtEPjc,E2BsE6C,GACxEmS,EAAUxJ,EAAAA,UAAgBrO,EAAU2hB,E3BvETjc,E2BuE+C,GAC1E+X,EAAUpP,EAAAA,UAAgBrO,EAAU2hB,E3BxETjc,E2BwE+C,GAEhF,MAAO,CACH5F,MAAO,CAACud,EAAMC,EAAOC,EAAKC,EAAO3F,EAAS4F,GAC1C3Q,YAAa,GAAF,OAAK+U,GAAIxE,EAAM,GAAf,YAAqBwE,GAAIvE,EAAO,GAAhC,YAAsCuE,GAAItE,EAAK,GAA/C,YAAqDsE,GAAIrE,EAAO,GAAhE,YAAsEqE,GAAIhK,EAAS,GAAnF,YAAyFgK,GAAIpE,EAAS,IAXpH,CAaJ,CAED,SAASmE,GAAgB5hB,EAAU2hB,EAAaL,EAAatC,EAAW5I,GACpE,OAAO4I,EAAY5I,GAAWkL,GAAeK,E3BjFZjc,E2BiFkDsZ,EAAY5I,GAAWpW,EAASK,UACtH,CAED,SAASwhB,GAAIxK,EAAQrH,GACjB,gBAAU,IAAI8R,OAAO9R,GAAQ,GAAKqH,GAAQnX,SAA1C,OAAoDmX,EACvD,CClGD,IAAM0K,GAAmB,CAAC,EAAG,EAAG,IAEhC,GAIA,SAAa/hB,EAAUgiB,EAAeve,GAClC,IAiBsB8K,EAjBDyT,UAkBiB5f,IAArBmM,EAAK0T,aAA+BF,GAAiB9b,SAASsI,EAAK0T,YAAYniB,SACzFyO,EAAK2T,uBAAyB3T,EAAK2T,sBAAsBpiB,OACzDyO,EAAK4T,6BAA+B5T,EAAK4T,4BAA4BriB,MApBvC,CACjCkiB,EAAc5Z,KAAO,aACrB,IAAMnI,EAASwD,EAAmBue,EAAcE,sBAAsBpiB,MACtEkiB,EAAcpgB,MAAQ5B,EAASwC,OAAOc,MAAMrD,EAAQA,EAAS+hB,EAAcG,4BAA4BriB,OACvGsB,EAAU4gB,EAAe,UAAU,WAC/B,OAAOrgB,EAAe7C,KAAK8C,MAC9B,GACJ,CAUL,IAA0B2M,EAHtB,OAAOyT,CACV,ECpBD,SAASI,GAAqBC,GAC1BvjB,KAAK+N,KAAO,uBACZ/N,KAAKujB,QAAUA,GAAW,eAC1BvjB,KAAKwjB,MAAarf,QAASqf,KAC9B,CAEDF,GAAqB3iB,UAAgBwD,QAErC,QACImf,qBAAAA,ICUJ,IACIG,KAAAA,GACAC,SAAAA,GACAC,OAAQC,IAGCD,GAASC,GAEf,SAASH,GAAKtgB,EAAM0gB,GACvB,OASJ,SAAyB1gB,GACrB,MAAuB,iBAATA,CACjB,CAXO2gB,CAAgB3gB,GAaxB,SAAkB4gB,EAAUF,GACxB,MAAI,eAAerV,KAAKuV,GACC,oBAAVC,MAcnB,SAAgCC,GAAoB,IAAd7iB,GAAc,uDAAJ,CAAC,GAAXA,OAC5ByiB,EAAU,CAACK,OAAQ,OAMzB,OALIlL,OAAOmL,UAAU/iB,IAAWA,GAAU,IACtCyiB,EAAQO,QAAU,CACdC,MAAO,WAAF,OAAajjB,EAAS,KAG5B4iB,MAAMC,EAAKJ,GAASS,MAAK,SAACC,GAAD,OAAcA,EAASC,aAAvB,GACnC,CArBkBC,CAAuBV,EAAUF,GAuBpD,SAA6BI,GAAoB,IAAd7iB,GAAc,uDAAJ,CAAC,GAAXA,OAC/B,OAAO,IAAIsjB,SAAQ,SAACC,EAASC,GACzB,IAAMf,EAAU,CAAC,EACb7K,OAAOmL,UAAU/iB,IAAWA,GAAU,IACtCyiB,EAAQO,QAAU,CACdC,MAAO,WAAF,OAAajjB,EAAS,KAIvByjB,GAAeZ,EAC3BzjB,CAAIyjB,EAAKJ,GAAS,SAACU,GACf,GAAKA,EAASO,YAAc,KAASP,EAASO,YAAc,IAAM,CAC9D,IAAM3hB,EAAO,GACbohB,EAASQ,GAAG,QAAQ,SAAClL,GAAD,OAAW1W,EAAK3B,KAAK6B,OAAOE,KAAKsW,GAAjC,IACpB0K,EAASQ,GAAG,SAAS,SAACjS,GAAD,OAAW8R,EAAO9R,EAAlB,IACrByR,EAASQ,GAAG,OAAO,kBAAMJ,EAAQthB,OAAO2hB,OAAO7hB,GAA5B,GACtB,MACGyhB,EAAO,yBAAD,OAA0BL,EAASO,WAAnC,YAAiDP,EAASU,gBAChEV,EAASW,QAEhB,IAAEH,GAAG,SAAS,SAACjS,GAAD,OAAW8R,EAAO9R,EAAlB,GAClB,GACJ,CA1CcqS,CAAoBpB,EAAUF,GAmD7C,SAAmBE,GACf,MAAO,0BAA0BvV,KAAKuV,EACzC,CAlDOqB,CAAUrB,GACHW,QAAQC,QnCgBhB,SAAyBU,GAC5B,IAAMliB,EAAOkiB,EAAQjN,UAAUiN,EAAQ1b,QAAQ,KAAO,GAEtD,IAAoC,IAAhC0b,EAAQ1b,QAAQ,WAAmB,CACnC,GAAoB,oBAAT2b,KACP,OAAOpiB,WAAWK,KAAK+hB,KAAKniB,IAAO,SAACoiB,GAAD,OAAUA,EAAK/M,WAAW,EAA1B,IAA8B9U,OAErE,GAAsB,oBAAXL,OACP,OAEJ,YAA2BC,IAAvB,EAAOD,OAAOE,MACPF,OAAOE,KAAKJ,EAAM,UAEtB,IAAIE,OAAOF,EAAM,SAC3B,CAED,IAAMqiB,EAAc5S,mBAAmBzP,GACvC,MAAsB,oBAAXE,YACoBC,IAAvB,EAAOD,OAAOE,MACPF,OAAOE,KAAKiiB,GAEhB,IAAIniB,OAAOmiB,GAEftiB,WAAWK,KAAKiiB,GAAa,SAACD,GAAD,OAAUA,EAAK/M,WAAW,EAA1B,IAA8B9U,MACrE,CmCxC8B+hB,CAAgB1B,IAmD/C,SAAuBA,GAAyB,IAAd3iB,GAAc,uDAAJ,CAAC,GAAXA,OAC9B,OAAO,IAAIsjB,SAAQ,SAACC,EAASC,GACzB,IAAMc,EAAKC,KACXD,EAAGE,KAAK7B,GAAU,SAACjR,EAAO+S,GAClB/S,EACA8R,EAAO9R,GAEP4S,EAAGI,KAAK/B,GAAU,SAACjR,EAAOgT,GACtB,GAAIhT,EACA8R,EAAO9R,OACJ,CACH,IAAM5B,EAAOjH,KAAKC,IAAI4b,EAAK5U,UAAiB5N,IAAXlC,EAAuBA,EAAS0kB,EAAK5U,MAChExN,EAASL,OAAO0iB,MAAM7U,GACtB2S,EAAU,CACZngB,OAAAA,EACAtC,OAAQ8P,GAEZwU,EAAGM,KAAKH,EAAIhC,GAAS,SAAC/Q,GACdA,EACA8R,EAAO9R,GAEP4S,EAAGO,MAAMJ,GAAI,SAAC/S,GACNA,GACAuH,QAAQC,KAAR,+BAAqCyJ,EAArC,KAAkDjR,GAEtD6R,EAAQjhB,EACX,GAER,GACJ,CACJ,GAER,GACJ,GACJ,CAlFUwiB,CAAcnC,EAAUF,EAClC,CA1BcsC,CAAShjB,EAAM0gB,GAASS,MAAK,SAAC8B,GAAD,OAAkBC,GAAaD,EAAcvC,EAA7C,IAqH5C,SAA6B1gB,GACzB,MAA0B,oBAAXmjB,QAA4C,oBAATC,MAA0BpjB,aAAgBojB,IAC/F,CArHOC,CAAoBrjB,IAuHJsjB,EAtHMtjB,EAuHnB,IAAIuhB,SAAQ,SAACC,EAASC,GACzB,IAAM8B,EAAS,IAAIC,WACnBD,EAAOE,OAAS,SAACC,GAAD,OAAiBlC,EAAQkC,EAAYC,OAAOC,OAA5C,EAChBL,EAAOM,QAAU,kBAAMpC,EAAO8B,EAAO5T,MAApB,EACjB4T,EAAOO,kBAAkBR,EAC5B,KA5H+BnC,MAAK,SAAC8B,GAAD,OAAkBC,GAAaD,EAAcvC,EAA7C,IAE9BwC,GAAaljB,EAAM0gB,GAoH9B,IAAwB4C,CAnHvB,CAwDD,SAAS5B,GAAeZ,GACpB,MAAI,cAAczV,KAAKyV,GACZ9J,QAAwB,SAAS3Z,IAErC2Z,QAAwB,QAAQ3Z,GAC1C,CA0CD,SAASmlB,KACL,IACI,OAAOxL,QAAwB,KAGlC,CAFC,MAAOrH,GACL,MACH,CACJ,CAeD,SAASuT,GAAaljB,EAAM0gB,GAMxB,OAGJ,SAAsB1gB,GAClB,IACI,OAAOE,OAAO6jB,SAAS/jB,EAG1B,CAFC,MAAO2P,GACL,OAAO,CACV,CACJ,CAdOqU,CAAahkB,KAGbA,EAAQ,IAAID,WAAWC,GAAOO,QAE3BggB,GAWX,SAAqBvgB,GACjB,IACI,OAAO,IAAIM,SAASN,EAGvB,CAFC,MAAO2P,GACL,OAAO,IAAIsU,EAAgBjkB,EAC9B,CACJ,CAjBmBkkB,CAAYlkB,GAAO0gB,EACtC,CAkBM,SAASH,GAASxiB,GAAiG,6DAA1C,CAAComB,SAAU,EAAO9X,eAAgB,GAAQ,IAAtF8X,SAAAA,OAAsF,MAA3E,EAA2E,MAApE9X,eAAAA,OAAoE,MAAnD,EAAmD,EAClH+X,EAAgB,EAChB9X,EAAO,CAAC,EAEZ,EAWI+X,EAA4BtmB,GAV5B+H,EADJ,EACIA,eACAb,EAFJ,EAEIA,eACAzD,EAHJ,EAGIA,iBACA0D,EAJJ,EAIIA,eACAC,EALJ,EAKIA,UACAC,EANJ,EAMIA,UACAC,EAPJ,EAOIA,cACAY,EARJ,EAQIA,gBACAC,EATJ,EASIA,cACAE,EAVJ,EAUIA,gBAGJ,GAAgDke,GAAYxe,GAAiB,CACzEse,EAAgB,EAChB,IAAMpO,EAAWuO,GAAcxmB,EAAU+H,GACrCqe,EACA7X,EAAKgX,KAAOtN,EAEZ1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,GAAgDwO,GAAYvf,GAAiB,CACzEmf,EAAgB,EAChB,IAAMpO,EAAWyO,GAAc1mB,EAAUkH,GACrCkf,EACA7X,EAAKoY,KAAO1O,EAEZ1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,GAA0B2O,GAAYnjB,GAAmB,CACrD4iB,EAAgB,EAChB,IAAMpO,EAAW4O,GAAU7mB,EAAUyD,EAAkB6K,GAavD,GAZI2J,EAAS6O,YACTvY,EAAKuY,UAAY7O,EAAS6O,iBACnB7O,EAAS6O,WAGhBV,GACA7X,EAAKwY,KAAO9O,EACZ+O,GAAYzY,IAEZA,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,GAGcA,EAAS,cAAgBgP,GAAY9f,GAAiB,CAClG,IAAM+f,EAAeC,GAAclP,EAAS,YAAYnY,MAAO,EAAGwO,GAC9D8X,EACA7X,EAAK6Y,KAAOF,EAEZ3Y,EAAOtN,EAAa,CAAC,EAAGsN,EAAM2Y,EAErC,CAED,GAA+CjP,EAAQ,mBAAyBoP,GAAWjgB,GAAY,CACnG,IAAMkgB,EAAcC,GAAa/mB,EAAwByX,EAAQ,iBAAqBnY,QAClFsmB,EACA7X,EAAKiZ,IAAMF,UAEJA,EAAY7O,KACnBlK,EAAOtN,EAAa,CAAC,EAAGsN,EAAM+Y,GAErC,CAED,GAA+CrP,EAAQ,cAAoBwP,GAAWpgB,GAAY,CAC9F,IAAMqgB,EAAcC,GAChB1P,EAAQ,YAAgBnY,MACxB,CAAC,CACGG,OAAQ,EACRC,OAAQ+X,EAAQ,YAAgBnY,MAAMI,OACtC2H,YAAa,EACbC,YAAa,KAGjBse,EACA7X,EAAK0P,IAAMyJ,EAEXnZ,EAAOtN,EAAa,CAAC,EAAGsN,EAAMmZ,EAErC,CACJ,CAED,GAAgDT,GAAY9f,GAAiB,CACzEkf,EAAgB,EAChB,IAAMpO,EAAWkP,GAAcnnB,EAAUmH,EAAgBmH,GACrD8X,EACA7X,EAAK6Y,KAAOnP,EAEZ1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,GAAyBoP,GAAWjgB,GAAY,CAC5Cif,EAAgB,EAChB,IAAMpO,EAAWsP,GAAavnB,EAAUoH,GACpCgf,EACA7X,EAAKiZ,IAAMvP,UAEJA,EAASQ,KAChBlK,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,GAErC,CAED,GAAuEwP,GAAWpgB,GAAY,CAC1Fgf,EAAgB,EAChB,IAAMpO,EAAW0P,GAAa3nB,EAAUqH,GACpC+e,EACA7X,EAAK0P,IAAMhG,EAEX1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,GAAyB2P,GAAWtgB,GAAgB,CAChD+e,EAAgB,EAChB,IAAMwB,EAAchB,GAAa7mB,EAAUsH,EAAegH,GACtD8X,EACA7X,EAAKuZ,IAAMD,EAEXtZ,EAAOtN,EAAa,CAAC,EAAGsN,EAAMsZ,EAErC,CAED,GAAmDE,GAAe7f,GAAkB,CAChFme,EAAgB,EAChB,IAAMpO,EAAW+P,GAAiBhoB,EAAUkI,GACxCke,GACA7X,EAAK0Z,IAAO1Z,EAAK0Z,IAAiBhnB,EAAa,CAAC,EAAGsN,EAAK0Z,IAAKhQ,GAAtCA,EACvB1J,EAAK2Z,QAAUjQ,GAEf1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,GAAyBkQ,GAAehgB,GAAgB,CACpDke,EAAgB,EAChB,IAAMpO,EAAWmQ,GAAiBpoB,EAAUmI,GACxCie,GACA7X,EAAK0Z,IAAO1Z,EAAK0Z,IAAiBhnB,EAAa,CAAC,EAAGsN,EAAK0Z,IAAKhQ,GAAtCA,EACvB1J,EAAK8Z,QAAUpQ,GAEf1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,GAAyBqQ,GAAWjgB,GAAkB,CAClDge,EAAgB,EAChB,IAAMpO,EAAWsQ,GAAavoB,EAAUqI,GACpC+d,EACA7X,EAAK0Z,IAAO1Z,EAAK0Z,IAAiBhnB,EAAa,CAAC,EAAGsN,EAAK0Z,IAAKhQ,GAAtCA,EAEvB1J,EAAOtN,EAAa,CAAC,EAAGsN,EAAM0J,EAErC,CAED,IAAMnE,EAGCgT,GAAc9mB,EAAUuO,EAAKuY,UAAWrjB,GAQ/C,GAPIqQ,GACAuS,EAAgB,EAChB9X,EAAKuY,UAAYhT,UAEVvF,EAAKuY,WAGXT,EACD,MAAM,IAAI3D,GAAAA,qBAGd,OAAOnU,CACV,CAED,SAASgY,GAAYxe,GACjB,YAA0B3F,IAAnB2F,CACV,CAED,SAAS0e,GAAYvf,GACjB,YAA0B9E,IAAnB8E,CACV,CAED,SAAS0f,GAAYnjB,GACjB,YAA4BrB,IAArBqB,CACV,CAED,SAASujB,GAAYzY,GACjB,GAAIA,EAAKwY,KAAM,CACX,GAAIxY,EAAKwY,KAAKyB,aAAeja,EAAKwY,KAAK0B,eACnC,IACIla,EAAKma,IAAMna,EAAKma,KAAO,CAAC,EACxBna,EAAKma,IAAIC,SAAWplB,EAAsBgL,EAAKwY,KAAKyB,YAAY1oB,OAChB,MAA5CyO,EAAKwY,KAAK0B,eAAe3oB,MAAMkB,KAAK,MACpCuN,EAAKma,IAAIC,UAAYpa,EAAKma,IAAIC,SAIrC,CAFC,MAAO/W,GAER,CAGL,GAAIrD,EAAKwY,KAAK6B,cAAgBra,EAAKwY,KAAK8B,gBACpC,IACIta,EAAKma,IAAMna,EAAKma,KAAO,CAAC,EACxBna,EAAKma,IAAII,UAAYvlB,EAAsBgL,EAAKwY,KAAK6B,aAAa9oB,OACjB,MAA7CyO,EAAKwY,KAAK8B,gBAAgB/oB,MAAMkB,KAAK,MACrCuN,EAAKma,IAAII,WAAava,EAAKma,IAAII,UAItC,CAFC,MAAOlX,GAER,CAGL,GAAIrD,EAAKwY,KAAKgC,aAAexa,EAAKwY,KAAKiC,eACnC,IACIza,EAAKma,IAAMna,EAAKma,KAAO,CAAC,EACxBna,EAAKma,IAAIO,SAAW1a,EAAKwY,KAAKgC,YAAYjpB,MAAM,GAAKyO,EAAKwY,KAAKgC,YAAYjpB,MAAM,GAC1C,IAAnCyO,EAAKwY,KAAKiC,eAAelpB,QACzByO,EAAKma,IAAIO,UAAY1a,EAAKma,IAAIO,SAIrC,CAFC,MAAOrX,GAER,CAER,CACJ,CAED,SAASqV,GAAY9f,GACjB,YAA0B/E,IAAnB+E,CACV,CAED,SAASkgB,GAAWjgB,GAChB,OAAOtF,MAAMoL,QAAQ9F,IAAcA,EAAUlH,OAAS,CACzD,CAED,SAASunB,GAAWyB,GAChB,OAAOpnB,MAAMoL,QAAQgc,IAAmBA,EAAehpB,OAAS,CACnE,CAED,SAAS0nB,GAAWtgB,GAChB,YAAyBlF,IAAlBkF,CACV,CAED,SAASygB,GAAeoB,GACpB,YAA6B/mB,IAAtB+mB,CACV,CAED,SAAShB,GAAehgB,GACpB,YAAyB/F,IAAlB+F,CACV,CAED,SAASmgB,GAAWjgB,GAChB,YAA2BjG,IAApBiG,CACV,C","sources":["webpack://ExifReader/webpack/universalModuleDefinition","webpack://ExifReader/webpack/bootstrap","webpack://ExifReader/webpack/runtime/define property getters","webpack://ExifReader/webpack/runtime/hasOwnProperty shorthand","webpack://ExifReader/webpack/runtime/make namespace object","webpack://ExifReader/./src/utils.js","webpack://ExifReader/./src/dataview.js","webpack://ExifReader/./src/tag-names-utils.js","webpack://ExifReader/./src/byte-order.js","webpack://ExifReader/./src/image-header-jpeg.js","webpack://ExifReader/./src/image-header-png.js","webpack://ExifReader/./src/image-header-heic.js","webpack://ExifReader/./src/image-header-webp.js","webpack://ExifReader/./src/image-header.js","webpack://ExifReader/./src/image-header-tiff.js","webpack://ExifReader/./src/types.js","webpack://ExifReader/./src/tag-names-common.js","webpack://ExifReader/./src/tag-names-0th-ifd.js","webpack://ExifReader/./src/tag-names-gps-ifd.js","webpack://ExifReader/./src/tag-names-interoperability-ifd.js","webpack://ExifReader/./src/tag-names-mpf-ifd.js","webpack://ExifReader/./src/tag-names.js","webpack://ExifReader/./src/tag-names-exif-ifd.js","webpack://ExifReader/./src/tags.js","webpack://ExifReader/./src/file-tags.js","webpack://ExifReader/./src/jfif-tags.js","webpack://ExifReader/./src/iptc-tag-names.js","webpack://ExifReader/./src/text-decoder.js","webpack://ExifReader/./src/tag-decoder.js","webpack://ExifReader/./src/iptc-tags.js","webpack://ExifReader/./src/xmp-tag-names.js","webpack://ExifReader/./src/xmp-tags.js","webpack://ExifReader/./src/dom-parser.js","webpack://ExifReader/./src/icc-tag-names.js","webpack://ExifReader/./src/icc-tags.js","webpack://ExifReader/./src/png-file-tags.js","webpack://ExifReader/./src/png-text-tags.js","webpack://ExifReader/./src/png-tags.js","webpack://ExifReader/./src/thumbnail.js","webpack://ExifReader/./src/errors.js","webpack://ExifReader/./src/exif-reader.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ExifReader\"] = factory();\n\telse\n\t\troot[\"ExifReader\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n chars.push(dataView.getUint8(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getUnicodeStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i += 2) {\n chars.push(dataView.getUint16(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getStringValueFromArray(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getCharacterArray(string) {\n return string.split('').map((character) => character.charCodeAt(0));\n}\n\nexport function objectAssign() {\n for (let i = 1; i < arguments.length; i++) {\n for (const property in arguments[i]) {\n arguments[0][property] = arguments[i][property];\n }\n }\n\n return arguments[0];\n}\n\nexport function deferInit(object, key, initializer) {\n let initialized = false;\n Object.defineProperty(object, key, {\n get() {\n if (!initialized) {\n initialized = true;\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value: initializer.apply(object),\n writable: true\n });\n }\n return object[key];\n },\n configurable: true,\n enumerable: true\n });\n}\n\nexport function getBase64Image(image) {\n if (typeof btoa !== 'undefined') {\n if (typeof image === 'string') {\n // This only happens during the build tests using Node 16+ (npm run test:build).\n return btoa(image);\n }\n // IE11- does not implement reduce on the Uint8Array prototype.\n return btoa(Array.prototype.reduce.call(new Uint8Array(image), (data, byte) => data + String.fromCharCode(byte), ''));\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(image).toString('base64'); // eslint-disable-line no-undef\n }\n return (new Buffer(image)).toString('base64'); // eslint-disable-line no-undef\n}\n\nexport function dataUriToBuffer(dataUri) {\n const data = dataUri.substring(dataUri.indexOf(',') + 1);\n\n if (dataUri.indexOf(';base64') !== -1) {\n if (typeof atob !== 'undefined') {\n return Uint8Array.from(atob(data), (char) => char.charCodeAt(0)).buffer;\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(data, 'base64'); // eslint-disable-line no-undef\n }\n return new Buffer(data, 'base64'); // eslint-disable-line no-undef\n }\n\n const decodedData = decodeURIComponent(data);\n if (typeof Buffer !== 'undefined') {\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(decodedData); // eslint-disable-line no-undef\n }\n return new Buffer(decodedData); // eslint-disable-line no-undef\n }\n return Uint8Array.from(decodedData, (char) => char.charCodeAt(0)).buffer;\n}\n","export default class DataView {\n constructor(buffer) {\n if (bufferTypeIsUnsupported(buffer)) {\n throw new Error('DataView: Passed buffer type is unsupported.');\n }\n\n this.buffer = buffer;\n this.byteLength = this.buffer.length;\n }\n\n getUint8(offset) {\n return this.buffer.readUInt8(offset);\n }\n\n getUint16(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt16LE(offset);\n }\n return this.buffer.readUInt16BE(offset);\n }\n\n getUint32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt32LE(offset);\n }\n return this.buffer.readUInt32BE(offset);\n }\n\n getInt32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readInt32LE(offset);\n }\n return this.buffer.readInt32BE(offset);\n }\n}\n\nfunction bufferTypeIsUnsupported(buffer) {\n return typeof buffer !== 'object'\n || buffer.length === undefined\n || buffer.readUInt8 === undefined\n || buffer.readUInt16LE === undefined\n || buffer.readUInt16BE === undefined\n || buffer.readUInt32LE === undefined\n || buffer.readUInt32BE === undefined\n || buffer.readInt32LE === undefined\n || buffer.readInt32BE === undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringValue(value) {\n return value.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getEncodedString(value) {\n if (value.length >= 8) {\n const encoding = getStringValue(value.slice(0, 8));\n\n if (encoding === 'ASCII\\x00\\x00\\x00') {\n return getStringValue(value.slice(8));\n } else if (encoding === 'JIS\\x00\\x00\\x00\\x00\\x00') {\n return '[JIS encoded text]';\n } else if (encoding === 'UNICODE\\x00') {\n return '[Unicode encoded text]';\n } else if (encoding === '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00') {\n return '[Undefined encoding]';\n }\n }\n\n return 'Undefined';\n}\n\nexport function getCalculatedGpsValue(value) {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nconst LITTLE_ENDIAN = 0x4949;\nconst BIG_ENDIAN = 0x4d4d;\n\nexport default {\n BIG_ENDIAN,\n LITTLE_ENDIAN,\n getByteOrder\n};\n\nfunction getByteOrder(dataView, tiffHeaderOffset) {\n if (dataView.getUint16(tiffHeaderOffset) === LITTLE_ENDIAN) {\n return LITTLE_ENDIAN;\n } else if (dataView.getUint16(tiffHeaderOffset) === BIG_ENDIAN) {\n return BIG_ENDIAN;\n }\n throw new Error('Illegal byte order value. Faulty image.');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isJpegFile,\n findJpegOffsets\n};\n\nconst MIN_JPEG_DATA_BUFFER_LENGTH = 2;\nconst JPEG_ID = 0xffd8;\nconst JPEG_ID_SIZE = 2;\nconst APP_ID_OFFSET = 4;\nconst APP_MARKER_SIZE = 2;\nconst JFIF_DATA_OFFSET = 2; // From start of APP0 marker.\nconst TIFF_HEADER_OFFSET = 10; // From start of APP1 marker.\nconst IPTC_DATA_OFFSET = 18; // From start of APP13 marker.\nconst XMP_DATA_OFFSET = 33; // From start of APP1 marker.\nconst XMP_EXTENDED_DATA_OFFSET = 79; // From start of APP1 marker including GUID, total length, and offset.\nconst APP2_ICC_DATA_OFFSET = 18; // From start of APP2 marker including marker and chunk/chunk total numbers.\nconst MPF_DATA_OFFSET = 8;\n\nconst APP2_ICC_IDENTIFIER = 'ICC_PROFILE\\0';\nconst ICC_CHUNK_NUMBER_OFFSET = APP_ID_OFFSET + APP2_ICC_IDENTIFIER.length;\nconst ICC_TOTAL_CHUNKS_OFFSET = ICC_CHUNK_NUMBER_OFFSET + 1;\n\nconst APP2_MPF_IDENTIFIER = 'MPF\\0';\n\nconst SOF0_MARKER = 0xffc0;\nconst SOF2_MARKER = 0xffc2;\nconst DHT_MARKER = 0xffc4;\nconst DQT_MARKER = 0xffdb;\nconst DRI_MARKER = 0xffdd;\nconst SOS_MARKER = 0xffda;\n\nconst APP0_MARKER = 0xffe0;\nconst APP1_MARKER = 0xffe1;\nconst APP2_MARKER = 0xffe2;\nconst APP13_MARKER = 0xffed;\nconst APP15_MARKER = 0xffef;\nconst COMMENT_MARKER = 0xfffe;\n\n// Any number of fill bytes can be placed before an app marker. It's actually the first 0xff that is the\n// fill byte and the next 0xff is either another fill byte or the first half of the next app marker.\nconst FILL_BYTE = 0xffff;\n\nconst APP0_JFIF_IDENTIFIER = 'JFIF';\nconst APP1_EXIF_IDENTIFIER = 'Exif';\nconst APP1_XMP_IDENTIFIER = 'http://ns.adobe.com/xap/1.0/\\x00';\nconst APP1_XMP_EXTENDED_IDENTIFIER = 'http://ns.adobe.com/xmp/extension/\\x00';\nconst APP13_IPTC_IDENTIFIER = 'Photoshop 3.0';\n\nfunction isJpegFile(dataView) {\n return !!dataView && (dataView.byteLength >= MIN_JPEG_DATA_BUFFER_LENGTH) && (dataView.getUint16(0) === JPEG_ID);\n}\n\nfunction findJpegOffsets(dataView) {\n let appMarkerPosition = JPEG_ID_SIZE;\n let fieldLength;\n let sof0DataOffset;\n let sof2DataOffset;\n let jfifDataOffset;\n let tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\n let mpfDataOffset;\n\n while (appMarkerPosition + APP_ID_OFFSET + 5 <= dataView.byteLength) {\n if (Constants.USE_FILE && isSOF0Marker(dataView, appMarkerPosition)) {\n sof0DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_FILE && isSOF2Marker(dataView, appMarkerPosition)) {\n sof2DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_JFIF && isApp0JfifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n jfifDataOffset = appMarkerPosition + JFIF_DATA_OFFSET;\n } else if (Constants.USE_EXIF && isApp1ExifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n tiffHeaderOffset = appMarkerPosition + TIFF_HEADER_OFFSET;\n } else if (Constants.USE_XMP && isApp1XmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_XMP && isApp1ExtendedXmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getExtendedXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_IPTC && isApp13PhotoshopMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n iptcDataOffset = appMarkerPosition + IPTC_DATA_OFFSET;\n } else if (Constants.USE_ICC && isApp2ICCMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n const iccDataOffset = appMarkerPosition + APP2_ICC_DATA_OFFSET;\n const iccDataLength = fieldLength - (APP2_ICC_DATA_OFFSET - APP_MARKER_SIZE);\n\n const iccChunkNumber = dataView.getUint8(appMarkerPosition + ICC_CHUNK_NUMBER_OFFSET);\n const iccChunksTotal = dataView.getUint8(appMarkerPosition + ICC_TOTAL_CHUNKS_OFFSET);\n if (!iccChunks) {\n iccChunks = [];\n }\n iccChunks.push({offset: iccDataOffset, length: iccDataLength, chunkNumber: iccChunkNumber, chunksTotal: iccChunksTotal});\n } else if (Constants.USE_MPF && isApp2MPFMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n mpfDataOffset = appMarkerPosition + MPF_DATA_OFFSET;\n } else if (isAppMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n } else if (isFillByte(dataView, appMarkerPosition)) {\n appMarkerPosition++;\n continue;\n } else {\n break;\n }\n appMarkerPosition += APP_MARKER_SIZE + fieldLength;\n }\n\n return {\n hasAppMarkers: appMarkerPosition > JPEG_ID_SIZE,\n fileDataOffset: sof0DataOffset || sof2DataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset\n };\n}\n\nfunction isSOF0Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF0_MARKER);\n}\n\nfunction isSOF2Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF2_MARKER);\n}\n\nfunction isApp2ICCMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_ICC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_ICC_IDENTIFIER);\n}\n\nfunction isApp2MPFMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_MPF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_MPF_IDENTIFIER);\n}\n\nfunction isApp0JfifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP0_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP0_JFIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1ExifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_EXIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1XmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_IDENTIFIER;\n}\n\nfunction isApp1ExtendedXmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isExtendedXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isExtendedXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_EXTENDED_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_EXTENDED_IDENTIFIER;\n}\n\nfunction getXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_DATA_OFFSET,\n length: fieldLength - (XMP_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction getExtendedXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_EXTENDED_DATA_OFFSET,\n length: fieldLength - (XMP_EXTENDED_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction isApp13PhotoshopMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP13_IPTC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP13_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP13_IPTC_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isAppMarker(dataView, appMarkerPosition) {\n const appMarker = dataView.getUint16(appMarkerPosition);\n return ((appMarker >= APP0_MARKER) && (appMarker <= APP15_MARKER))\n || (appMarker === COMMENT_MARKER)\n || (appMarker === SOF0_MARKER)\n || (appMarker === SOF2_MARKER)\n || (appMarker === DHT_MARKER)\n || (appMarker === DQT_MARKER)\n || (appMarker === DRI_MARKER)\n || (appMarker === SOS_MARKER);\n}\n\nfunction isFillByte(dataView, appMarkerPosition) {\n return dataView.getUint16(appMarkerPosition) === FILL_BYTE;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isPngFile,\n findPngOffsets\n};\n\nconst PNG_ID = '\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a';\nconst PNG_CHUNK_LENGTH_SIZE = 4;\nexport const PNG_CHUNK_TYPE_SIZE = 4;\nexport const PNG_CHUNK_LENGTH_OFFSET = 0;\nexport const PNG_CHUNK_TYPE_OFFSET = PNG_CHUNK_LENGTH_SIZE;\nexport const PNG_CHUNK_DATA_OFFSET = PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE;\nconst PNG_XMP_PREFIX = 'XML:com.adobe.xmp\\x00';\nexport const TYPE_TEXT = 'tEXt';\nexport const TYPE_ITXT = 'iTXt';\nexport const TYPE_PHYS = 'pHYs';\nexport const TYPE_TIME = 'tIME';\nexport const TYPE_EXIF = 'eXIf';\n\nfunction isPngFile(dataView) {\n return !!dataView && getStringFromDataView(dataView, 0, PNG_ID.length) === PNG_ID;\n}\n\nfunction findPngOffsets(dataView) {\n const PNG_CRC_SIZE = 4;\n\n const offsets = {\n hasAppMarkers: false\n };\n\n let offset = PNG_ID.length;\n\n while (offset + PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE <= dataView.byteLength) {\n if (Constants.USE_PNG_FILE && isPngImageHeaderChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.pngHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_XMP && isPngXmpChunk(dataView, offset)) {\n const dataOffset = getPngXmpDataOffset(dataView, offset);\n if (dataOffset !== undefined) {\n offsets.hasAppMarkers = true;\n offsets.xmpChunks = [{\n dataOffset,\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET) - (dataOffset - (offset + PNG_CHUNK_DATA_OFFSET))\n }];\n }\n } else if (isPngTextChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n if (!offsets.pngTextChunks) {\n offsets.pngTextChunks = [];\n }\n offsets.pngTextChunks.push({\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET),\n type: chunkType,\n offset: offset + PNG_CHUNK_DATA_OFFSET\n });\n } else if (isPngExifChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.tiffHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (isPngChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n if (!offsets.pngChunkOffsets) {\n offsets.pngChunkOffsets = [];\n }\n offsets.pngChunkOffsets.push(offset + PNG_CHUNK_LENGTH_OFFSET);\n }\n\n offset += dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET)\n + PNG_CHUNK_LENGTH_SIZE\n + PNG_CHUNK_TYPE_SIZE\n + PNG_CRC_SIZE;\n }\n\n return offsets;\n}\n\nfunction isPngImageHeaderChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_IMAGE_HEADER = 'IHDR';\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_IMAGE_HEADER;\n}\n\nfunction isPngXmpChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_INTERNATIONAL_TEXT = 'iTXt';\n return (getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_INTERNATIONAL_TEXT)\n && (getStringFromDataView(dataView, offset + PNG_CHUNK_DATA_OFFSET, PNG_XMP_PREFIX.length) === PNG_XMP_PREFIX);\n}\n\nfunction isPngTextChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_TEXT = 'tEXt';\n const PNG_CHUNK_TYPE_ITXT = 'iTXt';\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return chunkType === PNG_CHUNK_TYPE_TEXT || chunkType === PNG_CHUNK_TYPE_ITXT;\n}\n\nfunction isPngExifChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_EXIF;\n}\n\nfunction isPngChunk(dataView, offset) {\n const SUPPORTED_PNG_CHUNK_TYPES = [TYPE_PHYS, TYPE_TIME];\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return SUPPORTED_PNG_CHUNK_TYPES.includes(chunkType);\n}\n\nfunction getPngXmpDataOffset(dataView, offset) {\n const COMPRESSION_FLAG_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n offset += PNG_CHUNK_DATA_OFFSET + PNG_XMP_PREFIX.length + COMPRESSION_FLAG_SIZE + COMPRESSION_METHOD_SIZE;\n\n let numberOfNullSeparators = 0;\n while (numberOfNullSeparators < 2 && offset < dataView.byteLength) {\n if (dataView.getUint8(offset) === 0x00) {\n numberOfNullSeparators++;\n }\n offset++;\n }\n if (numberOfNullSeparators < 2) {\n return undefined;\n }\n return offset;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isHeicFile,\n findHeicOffsets\n};\n\nfunction isHeicFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n const HEIC_ID = 'ftyp';\n const HEIC_ID_OFFSET = 4;\n const HEIC_MAJOR_BRANDS = ['heic', 'heix', 'hevc', 'hevx', 'heim', 'heis', 'hevm', 'hevs', 'mif1'];\n const HEIC_MAJOR_BRAND_LENGTH = 4;\n\n const heicMajorBrand = getStringFromDataView(dataView, HEIC_ID_OFFSET + HEIC_ID.length, HEIC_MAJOR_BRAND_LENGTH);\n\n return (getStringFromDataView(dataView, HEIC_ID_OFFSET, HEIC_ID.length) === HEIC_ID)\n && (HEIC_MAJOR_BRANDS.indexOf(heicMajorBrand) !== -1);\n}\n\nfunction findHeicOffsets(dataView) {\n if (Constants.USE_EXIF || Constants.USE_ICC) {\n const {offset: metaOffset, length: metaLength} = findMetaAtom(dataView);\n if (metaOffset === undefined) {\n return {hasAppMarkers: false};\n }\n\n const metaEndOffset = Math.min(metaOffset + metaLength, dataView.byteLength);\n const {exifItemOffset, ilocOffset, colrOffset} = findMetaItems(dataView, metaOffset, metaEndOffset);\n\n const exifOffset = findExifOffset(dataView, exifItemOffset, ilocOffset, metaEndOffset);\n const iccChunks = findIccChunks(dataView, colrOffset, metaEndOffset);\n return {\n hasAppMarkers: (exifOffset !== undefined) || (iccChunks !== undefined),\n tiffHeaderOffset: exifOffset,\n iccChunks\n };\n }\n\n return {hasAppMarkers: false};\n}\n\nfunction findMetaAtom(dataView) {\n const ATOM_LENGTH_SIZE = 4;\n const ATOM_TYPE_SIZE = 4;\n const ATOM_MIN_LENGTH = 8;\n const ATOM_TYPE_OFFSET = 4;\n\n let offset = 0;\n\n while (offset + ATOM_LENGTH_SIZE + ATOM_TYPE_SIZE <= dataView.byteLength) {\n const atomLength = getAtomLength(dataView, offset);\n if (atomLength >= ATOM_MIN_LENGTH) {\n const atomType = getStringFromDataView(dataView, offset + ATOM_TYPE_OFFSET, ATOM_TYPE_SIZE);\n if (atomType === 'meta') {\n return {\n offset,\n length: atomLength\n };\n }\n }\n\n offset += atomLength;\n }\n\n return {\n offset: undefined,\n length: 0\n };\n}\n\nfunction getAtomLength(dataView, offset) {\n const ATOM_EXTENDED_SIZE_LOW_OFFSET = 12;\n\n const atomLength = dataView.getUint32(offset);\n if (extendsToEndOfFile(atomLength)) {\n return dataView.byteLength - offset;\n }\n if (hasExtendedSize(atomLength)) {\n if (hasEmptyHighBits(dataView, offset)) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return dataView.getUint32(offset + ATOM_EXTENDED_SIZE_LOW_OFFSET);\n }\n }\n\n return atomLength;\n}\n\nfunction extendsToEndOfFile(atomLength) {\n return atomLength === 0;\n}\n\nfunction hasExtendedSize(atomLength) {\n return atomLength === 1;\n}\n\nfunction hasEmptyHighBits(dataView, offset) {\n const ATOM_EXTENDED_SIZE_OFFSET = 8;\n return dataView.getUint32(offset + ATOM_EXTENDED_SIZE_OFFSET) === 0;\n}\n\nfunction findMetaItems(dataView, offset, metaEndOffset) {\n const STRING_SIZE = 4;\n const ITEM_INDEX_REL_OFFSET = -4;\n const offsets = {\n ilocOffset: undefined,\n exifItemOffset: undefined,\n colrOffset: undefined\n };\n\n while ((offset + STRING_SIZE <= metaEndOffset)\n && (!offsets.ilocOffset || !offsets.exifItemOffset || !offsets.colrOffset)) {\n const itemName = getStringFromDataView(dataView, offset, STRING_SIZE);\n if (Constants.USE_EXIF && (itemName === 'iloc')) {\n offsets.ilocOffset = offset;\n } else if (Constants.USE_EXIF && (itemName === 'Exif')) {\n offsets.exifItemOffset = offset + ITEM_INDEX_REL_OFFSET;\n } else if (Constants.USE_ICC && (itemName === 'colr')) {\n offsets.colrOffset = offset + ITEM_INDEX_REL_OFFSET;\n }\n\n offset++;\n }\n\n return offsets;\n}\n\nfunction findExifOffset(dataView, exifItemOffset, offset, metaEndOffset) {\n const EXIF_ITEM_OFFSET_SIZE = 2;\n const ILOC_DATA_OFFSET = 12;\n const EXIF_POINTER_OFFSET = 8;\n const EXIF_POINTER_SIZE = 4;\n const EXIF_PREFIX_LENGTH_OFFSET = 4;\n const ILOC_ITEM_SIZE = 16;\n\n if (!offset || !exifItemOffset || (exifItemOffset + EXIF_ITEM_OFFSET_SIZE > metaEndOffset)) {\n return undefined;\n }\n\n const exifItemIndex = dataView.getUint16(exifItemOffset);\n offset += ILOC_DATA_OFFSET;\n\n while (offset + ILOC_ITEM_SIZE <= metaEndOffset) {\n const itemIndex = dataView.getUint16(offset);\n if (itemIndex === exifItemIndex) {\n const exifPointer = dataView.getUint32(offset + EXIF_POINTER_OFFSET);\n if (exifPointer + EXIF_POINTER_SIZE <= dataView.byteLength) {\n const exifOffset = dataView.getUint32(exifPointer);\n const prefixLength = exifOffset + EXIF_PREFIX_LENGTH_OFFSET;\n return exifPointer + prefixLength;\n }\n }\n offset += ILOC_ITEM_SIZE;\n }\n\n return undefined;\n}\n\nfunction findIccChunks(dataView, offset, metaEndOffset) {\n const ITEM_TYPE_OFFSET = 8;\n const ITEM_TYPE_SIZE = 4;\n const ITEM_CONTENT_OFFSET = 12;\n\n if (!offset || (offset + ITEM_CONTENT_OFFSET > metaEndOffset)) {\n return undefined;\n }\n\n const colorType = getStringFromDataView(dataView, offset + ITEM_TYPE_OFFSET, ITEM_TYPE_SIZE);\n if ((colorType !== 'prof') && (colorType !== 'rICC')) {\n return undefined;\n }\n\n return [{\n offset: offset + ITEM_CONTENT_OFFSET,\n length: getAtomLength(dataView, offset) - ITEM_CONTENT_OFFSET,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isWebpFile,\n findOffsets\n};\n\nfunction isWebpFile(dataView) {\n const RIFF_ID_OFFSET = 0;\n const RIFF_ID = 'RIFF';\n const WEBP_MARKER_OFFSET = 8;\n const WEBP_MARKER = 'WEBP';\n\n return !!dataView && getStringFromDataView(dataView, RIFF_ID_OFFSET, RIFF_ID.length) === RIFF_ID\n && getStringFromDataView(dataView, WEBP_MARKER_OFFSET, WEBP_MARKER.length) === WEBP_MARKER;\n}\n\nfunction findOffsets(dataView) {\n const SUB_CHUNK_START_OFFSET = 12;\n const CHUNK_SIZE_OFFSET = 4;\n const EXIF_IDENTIFIER = 'Exif\\x00\\x00';\n const CHUNK_HEADER_SIZE = 8;\n\n let offset = SUB_CHUNK_START_OFFSET;\n let hasAppMarkers = false;\n let tiffHeaderOffset;\n let xmpChunks;\n let iccChunks;\n\n while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {\n const chunkId = getStringFromDataView(dataView, offset, 4);\n const chunkSize = dataView.getUint32(offset + CHUNK_SIZE_OFFSET, true);\n\n if (Constants.USE_EXIF && (chunkId === 'EXIF')) {\n hasAppMarkers = true;\n if (getStringFromDataView(dataView, offset + CHUNK_HEADER_SIZE, EXIF_IDENTIFIER.length) === EXIF_IDENTIFIER) {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE + EXIF_IDENTIFIER.length;\n } else {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE;\n }\n } else if (Constants.USE_XMP && (chunkId === 'XMP ')) {\n hasAppMarkers = true;\n xmpChunks = [{\n dataOffset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize\n }];\n } else if (Constants.USE_ICC && (chunkId === 'ICCP')) {\n hasAppMarkers = true;\n iccChunks = [{\n offset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n }\n\n offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);\n }\n\n return {\n hasAppMarkers,\n tiffHeaderOffset,\n xmpChunks,\n iccChunks\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport Tiff from './image-header-tiff.js';\nimport Jpeg from './image-header-jpeg.js';\nimport Png from './image-header-png.js';\nimport Heic from './image-header-heic.js';\nimport Webp from './image-header-webp.js';\n\nexport default {\n parseAppMarkers\n};\n\nfunction parseAppMarkers(dataView) {\n if (Constants.USE_TIFF && Tiff.isTiffFile(dataView)) {\n return Tiff.findTiffOffsets();\n }\n\n if (Constants.USE_JPEG && Jpeg.isJpegFile(dataView)) {\n return Jpeg.findJpegOffsets(dataView);\n }\n\n if (Constants.USE_PNG && Png.isPngFile(dataView)) {\n return Png.findPngOffsets(dataView);\n }\n\n if (Constants.USE_HEIC && Heic.isHeicFile(dataView)) {\n return Heic.findHeicOffsets(dataView);\n }\n\n if (Constants.USE_WEBP && Webp.isWebpFile(dataView)) {\n return Webp.findOffsets(dataView);\n }\n\n throw new Error('Invalid image format');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Constants from './constants.js';\n\nexport default {\n isTiffFile,\n findTiffOffsets\n};\n\nfunction isTiffFile(dataView) {\n const MIN_TIFF_DATA_BUFFER_LENGTH = 4;\n\n return !!dataView && (dataView.byteLength >= MIN_TIFF_DATA_BUFFER_LENGTH) && hasTiffMarker(dataView);\n}\n\nfunction hasTiffMarker(dataView) {\n const TIFF_ID = 0x2a;\n const TIFF_ID_OFFSET = 2;\n\n const littleEndian = dataView.getUint16(0) === ByteOrder.LITTLE_ENDIAN;\n return dataView.getUint16(TIFF_ID_OFFSET, littleEndian) === TIFF_ID;\n}\n\nfunction findTiffOffsets() {\n const TIFF_FILE_HEADER_OFFSET = 0;\n\n if (Constants.USE_EXIF) {\n return {\n hasAppMarkers: true,\n tiffHeaderOffset: TIFF_FILE_HEADER_OFFSET\n };\n }\n return {};\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\n\nconst typeSizes = {\n 1: 1, // BYTE\n 2: 1, // ASCII\n 3: 2, // SHORT\n 4: 4, // LONG\n 5: 8, // RATIONAL\n 7: 1, // UNDEFINED\n 9: 4, // SLONG\n 10: 8, // SRATIONAL\n 13: 4 // IFD\n};\n\nconst tagTypes = {\n 'BYTE': 1,\n 'ASCII': 2,\n 'SHORT': 3,\n 'LONG': 4,\n 'RATIONAL': 5,\n 'UNDEFINED': 7,\n 'SLONG': 9,\n 'SRATIONAL': 10,\n 'IFD': 13\n};\n\nexport default {\n getAsciiValue,\n getByteAt,\n getAsciiAt,\n getShortAt,\n getLongAt,\n getRationalAt,\n getUndefinedAt,\n getSlongAt,\n getSrationalAt,\n getIfdPointerAt,\n typeSizes,\n tagTypes,\n getTypeSize\n};\n\nfunction getAsciiValue(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode));\n}\n\nfunction getByteAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getAsciiAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getShortAt(dataView, offset, byteOrder) {\n return dataView.getUint16(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getLongAt(dataView, offset, byteOrder) {\n return dataView.getUint32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getRationalAt(dataView, offset, byteOrder) {\n return [getLongAt(dataView, offset, byteOrder), getLongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getUndefinedAt(dataView, offset) {\n return getByteAt(dataView, offset);\n}\n\nfunction getSlongAt(dataView, offset, byteOrder) {\n return dataView.getInt32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getSrationalAt(dataView, offset, byteOrder) {\n return [getSlongAt(dataView, offset, byteOrder), getSlongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getIfdPointerAt(dataView, offset, byteOrder) {\n return getLongAt(dataView, offset, byteOrder);\n}\n\nfunction getTypeSize(typeName) {\n if (tagTypes[typeName] === undefined) {\n throw new Error('No such type found.');\n }\n\n return typeSizes[tagTypes[typeName]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n ApertureValue: (value) => Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2),\n ColorSpace(value) {\n if (value === 1) {\n return 'sRGB';\n } else if (value === 0xffff) {\n return 'Uncalibrated';\n }\n return 'Unknown';\n },\n ComponentsConfiguration(value) {\n return value.map((character) => {\n if (character === 0x31) {\n return 'Y';\n } else if (character === 0x32) {\n return 'Cb';\n } else if (character === 0x33) {\n return 'Cr';\n } else if (character === 0x34) {\n return 'R';\n } else if (character === 0x35) {\n return 'G';\n } else if (character === 0x36) {\n return 'B';\n }\n }).join('');\n },\n Contrast(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n CustomRendered(value) {\n if (value === 0) {\n return 'Normal process';\n } else if (value === 1) {\n return 'Custom process';\n }\n return 'Unknown';\n },\n ExposureMode(value) {\n if (value === 0) {\n return 'Auto exposure';\n } else if (value === 1) {\n return 'Manual exposure';\n } else if (value === 2) {\n return 'Auto bracket';\n }\n return 'Unknown';\n },\n ExposureProgram(value) {\n if (value === 0) {\n return 'Undefined';\n } else if (value === 1) {\n return 'Manual';\n } else if (value === 2) {\n return 'Normal program';\n } else if (value === 3) {\n return 'Aperture priority';\n } else if (value === 4) {\n return 'Shutter priority';\n } else if (value === 5) {\n return 'Creative program';\n } else if (value === 6) {\n return 'Action program';\n } else if (value === 7) {\n return 'Portrait mode';\n } else if (value === 8) {\n return 'Landscape mode';\n } else if (value === 9) {\n return 'Bulb';\n }\n return 'Unknown';\n },\n ExposureTime(value) {\n if (value[0] >= value[1]) {\n return `${Math.round(value[0] / value[1])}`;\n }\n if (value[0] !== 0) {\n return `1/${Math.round(value[1] / value[0])}`;\n }\n return `0/${value[1]}`;\n },\n FNumber: (value) => `f/${value[0] / value[1]}`,\n FocalLength: (value) => (value[0] / value[1]) + ' mm',\n FocalPlaneResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n } else if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n LightSource: (value) => {\n if (value === 1) {\n return 'Daylight';\n } else if (value === 2) {\n return 'Fluorescent';\n } else if (value === 3) {\n return 'Tungsten (incandescent light)';\n } else if (value === 4) {\n return 'Flash';\n } else if (value === 9) {\n return 'Fine weather';\n } else if (value === 10) {\n return 'Cloudy weather';\n } else if (value === 11) {\n return 'Shade';\n } else if (value === 12) {\n return 'Daylight fluorescent (D 5700 – 7100K)';\n } else if (value === 13) {\n return 'Day white fluorescent (N 4600 – 5400K)';\n } else if (value === 14) {\n return 'Cool white fluorescent (W 3900 – 4500K)';\n } else if (value === 15) {\n return 'White fluorescent (WW 3200 – 3700K)';\n } else if (value === 17) {\n return 'Standard light A';\n } else if (value === 18) {\n return 'Standard light B';\n } else if (value === 19) {\n return 'Standard light C';\n } else if (value === 20) {\n return 'D55';\n } else if (value === 21) {\n return 'D65';\n } else if (value === 22) {\n return 'D75';\n } else if (value === 23) {\n return 'D50';\n } else if (value === 24) {\n return 'ISO studio tungsten';\n } else if (value === 255) {\n return 'Other light source';\n }\n return 'Unknown';\n },\n MeteringMode(value) {\n if (value === 1) {\n return 'Average';\n } else if (value === 2) {\n return 'CenterWeightedAverage';\n } else if (value === 3) {\n return 'Spot';\n } else if (value === 4) {\n return 'MultiSpot';\n } else if (value === 5) {\n return 'Pattern';\n } else if (value === 6) {\n return 'Partial';\n } else if (value === 255) {\n return 'Other';\n }\n return 'Unknown';\n },\n ResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n }\n if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n Saturation(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Low saturation';\n } else if (value === 2) {\n return 'High saturation';\n }\n return 'Unknown';\n },\n SceneCaptureType(value) {\n if (value === 0) {\n return 'Standard';\n } else if (value === 1) {\n return 'Landscape';\n } else if (value === 2) {\n return 'Portrait';\n } else if (value === 3) {\n return 'Night scene';\n }\n return 'Unknown';\n },\n Sharpness(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n ShutterSpeedValue(value) {\n const denominator = Math.pow(2, value[0] / value[1]);\n if (denominator <= 1) {\n return `${Math.round(1 / denominator)}`;\n }\n return `1/${Math.round(denominator)}`;\n },\n WhiteBalance(value) {\n if (value === 0) {\n return 'Auto white balance';\n } else if (value === 1) {\n return 'Manual white balance';\n }\n return 'Unknown';\n },\n XResolution: (value) => '' + Math.round(value[0] / value[1]),\n YResolution: (value) => '' + Math.round(value[0] / value[1])\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x000b: 'ProcessingSoftware',\n 0x00fe: {\n name: 'SubfileType',\n description: (value) => ({\n 0x0: 'Full-resolution image',\n 0x1: 'Reduced-resolution image',\n 0x2: 'Single page of multi-page image',\n 0x3: 'Single page of multi-page reduced-resolution image',\n 0x4: 'Transparency mask',\n 0x5: 'Transparency mask of reduced-resolution image',\n 0x6: 'Transparency mask of multi-page image',\n 0x7: 'Transparency mask of reduced-resolution multi-page image',\n 0x10001: 'Alternate reduced-resolution image',\n 0xffffffff: 'Invalid'\n })[value] || 'Unknown'\n },\n 0x00ff: {\n name: 'OldSubfileType',\n description: (value) => ({\n 0: 'Full-resolution image',\n 1: 'Reduced-resolution image',\n 2: 'Single page of multi-page image'\n })[value] || 'Unknown'\n },\n 0x0100: 'ImageWidth',\n 0x0101: 'ImageLength',\n 0x0102: 'BitsPerSample',\n 0x0103: 'Compression',\n 0x0106: 'PhotometricInterpretation',\n 0x0107: {\n name: 'Thresholding',\n description: (value) => ({\n 1: 'No dithering or halftoning',\n 2: 'Ordered dither or halfton',\n 3: 'Randomized dither'\n })[value] || 'Unknown'\n },\n 0x0108: 'CellWidth',\n 0x0109: 'CellLength',\n 0x010a: {\n name: 'FillOrder',\n description: (value) => ({\n 1: 'Normal',\n 2: 'Reversed'\n })[value] || 'Unknown'\n },\n 0x010d: 'DocumentName',\n 0x010e: 'ImageDescription',\n 0x010f: 'Make',\n 0x0110: 'Model',\n 0x0111: 'StripOffsets',\n 0x0112: {\n name: 'Orientation',\n description: (value) => {\n if (value === 1) {\n return 'top-left';\n }\n if (value === 2) {\n return 'top-right';\n }\n if (value === 3) {\n return 'bottom-right';\n }\n if (value === 4) {\n return 'bottom-left';\n }\n if (value === 5) {\n return 'left-top';\n }\n if (value === 6) {\n return 'right-top';\n }\n if (value === 7) {\n return 'right-bottom';\n }\n if (value === 8) {\n return 'left-bottom';\n }\n return 'Undefined';\n }\n },\n 0x0115: 'SamplesPerPixel',\n 0x0116: 'RowsPerStrip',\n 0x0117: 'StripByteCounts',\n 0x0118: 'MinSampleValue',\n 0x0119: 'MaxSampleValue',\n 0x011a: {\n 'name': 'XResolution',\n 'description': TagNamesCommon.XResolution\n },\n 0x011b: {\n 'name': 'YResolution',\n 'description': TagNamesCommon.YResolution\n },\n 0x011c: 'PlanarConfiguration',\n 0x011d: 'PageName',\n 0x011e: {\n 'name': 'XPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011f: {\n 'name': 'YPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x0122: {\n name: 'GrayResponseUnit',\n description: (value) => ({\n 1: '0.1',\n 2: '0.001',\n 3: '0.0001',\n 4: '1e-05',\n 5: '1e-06'\n })[value] || 'Unknown'\n },\n 0x0128: {\n name: 'ResolutionUnit',\n description: TagNamesCommon.ResolutionUnit\n },\n 0x0129: 'PageNumber',\n 0x012d: 'TransferFunction',\n 0x0131: 'Software',\n 0x0132: 'DateTime',\n 0x013b: 'Artist',\n 0x013c: 'HostComputer',\n 0x013d: 'Predictor',\n 0x013e: {\n 'name': 'WhitePoint',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x013f: {\n 'name': 'PrimaryChromaticities',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x0141: 'HalftoneHints',\n 0x0142: 'TileWidth',\n 0x0143: 'TileLength',\n 0x014a: 'A100DataOffset',\n 0x014c: {\n name: 'InkSet',\n description: (value) => ({\n 1: 'CMYK',\n 2: 'Not CMYK'\n })[value] || 'Unknown'\n },\n 0x0151: 'TargetPrinter',\n 0x0152: {\n name: 'ExtraSamples',\n description: (value) => ({\n 0: 'Unspecified',\n 1: 'Associated Alpha',\n 2: 'Unassociated Alpha',\n })[value] || 'Unknown'\n },\n 0x0153: {\n name: 'SampleFormat',\n description: (value) => {\n const formats = {\n 1: 'Unsigned',\n 2: 'Signed',\n 3: 'Float',\n 4: 'Undefined',\n 5: 'Complex int',\n 6: 'Complex float',\n };\n if (!Array.isArray(value)) {\n return 'Unknown';\n }\n return value.map((sample) => formats[sample] || 'Unknown').join(', ');\n }\n },\n 0x0201: 'JPEGInterchangeFormat',\n 0x0202: 'JPEGInterchangeFormatLength',\n 0x0211: {\n 'name': 'YCbCrCoefficients',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join('/');\n }\n },\n 0x0212: 'YCbCrSubSampling',\n 0x0213: {\n name: 'YCbCrPositioning',\n description: (value) => {\n if (value === 1) {\n return 'centered';\n }\n if (value === 2) {\n return 'co-sited';\n }\n return 'undefined ' + value;\n }\n },\n 0x0214: {\n 'name': 'ReferenceBlackWhite',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join(', ');\n }\n },\n 0x02bc: 'ApplicationNotes',\n 0x4746: 'Rating',\n 0x4749: 'RatingPercent',\n 0x8298: {\n name: 'Copyright',\n description: (value) => value.join('; ')\n },\n 0x830e: 'PixelScale',\n 0x83bb: 'IPTC-NAA',\n 0x8480: 'IntergraphMatrix',\n 0x8482: 'ModelTiePoint',\n 0x8546: 'SEMInfo',\n 0x85d8: 'ModelTransform',\n 0x8649: 'PhotoshopSettings',\n 0x8769: 'Exif IFD Pointer',\n 0x8773: 'ICC_Profile',\n 0x87af: 'GeoTiffDirectory',\n 0x87b0: 'GeoTiffDoubleParams',\n 0x87b1: 'GeoTiffAsciiParams',\n 0x8825: 'GPS Info IFD Pointer',\n 0x9c9b: 'XPTitle',\n 0x9c9c: 'XPComment',\n 0x9c9d: 'XPAuthor',\n 0x9c9e: 'XPKeywords',\n 0x9c9f: 'XPSubject',\n 0xa480: 'GDALMetadata',\n 0xa481: 'GDALNoData',\n 0xc4a5: 'PrintIM',\n 0xc613: 'DNGBackwardVersion',\n 0xc614: 'UniqueCameraModel',\n 0xc615: 'LocalizedCameraModel',\n 0xc621: 'ColorMatrix1',\n 0xc622: 'ColorMatrix2',\n 0xc623: 'CameraCalibration1',\n 0xc624: 'CameraCalibration2',\n 0xc625: 'ReductionMatrix1',\n 0xc626: 'ReductionMatrix2',\n 0xc627: 'AnalogBalance',\n 0xc628: 'AsShotNeutral',\n 0xc629: 'AsShotWhiteXY',\n 0xc62a: 'BaselineExposure',\n 0xc62b: 'BaselineNoise',\n 0xc62c: 'BaselineSharpness',\n 0xc62e: 'LinearResponseLimit',\n 0xc62f: 'CameraSerialNumber',\n 0xc630: 'DNGLensInfo',\n 0xc633: 'ShadowScale',\n 0xc635: {\n name: 'MakerNoteSafety',\n description: (value) => ({\n 0: 'Unsafe',\n 1: 'Safe'\n })[value] || 'Unknown'\n },\n 0xc65a: {\n name: 'CalibrationIlluminant1',\n description: TagNamesCommon['LightSource']\n },\n 0xc65b: {\n name: 'CalibrationIlluminant2',\n description: TagNamesCommon['LightSource']\n },\n 0xc65d: 'RawDataUniqueID',\n 0xc68b: 'OriginalRawFileName',\n 0xc68c: 'OriginalRawFileData',\n 0xc68f: 'AsShotICCProfile',\n 0xc690: 'AsShotPreProfileMatrix',\n 0xc691: 'CurrentICCProfile',\n 0xc692: 'CurrentPreProfileMatrix',\n 0xc6bf: 'ColorimetricReference',\n 0xc6c5: 'SRawType',\n 0xc6d2: 'PanasonicTitle',\n 0xc6d3: 'PanasonicTitle2',\n 0xc6f3: 'CameraCalibrationSig',\n 0xc6f4: 'ProfileCalibrationSig',\n 0xc6f5: 'ProfileIFD',\n 0xc6f6: 'AsShotProfileName',\n 0xc6f8: 'ProfileName',\n 0xc6f9: 'ProfileHueSatMapDims',\n 0xc6fa: 'ProfileHueSatMapData1',\n 0xc6fb: 'ProfileHueSatMapData2',\n 0xc6fc: 'ProfileToneCurve',\n 0xc6fd: {\n name: 'ProfileEmbedPolicy',\n description: (value) => ({\n 0: 'Allow Copying',\n 1: 'Embed if Used',\n 2: 'Never Embed',\n 3: 'No Restrictions'\n })[value] || 'Unknown'\n },\n 0xc6fe: 'ProfileCopyright',\n 0xc714: 'ForwardMatrix1',\n 0xc715: 'ForwardMatrix2',\n 0xc716: 'PreviewApplicationName',\n 0xc717: 'PreviewApplicationVersion',\n 0xc718: 'PreviewSettingsName',\n 0xc719: 'PreviewSettingsDigest',\n 0xc71a: {\n name: 'PreviewColorSpace',\n description: (value) => ({\n 1: 'Gray Gamma 2.2',\n 2: 'sRGB',\n 3: 'Adobe RGB',\n 4: 'ProPhoto RGB'\n })[value] || 'Unknown'\n },\n 0xc71b: 'PreviewDateTime',\n 0xc71c: 'RawImageDigest',\n 0xc71d: 'OriginalRawFileDigest',\n 0xc725: 'ProfileLookTableDims',\n 0xc726: 'ProfileLookTableData',\n 0xc763: 'TimeCodes',\n 0xc764: 'FrameRate',\n 0xc772: 'TStop',\n 0xc789: 'ReelName',\n 0xc791: 'OriginalDefaultFinalSize',\n 0xc792: 'OriginalBestQualitySize',\n 0xc793: 'OriginalDefaultCropSize',\n 0xc7a1: 'CameraLabel',\n 0xc7a3: {\n name: 'ProfileHueSatMapEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a4: {\n name: 'ProfileLookTableEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a5: 'BaselineExposureOffset',\n 0xc7a6: {\n name: 'DefaultBlackRender',\n description: (value) => ({\n 0: 'Auto',\n 1: 'None'\n })[value] || 'Unknown'\n },\n 0xc7a7: 'NewRawImageDigest',\n 0xc7a8: 'RawToPreviewGain'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getEncodedString, getCalculatedGpsValue} from './tag-names-utils.js';\n\nexport default {\n 0x0000: {\n 'name': 'GPSVersionID',\n 'description': (value) => {\n if (value[0] === 2 && value[1] === 2 && value[2] === 0 && value[3] === 0) {\n return 'Version 2.2';\n }\n return 'Unknown';\n }\n },\n 0x0001: {\n 'name': 'GPSLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0002: {\n 'name': 'GPSLatitude',\n 'description': getCalculatedGpsValue\n },\n 0x0003: {\n 'name': 'GPSLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0004: {\n 'name': 'GPSLongitude',\n 'description': getCalculatedGpsValue\n },\n 0x0005: {\n 'name': 'GPSAltitudeRef',\n 'description': (value) => {\n if (value === 0) {\n return 'Sea level';\n } else if (value === 1) {\n return 'Sea level reference (negative value)';\n }\n return 'Unknown';\n }\n },\n 0x0006: {\n 'name': 'GPSAltitude',\n 'description': (value) => {\n return (value[0] / value[1]) + ' m';\n }\n },\n 0x0007: {\n 'name': 'GPSTimeStamp',\n 'description': (values) => {\n return values.map(([numerator, denominator]) => {\n const num = numerator / denominator;\n if (/^\\d(\\.|$)/.test(`${num}`)) {\n return `0${num}`;\n }\n return num;\n }).join(':');\n }\n },\n 0x0008: 'GPSSatellites',\n 0x0009: {\n 'name': 'GPSStatus',\n 'description': (value) => {\n const status = value.join('');\n if (status === 'A') {\n return 'Measurement in progress';\n } else if (status === 'V') {\n return 'Measurement Interoperability';\n }\n return 'Unknown';\n }\n },\n 0x000a: {\n 'name': 'GPSMeasureMode',\n 'description': (value) => {\n const mode = value.join('');\n if (mode === '2') {\n return '2-dimensional measurement';\n } else if (mode === '3') {\n return '3-dimensional measurement';\n }\n return 'Unknown';\n }\n },\n 0x000b: 'GPSDOP',\n 0x000c: {\n 'name': 'GPSSpeedRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers per hour';\n } else if (ref === 'M') {\n return 'Miles per hour';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x000d: 'GPSSpeed',\n 0x000e: {\n 'name': 'GPSTrackRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x000f: 'GPSTrack',\n 0x0010: {\n 'name': 'GPSImgDirectionRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0011: 'GPSImgDirection',\n 0x0012: 'GPSMapDatum',\n 0x0013: {\n 'name': 'GPSDestLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0014: {\n 'name': 'GPSDestLatitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0015: {\n 'name': 'GPSDestLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0016: {\n 'name': 'GPSDestLongitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0017: {\n 'name': 'GPSDestBearingRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0018: 'GPSDestBearing',\n 0x0019: {\n 'name': 'GPSDestDistanceRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers';\n } else if (ref === 'M') {\n return 'Miles';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x001a: 'GPSDestDistance',\n 0x001b: {\n 'name': 'GPSProcessingMethod',\n 'description': getEncodedString\n },\n 0x001c: {\n 'name': 'GPSAreaInformation',\n 'description': getEncodedString\n },\n 0x001d: 'GPSDateStamp',\n 0x001e: {\n 'name': 'GPSDifferential',\n 'description': (value) => {\n if (value === 0) {\n return 'Measurement without differential correction';\n } else if (value === 1) {\n return 'Differential correction applied';\n }\n return 'Unknown';\n }\n },\n 0x001f: 'GPSHPositioningError'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0x0001: 'InteroperabilityIndex',\n 0x0002: {\n name: 'InteroperabilityVersion',\n description: (value) => getStringValue(value)\n },\n 0x1000: 'RelatedImageFileFormat',\n 0x1001: 'RelatedImageWidth',\n 0x1002: 'RelatedImageHeight'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0xb000: {\n 'name': 'MPFVersion',\n 'description': (value) => getStringValue(value)\n },\n 0xb001: 'NumberOfImages',\n 0xb002: 'MPEntry',\n 0xb003: 'ImageUIDList',\n 0xb004: 'TotalFrames'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport Constants from './constants.js';\nimport TagNames0thIfd from './tag-names-0th-ifd.js';\nimport TagNamesExifIfd from './tag-names-exif-ifd.js';\nimport TagNamesGpsIfd from './tag-names-gps-ifd.js';\nimport TagNamesInteroperabilityIfd from './tag-names-interoperability-ifd.js';\nimport TagNamesMpfIfd from './tag-names-mpf-ifd.js';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport const IFD_TYPE_0TH = '0th';\nexport const IFD_TYPE_1ST = '1st';\nexport const IFD_TYPE_EXIF = 'exif';\nexport const IFD_TYPE_GPS = 'gps';\nexport const IFD_TYPE_INTEROPERABILITY = 'interoperability';\nexport const IFD_TYPE_MPF = 'mpf';\n\nexport default {\n [IFD_TYPE_0TH]: tagNames0thExifIfds,\n [IFD_TYPE_1ST]: TagNames0thIfd,\n [IFD_TYPE_EXIF]: tagNames0thExifIfds,\n [IFD_TYPE_GPS]: TagNamesGpsIfd,\n [IFD_TYPE_INTEROPERABILITY]: TagNamesInteroperabilityIfd,\n [IFD_TYPE_MPF]: Constants.USE_MPF ? TagNamesMpfIfd : {},\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue, getEncodedString} from './tag-names-utils.js';\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x829a: {\n 'name': 'ExposureTime',\n 'description': TagNamesCommon.ExposureTime\n },\n 0x829d: {\n 'name': 'FNumber',\n 'description': TagNamesCommon.FNumber\n },\n 0x8822: {\n 'name': 'ExposureProgram',\n 'description': TagNamesCommon.ExposureProgram\n },\n 0x8824: 'SpectralSensitivity',\n 0x8827: 'ISOSpeedRatings',\n 0x8828: {\n 'name': 'OECF',\n 'description': () => '[Raw OECF table data]'\n },\n 0x882a: 'TimeZoneOffset',\n 0x882b: 'SelfTimerMode',\n 0x8830: {\n name: 'SensitivityType',\n description: (value) => ({\n 1: 'Standard Output Sensitivity',\n 2: 'Recommended Exposure Index',\n 3: 'ISO Speed',\n 4: 'Standard Output Sensitivity and Recommended Exposure Index',\n 5: 'Standard Output Sensitivity and ISO Speed',\n 6: 'Recommended Exposure Index and ISO Speed',\n 7: 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed'\n })[value] || 'Unknown'\n },\n 0x8831: 'StandardOutputSensitivity',\n 0x8832: 'RecommendedExposureIndex',\n 0x8833: 'ISOSpeed',\n 0x8834: 'ISOSpeedLatitudeyyy',\n 0x8835: 'ISOSpeedLatitudezzz',\n 0x9000: {\n 'name': 'ExifVersion',\n 'description': (value) => getStringValue(value)\n },\n 0x9003: 'DateTimeOriginal',\n 0x9004: 'DateTimeDigitized',\n 0x9009: 'GooglePlusUploadCode',\n 0x9010: 'OffsetTime',\n 0x9011: 'OffsetTimeOriginal',\n 0x9012: 'OffsetTimeDigitized',\n 0x9101: {\n 'name': 'ComponentsConfiguration',\n 'description': TagNamesCommon.ComponentsConfiguration\n },\n 0x9102: 'CompressedBitsPerPixel',\n 0x9201: {\n 'name': 'ShutterSpeedValue',\n 'description': TagNamesCommon.ShutterSpeedValue\n },\n 0x9202: {\n 'name': 'ApertureValue',\n 'description': TagNamesCommon.ApertureValue\n },\n 0x9203: 'BrightnessValue',\n 0x9204: 'ExposureBiasValue',\n 0x9205: {\n 'name': 'MaxApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9206: {\n 'name': 'SubjectDistance',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9207: {\n 'name': 'MeteringMode',\n 'description': TagNamesCommon.MeteringMode\n },\n 0x9208: {\n 'name': 'LightSource',\n description: TagNamesCommon.LightSource\n },\n 0x9209: {\n 'name': 'Flash',\n 'description': (value) => {\n if (value === 0x00) {\n return 'Flash did not fire';\n } else if (value === 0x01) {\n return 'Flash fired';\n } else if (value === 0x05) {\n return 'Strobe return light not detected';\n } else if (value === 0x07) {\n return 'Strobe return light detected';\n } else if (value === 0x09) {\n return 'Flash fired, compulsory flash mode';\n } else if (value === 0x0d) {\n return 'Flash fired, compulsory flash mode, return light not detected';\n } else if (value === 0x0f) {\n return 'Flash fired, compulsory flash mode, return light detected';\n } else if (value === 0x10) {\n return 'Flash did not fire, compulsory flash mode';\n } else if (value === 0x18) {\n return 'Flash did not fire, auto mode';\n } else if (value === 0x19) {\n return 'Flash fired, auto mode';\n } else if (value === 0x1d) {\n return 'Flash fired, auto mode, return light not detected';\n } else if (value === 0x1f) {\n return 'Flash fired, auto mode, return light detected';\n } else if (value === 0x20) {\n return 'No flash function';\n } else if (value === 0x41) {\n return 'Flash fired, red-eye reduction mode';\n } else if (value === 0x45) {\n return 'Flash fired, red-eye reduction mode, return light not detected';\n } else if (value === 0x47) {\n return 'Flash fired, red-eye reduction mode, return light detected';\n } else if (value === 0x49) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode';\n } else if (value === 0x4d) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected';\n } else if (value === 0x4f) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected';\n } else if (value === 0x59) {\n return 'Flash fired, auto mode, red-eye reduction mode';\n } else if (value === 0x5d) {\n return 'Flash fired, auto mode, return light not detected, red-eye reduction mode';\n } else if (value === 0x5f) {\n return 'Flash fired, auto mode, return light detected, red-eye reduction mode';\n }\n return 'Unknown';\n }\n },\n 0x920a: {\n 'name': 'FocalLength',\n 'description': TagNamesCommon.FocalLength\n },\n 0x9211: 'ImageNumber',\n 0x9212: {\n name: 'SecurityClassification',\n description: (value) => ({\n 'C': 'Confidential',\n 'R': 'Restricted',\n 'S': 'Secret',\n 'T': 'Top Secret',\n 'U': 'Unclassified'\n })[value] || 'Unknown'\n },\n 0x9213: 'ImageHistory',\n 0x9214: {\n 'name': 'SubjectArea',\n 'description': (value) => {\n if (value.length === 2) {\n return `Location; X: ${value[0]}, Y: ${value[1]}`;\n } else if (value.length === 3) {\n return `Circle; X: ${value[0]}, Y: ${value[1]}, diameter: ${value[2]}`;\n } else if (value.length === 4) {\n return `Rectangle; X: ${value[0]}, Y: ${value[1]}, width: ${value[2]}, height: ${value[3]}`;\n }\n return 'Unknown';\n }\n },\n 0x927c: {\n 'name': 'MakerNote',\n 'description': () => '[Raw maker note data]'\n },\n 0x9286: {\n 'name': 'UserComment',\n 'description': getEncodedString\n },\n 0x9290: 'SubSecTime',\n 0x9291: 'SubSecTimeOriginal',\n 0x9292: 'SubSecTimeDigitized',\n 0x9400: {\n 'name': 'AmbientTemperature',\n 'description': (value) => (value[0] / value[1]) + ' °C'\n },\n 0x9401: {\n 'name': 'Humidity',\n 'description': (value) => (value[0] / value[1]) + ' %'\n },\n 0x9402: {\n 'name': 'Pressure',\n 'description': (value) => (value[0] / value[1]) + ' hPa'\n },\n 0x9403: {\n 'name': 'WaterDepth',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9404: {\n 'name': 'Acceleration',\n 'description': (value) => (value[0] / value[1]) + ' mGal'\n },\n 0x9405: {\n 'name': 'CameraElevationAngle',\n 'description': (value) => (value[0] / value[1]) + ' °'\n },\n 0xa000: {\n 'name': 'FlashpixVersion',\n 'description': (value) => value.map((charCode) => String.fromCharCode(charCode)).join('')\n },\n 0xa001: {\n 'name': 'ColorSpace',\n 'description': TagNamesCommon.ColorSpace\n },\n 0xa002: 'PixelXDimension',\n 0xa003: 'PixelYDimension',\n 0xa004: 'RelatedSoundFile',\n 0xa005: 'Interoperability IFD Pointer',\n 0xa20b: 'FlashEnergy',\n 0xa20c: {\n 'name': 'SpatialFrequencyResponse',\n 'description': () => '[Raw SFR table data]'\n },\n 0xa20e: 'FocalPlaneXResolution',\n 0xa20f: 'FocalPlaneYResolution',\n 0xa210: {\n 'name': 'FocalPlaneResolutionUnit',\n 'description': TagNamesCommon.FocalPlaneResolutionUnit\n },\n 0xa214: {\n 'name': 'SubjectLocation',\n 'description': ([x, y]) => `X: ${x}, Y: ${y}`\n },\n 0xa215: 'ExposureIndex',\n 0xa217: {\n 'name': 'SensingMethod',\n 'description': (value) => {\n if (value === 1) {\n return 'Undefined';\n } else if (value === 2) {\n return 'One-chip color area sensor';\n } else if (value === 3) {\n return 'Two-chip color area sensor';\n } else if (value === 4) {\n return 'Three-chip color area sensor';\n } else if (value === 5) {\n return 'Color sequential area sensor';\n } else if (value === 7) {\n return 'Trilinear sensor';\n } else if (value === 8) {\n return 'Color sequential linear sensor';\n }\n return 'Unknown';\n }\n },\n 0xa300: {\n 'name': 'FileSource',\n 'description': (value) => {\n if (value === 3) {\n return 'DSC';\n }\n return 'Unknown';\n }\n },\n 0xa301: {\n 'name': 'SceneType',\n 'description': (value) => {\n if (value === 1) {\n return 'A directly photographed image';\n }\n return 'Unknown';\n }\n },\n 0xa302: {\n 'name': 'CFAPattern',\n 'description': () => '[Raw CFA pattern table data]'\n },\n 0xa401: {\n 'name': 'CustomRendered',\n 'description': TagNamesCommon.CustomRendered\n },\n 0xa402: {\n 'name': 'ExposureMode',\n 'description': TagNamesCommon.ExposureMode\n },\n 0xa403: {\n 'name': 'WhiteBalance',\n 'description': TagNamesCommon.WhiteBalance\n },\n 0xa404: {\n 'name': 'DigitalZoomRatio',\n 'description': (value) => {\n if (value[0] === 0) {\n return 'Digital zoom was not used';\n }\n return '' + (value[0] / value[1]);\n }\n },\n 0xa405: {\n 'name': 'FocalLengthIn35mmFilm',\n 'description': (value) => {\n if (value === 0) {\n return 'Unknown';\n }\n return value;\n }\n },\n 0xa406: {\n 'name': 'SceneCaptureType',\n 'description': TagNamesCommon.SceneCaptureType\n },\n 0xa407: {\n 'name': 'GainControl',\n 'description': (value) => {\n if (value === 0) {\n return 'None';\n } else if (value === 1) {\n return 'Low gain up';\n } else if (value === 2) {\n return 'High gain up';\n } else if (value === 3) {\n return 'Low gain down';\n } else if (value === 4) {\n return 'High gain down';\n }\n return 'Unknown';\n }\n },\n 0xa408: {\n 'name': 'Contrast',\n 'description': TagNamesCommon.Contrast\n },\n 0xa409: {\n 'name': 'Saturation',\n 'description': TagNamesCommon.Saturation\n },\n 0xa40a: {\n 'name': 'Sharpness',\n 'description': TagNamesCommon.Sharpness\n },\n 0xa40b: {\n 'name': 'DeviceSettingDescription',\n 'description': () => '[Raw device settings table data]'\n },\n 0xa40c: {\n 'name': 'SubjectDistanceRange',\n 'description': (value) => {\n if (value === 1) {\n return 'Macro';\n } else if (value === 2) {\n return 'Close view';\n } else if (value === 3) {\n return 'Distant view';\n }\n return 'Unknown';\n }\n },\n 0xa420: 'ImageUniqueID',\n 0xa430: 'CameraOwnerName',\n 0xa431: 'BodySerialNumber',\n 0xa432: {\n 'name': 'LensSpecification',\n 'description': (value) => {\n const focalLengths = `${value[0][0] / value[0][1]}-${value[1][0] / value[1][1]} mm`;\n if (value[3][1] === 0) {\n return `${focalLengths} f/?`;\n }\n return `${focalLengths} f/${1 / ((value[2][1] / value[2][1]) / (value[3][0] / value[3][1]))}`;\n }\n },\n 0xa433: 'LensMake',\n 0xa434: 'LensModel',\n 0xa435: 'LensSerialNumber',\n 0xa460: {\n name: 'CompositeImage',\n description: (value) => ({\n 1: 'Not a Composite Image',\n 2: 'General Composite Image',\n 3: 'Composite Image Captured While Shooting',\n })[value] || 'Unknown'\n },\n 0xa461: 'SourceImageNumberOfCompositeImage',\n 0xa462: 'SourceExposureTimesOfCompositeImage',\n 0xa500: 'Gamma',\n 0xea1c: 'Padding',\n 0xea1d: 'OffsetSchema',\n 0xfde8: 'OwnerName',\n 0xfde9: 'SerialNumber',\n 0xfdea: 'Lens',\n 0xfe4c: 'RawFile',\n 0xfe4d: 'Converter',\n 0xfe4e: 'WhiteBalance',\n 0xfe51: 'Exposure',\n 0xfe52: 'Shadows',\n 0xfe53: 'Brightness',\n 0xfe54: 'Contrast',\n 0xfe55: 'Saturation',\n 0xfe56: 'Sharpness',\n 0xfe57: 'Smoothness',\n 0xfe58: 'MoireFilter'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport TagNames, {IFD_TYPE_0TH, IFD_TYPE_1ST, IFD_TYPE_EXIF, IFD_TYPE_GPS, IFD_TYPE_INTEROPERABILITY, IFD_TYPE_MPF} from './tag-names.js';\nimport {deferInit, getBase64Image} from './utils.js';\n\nconst EXIF_IFD_POINTER_KEY = 'Exif IFD Pointer';\nconst GPS_INFO_IFD_POINTER_KEY = 'GPS Info IFD Pointer';\nconst INTEROPERABILITY_IFD_POINTER_KEY = 'Interoperability IFD Pointer';\n\nconst getTagValueAt = {\n 1: Types.getByteAt,\n 2: Types.getAsciiAt,\n 3: Types.getShortAt,\n 4: Types.getLongAt,\n 5: Types.getRationalAt,\n 7: Types.getUndefinedAt,\n 9: Types.getSlongAt,\n 10: Types.getSrationalAt,\n 13: Types.getIfdPointerAt\n};\n\nexport default {\n read,\n readMpf\n};\n\nfunction read(dataView, tiffHeaderOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n\n return tags;\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n return readIfd(dataView, IFD_TYPE_0TH, tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder, includeUnknown);\n}\n\nfunction get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_EXIF, tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[GPS_INFO_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_GPS, tiffHeaderOffset, tiffHeaderOffset + tags[GPS_INFO_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_INTEROPERABILITY, tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readMpf(dataView, dataOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, dataOffset);\n const tags = readIfd(dataView, IFD_TYPE_MPF, dataOffset, get0thIfdOffset(dataView, dataOffset, byteOrder), byteOrder, includeUnknown);\n return addMpfImages(dataView, dataOffset, tags, byteOrder);\n}\n\nfunction addMpfImages(dataView, dataOffset, tags, byteOrder) {\n const ENTRY_SIZE = 16;\n\n if (!tags['MPEntry']) {\n return tags;\n }\n\n const images = [];\n for (let i = 0; i < Math.ceil(tags['MPEntry'].value.length / ENTRY_SIZE); i++) {\n images[i] = {};\n\n const attributes = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageFlags'] = getImageFlags(attributes);\n images[i]['ImageFormat'] = getImageFormat(attributes);\n images[i]['ImageType'] = getImageType(attributes);\n\n const imageSize = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 4, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageSize'] = {\n value: imageSize,\n description: '' + imageSize\n };\n\n const imageOffset = isFirstIndividualImage(i) ? 0 : getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 8, Types.getTypeSize('LONG'), byteOrder) + dataOffset;\n images[i]['ImageOffset'] = {\n value: imageOffset,\n description: '' + imageOffset\n };\n\n const dependentImage1EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 12, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage1EntryNumber'] = {\n value: dependentImage1EntryNumber,\n description: '' + dependentImage1EntryNumber\n };\n\n const dependentImage2EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 14, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage2EntryNumber'] = {\n value: dependentImage2EntryNumber,\n description: '' + dependentImage2EntryNumber\n };\n\n images[i].image = dataView.buffer.slice(imageOffset, imageOffset + imageSize);\n deferInit(images[i], 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n tags['Images'] = images;\n\n return tags;\n}\n\nfunction getImageNumberValue(entries, offset, size, byteOrder) {\n if (byteOrder === ByteOrder.LITTLE_ENDIAN) {\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * i);\n }\n return value;\n }\n\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * (size - 1 - i));\n }\n return value;\n}\n\nfunction getImageFlags(attributes) {\n const flags = [\n (attributes >> 31) & 0x1,\n (attributes >> 30) & 0x1,\n (attributes >> 29) & 0x1\n ];\n\n const flagsDescription = [];\n\n if (flags[0]) {\n flagsDescription.push('Dependent Parent Image');\n }\n if (flags[1]) {\n flagsDescription.push('Dependent Child Image');\n }\n if (flags[2]) {\n flagsDescription.push('Representative Image');\n }\n\n return {\n value: flags,\n description: flagsDescription.join(', ') || 'None'\n };\n}\n\nfunction getImageFormat(attributes) {\n const imageFormat = attributes >> 24 & 0x7;\n return {\n value: imageFormat,\n description: imageFormat === 0 ? 'JPEG' : 'Unknown'\n };\n}\n\nfunction getImageType(attributes) {\n const type = attributes & 0xffffff;\n const descriptions = {\n 0x30000: 'Baseline MP Primary Image',\n 0x10001: 'Large Thumbnail (VGA equivalent)',\n 0x10002: 'Large Thumbnail (Full HD equivalent)',\n 0x20001: 'Multi-Frame Image (Panorama)',\n 0x20002: 'Multi-Frame Image (Disparity)',\n 0x20003: 'Multi-Frame Image (Multi-Angle)',\n 0x0: 'Undefined',\n };\n\n return {\n value: type,\n description: descriptions[type] || 'Unknown'\n };\n}\n\nfunction isFirstIndividualImage(i) {\n return i === 0;\n}\n\nfunction readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const FIELD_COUNT_SIZE = Types.getTypeSize('SHORT');\n const FIELD_SIZE = 12;\n\n const tags = {};\n const numberOfFields = getNumberOfFields(dataView, offset, byteOrder);\n\n offset += FIELD_COUNT_SIZE;\n for (let fieldIndex = 0; fieldIndex < numberOfFields; fieldIndex++) {\n if (offset + FIELD_SIZE > dataView.byteLength) {\n break;\n }\n\n const tag = readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown);\n if (tag !== undefined) {\n tags[tag.name] = {\n 'id': tag.id,\n 'value': tag.value,\n 'description': tag.description\n };\n }\n\n offset += FIELD_SIZE;\n }\n\n if (Constants.USE_THUMBNAIL && (offset < dataView.byteLength - Types.getTypeSize('LONG'))) {\n const nextIfdOffset = Types.getLongAt(dataView, offset, byteOrder);\n if (nextIfdOffset !== 0 && ifdType === IFD_TYPE_0TH) {\n tags['Thumbnail'] = readIfd(dataView, IFD_TYPE_1ST, tiffHeaderOffset, tiffHeaderOffset + nextIfdOffset, byteOrder, true);\n }\n }\n\n return tags;\n}\n\nfunction getNumberOfFields(dataView, offset, byteOrder) {\n if (offset + Types.getTypeSize('SHORT') <= dataView.byteLength) {\n return Types.getShortAt(dataView, offset, byteOrder);\n }\n return 0;\n}\n\nfunction readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const TAG_CODE_IPTC_NAA = 0x83bb;\n const TAG_TYPE_OFFSET = Types.getTypeSize('SHORT');\n const TAG_COUNT_OFFSET = TAG_TYPE_OFFSET + Types.getTypeSize('SHORT');\n const TAG_VALUE_OFFSET = TAG_COUNT_OFFSET + Types.getTypeSize('LONG');\n\n const tagCode = Types.getShortAt(dataView, offset, byteOrder);\n const tagType = Types.getShortAt(dataView, offset + TAG_TYPE_OFFSET, byteOrder);\n const tagCount = Types.getLongAt(dataView, offset + TAG_COUNT_OFFSET, byteOrder);\n let tagValue;\n\n if (Types.typeSizes[tagType] === undefined || (!includeUnknown && TagNames[ifdType][tagCode] === undefined)) {\n return undefined;\n }\n\n if (tagValueFitsInOffsetSlot(tagType, tagCount)) {\n tagValue = getTagValue(dataView, offset + TAG_VALUE_OFFSET, tagType, tagCount, byteOrder);\n } else {\n const tagValueOffset = Types.getLongAt(dataView, offset + TAG_VALUE_OFFSET, byteOrder);\n if (tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount)) {\n const forceByteType = tagCode === TAG_CODE_IPTC_NAA;\n tagValue = getTagValue(dataView, tiffHeaderOffset + tagValueOffset, tagType, tagCount, byteOrder, forceByteType);\n } else {\n tagValue = '';\n }\n }\n\n if (tagType === Types.tagTypes['ASCII']) {\n tagValue = splitNullSeparatedAsciiString(tagValue);\n tagValue = decodeAsciiValue(tagValue);\n }\n\n let tagName = `undefined-${tagCode}`;\n let tagDescription = tagValue;\n\n if (TagNames[ifdType][tagCode] !== undefined) {\n if ((TagNames[ifdType][tagCode]['name'] !== undefined) && (TagNames[ifdType][tagCode]['description'] !== undefined)) {\n tagName = TagNames[ifdType][tagCode]['name'];\n try {\n tagDescription = TagNames[ifdType][tagCode]['description'](tagValue);\n } catch (error) {\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n } else if ((tagType === Types.tagTypes['RATIONAL']) || (tagType === Types.tagTypes['SRATIONAL'])) {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = '' + (tagValue[0] / tagValue[1]);\n } else {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n }\n\n return {\n id: tagCode,\n name: tagName,\n value: tagValue,\n description: tagDescription\n };\n}\n\nfunction tagValueFitsInOffsetSlot(tagType, tagCount) {\n return Types.typeSizes[tagType] * tagCount <= Types.getTypeSize('LONG');\n}\n\nfunction getTagValue(dataView, offset, type, count, byteOrder, forceByteType = false) {\n let value = [];\n\n if (forceByteType) {\n count = count * Types.typeSizes[type];\n type = Types.tagTypes['BYTE'];\n }\n for (let valueIndex = 0; valueIndex < count; valueIndex++) {\n value.push(getTagValueAt[type](dataView, offset, byteOrder));\n offset += Types.typeSizes[type];\n }\n\n if (type === Types.tagTypes['ASCII']) {\n value = Types.getAsciiValue(value);\n } else if (value.length === 1) {\n value = value[0];\n }\n\n return value;\n}\n\nfunction tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount) {\n return tiffHeaderOffset + tagValueOffset + Types.typeSizes[tagType] * tagCount <= dataView.byteLength;\n}\n\nfunction splitNullSeparatedAsciiString(string) {\n const tagValue = [];\n let i = 0;\n\n for (let j = 0; j < string.length; j++) {\n if (string[j] === '\\x00') {\n i++;\n continue;\n }\n if (tagValue[i] === undefined) {\n tagValue[i] = '';\n }\n tagValue[i] += string[j];\n }\n\n return tagValue;\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return asciiValue.map((value) => decodeURIComponent(escape(value)));\n } catch (error) {\n return asciiValue;\n }\n}\n\nfunction getDescriptionFromTagValue(tagValue) {\n if (tagValue instanceof Array) {\n return tagValue.join(', ');\n }\n return tagValue;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n const length = getLength(dataView, fileDataOffset);\n const numberOfColorComponents = getNumberOfColorComponents(dataView, fileDataOffset, length);\n return {\n 'Bits Per Sample': getDataPrecision(dataView, fileDataOffset, length),\n 'Image Height': getImageHeight(dataView, fileDataOffset, length),\n 'Image Width': getImageWidth(dataView, fileDataOffset, length),\n 'Color Components': numberOfColorComponents,\n 'Subsampling': numberOfColorComponents && getSubsampling(dataView, fileDataOffset, numberOfColorComponents.value, length)\n };\n}\n\nfunction getLength(dataView, fileDataOffset) {\n return Types.getShortAt(dataView, fileDataOffset);\n}\n\nfunction getDataPrecision(dataView, fileDataOffset, length) {\n const OFFSET = 2;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset, length) {\n const OFFSET = 3;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset, length) {\n const OFFSET = 5;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getNumberOfColorComponents(dataView, fileDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getSubsampling(dataView, fileDataOffset, numberOfColorComponents, length) {\n const OFFSET = 8;\n const SIZE = 3 * numberOfColorComponents;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const components = [];\n\n for (let i = 0; i < numberOfColorComponents; i++) {\n const componentOffset = fileDataOffset + OFFSET + i * 3;\n components.push([\n Types.getByteAt(dataView, componentOffset),\n Types.getByteAt(dataView, componentOffset + 1),\n Types.getByteAt(dataView, componentOffset + 2)\n ]);\n }\n\n return {\n value: components,\n description: components.length > 1 ? getComponentIds(components) + getSamplingType(components) : ''\n };\n}\n\nfunction getComponentIds(components) {\n const ids = {\n 0x01: 'Y',\n 0x02: 'Cb',\n 0x03: 'Cr',\n 0x04: 'I',\n 0x05: 'Q',\n };\n\n return components.map((compontent) => ids[compontent[0]]).join('');\n}\n\nfunction getSamplingType(components) {\n const types = {\n 0x11: '4:4:4 (1 1)',\n 0x12: '4:4:0 (1 2)',\n 0x14: '4:4:1 (1 4)',\n 0x21: '4:2:2 (2 1)',\n 0x22: '4:2:0 (2 2)',\n 0x24: '4:2:1 (2 4)',\n 0x41: '4:1:1 (4 1)',\n 0x42: '4:1:0 (4 2)'\n };\n\n if (components.length === 0 || components[0][1] === undefined || types[components[0][1]] === undefined) {\n return '';\n }\n\n return types[components[0][1]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, jfifDataOffset) {\n const length = getLength(dataView, jfifDataOffset);\n const thumbnailWidth = getThumbnailWidth(dataView, jfifDataOffset, length);\n const thumbnailHeight = getThumbnailHeight(dataView, jfifDataOffset, length);\n const tags = {\n 'JFIF Version': getVersion(dataView, jfifDataOffset, length),\n 'Resolution Unit': getResolutionUnit(dataView, jfifDataOffset, length),\n 'XResolution': getXResolution(dataView, jfifDataOffset, length),\n 'YResolution': getYResolution(dataView, jfifDataOffset, length),\n 'JFIF Thumbnail Width': thumbnailWidth,\n 'JFIF Thumbnail Height': thumbnailHeight\n };\n\n if (thumbnailWidth !== undefined && thumbnailHeight !== undefined) {\n const thumbnail = getThumbnail(dataView, jfifDataOffset, 3 * thumbnailWidth.value * thumbnailHeight.value, length);\n if (thumbnail) {\n tags['JFIF Thumbnail'] = thumbnail;\n }\n }\n\n for (const tagName in tags) {\n if (tags[tagName] === undefined) {\n delete tags[tagName];\n }\n }\n\n return tags;\n}\n\nfunction getLength(dataView, jfifDataOffset) {\n return Types.getShortAt(dataView, jfifDataOffset);\n}\n\nfunction getVersion(dataView, jfifDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const majorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n const minorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET + 1);\n return {\n value: majorVersion * 0x100 + minorVersion,\n description: majorVersion + '.' + minorVersion\n };\n}\n\nfunction getResolutionUnit(dataView, jfifDataOffset, length) {\n const OFFSET = 9;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: getResolutionUnitDescription(value)\n };\n}\n\nfunction getResolutionUnitDescription(value) {\n if (value === 0) {\n return 'None';\n }\n if (value === 1) {\n return 'inches';\n }\n if (value === 2) {\n return 'cm';\n }\n return 'Unknown';\n}\n\nfunction getXResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 10;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getYResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 12;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getThumbnailWidth(dataView, jfifDataOffset, length) {\n const OFFSET = 14;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnailHeight(dataView, jfifDataOffset, length) {\n const OFFSET = 15;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnail(dataView, jfifDataOffset, thumbnailLength, length) {\n const OFFSET = 16;\n\n if (thumbnailLength === 0 || OFFSET + thumbnailLength > length) {\n return undefined;\n }\n\n const value = dataView.buffer.slice(jfifDataOffset + OFFSET, jfifDataOffset + OFFSET + thumbnailLength);\n return {\n value,\n description: '<24-bit RGB pixel data>'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 'iptc': {\n 0x0100: {\n 'name': 'Model Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0105: {\n 'name': 'Destination',\n 'repeatable': true\n },\n 0x0114: {\n 'name': 'File Format',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0116: {\n 'name': 'File Format Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x011e: 'Service Identifier',\n 0x0128: 'Envelope Number',\n 0x0132: 'Product ID',\n 0x013c: 'Envelope Priority',\n 0x0146: {\n 'name': 'Date Sent',\n 'description': getCreationDate\n },\n 0x0150: {\n 'name': 'Time Sent',\n 'description': getCreationTime\n },\n 0x015a: {\n 'name': 'Coded Character Set',\n 'description': getEncodingName,\n 'encoding_name': getEncodingName,\n },\n 0x0164: 'UNO',\n 0x0178: {\n 'name': 'ARM Identifier',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x017a: {\n 'name': 'ARM Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0200: {\n 'name': 'Record Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0203: 'Object Type Reference',\n 0x0204: 'Object Attribute Reference',\n 0x0205: 'Object Name',\n 0x0207: 'Edit Status',\n 0x0208: {\n 'name': 'Editorial Update',\n 'description': (value) => {\n if (getStringValue(value) === '01') {\n return 'Additional Language';\n }\n return 'Unknown';\n }\n },\n 0x020a: 'Urgency',\n 0x020c: {\n 'name': 'Subject Reference',\n 'repeatable': true,\n 'description': (value) => {\n const parts = getStringValue(value).split(':');\n return parts[2] + (parts[3] ? '/' + parts[3] : '') + (parts[4] ? '/' + parts[4] : '');\n }\n },\n 0x020f: 'Category',\n 0x0214: {\n 'name': 'Supplemental Category',\n 'repeatable': true\n },\n 0x0216: 'Fixture Identifier',\n 0x0219: {\n 'name': 'Keywords',\n 'repeatable': true\n },\n 0x021a: {\n 'name': 'Content Location Code',\n 'repeatable': true\n },\n 0x021b: {\n 'name': 'Content Location Name',\n 'repeatable': true\n },\n 0x021e: 'Release Date',\n 0x0223: 'Release Time',\n 0x0225: 'Expiration Date',\n 0x0226: 'Expiration Time',\n 0x0228: 'Special Instructions',\n 0x022a: {\n 'name': 'Action Advised',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === '01') {\n return 'Object Kill';\n } else if (string === '02') {\n return 'Object Replace';\n } else if (string === '03') {\n return 'Object Append';\n } else if (string === '04') {\n return 'Object Reference';\n }\n return 'Unknown';\n }\n },\n 0x022d: {\n 'name': 'Reference Service',\n 'repeatable': true\n },\n 0x022f: {\n 'name': 'Reference Date',\n 'repeatable': true\n },\n 0x0232: {\n 'name': 'Reference Number',\n 'repeatable': true\n },\n 0x0237: {\n 'name': 'Date Created',\n 'description': getCreationDate\n },\n 0x023c: {\n 'name': 'Time Created',\n 'description': getCreationTime\n },\n 0x023e: {\n 'name': 'Digital Creation Date',\n 'description': getCreationDate\n },\n 0x023f: {\n 'name': 'Digital Creation Time',\n 'description': getCreationTime\n },\n 0x0241: 'Originating Program',\n 0x0246: 'Program Version',\n 0x024b: {\n 'name': 'Object Cycle',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'a') {\n return 'morning';\n } else if (string === 'p') {\n return 'evening';\n } else if (string === 'b') {\n return 'both';\n }\n return 'Unknown';\n }\n },\n 0x0250: {\n 'name': 'By-line',\n 'repeatable': true\n },\n 0x0255: {\n 'name': 'By-line Title',\n 'repeatable': true\n },\n 0x025a: 'City',\n 0x025c: 'Sub-location',\n 0x025f: 'Province/State',\n 0x0264: 'Country/Primary Location Code',\n 0x0265: 'Country/Primary Location Name',\n 0x0267: 'Original Transmission Reference',\n 0x0269: 'Headline',\n 0x026e: 'Credit',\n 0x0273: 'Source',\n 0x0274: 'Copyright Notice',\n 0x0276: {\n 'name': 'Contact',\n 'repeatable': true\n },\n 0x0278: 'Caption/Abstract',\n 0x027a: {\n 'name': 'Writer/Editor',\n 'repeatable': true\n },\n 0x027d: {\n 'name': 'Rasterized Caption',\n 'description': (value) => value\n },\n 0x0282: 'Image Type',\n 0x0283: {\n 'name': 'Image Orientation',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'P') {\n return 'Portrait';\n } else if (string === 'L') {\n return 'Landscape';\n } else if (string === 'S') {\n return 'Square';\n }\n return 'Unknown';\n }\n },\n 0x0287: 'Language Identifier',\n 0x0296: {\n 'name': 'Audio Type',\n 'description': (value) => {\n const stringValue = getStringValue(value);\n const character0 = stringValue.charAt(0);\n const character1 = stringValue.charAt(1);\n let description = '';\n\n if (character0 === '1') {\n description += 'Mono';\n } else if (character0 === '2') {\n description += 'Stereo';\n }\n\n if (character1 === 'A') {\n description += ', actuality';\n } else if (character1 === 'C') {\n description += ', question and answer session';\n } else if (character1 === 'M') {\n description += ', music, transmitted by itself';\n } else if (character1 === 'Q') {\n description += ', response to a question';\n } else if (character1 === 'R') {\n description += ', raw sound';\n } else if (character1 === 'S') {\n description += ', scener';\n } else if (character1 === 'V') {\n description += ', voicer';\n } else if (character1 === 'W') {\n description += ', wrap';\n }\n\n if (description !== '') {\n return description;\n }\n return stringValue;\n }\n },\n 0x0297: {\n 'name': 'Audio Sampling Rate',\n 'description': (value) => parseInt(getStringValue(value), 10) + ' Hz'\n },\n 0x0298: {\n 'name': 'Audio Sampling Resolution',\n 'description': (value) => {\n const bits = parseInt(getStringValue(value), 10);\n return bits + (bits === 1 ? ' bit' : ' bits');\n }\n },\n 0x0299: {\n 'name': 'Audio Duration',\n 'description': (value) => {\n const duration = getStringValue(value);\n if (duration.length >= 6) {\n return duration.substr(0, 2) + ':' + duration.substr(2, 2) + ':' + duration.substr(4, 2);\n }\n return duration;\n }\n },\n 0x029a: 'Audio Outcue',\n 0x02ba: 'Short Document ID',\n 0x02bb: 'Unique Document ID',\n 0x02bc: 'Owner ID',\n 0x02c8: {\n 'name': (value) => {\n if (value.length === 2) {\n return 'ObjectData Preview File Format';\n }\n return 'Record 2 destination';\n },\n 'description': (value) => {\n if (value.length === 2) {\n const intValue = (value[0] << 8) + value[1];\n if (intValue === 0) {\n return 'No ObjectData';\n } else if (intValue === 1) {\n return 'IPTC-NAA Digital Newsphoto Parameter Record';\n } else if (intValue === 2) {\n return 'IPTC7901 Recommended Message Format';\n } else if (intValue === 3) {\n return 'Tagged Image File Format (Adobe/Aldus Image data)';\n } else if (intValue === 4) {\n return 'Illustrator (Adobe Graphics data)';\n } else if (intValue === 5) {\n return 'AppleSingle (Apple Computer Inc)';\n } else if (intValue === 6) {\n return 'NAA 89-3 (ANPA 1312)';\n } else if (intValue === 7) {\n return 'MacBinary II';\n } else if (intValue === 8) {\n return 'IPTC Unstructured Character Oriented File Format (UCOFF)';\n } else if (intValue === 9) {\n return 'United Press International ANPA 1312 variant';\n } else if (intValue === 10) {\n return 'United Press International Down-Load Message';\n } else if (intValue === 11) {\n return 'JPEG File Interchange (JFIF)';\n } else if (intValue === 12) {\n return 'Photo-CD Image-Pac (Eastman Kodak)';\n } else if (intValue === 13) {\n return 'Microsoft Bit Mapped Graphics File [*.BMP]';\n } else if (intValue === 14) {\n return 'Digital Audio File [*.WAV] (Microsoft & Creative Labs)';\n } else if (intValue === 15) {\n return 'Audio plus Moving Video [*.AVI] (Microsoft)';\n } else if (intValue === 16) {\n return 'PC DOS/Windows Executable Files [*.COM][*.EXE]';\n } else if (intValue === 17) {\n return 'Compressed Binary File [*.ZIP] (PKWare Inc)';\n } else if (intValue === 18) {\n return 'Audio Interchange File Format AIFF (Apple Computer Inc)';\n } else if (intValue === 19) {\n return 'RIFF Wave (Microsoft Corporation)';\n } else if (intValue === 20) {\n return 'Freehand (Macromedia/Aldus)';\n } else if (intValue === 21) {\n return 'Hypertext Markup Language \"HTML\" (The Internet Society)';\n } else if (intValue === 22) {\n return 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC';\n } else if (intValue === 23) {\n return 'MPEG 2 Audio Layer 3, ISO/IEC';\n } else if (intValue === 24) {\n return 'Portable Document File (*.PDF) Adobe';\n } else if (intValue === 25) {\n return 'News Industry Text Format (NITF)';\n } else if (intValue === 26) {\n return 'Tape Archive (*.TAR)';\n } else if (intValue === 27) {\n return 'Tidningarnas Telegrambyrå NITF version (TTNITF DTD)';\n } else if (intValue === 28) {\n return 'Ritzaus Bureau NITF version (RBNITF DTD)';\n } else if (intValue === 29) {\n return 'Corel Draw [*.CDR]';\n }\n return `Unknown format ${intValue}`;\n }\n return getStringValue(value);\n }\n },\n 0x02c9: {\n 'name': 'ObjectData Preview File Format Version',\n 'description': (value, tags) => {\n // Format ID, Version ID, Version Description\n const formatVersions = {\n '00': {'00': '1'},\n '01': {'01': '1', '02': '2', '03': '3', '04': '4'},\n '02': {'04': '4'},\n '03': {'01': '5.0', '02': '6.0'},\n '04': {'01': '1.40'},\n '05': {'01': '2'},\n '06': {'01': '1'},\n '11': {'01': '1.02'},\n '20': {'01': '3.1', '02': '4.0', '03': '5.0', '04': '5.5'},\n '21': {'02': '2.0'}\n };\n const stringValue = getStringValue(value);\n\n if (tags['ObjectData Preview File Format']) {\n const objectDataPreviewFileFormat = getStringValue(tags['ObjectData Preview File Format'].value);\n if (formatVersions[objectDataPreviewFileFormat]\n && formatVersions[objectDataPreviewFileFormat][stringValue]) {\n return formatVersions[objectDataPreviewFileFormat][stringValue];\n }\n }\n\n return stringValue;\n }\n },\n 0x02ca: 'ObjectData Preview Data',\n 0x070a: {\n 'name': 'Size Mode',\n 'description': (value) => {\n return (value[0]).toString();\n }\n },\n 0x0714: {\n 'name': 'Max Subfile Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075a: {\n 'name': 'ObjectData Size Announced',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075f: {\n 'name': 'Maximum ObjectData Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n }\n }\n};\n\nfunction getCreationDate(value) {\n const date = getStringValue(value);\n\n if (date.length >= 8) {\n return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);\n }\n\n return date;\n}\n\nfunction getCreationTime(value) {\n const time = getStringValue(value);\n let parsedTime = time;\n\n if (time.length >= 6) {\n parsedTime = time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);\n if (time.length === 11) {\n parsedTime += time.substr(6, 1) + time.substr(7, 2) + ':' + time.substr(9, 2);\n }\n }\n\n return parsedTime;\n}\n\nfunction getEncodingName(value) {\n const string = getStringValue(value);\n if (string === '\\x1b%G') {\n return 'UTF-8';\n } else if (string === '\\x1b%5') {\n return 'Windows-1252';\n } else if (string === '\\x1b%/G') {\n return 'UTF-8 Level 1';\n } else if (string === '\\x1b%/H') {\n return 'UTF-8 Level 2';\n } else if (string === '\\x1b%/I') {\n return 'UTF-8 Level 3';\n } else if (string === '\\x1B/A') {\n return 'ISO-8859-1';\n } else if (string === '\\x1B/B') {\n return 'ISO-8859-2';\n } else if (string === '\\x1B/C') {\n return 'ISO-8859-3';\n } else if (string === '\\x1B/D') {\n return 'ISO-8859-4';\n } else if (string === '\\x1B/@') {\n return 'ISO-8859-5';\n } else if (string === '\\x1B/G') {\n return 'ISO-8859-6';\n } else if (string === '\\x1B/F') {\n return 'ISO-8859-7';\n } else if (string === '\\x1B/H') {\n return 'ISO-8859-8';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof TextDecoder !== 'undefined') {\n return TextDecoder;\n }\n\n return undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TextDecoder from './text-decoder.js';\n\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n decode,\n TAG_HEADER_SIZE\n};\n\nfunction decode(encoding, tagValue) {\n const Decoder = TextDecoder.get();\n if ((typeof Decoder !== 'undefined') && (encoding !== undefined)) {\n try {\n return new Decoder(encoding).decode(Uint8Array.from(tagValue));\n } catch (error) {\n // Pass through and fall back to ASCII decoding.\n }\n }\n\n const stringValue = tagValue.map((charCode) => String.fromCharCode(charCode)).join('');\n return decodeAsciiValue(stringValue);\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return decodeURIComponent(escape(asciiValue));\n } catch (error) {\n return asciiValue;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport IptcTagNames from './iptc-tag-names.js';\nimport TagDecoder from './tag-decoder.js';\n\nconst BYTES_8BIM = 0x3842494d;\nconst BYTES_8BIM_SIZE = 4;\nconst RESOURCE_BLOCK_HEADER_SIZE = BYTES_8BIM_SIZE + 8;\nconst NAA_RESOURCE_BLOCK_TYPE = 0x0404;\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n read\n};\n\nfunction read(dataView, dataOffset, includeUnknown) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0, includeUnknown);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset, includeUnknown);\n } catch (error) {\n return {};\n }\n}\n\nfunction getNaaResourceBlock(dataView, dataOffset) {\n while (dataOffset + RESOURCE_BLOCK_HEADER_SIZE <= dataView.byteLength) {\n const resourceBlock = getResourceBlock(dataView, dataOffset);\n if (isNaaResourceBlock(resourceBlock)) {\n return {naaBlock: resourceBlock, dataOffset: dataOffset + RESOURCE_BLOCK_HEADER_SIZE};\n }\n dataOffset += RESOURCE_BLOCK_HEADER_SIZE + resourceBlock.size + getBlockPadding(resourceBlock);\n }\n throw new Error('No IPTC NAA resource block.');\n}\n\nfunction getResourceBlock(dataView, dataOffset) {\n const RESOURCE_BLOCK_SIZE_OFFSET = 10;\n\n if (dataView.getUint32(dataOffset, false) !== BYTES_8BIM) {\n throw new Error('Not an IPTC resource block.');\n }\n\n return {\n type: dataView.getUint16(dataOffset + BYTES_8BIM_SIZE),\n size: dataView.getUint16(dataOffset + RESOURCE_BLOCK_SIZE_OFFSET)\n };\n}\n\nfunction isNaaResourceBlock(resourceBlock) {\n return resourceBlock.type === NAA_RESOURCE_BLOCK_TYPE;\n}\n\nfunction getBlockPadding(resourceBlock) {\n if (resourceBlock.size % 2 !== 0) {\n return 1;\n }\n return 0;\n}\n\nfunction parseTags(dataView, naaBlock, dataOffset, includeUnknown) {\n const tags = {};\n let encoding = undefined;\n\n const endOfBlockOffset = dataOffset + naaBlock['size'];\n\n while ((dataOffset < endOfBlockOffset) && (dataOffset < dataView.byteLength)) {\n const {tag, tagSize} = readTag(dataView, dataOffset, tags, encoding, includeUnknown);\n\n if (tag === null) {\n break;\n }\n\n if (tag) {\n if ('encoding' in tag) {\n encoding = tag.encoding;\n }\n\n if ((tags[tag.name] === undefined) || (tag['repeatable'] === undefined)) {\n tags[tag.name] = {\n id: tag.id,\n value: tag.value,\n description: tag.description\n };\n } else {\n if (!(tags[tag.name] instanceof Array)) {\n tags[tag.name] = [{\n id: tags[tag.name].id,\n value: tags[tag.name].value,\n description: tags[tag.name].description\n }];\n }\n tags[tag.name].push({\n id: tag.id,\n value: tag.value,\n description: tag.description\n });\n }\n }\n\n dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding, includeUnknown) {\n const TAG_CODE_OFFSET = 1;\n const TAG_SIZE_OFFSET = 3;\n\n if (leadByteIsMissing(dataView, dataOffset)) {\n return {tag: null, tagSize: 0};\n }\n\n const tagCode = dataView.getUint16(dataOffset + TAG_CODE_OFFSET);\n const tagSize = dataView.getUint16(dataOffset + TAG_SIZE_OFFSET);\n\n if (!includeUnknown && !IptcTagNames['iptc'][tagCode]) {\n return {tag: undefined, tagSize};\n }\n\n const tagValue = getTagValue(dataView, dataOffset + TAG_HEADER_SIZE, tagSize);\n\n const tag = {\n id: tagCode,\n name: getTagName(IptcTagNames['iptc'][tagCode], tagCode, tagValue),\n value: tagValue,\n description: getTagDescription(IptcTagNames['iptc'][tagCode], tagValue, tags, encoding)\n };\n if (tagIsRepeatable(tagCode)) {\n tag['repeatable'] = true;\n }\n if (tagContainsEncoding(tagCode)) {\n tag['encoding'] = IptcTagNames['iptc'][tagCode]['encoding_name'](tagValue);\n }\n\n return {tag, tagSize};\n}\n\nfunction leadByteIsMissing(dataView, dataOffset) {\n const TAG_LEAD_BYTE = 0x1c;\n return dataView.getUint8(dataOffset) !== TAG_LEAD_BYTE;\n}\n\nfunction getTagValue(dataView, offset, size) {\n const value = [];\n\n for (let valueIndex = 0; valueIndex < size; valueIndex++) {\n value.push(dataView.getUint8(offset + valueIndex));\n }\n\n return value;\n}\n\nfunction getTagName(tag, tagCode, tagValue) {\n if (!tag) {\n return `undefined-${tagCode}`;\n }\n if (tagIsName(tag)) {\n return tag;\n }\n if (hasDynamicName(tag)) {\n return tag['name'](tagValue);\n }\n return tag['name'];\n}\n\nfunction tagIsName(tag) {\n return typeof tag === 'string';\n}\n\nfunction hasDynamicName(tag) {\n return typeof (tag['name']) === 'function';\n}\n\nfunction getTagDescription(tag, tagValue, tags, encoding) {\n if (hasDescriptionProperty(tag)) {\n try {\n return tag['description'](tagValue, tags);\n } catch (error) {\n // Fall through to next handler.\n }\n }\n if (tagValueIsText(tag, tagValue)) {\n return TagDecoder.decode(encoding, tagValue);\n }\n return tagValue;\n}\n\nfunction tagValueIsText(tag, tagValue) {\n return tag && tagValue instanceof Array;\n}\n\nfunction hasDescriptionProperty(tag) {\n return tag && tag['description'] !== undefined;\n}\n\nfunction tagIsRepeatable(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['repeatable'];\n}\n\nfunction tagContainsEncoding(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['encoding_name'] !== undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 'tiff:Orientation'(value) {\n if (value === '1') {\n return 'Horizontal (normal)';\n }\n if (value === '2') {\n return 'Mirror horizontal';\n }\n if (value === '3') {\n return 'Rotate 180';\n }\n if (value === '4') {\n return 'Mirror vertical';\n }\n if (value === '5') {\n return 'Mirror horizontal and rotate 270 CW';\n }\n if (value === '6') {\n return 'Rotate 90 CW';\n }\n if (value === '7') {\n return 'Mirror horizontal and rotate 90 CW';\n }\n if (value === '8') {\n return 'Rotate 270 CW';\n }\n return value;\n },\n 'tiff:ResolutionUnit': (value) => TagNamesCommon.ResolutionUnit(parseInt(value, 10)),\n 'tiff:XResolution': (value) => fraction(TagNamesCommon.XResolution, value),\n 'tiff:YResolution': (value) => fraction(TagNamesCommon.YResolution, value),\n 'exif:ApertureValue': (value) => fraction(TagNamesCommon.ApertureValue, value),\n 'exif:GPSLatitude': calculateGPSValue,\n 'exif:GPSLongitude': calculateGPSValue,\n 'exif:FNumber': (value) => fraction(TagNamesCommon.FNumber, value),\n 'exif:FocalLength': (value) => fraction(TagNamesCommon.FocalLength, value),\n 'exif:FocalPlaneResolutionUnit': (value) => TagNamesCommon.FocalPlaneResolutionUnit(parseInt(value, 10)),\n 'exif:ColorSpace': (value) => TagNamesCommon.ColorSpace(parseNumber(value)),\n 'exif:ComponentsConfiguration'(value, description) {\n if (/^\\d, \\d, \\d, \\d$/.test(description)) {\n const numbers = description.split(', ').map((number) => number.charCodeAt(0));\n return TagNamesCommon.ComponentsConfiguration(numbers);\n }\n return description;\n },\n 'exif:Contrast': (value) => TagNamesCommon.Contrast(parseInt(value, 10)),\n 'exif:CustomRendered': (value) => TagNamesCommon.CustomRendered(parseInt(value, 10)),\n 'exif:ExposureMode': (value) => TagNamesCommon.ExposureMode(parseInt(value, 10)),\n 'exif:ExposureProgram': (value) => TagNamesCommon.ExposureProgram(parseInt(value, 10)),\n 'exif:ExposureTime'(value) {\n if (isFraction(value)) {\n return TagNamesCommon.ExposureTime(value.split('/').map((number) => parseInt(number, 10)));\n }\n return value;\n },\n 'exif:MeteringMode': (value) => TagNamesCommon.MeteringMode(parseInt(value, 10)),\n 'exif:Saturation': (value) => TagNamesCommon.Saturation(parseInt(value, 10)),\n 'exif:SceneCaptureType': (value) => TagNamesCommon.SceneCaptureType(parseInt(value, 10)),\n 'exif:Sharpness': (value) => TagNamesCommon.Sharpness(parseInt(value, 10)),\n 'exif:ShutterSpeedValue': (value) => fraction(TagNamesCommon.ShutterSpeedValue, value),\n 'exif:WhiteBalance': (value) => TagNamesCommon.WhiteBalance(parseInt(value, 10))\n};\n\nfunction fraction(func, value) {\n if (isFraction(value)) {\n return func(value.split('/'));\n }\n return value;\n}\n\nfunction parseNumber(value) {\n if (value.substring(0, 2) === '0x') {\n return parseInt(value.substring(2), 16);\n }\n return parseInt(value, 10);\n}\n\nfunction isFraction(value) {\n return /^-?\\d+\\/-?\\d+$/.test(value);\n}\n\nfunction calculateGPSValue(value) {\n const [degreesString, minutesString] = value.split(',');\n if ((degreesString !== undefined) && (minutesString !== undefined)) {\n const degrees = parseFloat(degreesString);\n const minutes = parseFloat(minutesString);\n const ref = minutesString.charAt(minutesString.length - 1);\n if ((!Number.isNaN(degrees)) && (!Number.isNaN(minutes))) {\n return '' + (degrees + minutes / 60) + ref;\n }\n }\n return value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView, objectAssign} from './utils.js';\nimport XmpTagNames from './xmp-tag-names.js';\nimport DOMParser from './dom-parser.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunks) {\n const tags = {};\n\n if (typeof dataView === 'string') {\n readTags(tags, dataView);\n return tags;\n }\n\n const [standardXmp, extendedXmp] = extractCompleteChunks(dataView, chunks);\n\n const hasStandardTags = readTags(tags, standardXmp);\n\n if (extendedXmp) {\n const hasExtendedTags = readTags(tags, extendedXmp);\n\n if (!hasStandardTags && !hasExtendedTags) {\n // Some writers are not spec-compliant in that they split an XMP\n // metadata tree over both the standard XMP block and the extended\n // XMP block. If we failed parsing both of the XMPs in the regular\n // way, we try to combine them to see if that works better.\n delete tags._raw;\n readTags(tags, combineChunks(dataView, chunks));\n }\n }\n\n return tags;\n}\n\n// The first chunk is always the regular XMP document. Then there is something\n// called extended XMP. The extended XMP is also a single XMP document but it\n// can be divided into multiple chunks that need to be combined into one.\nfunction extractCompleteChunks(dataView, chunks) {\n if (chunks.length === 0) {\n return [];\n }\n\n const completeChunks = [combineChunks(dataView, chunks.slice(0, 1))];\n if (chunks.length > 1) {\n completeChunks.push(combineChunks(dataView, chunks.slice(1)));\n }\n\n return completeChunks;\n}\n\nfunction combineChunks(dataView, chunks) {\n const totalLength = chunks.reduce((size, chunk) => size + chunk.length, 0);\n const combinedChunks = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const slice = dataView.buffer.slice(chunk.dataOffset, chunk.dataOffset + chunk.length);\n combinedChunks.set(new Uint8Array(slice), offset);\n offset += chunk.length;\n }\n\n return new DataView(combinedChunks.buffer);\n}\n\nfunction readTags(tags, chunkDataView) {\n try {\n const {doc, raw} = getDocument(chunkDataView);\n tags._raw = (tags._raw || '') + raw;\n const rdf = getRDF(doc);\n\n objectAssign(tags, parseXMPObject(convertToObject(rdf, true)));\n return true;\n } catch (error) {\n return false;\n }\n}\n\nfunction getDocument(chunkDataView) {\n const domParser = DOMParser.get();\n if (!domParser) {\n console.warn('Warning: DOMParser is not available. It is needed to be able to parse XMP tags.'); // eslint-disable-line no-console\n throw new Error();\n }\n\n const xmlString = typeof chunkDataView === 'string' ? chunkDataView : getStringFromDataView(chunkDataView, 0, chunkDataView.byteLength);\n const doc = domParser.parseFromString(trimXmlSource(xmlString), 'application/xml');\n\n if (doc.documentElement.nodeName === 'parsererror') {\n throw new Error(doc.documentElement.textContent);\n }\n\n return {\n doc,\n raw: xmlString,\n };\n}\n\nfunction trimXmlSource(xmlSource) {\n return xmlSource.replace(/^.+(<\\?xpacket begin)/, '$1').replace(/(<\\?xpacket end=\".*\"\\?>).+$/, '$1');\n}\n\nfunction getRDF(node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n if (node.childNodes[i].tagName === 'x:xmpmeta') {\n return getRDF(node.childNodes[i]);\n }\n if (node.childNodes[i].tagName === 'rdf:RDF') {\n return node.childNodes[i];\n }\n }\n\n throw new Error();\n}\n\nfunction convertToObject(node, isTopNode = false) {\n const childNodes = getChildNodes(node);\n\n if (hasTextOnlyContent(childNodes)) {\n if (isTopNode) {\n return {};\n }\n return getTextValue(childNodes[0]);\n }\n\n return getElementsFromNodes(childNodes);\n}\n\nfunction getChildNodes(node) {\n const elements = [];\n\n for (let i = 0; i < node.childNodes.length; i++) {\n elements.push(node.childNodes[i]);\n }\n\n return elements;\n}\n\nfunction hasTextOnlyContent(nodes) {\n return (nodes.length === 1) && (nodes[0].nodeName === '#text');\n}\n\nfunction getTextValue(node) {\n return node.nodeValue;\n}\n\nfunction getElementsFromNodes(nodes) {\n const elements = {};\n\n nodes.forEach((node) => {\n if (isElement(node)) {\n const nodeElement = getElementFromNode(node);\n\n if (elements[node.nodeName] !== undefined) {\n if (!Array.isArray(elements[node.nodeName])) {\n elements[node.nodeName] = [elements[node.nodeName]];\n }\n elements[node.nodeName].push(nodeElement);\n } else {\n elements[node.nodeName] = nodeElement;\n }\n }\n });\n\n return elements;\n}\n\nfunction isElement(node) {\n return (node.nodeName) && (node.nodeName !== '#text');\n}\n\nfunction getElementFromNode(node) {\n return {\n attributes: getAttributes(node),\n value: convertToObject(node)\n };\n}\n\nfunction getAttributes(element) {\n const attributes = {};\n\n for (let i = 0; i < element.attributes.length; i++) {\n attributes[element.attributes[i].nodeName] = decodeURIComponent(escape(element.attributes[i].value));\n }\n\n return attributes;\n}\n\nfunction parseXMPObject(xmpObject) {\n const tags = {};\n\n if (typeof xmpObject === 'string') {\n return xmpObject;\n }\n\n for (const nodeName in xmpObject) {\n let nodes = xmpObject[nodeName];\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n nodes.forEach((node) => {\n objectAssign(tags, parseNodeAttributesAsTags(node.attributes));\n if (typeof node.value === 'object') {\n objectAssign(tags, parseNodeChildrenAsTags(node.value));\n }\n });\n }\n\n return tags;\n}\n\nfunction parseNodeAttributesAsTags(attributes) {\n const tags = {};\n\n for (const name in attributes) {\n if (isTagAttribute(name)) {\n tags[getLocalName(name)] = {\n value: attributes[name],\n attributes: {},\n description: getDescription(attributes[name], name)\n };\n }\n }\n\n return tags;\n}\n\nfunction isTagAttribute(name) {\n return (name !== 'rdf:parseType') && (!isNamespaceDefinition(name));\n}\n\nfunction isNamespaceDefinition(name) {\n return name.split(':')[0] === 'xmlns';\n}\n\nfunction getLocalName(name) {\n if (/^MicrosoftPhoto(_\\d+_)?:Rating$/i.test(name)) {\n return 'RatingPercent';\n }\n return name.split(':')[1];\n}\n\nfunction getDescription(value, name = undefined) {\n if (Array.isArray(value)) {\n const arrayDescription = getDescriptionOfArray(value);\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value, arrayDescription);\n }\n return arrayDescription;\n }\n if (typeof value === 'object') {\n return getDescriptionOfObject(value);\n }\n\n try {\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value);\n }\n return decodeURIComponent(escape(value));\n } catch (error) {\n return value;\n }\n}\n\nfunction getDescriptionOfArray(value) {\n return value.map((item) => {\n if (item.value !== undefined) {\n return getDescription(item.value);\n }\n return getDescription(item);\n }).join(', ');\n}\n\nfunction getDescriptionOfObject(value) {\n const descriptions = [];\n\n for (const key in value) {\n descriptions.push(`${getClearTextKey(key)}: ${getDescription(value[key].value)}`);\n }\n\n return descriptions.join('; ');\n}\n\nfunction getClearTextKey(key) {\n if (key === 'CiAdrCity') {\n return 'CreatorCity';\n }\n if (key === 'CiAdrCtry') {\n return 'CreatorCountry';\n }\n if (key === 'CiAdrExtadr') {\n return 'CreatorAddress';\n }\n if (key === 'CiAdrPcode') {\n return 'CreatorPostalCode';\n }\n if (key === 'CiAdrRegion') {\n return 'CreatorRegion';\n }\n if (key === 'CiEmailWork') {\n return 'CreatorWorkEmail';\n }\n if (key === 'CiTelWork') {\n return 'CreatorWorkPhone';\n }\n if (key === 'CiUrlWork') {\n return 'CreatorWorkUrl';\n }\n return key;\n}\n\nfunction parseNodeChildrenAsTags(children) {\n const tags = {};\n\n for (const name in children) {\n if (!isNamespaceDefinition(name)) {\n tags[getLocalName(name)] = parseNodeAsTag(children[name], name);\n }\n }\n\n return tags;\n}\n\nfunction parseNodeAsTag(node, name) {\n if (hasNestedSimpleRdfDescription(node)) {\n return parseNodeAsSimpleRdfDescription(node, name);\n }\n if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n }\n if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n }\n if (isArray(node)) {\n return parseNodeAsArray(node, name);\n }\n return parseNodeAsSimpleValue(node, name);\n}\n\nfunction hasNestedSimpleRdfDescription(node) {\n return ((node.attributes['rdf:parseType'] === 'Resource') && (node.value['rdf:value'] !== undefined))\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] !== undefined));\n}\n\nfunction parseNodeAsSimpleRdfDescription(node, name) {\n const attributes = parseNodeAttributes(node);\n\n if (node.value['rdf:Description'] !== undefined) {\n node = node.value['rdf:Description'];\n }\n\n objectAssign(attributes, parseNodeAttributes(node), parseNodeChildrenAsAttributes(node));\n\n const value = parseRdfValue(node);\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseNodeAttributes(node) {\n const attributes = {};\n\n for (const name in node.attributes) {\n if ((name !== 'rdf:parseType') && (name !== 'rdf:resource') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.attributes[name];\n }\n }\n\n return attributes;\n}\n\nfunction parseNodeChildrenAsAttributes(node) {\n const attributes = {};\n\n for (const name in node.value) {\n if ((name !== 'rdf:value') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.value[name].value;\n }\n }\n\n return attributes;\n}\n\nfunction parseRdfValue(node) {\n return getURIValue(node.value['rdf:value']) || node.value['rdf:value'].value;\n}\n\nfunction hasNestedStructureRdfDescription(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] === undefined));\n}\n\nfunction parseNodeAsStructureRdfDescription(node, name) {\n const tag = {\n value: {},\n attributes: {}\n };\n\n if (node.value['rdf:Description'] !== undefined) {\n objectAssign(tag.value, parseNodeAttributesAsTags(node.value['rdf:Description'].attributes));\n objectAssign(tag.attributes, parseNodeAttributes(node));\n node = node.value['rdf:Description'];\n }\n\n objectAssign(tag.value, parseNodeChildrenAsTags(node.value));\n\n tag.description = getDescription(tag.value, name);\n\n return tag;\n}\n\nfunction isCompactStructure(node) {\n return (Object.keys(node.value).length === 0)\n && (node.attributes['xml:lang'] === undefined)\n && (node.attributes['rdf:resource'] === undefined);\n}\n\nfunction parseNodeAsCompactStructure(node, name) {\n const value = parseNodeAttributesAsTags(node.attributes);\n\n return {\n value,\n attributes: {},\n description: getDescription(value, name)\n };\n}\n\nfunction isArray(node) {\n return getArrayChild(node.value) !== undefined;\n}\n\nfunction getArrayChild(value) {\n return value['rdf:Bag'] || value['rdf:Seq'] || value['rdf:Alt'];\n}\n\nfunction parseNodeAsArray(node, name) {\n let items = getArrayChild(node.value).value['rdf:li'];\n const attributes = parseNodeAttributes(node);\n const value = [];\n\n if (items === undefined) {\n items = [];\n } else if (!Array.isArray(items)) {\n items = [items];\n }\n\n items.forEach((item) => {\n value.push(parseArrayValue(item));\n });\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseArrayValue(item) {\n if (hasNestedSimpleRdfDescription(item)) {\n return parseNodeAsSimpleRdfDescription(item);\n }\n if (hasNestedStructureRdfDescription(item)) {\n return parseNodeAsStructureRdfDescription(item).value;\n }\n if (isCompactStructure(item)) {\n return parseNodeAsCompactStructure(item).value;\n }\n\n return parseNodeAsSimpleValue(item);\n}\n\nfunction parseNodeAsSimpleValue(node, name) {\n const value = getURIValue(node) || parseXMPObject(node.value);\n\n return {\n value,\n attributes: parseNodeAttributes(node),\n description: getDescription(value, name)\n };\n}\n\nfunction getURIValue(node) {\n return node.attributes && node.attributes['rdf:resource'];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser();\n }\n try {\n // eslint-disable-next-line no-undef\n return new (__non_webpack_require__('@xmldom/xmldom').DOMParser)({\n errorHandler: {\n error: () => {\n throw new Error('Faulty XML');\n }\n }\n });\n } catch (error) {\n return undefined;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport const iccTags = {\n 'desc': {\n 'name': 'ICC Description',\n },\n 'cprt': {\n 'name': 'ICC Copyright',\n },\n 'dmdd': {\n 'name': 'ICC Device Model Description',\n },\n 'vued': {\n 'name': 'ICC Viewing Conditions Description',\n },\n 'dmnd': {\n 'name': 'ICC Device Manufacturer for Display',\n },\n 'tech': {\n 'name': 'Technology',\n },\n};\n\nexport const iccProfile = {\n 4: {\n 'name': 'Preferred CMM type',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => value !== null ? toCompany(value) : '',\n },\n 8: {\n 'name': 'Profile Version',\n 'value': (dataView, offset) => {\n return (dataView.getUint8(offset)).toString(10) + '.'\n + (dataView.getUint8(offset + 1) >> 4).toString(10) + '.'\n + (dataView.getUint8(offset + 1) % 16).toString(10);\n }\n },\n 12: {\n 'name': 'Profile/Device class',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => {\n switch (value.toLowerCase()) {\n case 'scnr': return 'Input Device profile';\n case 'mntr': return 'Display Device profile';\n case 'prtr': return 'Output Device profile';\n case 'link': return 'DeviceLink profile';\n case 'abst': return 'Abstract profile';\n case 'spac': return 'ColorSpace profile';\n case 'nmcl': return 'NamedColor profile';\n case 'cenc': return 'ColorEncodingSpace profile';\n case 'mid ': return 'MultiplexIdentification profile';\n case 'mlnk': return 'MultiplexLink profile';\n case 'mvis': return 'MultiplexVisualization profile';\n default: return value;\n }\n }\n },\n 16: {\n 'name': 'Color Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 20: {\n 'name': 'Connection Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 24: {\n 'name': 'ICC Profile Date',\n 'value': (dataView, offset) => parseDate(dataView, offset).toISOString()\n },\n 36: {\n 'name': 'ICC Signature',\n 'value': (dataView, offset) => sliceToString(dataView.buffer.slice(offset, offset + 4))\n },\n 40: {\n 'name': 'Primary Platform',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 48: {\n 'name': 'Device Manufacturer',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 52: {\n 'name': 'Device Model Number',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 64: {\n 'name': 'Rendering Intent',\n 'value': (dataView, offset) => dataView.getUint32(offset),\n 'description': (value) => {\n switch (value) {\n case 0: return 'Perceptual';\n case 1: return 'Relative Colorimetric';\n case 2: return 'Saturation';\n case 3: return 'Absolute Colorimetric';\n default: return value;\n }\n }\n },\n\n 80: {\n 'name': 'Profile Creator',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n};\n\nfunction parseDate(dataView, offset) {\n const year = dataView.getUint16(offset);\n const month = dataView.getUint16(offset + 2) - 1;\n const day = dataView.getUint16(offset + 4);\n const hours = dataView.getUint16(offset + 6);\n const minutes = dataView.getUint16(offset + 8);\n const seconds = dataView.getUint16(offset + 10);\n return new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction toCompany(value) {\n switch (value.toLowerCase()) {\n case 'appl': return 'Apple';\n case 'adbe': return 'Adobe';\n case 'msft': return 'Microsoft';\n case 'sunw': return 'Sun Microsystems';\n case 'sgi': return 'Silicon Graphics';\n case 'tgnt': return 'Taligent';\n default: return value;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\nimport {iccTags, iccProfile} from './icc-tag-names.js';\nimport {getStringFromDataView, getUnicodeStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nconst PROFILE_HEADER_LENGTH = 84;\nconst ICC_TAG_COUNT_OFFSET = 128;\nconst ICC_SIGNATURE = 'acsp';\nconst TAG_TYPE_DESC = 'desc';\nconst TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE = 'mluc';\nconst TAG_TYPE_TEXT = 'text';\nconst TAG_TYPE_SIGNATURE = 'sig ';\nconst TAG_TABLE_SINGLE_TAG_DATA = 12;\n\n// ICC profile data can be longer than application segment max length of ~64k.\n// so it can be split into multiple APP2 segments. Each segment includes\n// total chunk count and chunk number.\n// Here we read all chunks into single continious array of bytes.\nfunction read(dataView, iccData) {\n try {\n const totalIccProfileLength = iccData.reduce((sum, icc) => sum + icc.length, 0);\n\n const iccBinaryData = new Uint8Array(totalIccProfileLength);\n let offset = 0;\n const buffer = getBuffer(dataView);\n\n for (let chunkNumber = 1; chunkNumber <= iccData.length; chunkNumber++) {\n const iccDataChunk = iccData.find((x) => x.chunkNumber === chunkNumber);\n if (!iccDataChunk) {\n throw new Error(`ICC chunk ${chunkNumber} not found`);\n }\n\n const data = buffer.slice(iccDataChunk.offset, iccDataChunk.offset + iccDataChunk.length);\n const chunkData = new Uint8Array(data);\n\n iccBinaryData.set(chunkData, offset);\n offset += chunkData.length;\n }\n\n return parseTags(new DataView(iccBinaryData.buffer));\n } catch (error) {\n return {};\n }\n}\n\nfunction getBuffer(dataView) {\n if (Array.isArray(dataView)) {\n return (new DataView(Uint8Array.from(dataView).buffer)).buffer;\n }\n return dataView.buffer;\n}\n\nfunction iccDoesNotHaveTagCount(buffer) {\n return buffer.length < (ICC_TAG_COUNT_OFFSET + 4);\n}\n\nfunction hasTagsData(buffer, tagHeaderOffset) {\n return buffer.length < tagHeaderOffset + TAG_TABLE_SINGLE_TAG_DATA;\n}\n\nexport function parseTags(dataView) {\n const buffer = dataView.buffer;\n\n const length = dataView.getUint32();\n if (dataView.byteLength !== length) {\n throw new Error('ICC profile length not matching');\n }\n\n if (dataView.length < PROFILE_HEADER_LENGTH) {\n throw new Error('ICC profile too short');\n }\n\n const tags = {};\n\n const iccProfileKeys = Object.keys(iccProfile);\n for (let i = 0; i < iccProfileKeys.length; i++) {\n const offset = iccProfileKeys[i];\n const profileEntry = iccProfile[offset];\n const value = profileEntry.value(dataView, parseInt(offset, 10));\n let description = value;\n if (profileEntry.description) {\n description = profileEntry.description(value);\n }\n\n tags[profileEntry.name] = {\n value,\n description\n };\n }\n\n const signature = sliceToString(buffer.slice(36, 40));\n if (signature !== ICC_SIGNATURE) {\n throw new Error('ICC profile: missing signature');\n }\n\n /* ICC data is incomplete but we have header parsed so lets return it */\n if (iccDoesNotHaveTagCount(buffer)) {\n return tags;\n }\n\n const tagCount = dataView.getUint32(128);\n let tagHeaderOffset = 132;\n\n for (let i = 0; i < tagCount; i++) {\n if (hasTagsData(buffer, tagHeaderOffset)) {\n // Tags are corrupted (offset too far), return what we parsed until now\n return tags;\n }\n const tagSignature = getStringFromDataView(dataView, tagHeaderOffset, 4);\n const tagOffset = dataView.getUint32(tagHeaderOffset + 4);\n const tagSize = dataView.getUint32(tagHeaderOffset + 8);\n\n if (tagOffset > buffer.length) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n const tagType = getStringFromDataView(dataView, tagOffset, 4);\n\n if (tagType === TAG_TYPE_DESC) {\n const tagValueSize = dataView.getUint32(tagOffset + 8);\n if (tagValueSize > tagSize) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n\n const val = sliceToString(buffer.slice(tagOffset + 12, tagOffset + tagValueSize + 11));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE) {\n const numRecords = dataView.getUint32(tagOffset + 8);\n const recordSize = dataView.getUint32(tagOffset + 12);\n let offset = tagOffset + 16;\n const val = [];\n for (let recordNum = 0; recordNum < numRecords; recordNum++) {\n const languageCode = getStringFromDataView(dataView, offset + 0, 2);\n const countryCode = getStringFromDataView(dataView, offset + 2, 2);\n const textLength = dataView.getUint32(offset + 4);\n const textOffset = dataView.getUint32(offset + 8);\n\n const text = getUnicodeStringFromDataView(dataView, tagOffset + textOffset, textLength);\n val.push({languageCode, countryCode, text});\n offset += recordSize;\n }\n if (numRecords === 1) {\n addTag(tags, tagSignature, val[0].text);\n } else {\n const valObj = {};\n for (let valIndex = 0; valIndex < val.length; valIndex++) {\n valObj[`${val[valIndex].languageCode}-${val[valIndex].countryCode}`] = val[valIndex].text;\n }\n addTag(tags, tagSignature, valObj);\n }\n } else if (tagType === TAG_TYPE_TEXT) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + tagSize - 7));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_SIGNATURE) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + 12));\n addTag(tags, tagSignature, val);\n }\n tagHeaderOffset = tagHeaderOffset + 12;\n }\n\n return tags;\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction addTag(tags, tagSignature, value) {\n if (iccTags[tagSignature]) {\n tags[iccTags[tagSignature].name] = {value, description: value};\n } else {\n tags[tagSignature] = {value, description: value};\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n return {\n 'Image Width': getImageWidth(dataView, fileDataOffset),\n 'Image Height': getImageHeight(dataView, fileDataOffset),\n 'Bit Depth': getBitDepth(dataView, fileDataOffset),\n 'Color Type': getColorType(dataView, fileDataOffset),\n 'Compression': getCompression(dataView, fileDataOffset),\n 'Filter': getFilter(dataView, fileDataOffset),\n 'Interlace': getInterlace(dataView, fileDataOffset)\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset) {\n const OFFSET = 0;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset) {\n const OFFSET = 4;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getBitDepth(dataView, fileDataOffset) {\n const OFFSET = 8;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}`\n };\n}\n\nfunction getColorType(dataView, fileDataOffset) {\n const OFFSET = 9;\n const SIZE = 1;\n const COLOR_TYPES = {\n 0: 'Grayscale',\n 2: 'RGB',\n 3: 'Palette',\n 4: 'Grayscale with Alpha',\n 6: 'RGB with Alpha'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: COLOR_TYPES[value] || 'Unknown'\n };\n}\n\nfunction getCompression(dataView, fileDataOffset) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Deflate/Inflate' : 'Unknown'\n };\n}\n\nfunction getFilter(dataView, fileDataOffset) {\n const OFFSET = 11;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Adaptive' : 'Unknown'\n };\n}\n\nfunction getInterlace(dataView, fileDataOffset) {\n const OFFSET = 12;\n const SIZE = 1;\n const INTERLACE_TYPES = {\n 0: 'Noninterlaced',\n 1: 'Adam7 Interlace'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: INTERLACE_TYPES[value] || 'Unknown'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValueFromArray} from './utils.js';\nimport TagDecoder from './tag-decoder.js';\nimport {TYPE_TEXT, TYPE_ITXT} from './image-header-png.js';\n\nexport default {\n read\n};\n\nconst STATE_KEYWORD = 'STATE_KEYWORD';\nconst STATE_COMPRESSION = 'STATE_COMPRESSION';\nconst STATE_LANG = 'STATE_LANG';\nconst STATE_TRANSLATED_KEYWORD = 'STATE_TRANSLATED_KEYWORD';\nconst STATE_TEXT = 'STATE_TEXT';\nconst COMPRESSION_SECTION_LENGTH = 2;\n\nfunction read(dataView, pngTextChunks) {\n return pngTextChunks.reduce((tags, {offset, length, type}) => {\n const {name, value, description} = getNameAndValue(dataView, offset, length, type);\n if (name) {\n tags[name] = {\n value,\n description\n };\n }\n return tags;\n }, {});\n}\n\nfunction getNameAndValue(dataView, offset, length, type) {\n const keywordChars = [];\n const langChars = [];\n const translatedKeywordChars = [];\n const valueChars = [];\n let parsingState = STATE_KEYWORD;\n\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n if (parsingState === STATE_COMPRESSION) {\n const compressionFlag = dataView.getUint8(offset + i);\n if (compressionFlag !== 0) {\n return {}; // We don't support compression.\n }\n i += COMPRESSION_SECTION_LENGTH;\n parsingState = moveToNextState(type, parsingState);\n }\n const byte = dataView.getUint8(offset + i);\n if (byte === 0) {\n parsingState = moveToNextState(type, parsingState);\n } else if (parsingState === STATE_KEYWORD) {\n keywordChars.push(byte);\n } else if (parsingState === STATE_LANG) {\n langChars.push(byte);\n } else if (parsingState === STATE_TRANSLATED_KEYWORD) {\n translatedKeywordChars.push(byte);\n } else {\n valueChars.push(byte);\n }\n }\n\n const textValue = getStringValueFromArray(valueChars);\n\n return {\n name: getName(type, langChars, keywordChars),\n value: textValue,\n description: type === TYPE_ITXT ? TagDecoder.decode('UTF-8', valueChars) : textValue\n };\n}\n\nfunction moveToNextState(type, parsingState) {\n if (parsingState === STATE_KEYWORD && type === TYPE_ITXT) {\n return STATE_COMPRESSION;\n }\n if (parsingState === STATE_COMPRESSION) {\n return STATE_LANG;\n }\n if (parsingState === STATE_LANG) {\n return STATE_TRANSLATED_KEYWORD;\n }\n return STATE_TEXT;\n}\n\nfunction getName(type, langChars, keywordChars) {\n const name = getStringValueFromArray(keywordChars);\n if (type === TYPE_TEXT || langChars.length === 0) {\n return name;\n }\n const lang = getStringValueFromArray(langChars);\n return `${name} (${lang})`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {PNG_CHUNK_LENGTH_OFFSET, PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_DATA_OFFSET, PNG_CHUNK_TYPE_SIZE, TYPE_PHYS, TYPE_TIME} from './image-header-png.js';\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunkOffsets) {\n const tags = {};\n\n for (let i = 0; i < chunkOffsets.length; i++) {\n const chunkLength = Types.getLongAt(dataView, chunkOffsets[i] + PNG_CHUNK_LENGTH_OFFSET);\n const chunkType = getStringFromDataView(dataView, chunkOffsets[i] + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n\n if (chunkType === TYPE_PHYS) {\n tags['Pixels Per Unit X'] = getPixelsPerUnitX(dataView, chunkOffsets[i], chunkLength);\n tags['Pixels Per Unit Y'] = getPixelsPerUnitY(dataView, chunkOffsets[i], chunkLength);\n tags['Pixel Units'] = getPixelUnits(dataView, chunkOffsets[i], chunkLength);\n } else if (chunkType === TYPE_TIME) {\n tags['Modify Date'] = getModifyDate(dataView, chunkOffsets[i], chunkLength);\n }\n }\n\n return tags;\n}\n\nfunction getPixelsPerUnitX(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 0;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelsPerUnitY(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 4;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelUnits(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 8;\n const TAG_SIZE = 1;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: value === 1 ? 'meters' : 'Unknown'\n };\n}\n\nfunction getModifyDate(dataView, chunkOffset, chunkLength) {\n const TIME_TAG_SIZE = 7;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, 0, TIME_TAG_SIZE)) {\n return undefined;\n }\n\n const year = Types.getShortAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET);\n const month = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 2);\n const day = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 3);\n const hours = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 4);\n const minutes = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 5);\n const seconds = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 6);\n\n return {\n value: [year, month, day, hours, minutes, seconds],\n description: `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)} ${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`\n };\n}\n\nfunction tagFitsInBuffer(dataView, chunkOffset, chunkLength, tagOffset, tagSize) {\n return tagOffset + tagSize <= chunkLength && chunkOffset + PNG_CHUNK_DATA_OFFSET + tagOffset + tagSize <= dataView.byteLength;\n}\n\nfunction pad(number, size) {\n return `${'0'.repeat(size - ('' + number).length)}${number}`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {deferInit, getBase64Image} from './utils.js';\n\n// https://exiftool.org/TagNames/EXIF.html#Compression\nconst COMPRESSION_JPEG = [6, 7, 99];\n\nexport default {\n get,\n};\n\nfunction get(dataView, thumbnailTags, tiffHeaderOffset) {\n if (hasJpegThumbnail(thumbnailTags)) {\n thumbnailTags.type = 'image/jpeg';\n const offset = tiffHeaderOffset + thumbnailTags.JPEGInterchangeFormat.value;\n thumbnailTags.image = dataView.buffer.slice(offset, offset + thumbnailTags.JPEGInterchangeFormatLength.value);\n deferInit(thumbnailTags, 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n // There is a small possibility of thumbnails in TIFF format but they are\n // not stored as a self-contained image file and would be much more\n // difficult to extract.\n // https://exiftool.org/forum/index.php?topic=3273.msg14778#msg14778\n\n return thumbnailTags;\n}\n\nfunction hasJpegThumbnail(tags) {\n return tags && ((tags.Compression === undefined) || (COMPRESSION_JPEG.includes(tags.Compression.value)))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n/**\n * Thrown when no Exif metadata was found for the given image.\n *\n * @param {string} message The error message.\n */\nfunction MetadataMissingError(message) {\n this.name = 'MetadataMissingError';\n this.message = message || 'No Exif data';\n this.stack = (new Error()).stack;\n}\n\nMetadataMissingError.prototype = new Error;\n\nexport default {\n MetadataMissingError,\n};\n","/**\n * ExifReader\n * http://github.com/mattiasw/exifreader\n * Copyright (C) 2011-2023 Mattias Wallander \n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/* global Buffer, __non_webpack_require__ */\n\nimport {objectAssign, dataUriToBuffer} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport {getCalculatedGpsValue} from './tag-names-utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport FileTags from './file-tags.js';\nimport JfifTags from './jfif-tags.js';\nimport IptcTags from './iptc-tags.js';\nimport XmpTags from './xmp-tags.js';\nimport IccTags from './icc-tags.js';\nimport PngFileTags from './png-file-tags.js';\nimport PngTextTags from './png-text-tags.js';\nimport PngTags from './png-tags.js';\nimport Thumbnail from './thumbnail.js';\nimport exifErrors from './errors.js';\n\nexport default {\n load,\n loadView,\n errors: exifErrors,\n};\n\nexport const errors = exifErrors;\n\nexport function load(data, options) {\n if (isFilePathOrURL(data)) {\n return loadFile(data, options).then((fileContents) => loadFromData(fileContents, options));\n }\n if (isBrowserFileObject(data)) {\n return loadFileObject(data).then((fileContents) => loadFromData(fileContents, options));\n }\n return loadFromData(data, options);\n}\n\nfunction isFilePathOrURL(data) {\n return typeof data === 'string';\n}\n\nfunction loadFile(filename, options) {\n if (/^https?:\\/\\//.test(filename)) {\n if (typeof fetch !== 'undefined') {\n return browserFetchRemoteFile(filename, options);\n }\n\n return nodeFetchRemoteFile(filename, options);\n }\n\n if (isDataUri(filename)) {\n return Promise.resolve(dataUriToBuffer(filename));\n }\n\n return loadLocalFile(filename, options);\n}\n\nfunction browserFetchRemoteFile(url, {length} = {}) {\n const options = {method: 'GET'};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n return fetch(url, options).then((response) => response.arrayBuffer());\n}\n\nfunction nodeFetchRemoteFile(url, {length} = {}) {\n return new Promise((resolve, reject) => {\n const options = {};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n\n const get = requireNodeGet(url);\n get(url, options, (response) => {\n if ((response.statusCode >= 200) && (response.statusCode <= 299)) {\n const data = [];\n response.on('data', (chunk) => data.push(Buffer.from(chunk)));\n response.on('error', (error) => reject(error));\n response.on('end', () => resolve(Buffer.concat(data)));\n } else {\n reject(`Could not fetch file: ${response.statusCode} ${response.statusMessage}`);\n response.resume();\n }\n }).on('error', (error) => reject(error));\n });\n}\n\nfunction requireNodeGet(url) {\n if (/^https:\\/\\//.test(url)) {\n return __non_webpack_require__('https').get;\n }\n return __non_webpack_require__('http').get;\n}\n\nfunction isDataUri(filename) {\n return /^data:[^;,]*(;base64)?,/.test(filename);\n}\n\nfunction loadLocalFile(filename, {length} = {}) {\n return new Promise((resolve, reject) => {\n const fs = requireNodeFs();\n fs.open(filename, (error, fd) => {\n if (error) {\n reject(error);\n } else {\n fs.stat(filename, (error, stat) => {\n if (error) {\n reject(error);\n } else {\n const size = Math.min(stat.size, length !== undefined ? length : stat.size);\n const buffer = Buffer.alloc(size);\n const options = {\n buffer,\n length: size\n };\n fs.read(fd, options, (error) => {\n if (error) {\n reject(error);\n } else {\n fs.close(fd, (error) => {\n if (error) {\n console.warn(`Could not close file ${filename}:`, error); // eslint-disable-line no-console\n }\n resolve(buffer);\n });\n }\n });\n }\n });\n }\n });\n });\n}\n\nfunction requireNodeFs() {\n try {\n return __non_webpack_require__('fs');\n } catch (error) {\n return undefined;\n }\n}\n\nfunction isBrowserFileObject(data) {\n return (typeof window !== 'undefined') && (typeof File !== 'undefined') && (data instanceof File);\n}\n\nfunction loadFileObject(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => resolve(readerEvent.target.result);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction loadFromData(data, options) {\n if (isNodeBuffer(data)) {\n // File data read in Node can share the underlying buffer with other\n // data. Therefore it's safest to get a new one to avoid weird bugs.\n data = (new Uint8Array(data)).buffer;\n }\n return loadView(getDataView(data), options);\n}\n\nfunction isNodeBuffer(data) {\n try {\n return Buffer.isBuffer(data);\n } catch (error) {\n return false;\n }\n}\n\nfunction getDataView(data) {\n try {\n return new DataView(data);\n } catch (error) {\n return new DataViewWrapper(data);\n }\n}\n\nexport function loadView(dataView, {expanded = false, includeUnknown = false} = {expanded: false, includeUnknown: false}) {\n let foundMetaData = false;\n let tags = {};\n\n const {\n fileDataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset,\n pngHeaderOffset,\n pngTextChunks,\n pngChunkOffsets\n } = ImageHeader.parseAppMarkers(dataView);\n\n if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {\n foundMetaData = true;\n const readTags = FileTags.read(dataView, fileDataOffset);\n if (expanded) {\n tags.file = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_JFIF && hasJfifData(jfifDataOffset)) {\n foundMetaData = true;\n const readTags = JfifTags.read(dataView, jfifDataOffset);\n if (expanded) {\n tags.jfif = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_EXIF && hasExifData(tiffHeaderOffset)) {\n foundMetaData = true;\n const readTags = Tags.read(dataView, tiffHeaderOffset, includeUnknown);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (expanded) {\n tags.exif = readTags;\n addGpsGroup(tags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n\n if (Constants.USE_TIFF && Constants.USE_IPTC && readTags['IPTC-NAA'] && !hasIptcData(iptcDataOffset)) {\n const readIptcTags = IptcTags.read(readTags['IPTC-NAA'].value, 0, includeUnknown);\n if (expanded) {\n tags.iptc = readIptcTags;\n } else {\n tags = objectAssign({}, tags, readIptcTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_XMP && readTags['ApplicationNotes'] && !hasXmpData(xmpChunks)) {\n const readXmpTags = XmpTags.read(getStringValueFromArray(readTags['ApplicationNotes'].value));\n if (expanded) {\n tags.xmp = readXmpTags;\n } else {\n delete readXmpTags._raw;\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_ICC && readTags['ICC_Profile'] && !hasIccData(iccChunks)) {\n const readIccTags = IccTags.read(\n readTags['ICC_Profile'].value,\n [{\n offset: 0,\n length: readTags['ICC_Profile'].value.length,\n chunkNumber: 1,\n chunksTotal: 1\n }]\n );\n if (expanded) {\n tags.icc = readIccTags;\n } else {\n tags = objectAssign({}, tags, readIccTags);\n }\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset, includeUnknown);\n if (expanded) {\n tags.iptc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_XMP && hasXmpData(xmpChunks)) {\n foundMetaData = true;\n const readTags = XmpTags.read(dataView, xmpChunks);\n if (expanded) {\n tags.xmp = readTags;\n } else {\n delete readTags._raw;\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if ((Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks);\n if (expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_MPF && hasMpfData(mpfDataOffset)) {\n foundMetaData = true;\n const readMpfTags = Tags.readMpf(dataView, mpfDataOffset, includeUnknown);\n if (expanded) {\n tags.mpf = readMpfTags;\n } else {\n tags = objectAssign({}, tags, readMpfTags);\n }\n }\n\n if (Constants.USE_PNG && Constants.USE_PNG_FILE && hasPngFileData(pngHeaderOffset)) {\n foundMetaData = true;\n const readTags = PngFileTags.read(dataView, pngHeaderOffset);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngTextData(pngTextChunks)) {\n foundMetaData = true;\n const readTags = PngTextTags.read(dataView, pngTextChunks);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngText = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngData(pngChunkOffsets)) {\n foundMetaData = true;\n const readTags = PngTags.read(dataView, pngChunkOffsets);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n foundMetaData = true;\n tags.Thumbnail = thumbnail;\n } else {\n delete tags.Thumbnail;\n }\n\n if (!foundMetaData) {\n throw new exifErrors.MetadataMissingError();\n }\n\n return tags;\n}\n\nfunction hasFileData(fileDataOffset) {\n return fileDataOffset !== undefined;\n}\n\nfunction hasJfifData(jfifDataOffset) {\n return jfifDataOffset !== undefined;\n}\n\nfunction hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\n}\n\nfunction addGpsGroup(tags) {\n if (tags.exif) {\n if (tags.exif.GPSLatitude && tags.exif.GPSLatitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Latitude = getCalculatedGpsValue(tags.exif.GPSLatitude.value);\n if (tags.exif.GPSLatitudeRef.value.join('') === 'S') {\n tags.gps.Latitude = -tags.gps.Latitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSLongitude && tags.exif.GPSLongitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Longitude = getCalculatedGpsValue(tags.exif.GPSLongitude.value);\n if (tags.exif.GPSLongitudeRef.value.join('') === 'W') {\n tags.gps.Longitude = -tags.gps.Longitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSAltitude && tags.exif.GPSAltitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Altitude = tags.exif.GPSAltitude.value[0] / tags.exif.GPSAltitude.value[1];\n if (tags.exif.GPSAltitudeRef.value === 1) {\n tags.gps.Altitude = -tags.gps.Altitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n }\n}\n\nfunction hasIptcData(iptcDataOffset) {\n return iptcDataOffset !== undefined;\n}\n\nfunction hasXmpData(xmpChunks) {\n return Array.isArray(xmpChunks) && xmpChunks.length > 0;\n}\n\nfunction hasIccData(iccDataOffsets) {\n return Array.isArray(iccDataOffsets) && iccDataOffsets.length > 0;\n}\n\nfunction hasMpfData(mpfDataOffset) {\n return mpfDataOffset !== undefined;\n}\n\nfunction hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n\nfunction hasPngTextData(pngTextChunks) {\n return pngTextChunks !== undefined;\n}\n\nfunction hasPngData(pngChunkOffsets) {\n return pngChunkOffsets !== undefined;\n}\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","getStringFromDataView","dataView","offset","length","chars","i","byteLength","push","getUint8","getStringValueFromArray","getUnicodeStringFromDataView","getUint16","charArray","map","charCode","String","fromCharCode","join","objectAssign","arguments","property","deferInit","object","initializer","initialized","configurable","apply","writable","getBase64Image","image","btoa","Array","reduce","Uint8Array","data","byte","Buffer","undefined","from","toString","DataView","buffer","readUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt32LE","readInt32BE","bufferTypeIsUnsupported","Error","littleEndian","getStringValue","getEncodedString","encoding","slice","getCalculatedGpsValue","LITTLE_ENDIAN","tiffHeaderOffset","APP1_MARKER","isSOF0Marker","appMarkerPosition","isSOF2Marker","isApp2ICCMarker","APP2_ICC_IDENTIFIER","isApp2MPFMarker","APP2_MPF_IDENTIFIER","isApp0JfifMarker","APP1_EXIF_IDENTIFIER","isApp1ExifMarker","isApp1XmpMarker","APP1_XMP_IDENTIFIER","isXmpIdentifier","isApp1ExtendedXmpMarker","APP1_XMP_EXTENDED_IDENTIFIER","isExtendedXmpIdentifier","getXmpChunkDetails","fieldLength","dataOffset","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","APP13_IPTC_IDENTIFIER","isAppMarker","appMarker","isFillByte","PNG_ID","TYPE_ITXT","TYPE_PHYS","TYPE_TIME","isPngImageHeaderChunk","isPngXmpChunk","PNG_CHUNK_LENGTH_SIZE","PNG_XMP_PREFIX","isPngTextChunk","chunkType","isPngExifChunk","isPngChunk","SUPPORTED_PNG_CHUNK_TYPES","includes","getPngXmpDataOffset","PNG_CHUNK_DATA_OFFSET","numberOfNullSeparators","getAtomLength","atomLength","getUint32","extendsToEndOfFile","hasExtendedSize","hasEmptyHighBits","ByteOrder","hasTiffMarker","Tiff","hasAppMarkers","Jpeg","sof0DataOffset","sof2DataOffset","jfifDataOffset","iptcDataOffset","xmpChunks","iccChunks","mpfDataOffset","iccDataOffset","iccDataLength","iccChunkNumber","APP_ID_OFFSET","iccChunksTotal","ICC_CHUNK_NUMBER_OFFSET","chunkNumber","chunksTotal","fileDataOffset","Png","offsets","pngHeaderOffset","pngTextChunks","type","pngChunkOffsets","heicMajorBrand","HEIC_ID_OFFSET","HEIC_ID","indexOf","Heic","findMetaAtom","metaOffset","metaLength","metaEndOffset","Math","min","ilocOffset","exifItemOffset","colrOffset","itemName","findMetaItems","exifOffset","exifItemIndex","exifPointer","findExifOffset","colorType","findIccChunks","RIFF_ID","WEBP_MARKER","Webp","chunkId","chunkSize","EXIF_IDENTIFIER","typeSizes","tagTypes","getAsciiValue","getByteAt","getAsciiAt","getShortAt","byteOrder","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","typeName","getInt32","ApertureValue","pow","sqrt","toFixed","ColorSpace","ComponentsConfiguration","character","Contrast","CustomRendered","ExposureMode","ExposureProgram","ExposureTime","round","FNumber","FocalLength","FocalPlaneResolutionUnit","LightSource","MeteringMode","ResolutionUnit","Saturation","SceneCaptureType","Sharpness","ShutterSpeedValue","denominator","WhiteBalance","XResolution","YResolution","name","description","TagNamesCommon","values","formats","isArray","sample","ref","num","test","status","mode","tagNames0thExifIfds","TagNames0thIfd","x","y","focalLengths","IFD_TYPE_0TH","IFD_TYPE_EXIF","IFD_TYPE_INTEROPERABILITY","TagNamesGpsIfd","TagNamesInteroperabilityIfd","TagNamesMpfIfd","getTagValueAt","Types","includeUnknown","tags","readIfd","get0thIfdOffset","read0thIfd","INTEROPERABILITY_IFD_POINTER_KEY","readInteroperabilityIfd","GPS_INFO_IFD_POINTER_KEY","readGpsIfd","EXIF_IFD_POINTER_KEY","readExifIfd","ENTRY_SIZE","images","ceil","attributes","getImageNumberValue","getImageFlags","getImageFormat","getImageType","imageSize","imageOffset","isFirstIndividualImage","dependentImage1EntryNumber","dependentImage2EntryNumber","addMpfImages","entries","size","flags","flagsDescription","imageFormat","ifdType","FIELD_COUNT_SIZE","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","id","nextIfdOffset","tagValue","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","TagNames","tagValueFitsInOffsetSlot","getTagValue","tagValueOffset","tagValueFitsInDataView","asciiValue","decodeURIComponent","escape","error","decodeAsciiValue","string","j","splitNullSeparatedAsciiString","tagName","tagDescription","getDescriptionFromTagValue","count","forceByteType","valueIndex","getLength","numberOfColorComponents","OFFSET","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","thumbnailWidth","getThumbnailWidth","thumbnailHeight","getThumbnailHeight","getVersion","getResolutionUnit","getXResolution","getYResolution","thumbnail","thumbnailLength","getThumbnail","majorVersion","minorVersion","getResolutionUnitDescription","getCreationDate","getCreationTime","getEncodingName","parts","split","stringValue","character0","charAt","character1","parseInt","bits","duration","substr","intValue","formatVersions","objectDataPreviewFileFormat","n","date","time","parsedTime","Decoder","TextDecoder","decode","parseTags","BYTES_8BIM_SIZE","resourceBlock","getResourceBlock","isNaaResourceBlock","naaBlock","getBlockPadding","getNaaResourceBlock","endOfBlockOffset","tagSize","leadByteIsMissing","IptcTagNames","getTagName","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","TagDecoder","fraction","calculateGPSValue","substring","parseNumber","numbers","number","charCodeAt","isFraction","func","degreesString","minutesString","degrees","parseFloat","minutes","Number","isNaN","chunks","readTags","completeChunks","combineChunks","extractCompleteChunks","standardXmp","extendedXmp","hasStandardTags","hasExtendedTags","_raw","totalLength","chunk","combinedChunks","set","chunkDataView","domParser","DOMParser","__non_webpack_require__","errorHandler","console","warn","xmlString","doc","parseFromString","replace","documentElement","nodeName","textContent","raw","getDocument","parseXMPObject","convertToObject","getRDF","node","childNodes","isTopNode","getChildNodes","hasTextOnlyContent","getTextValue","getElementsFromNodes","elements","nodes","nodeValue","forEach","isElement","nodeElement","getAttributes","getElementFromNode","element","xmpObject","parseNodeAttributesAsTags","parseNodeChildrenAsTags","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","arrayDescription","getDescriptionOfArray","XmpTagNames","getDescriptionOfObject","item","descriptions","getClearTextKey","children","parseNodeAsTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAsStructureRdfDescription","isCompactStructure","parseNodeAsCompactStructure","getArrayChild","items","parseNodeAttributes","parseNodeAsSimpleValue","parseArrayValue","parseNodeAsArray","parseNodeChildrenAsAttributes","getURIValue","parseRdfValue","keys","iccTags","iccProfile","toCompany","toLowerCase","year","month","day","hours","seconds","Date","UTC","parseDate","toISOString","iccData","totalIccProfileLength","sum","icc","iccBinaryData","getBuffer","iccDataChunk","find","chunkData","iccProfileKeys","profileEntry","sliceToString","ICC_SIGNATURE","ICC_TAG_COUNT_OFFSET","iccDoesNotHaveTagCount","tagHeaderOffset","hasTagsData","tagSignature","tagOffset","TAG_TYPE_DESC","tagValueSize","addTag","TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE","numRecords","recordSize","val","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","TAG_TYPE_TEXT","TAG_TYPE_SIGNATURE","getBitDepth","getColorType","getCompression","getFilter","getInterlace","keywordChars","langChars","translatedKeywordChars","valueChars","parsingState","STATE_KEYWORD","STATE_COMPRESSION","moveToNextState","STATE_LANG","STATE_TRANSLATED_KEYWORD","textValue","getName","getNameAndValue","lang","chunkOffsets","chunkLength","getPixelsPerUnitX","getPixelsPerUnitY","getPixelUnits","getModifyDate","chunkOffset","tagFitsInBuffer","pad","repeat","COMPRESSION_JPEG","thumbnailTags","Compression","JPEGInterchangeFormat","JPEGInterchangeFormatLength","MetadataMissingError","message","stack","load","loadView","errors","exifErrors","options","isFilePathOrURL","filename","fetch","url","method","isInteger","headers","range","then","response","arrayBuffer","browserFetchRemoteFile","Promise","resolve","reject","requireNodeGet","statusCode","on","concat","statusMessage","resume","nodeFetchRemoteFile","isDataUri","dataUri","atob","char","decodedData","dataUriToBuffer","fs","requireNodeFs","open","fd","stat","alloc","read","close","loadLocalFile","loadFile","fileContents","loadFromData","window","File","isBrowserFileObject","file","reader","FileReader","onload","readerEvent","target","result","onerror","readAsArrayBuffer","isBuffer","isNodeBuffer","DataViewWrapper","getDataView","expanded","foundMetaData","ImageHeader","hasFileData","FileTags","hasJfifData","JfifTags","jfif","hasExifData","Tags","Thumbnail","exif","addGpsGroup","hasIptcData","readIptcTags","IptcTags","iptc","hasXmpData","readXmpTags","XmpTags","xmp","hasIccData","readIccTags","IccTags","hasMpfData","readMpfTags","mpf","hasPngFileData","PngFileTags","png","pngFile","hasPngTextData","PngTextTags","pngText","hasPngData","PngTags","GPSLatitude","GPSLatitudeRef","gps","Latitude","GPSLongitude","GPSLongitudeRef","Longitude","GPSAltitude","GPSAltitudeRef","Altitude","iccDataOffsets","pngFileDataOffset"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"exif-reader.js","mappings":"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","sources":["webpack://ExifReader/webpack/universalModuleDefinition","webpack://ExifReader/webpack/bootstrap","webpack://ExifReader/webpack/runtime/define property getters","webpack://ExifReader/webpack/runtime/hasOwnProperty shorthand","webpack://ExifReader/webpack/runtime/make namespace object","webpack://ExifReader/./src/utils.js","webpack://ExifReader/./src/dataview.js","webpack://ExifReader/./src/tag-names-utils.js","webpack://ExifReader/./src/byte-order.js","webpack://ExifReader/./src/image-header-jpeg.js","webpack://ExifReader/./src/image-header-png.js","webpack://ExifReader/./src/image-header-heic.js","webpack://ExifReader/./src/image-header-webp.js","webpack://ExifReader/./src/image-header.js","webpack://ExifReader/./src/image-header-tiff.js","webpack://ExifReader/./src/types.js","webpack://ExifReader/./src/tag-names-common.js","webpack://ExifReader/./src/tag-names-0th-ifd.js","webpack://ExifReader/./src/tag-names-gps-ifd.js","webpack://ExifReader/./src/tag-names-interoperability-ifd.js","webpack://ExifReader/./src/tag-names-mpf-ifd.js","webpack://ExifReader/./src/tag-names.js","webpack://ExifReader/./src/tag-names-exif-ifd.js","webpack://ExifReader/./src/tags.js","webpack://ExifReader/./src/file-tags.js","webpack://ExifReader/./src/jfif-tags.js","webpack://ExifReader/./src/iptc-tag-names.js","webpack://ExifReader/./src/text-decoder.js","webpack://ExifReader/./src/tag-decoder.js","webpack://ExifReader/./src/iptc-tags.js","webpack://ExifReader/./src/xmp-tag-names.js","webpack://ExifReader/./src/xmp-tags.js","webpack://ExifReader/./src/dom-parser.js","webpack://ExifReader/./src/icc-tag-names.js","webpack://ExifReader/./src/icc-tags.js","webpack://ExifReader/./src/png-file-tags.js","webpack://ExifReader/./src/png-text-tags.js","webpack://ExifReader/./src/png-tags.js","webpack://ExifReader/./src/vp8x-tags.js","webpack://ExifReader/./src/thumbnail.js","webpack://ExifReader/./src/errors.js","webpack://ExifReader/./src/exif-reader.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ExifReader\"] = factory();\n\telse\n\t\troot[\"ExifReader\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n chars.push(dataView.getUint8(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getUnicodeStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i += 2) {\n chars.push(dataView.getUint16(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getStringValueFromArray(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getCharacterArray(string) {\n return string.split('').map((character) => character.charCodeAt(0));\n}\n\nexport function objectAssign() {\n for (let i = 1; i < arguments.length; i++) {\n for (const property in arguments[i]) {\n arguments[0][property] = arguments[i][property];\n }\n }\n\n return arguments[0];\n}\n\nexport function deferInit(object, key, initializer) {\n let initialized = false;\n Object.defineProperty(object, key, {\n get() {\n if (!initialized) {\n initialized = true;\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value: initializer.apply(object),\n writable: true\n });\n }\n return object[key];\n },\n configurable: true,\n enumerable: true\n });\n}\n\nexport function getBase64Image(image) {\n if (typeof btoa !== 'undefined') {\n if (typeof image === 'string') {\n // This only happens during the build tests using Node 16+ (npm run test:build).\n return btoa(image);\n }\n // IE11- does not implement reduce on the Uint8Array prototype.\n return btoa(Array.prototype.reduce.call(new Uint8Array(image), (data, byte) => data + String.fromCharCode(byte), ''));\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(image).toString('base64'); // eslint-disable-line no-undef\n }\n return (new Buffer(image)).toString('base64'); // eslint-disable-line no-undef\n}\n\nexport function dataUriToBuffer(dataUri) {\n const data = dataUri.substring(dataUri.indexOf(',') + 1);\n\n if (dataUri.indexOf(';base64') !== -1) {\n if (typeof atob !== 'undefined') {\n return Uint8Array.from(atob(data), (char) => char.charCodeAt(0)).buffer;\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(data, 'base64'); // eslint-disable-line no-undef\n }\n return new Buffer(data, 'base64'); // eslint-disable-line no-undef\n }\n\n const decodedData = decodeURIComponent(data);\n if (typeof Buffer !== 'undefined') {\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(decodedData); // eslint-disable-line no-undef\n }\n return new Buffer(decodedData); // eslint-disable-line no-undef\n }\n return Uint8Array.from(decodedData, (char) => char.charCodeAt(0)).buffer;\n}\n","export default class DataView {\n constructor(buffer) {\n if (bufferTypeIsUnsupported(buffer)) {\n throw new Error('DataView: Passed buffer type is unsupported.');\n }\n\n this.buffer = buffer;\n this.byteLength = this.buffer.length;\n }\n\n getUint8(offset) {\n return this.buffer.readUInt8(offset);\n }\n\n getUint16(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt16LE(offset);\n }\n return this.buffer.readUInt16BE(offset);\n }\n\n getUint32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt32LE(offset);\n }\n return this.buffer.readUInt32BE(offset);\n }\n\n getInt32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readInt32LE(offset);\n }\n return this.buffer.readInt32BE(offset);\n }\n}\n\nfunction bufferTypeIsUnsupported(buffer) {\n return typeof buffer !== 'object'\n || buffer.length === undefined\n || buffer.readUInt8 === undefined\n || buffer.readUInt16LE === undefined\n || buffer.readUInt16BE === undefined\n || buffer.readUInt32LE === undefined\n || buffer.readUInt32BE === undefined\n || buffer.readInt32LE === undefined\n || buffer.readInt32BE === undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringValue(value) {\n return value.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getEncodedString(value) {\n if (value.length >= 8) {\n const encoding = getStringValue(value.slice(0, 8));\n\n if (encoding === 'ASCII\\x00\\x00\\x00') {\n return getStringValue(value.slice(8));\n } else if (encoding === 'JIS\\x00\\x00\\x00\\x00\\x00') {\n return '[JIS encoded text]';\n } else if (encoding === 'UNICODE\\x00') {\n return '[Unicode encoded text]';\n } else if (encoding === '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00') {\n return '[Undefined encoding]';\n }\n }\n\n return 'Undefined';\n}\n\nexport function getCalculatedGpsValue(value) {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nconst LITTLE_ENDIAN = 0x4949;\nconst BIG_ENDIAN = 0x4d4d;\n\nexport default {\n BIG_ENDIAN,\n LITTLE_ENDIAN,\n getByteOrder\n};\n\nfunction getByteOrder(dataView, tiffHeaderOffset) {\n if (dataView.getUint16(tiffHeaderOffset) === LITTLE_ENDIAN) {\n return LITTLE_ENDIAN;\n } else if (dataView.getUint16(tiffHeaderOffset) === BIG_ENDIAN) {\n return BIG_ENDIAN;\n }\n throw new Error('Illegal byte order value. Faulty image.');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isJpegFile,\n findJpegOffsets\n};\n\nconst MIN_JPEG_DATA_BUFFER_LENGTH = 2;\nconst JPEG_ID = 0xffd8;\nconst JPEG_ID_SIZE = 2;\nconst APP_ID_OFFSET = 4;\nconst APP_MARKER_SIZE = 2;\nconst JFIF_DATA_OFFSET = 2; // From start of APP0 marker.\nconst TIFF_HEADER_OFFSET = 10; // From start of APP1 marker.\nconst IPTC_DATA_OFFSET = 18; // From start of APP13 marker.\nconst XMP_DATA_OFFSET = 33; // From start of APP1 marker.\nconst XMP_EXTENDED_DATA_OFFSET = 79; // From start of APP1 marker including GUID, total length, and offset.\nconst APP2_ICC_DATA_OFFSET = 18; // From start of APP2 marker including marker and chunk/chunk total numbers.\nconst MPF_DATA_OFFSET = 8;\n\nconst APP2_ICC_IDENTIFIER = 'ICC_PROFILE\\0';\nconst ICC_CHUNK_NUMBER_OFFSET = APP_ID_OFFSET + APP2_ICC_IDENTIFIER.length;\nconst ICC_TOTAL_CHUNKS_OFFSET = ICC_CHUNK_NUMBER_OFFSET + 1;\n\nconst APP2_MPF_IDENTIFIER = 'MPF\\0';\n\nconst SOF0_MARKER = 0xffc0;\nconst SOF2_MARKER = 0xffc2;\nconst DHT_MARKER = 0xffc4;\nconst DQT_MARKER = 0xffdb;\nconst DRI_MARKER = 0xffdd;\nconst SOS_MARKER = 0xffda;\n\nconst APP0_MARKER = 0xffe0;\nconst APP1_MARKER = 0xffe1;\nconst APP2_MARKER = 0xffe2;\nconst APP13_MARKER = 0xffed;\nconst APP15_MARKER = 0xffef;\nconst COMMENT_MARKER = 0xfffe;\n\n// Any number of fill bytes can be placed before an app marker. It's actually the first 0xff that is the\n// fill byte and the next 0xff is either another fill byte or the first half of the next app marker.\nconst FILL_BYTE = 0xffff;\n\nconst APP0_JFIF_IDENTIFIER = 'JFIF';\nconst APP1_EXIF_IDENTIFIER = 'Exif';\nconst APP1_XMP_IDENTIFIER = 'http://ns.adobe.com/xap/1.0/\\x00';\nconst APP1_XMP_EXTENDED_IDENTIFIER = 'http://ns.adobe.com/xmp/extension/\\x00';\nconst APP13_IPTC_IDENTIFIER = 'Photoshop 3.0';\n\nfunction isJpegFile(dataView) {\n return !!dataView && (dataView.byteLength >= MIN_JPEG_DATA_BUFFER_LENGTH) && (dataView.getUint16(0) === JPEG_ID);\n}\n\nfunction findJpegOffsets(dataView) {\n let appMarkerPosition = JPEG_ID_SIZE;\n let fieldLength;\n let sof0DataOffset;\n let sof2DataOffset;\n let jfifDataOffset;\n let tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\n let mpfDataOffset;\n\n while (appMarkerPosition + APP_ID_OFFSET + 5 <= dataView.byteLength) {\n if (Constants.USE_FILE && isSOF0Marker(dataView, appMarkerPosition)) {\n sof0DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_FILE && isSOF2Marker(dataView, appMarkerPosition)) {\n sof2DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_JFIF && isApp0JfifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n jfifDataOffset = appMarkerPosition + JFIF_DATA_OFFSET;\n } else if (Constants.USE_EXIF && isApp1ExifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n tiffHeaderOffset = appMarkerPosition + TIFF_HEADER_OFFSET;\n } else if (Constants.USE_XMP && isApp1XmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_XMP && isApp1ExtendedXmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getExtendedXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_IPTC && isApp13PhotoshopMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n iptcDataOffset = appMarkerPosition + IPTC_DATA_OFFSET;\n } else if (Constants.USE_ICC && isApp2ICCMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n const iccDataOffset = appMarkerPosition + APP2_ICC_DATA_OFFSET;\n const iccDataLength = fieldLength - (APP2_ICC_DATA_OFFSET - APP_MARKER_SIZE);\n\n const iccChunkNumber = dataView.getUint8(appMarkerPosition + ICC_CHUNK_NUMBER_OFFSET);\n const iccChunksTotal = dataView.getUint8(appMarkerPosition + ICC_TOTAL_CHUNKS_OFFSET);\n if (!iccChunks) {\n iccChunks = [];\n }\n iccChunks.push({offset: iccDataOffset, length: iccDataLength, chunkNumber: iccChunkNumber, chunksTotal: iccChunksTotal});\n } else if (Constants.USE_MPF && isApp2MPFMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n mpfDataOffset = appMarkerPosition + MPF_DATA_OFFSET;\n } else if (isAppMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n } else if (isFillByte(dataView, appMarkerPosition)) {\n appMarkerPosition++;\n continue;\n } else {\n break;\n }\n appMarkerPosition += APP_MARKER_SIZE + fieldLength;\n }\n\n return {\n hasAppMarkers: appMarkerPosition > JPEG_ID_SIZE,\n fileDataOffset: sof0DataOffset || sof2DataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset\n };\n}\n\nfunction isSOF0Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF0_MARKER);\n}\n\nfunction isSOF2Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF2_MARKER);\n}\n\nfunction isApp2ICCMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_ICC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_ICC_IDENTIFIER);\n}\n\nfunction isApp2MPFMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_MPF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_MPF_IDENTIFIER);\n}\n\nfunction isApp0JfifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP0_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP0_JFIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1ExifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_EXIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1XmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_IDENTIFIER;\n}\n\nfunction isApp1ExtendedXmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isExtendedXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isExtendedXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_EXTENDED_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_EXTENDED_IDENTIFIER;\n}\n\nfunction getXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_DATA_OFFSET,\n length: fieldLength - (XMP_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction getExtendedXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_EXTENDED_DATA_OFFSET,\n length: fieldLength - (XMP_EXTENDED_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction isApp13PhotoshopMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP13_IPTC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP13_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP13_IPTC_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isAppMarker(dataView, appMarkerPosition) {\n const appMarker = dataView.getUint16(appMarkerPosition);\n return ((appMarker >= APP0_MARKER) && (appMarker <= APP15_MARKER))\n || (appMarker === COMMENT_MARKER)\n || (appMarker === SOF0_MARKER)\n || (appMarker === SOF2_MARKER)\n || (appMarker === DHT_MARKER)\n || (appMarker === DQT_MARKER)\n || (appMarker === DRI_MARKER)\n || (appMarker === SOS_MARKER);\n}\n\nfunction isFillByte(dataView, appMarkerPosition) {\n return dataView.getUint16(appMarkerPosition) === FILL_BYTE;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isPngFile,\n findPngOffsets\n};\n\nconst PNG_ID = '\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a';\nconst PNG_CHUNK_LENGTH_SIZE = 4;\nexport const PNG_CHUNK_TYPE_SIZE = 4;\nexport const PNG_CHUNK_LENGTH_OFFSET = 0;\nexport const PNG_CHUNK_TYPE_OFFSET = PNG_CHUNK_LENGTH_SIZE;\nexport const PNG_CHUNK_DATA_OFFSET = PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE;\nconst PNG_XMP_PREFIX = 'XML:com.adobe.xmp\\x00';\nexport const TYPE_TEXT = 'tEXt';\nexport const TYPE_ITXT = 'iTXt';\nexport const TYPE_PHYS = 'pHYs';\nexport const TYPE_TIME = 'tIME';\nexport const TYPE_EXIF = 'eXIf';\n\nfunction isPngFile(dataView) {\n return !!dataView && getStringFromDataView(dataView, 0, PNG_ID.length) === PNG_ID;\n}\n\nfunction findPngOffsets(dataView) {\n const PNG_CRC_SIZE = 4;\n\n const offsets = {\n hasAppMarkers: false\n };\n\n let offset = PNG_ID.length;\n\n while (offset + PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE <= dataView.byteLength) {\n if (Constants.USE_PNG_FILE && isPngImageHeaderChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.pngHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_XMP && isPngXmpChunk(dataView, offset)) {\n const dataOffset = getPngXmpDataOffset(dataView, offset);\n if (dataOffset !== undefined) {\n offsets.hasAppMarkers = true;\n offsets.xmpChunks = [{\n dataOffset,\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET) - (dataOffset - (offset + PNG_CHUNK_DATA_OFFSET))\n }];\n }\n } else if (isPngTextChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n if (!offsets.pngTextChunks) {\n offsets.pngTextChunks = [];\n }\n offsets.pngTextChunks.push({\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET),\n type: chunkType,\n offset: offset + PNG_CHUNK_DATA_OFFSET\n });\n } else if (isPngExifChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.tiffHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (isPngChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n if (!offsets.pngChunkOffsets) {\n offsets.pngChunkOffsets = [];\n }\n offsets.pngChunkOffsets.push(offset + PNG_CHUNK_LENGTH_OFFSET);\n }\n\n offset += dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET)\n + PNG_CHUNK_LENGTH_SIZE\n + PNG_CHUNK_TYPE_SIZE\n + PNG_CRC_SIZE;\n }\n\n return offsets;\n}\n\nfunction isPngImageHeaderChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_IMAGE_HEADER = 'IHDR';\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_IMAGE_HEADER;\n}\n\nfunction isPngXmpChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_INTERNATIONAL_TEXT = 'iTXt';\n return (getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_INTERNATIONAL_TEXT)\n && (getStringFromDataView(dataView, offset + PNG_CHUNK_DATA_OFFSET, PNG_XMP_PREFIX.length) === PNG_XMP_PREFIX);\n}\n\nfunction isPngTextChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_TEXT = 'tEXt';\n const PNG_CHUNK_TYPE_ITXT = 'iTXt';\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return chunkType === PNG_CHUNK_TYPE_TEXT || chunkType === PNG_CHUNK_TYPE_ITXT;\n}\n\nfunction isPngExifChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_EXIF;\n}\n\nfunction isPngChunk(dataView, offset) {\n const SUPPORTED_PNG_CHUNK_TYPES = [TYPE_PHYS, TYPE_TIME];\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return SUPPORTED_PNG_CHUNK_TYPES.includes(chunkType);\n}\n\nfunction getPngXmpDataOffset(dataView, offset) {\n const COMPRESSION_FLAG_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n offset += PNG_CHUNK_DATA_OFFSET + PNG_XMP_PREFIX.length + COMPRESSION_FLAG_SIZE + COMPRESSION_METHOD_SIZE;\n\n let numberOfNullSeparators = 0;\n while (numberOfNullSeparators < 2 && offset < dataView.byteLength) {\n if (dataView.getUint8(offset) === 0x00) {\n numberOfNullSeparators++;\n }\n offset++;\n }\n if (numberOfNullSeparators < 2) {\n return undefined;\n }\n return offset;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isHeicFile,\n findHeicOffsets\n};\n\nfunction isHeicFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n const HEIC_ID = 'ftyp';\n const HEIC_ID_OFFSET = 4;\n const HEIC_MAJOR_BRANDS = ['heic', 'heix', 'hevc', 'hevx', 'heim', 'heis', 'hevm', 'hevs', 'mif1'];\n const HEIC_MAJOR_BRAND_LENGTH = 4;\n\n const heicMajorBrand = getStringFromDataView(dataView, HEIC_ID_OFFSET + HEIC_ID.length, HEIC_MAJOR_BRAND_LENGTH);\n\n return (getStringFromDataView(dataView, HEIC_ID_OFFSET, HEIC_ID.length) === HEIC_ID)\n && (HEIC_MAJOR_BRANDS.indexOf(heicMajorBrand) !== -1);\n}\n\nfunction findHeicOffsets(dataView) {\n if (Constants.USE_EXIF || Constants.USE_ICC) {\n const {offset: metaOffset, length: metaLength} = findMetaAtom(dataView);\n if (metaOffset === undefined) {\n return {hasAppMarkers: false};\n }\n\n const metaEndOffset = Math.min(metaOffset + metaLength, dataView.byteLength);\n const {exifItemOffset, ilocOffset, colrOffset} = findMetaItems(dataView, metaOffset, metaEndOffset);\n\n const exifOffset = findExifOffset(dataView, exifItemOffset, ilocOffset, metaEndOffset);\n const iccChunks = findIccChunks(dataView, colrOffset, metaEndOffset);\n return {\n hasAppMarkers: (exifOffset !== undefined) || (iccChunks !== undefined),\n tiffHeaderOffset: exifOffset,\n iccChunks\n };\n }\n\n return {hasAppMarkers: false};\n}\n\nfunction findMetaAtom(dataView) {\n const ATOM_LENGTH_SIZE = 4;\n const ATOM_TYPE_SIZE = 4;\n const ATOM_MIN_LENGTH = 8;\n const ATOM_TYPE_OFFSET = 4;\n\n let offset = 0;\n\n while (offset + ATOM_LENGTH_SIZE + ATOM_TYPE_SIZE <= dataView.byteLength) {\n const atomLength = getAtomLength(dataView, offset);\n if (atomLength >= ATOM_MIN_LENGTH) {\n const atomType = getStringFromDataView(dataView, offset + ATOM_TYPE_OFFSET, ATOM_TYPE_SIZE);\n if (atomType === 'meta') {\n return {\n offset,\n length: atomLength\n };\n }\n }\n\n offset += atomLength;\n }\n\n return {\n offset: undefined,\n length: 0\n };\n}\n\nfunction getAtomLength(dataView, offset) {\n const ATOM_EXTENDED_SIZE_LOW_OFFSET = 12;\n\n const atomLength = dataView.getUint32(offset);\n if (extendsToEndOfFile(atomLength)) {\n return dataView.byteLength - offset;\n }\n if (hasExtendedSize(atomLength)) {\n if (hasEmptyHighBits(dataView, offset)) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return dataView.getUint32(offset + ATOM_EXTENDED_SIZE_LOW_OFFSET);\n }\n }\n\n return atomLength;\n}\n\nfunction extendsToEndOfFile(atomLength) {\n return atomLength === 0;\n}\n\nfunction hasExtendedSize(atomLength) {\n return atomLength === 1;\n}\n\nfunction hasEmptyHighBits(dataView, offset) {\n const ATOM_EXTENDED_SIZE_OFFSET = 8;\n return dataView.getUint32(offset + ATOM_EXTENDED_SIZE_OFFSET) === 0;\n}\n\nfunction findMetaItems(dataView, offset, metaEndOffset) {\n const STRING_SIZE = 4;\n const ITEM_INDEX_REL_OFFSET = -4;\n const offsets = {\n ilocOffset: undefined,\n exifItemOffset: undefined,\n colrOffset: undefined\n };\n\n while ((offset + STRING_SIZE <= metaEndOffset)\n && (!offsets.ilocOffset || !offsets.exifItemOffset || !offsets.colrOffset)) {\n const itemName = getStringFromDataView(dataView, offset, STRING_SIZE);\n if (Constants.USE_EXIF && (itemName === 'iloc')) {\n offsets.ilocOffset = offset;\n } else if (Constants.USE_EXIF && (itemName === 'Exif')) {\n offsets.exifItemOffset = offset + ITEM_INDEX_REL_OFFSET;\n } else if (Constants.USE_ICC && (itemName === 'colr')) {\n offsets.colrOffset = offset + ITEM_INDEX_REL_OFFSET;\n }\n\n offset++;\n }\n\n return offsets;\n}\n\nfunction findExifOffset(dataView, exifItemOffset, offset, metaEndOffset) {\n const EXIF_ITEM_OFFSET_SIZE = 2;\n const ILOC_DATA_OFFSET = 12;\n const EXIF_POINTER_OFFSET = 8;\n const EXIF_POINTER_SIZE = 4;\n const EXIF_PREFIX_LENGTH_OFFSET = 4;\n const ILOC_ITEM_SIZE = 16;\n\n if (!offset || !exifItemOffset || (exifItemOffset + EXIF_ITEM_OFFSET_SIZE > metaEndOffset)) {\n return undefined;\n }\n\n const exifItemIndex = dataView.getUint16(exifItemOffset);\n offset += ILOC_DATA_OFFSET;\n\n while (offset + ILOC_ITEM_SIZE <= metaEndOffset) {\n const itemIndex = dataView.getUint16(offset);\n if (itemIndex === exifItemIndex) {\n const exifPointer = dataView.getUint32(offset + EXIF_POINTER_OFFSET);\n if (exifPointer + EXIF_POINTER_SIZE <= dataView.byteLength) {\n const exifOffset = dataView.getUint32(exifPointer);\n const prefixLength = exifOffset + EXIF_PREFIX_LENGTH_OFFSET;\n return exifPointer + prefixLength;\n }\n }\n offset += ILOC_ITEM_SIZE;\n }\n\n return undefined;\n}\n\nfunction findIccChunks(dataView, offset, metaEndOffset) {\n const ITEM_TYPE_OFFSET = 8;\n const ITEM_TYPE_SIZE = 4;\n const ITEM_CONTENT_OFFSET = 12;\n\n if (!offset || (offset + ITEM_CONTENT_OFFSET > metaEndOffset)) {\n return undefined;\n }\n\n const colorType = getStringFromDataView(dataView, offset + ITEM_TYPE_OFFSET, ITEM_TYPE_SIZE);\n if ((colorType !== 'prof') && (colorType !== 'rICC')) {\n return undefined;\n }\n\n return [{\n offset: offset + ITEM_CONTENT_OFFSET,\n length: getAtomLength(dataView, offset) - ITEM_CONTENT_OFFSET,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isWebpFile,\n findOffsets\n};\n\nfunction isWebpFile(dataView) {\n const RIFF_ID_OFFSET = 0;\n const RIFF_ID = 'RIFF';\n const WEBP_MARKER_OFFSET = 8;\n const WEBP_MARKER = 'WEBP';\n\n return !!dataView && getStringFromDataView(dataView, RIFF_ID_OFFSET, RIFF_ID.length) === RIFF_ID\n && getStringFromDataView(dataView, WEBP_MARKER_OFFSET, WEBP_MARKER.length) === WEBP_MARKER;\n}\n\nfunction findOffsets(dataView) {\n const SUB_CHUNK_START_OFFSET = 12;\n const CHUNK_SIZE_OFFSET = 4;\n const EXIF_IDENTIFIER = 'Exif\\x00\\x00';\n const CHUNK_HEADER_SIZE = 8;\n\n let offset = SUB_CHUNK_START_OFFSET;\n let hasAppMarkers = false;\n let tiffHeaderOffset;\n let xmpChunks;\n let iccChunks;\n let vp8xChunkOffset;\n\n while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {\n const chunkId = getStringFromDataView(dataView, offset, 4);\n const chunkSize = dataView.getUint32(offset + CHUNK_SIZE_OFFSET, true);\n\n if (Constants.USE_EXIF && (chunkId === 'EXIF')) {\n hasAppMarkers = true;\n if (getStringFromDataView(dataView, offset + CHUNK_HEADER_SIZE, EXIF_IDENTIFIER.length) === EXIF_IDENTIFIER) {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE + EXIF_IDENTIFIER.length;\n } else {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE;\n }\n } else if (Constants.USE_XMP && (chunkId === 'XMP ')) {\n hasAppMarkers = true;\n xmpChunks = [{\n dataOffset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize\n }];\n } else if (Constants.USE_ICC && (chunkId === 'ICCP')) {\n hasAppMarkers = true;\n iccChunks = [{\n offset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n } else if (chunkId === 'VP8X') {\n hasAppMarkers = true;\n vp8xChunkOffset = offset + CHUNK_HEADER_SIZE;\n }\n\n offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);\n }\n\n return {\n hasAppMarkers,\n tiffHeaderOffset,\n xmpChunks,\n iccChunks,\n vp8xChunkOffset\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport Tiff from './image-header-tiff.js';\nimport Jpeg from './image-header-jpeg.js';\nimport Png from './image-header-png.js';\nimport Heic from './image-header-heic.js';\nimport Webp from './image-header-webp.js';\nimport {objectAssign} from './utils.js';\n\nexport default {\n parseAppMarkers\n};\n\nfunction parseAppMarkers(dataView) {\n if (Constants.USE_TIFF && Tiff.isTiffFile(dataView)) {\n return addFileType(Tiff.findTiffOffsets(), 'tiff', 'TIFF');\n }\n\n if (Constants.USE_JPEG && Jpeg.isJpegFile(dataView)) {\n return addFileType(Jpeg.findJpegOffsets(dataView), 'jpeg', 'JPEG');\n }\n\n if (Constants.USE_PNG && Png.isPngFile(dataView)) {\n return addFileType(Png.findPngOffsets(dataView), 'png', 'PNG');\n }\n\n if (Constants.USE_HEIC && Heic.isHeicFile(dataView)) {\n return addFileType(Heic.findHeicOffsets(dataView), 'heic', 'HEIC');\n }\n\n if (Constants.USE_WEBP && Webp.isWebpFile(dataView)) {\n return addFileType(Webp.findOffsets(dataView), 'webp', 'WebP');\n }\n\n throw new Error('Invalid image format');\n}\n\nfunction addFileType(offsets, fileType, fileTypeDescription) {\n return objectAssign({}, offsets, {fileType: {value: fileType, description: fileTypeDescription}});\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Constants from './constants.js';\n\nexport default {\n isTiffFile,\n findTiffOffsets\n};\n\nfunction isTiffFile(dataView) {\n const MIN_TIFF_DATA_BUFFER_LENGTH = 4;\n\n return !!dataView && (dataView.byteLength >= MIN_TIFF_DATA_BUFFER_LENGTH) && hasTiffMarker(dataView);\n}\n\nfunction hasTiffMarker(dataView) {\n const TIFF_ID = 0x2a;\n const TIFF_ID_OFFSET = 2;\n\n const littleEndian = dataView.getUint16(0) === ByteOrder.LITTLE_ENDIAN;\n return dataView.getUint16(TIFF_ID_OFFSET, littleEndian) === TIFF_ID;\n}\n\nfunction findTiffOffsets() {\n const TIFF_FILE_HEADER_OFFSET = 0;\n\n if (Constants.USE_EXIF) {\n return {\n hasAppMarkers: true,\n tiffHeaderOffset: TIFF_FILE_HEADER_OFFSET\n };\n }\n return {};\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\n\nconst typeSizes = {\n 1: 1, // BYTE\n 2: 1, // ASCII\n 3: 2, // SHORT\n 4: 4, // LONG\n 5: 8, // RATIONAL\n 7: 1, // UNDEFINED\n 9: 4, // SLONG\n 10: 8, // SRATIONAL\n 13: 4 // IFD\n};\n\nconst tagTypes = {\n 'BYTE': 1,\n 'ASCII': 2,\n 'SHORT': 3,\n 'LONG': 4,\n 'RATIONAL': 5,\n 'UNDEFINED': 7,\n 'SLONG': 9,\n 'SRATIONAL': 10,\n 'IFD': 13\n};\n\nexport default {\n getAsciiValue,\n getByteAt,\n getAsciiAt,\n getShortAt,\n getLongAt,\n getRationalAt,\n getUndefinedAt,\n getSlongAt,\n getSrationalAt,\n getIfdPointerAt,\n typeSizes,\n tagTypes,\n getTypeSize\n};\n\nfunction getAsciiValue(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode));\n}\n\nfunction getByteAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getAsciiAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getShortAt(dataView, offset, byteOrder) {\n return dataView.getUint16(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getLongAt(dataView, offset, byteOrder) {\n return dataView.getUint32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getRationalAt(dataView, offset, byteOrder) {\n return [getLongAt(dataView, offset, byteOrder), getLongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getUndefinedAt(dataView, offset) {\n return getByteAt(dataView, offset);\n}\n\nfunction getSlongAt(dataView, offset, byteOrder) {\n return dataView.getInt32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getSrationalAt(dataView, offset, byteOrder) {\n return [getSlongAt(dataView, offset, byteOrder), getSlongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getIfdPointerAt(dataView, offset, byteOrder) {\n return getLongAt(dataView, offset, byteOrder);\n}\n\nfunction getTypeSize(typeName) {\n if (tagTypes[typeName] === undefined) {\n throw new Error('No such type found.');\n }\n\n return typeSizes[tagTypes[typeName]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n ApertureValue: (value) => Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2),\n ColorSpace(value) {\n if (value === 1) {\n return 'sRGB';\n } else if (value === 0xffff) {\n return 'Uncalibrated';\n }\n return 'Unknown';\n },\n ComponentsConfiguration(value) {\n return value.map((character) => {\n if (character === 0x31) {\n return 'Y';\n } else if (character === 0x32) {\n return 'Cb';\n } else if (character === 0x33) {\n return 'Cr';\n } else if (character === 0x34) {\n return 'R';\n } else if (character === 0x35) {\n return 'G';\n } else if (character === 0x36) {\n return 'B';\n }\n }).join('');\n },\n Contrast(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n CustomRendered(value) {\n if (value === 0) {\n return 'Normal process';\n } else if (value === 1) {\n return 'Custom process';\n }\n return 'Unknown';\n },\n ExposureMode(value) {\n if (value === 0) {\n return 'Auto exposure';\n } else if (value === 1) {\n return 'Manual exposure';\n } else if (value === 2) {\n return 'Auto bracket';\n }\n return 'Unknown';\n },\n ExposureProgram(value) {\n if (value === 0) {\n return 'Undefined';\n } else if (value === 1) {\n return 'Manual';\n } else if (value === 2) {\n return 'Normal program';\n } else if (value === 3) {\n return 'Aperture priority';\n } else if (value === 4) {\n return 'Shutter priority';\n } else if (value === 5) {\n return 'Creative program';\n } else if (value === 6) {\n return 'Action program';\n } else if (value === 7) {\n return 'Portrait mode';\n } else if (value === 8) {\n return 'Landscape mode';\n } else if (value === 9) {\n return 'Bulb';\n }\n return 'Unknown';\n },\n ExposureTime(value) {\n if (value[0] >= value[1]) {\n return `${Math.round(value[0] / value[1])}`;\n }\n if (value[0] !== 0) {\n return `1/${Math.round(value[1] / value[0])}`;\n }\n return `0/${value[1]}`;\n },\n FNumber: (value) => `f/${value[0] / value[1]}`,\n FocalLength: (value) => (value[0] / value[1]) + ' mm',\n FocalPlaneResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n } else if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n LightSource: (value) => {\n if (value === 1) {\n return 'Daylight';\n } else if (value === 2) {\n return 'Fluorescent';\n } else if (value === 3) {\n return 'Tungsten (incandescent light)';\n } else if (value === 4) {\n return 'Flash';\n } else if (value === 9) {\n return 'Fine weather';\n } else if (value === 10) {\n return 'Cloudy weather';\n } else if (value === 11) {\n return 'Shade';\n } else if (value === 12) {\n return 'Daylight fluorescent (D 5700 – 7100K)';\n } else if (value === 13) {\n return 'Day white fluorescent (N 4600 – 5400K)';\n } else if (value === 14) {\n return 'Cool white fluorescent (W 3900 – 4500K)';\n } else if (value === 15) {\n return 'White fluorescent (WW 3200 – 3700K)';\n } else if (value === 17) {\n return 'Standard light A';\n } else if (value === 18) {\n return 'Standard light B';\n } else if (value === 19) {\n return 'Standard light C';\n } else if (value === 20) {\n return 'D55';\n } else if (value === 21) {\n return 'D65';\n } else if (value === 22) {\n return 'D75';\n } else if (value === 23) {\n return 'D50';\n } else if (value === 24) {\n return 'ISO studio tungsten';\n } else if (value === 255) {\n return 'Other light source';\n }\n return 'Unknown';\n },\n MeteringMode(value) {\n if (value === 1) {\n return 'Average';\n } else if (value === 2) {\n return 'CenterWeightedAverage';\n } else if (value === 3) {\n return 'Spot';\n } else if (value === 4) {\n return 'MultiSpot';\n } else if (value === 5) {\n return 'Pattern';\n } else if (value === 6) {\n return 'Partial';\n } else if (value === 255) {\n return 'Other';\n }\n return 'Unknown';\n },\n ResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n }\n if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n Saturation(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Low saturation';\n } else if (value === 2) {\n return 'High saturation';\n }\n return 'Unknown';\n },\n SceneCaptureType(value) {\n if (value === 0) {\n return 'Standard';\n } else if (value === 1) {\n return 'Landscape';\n } else if (value === 2) {\n return 'Portrait';\n } else if (value === 3) {\n return 'Night scene';\n }\n return 'Unknown';\n },\n Sharpness(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n ShutterSpeedValue(value) {\n const denominator = Math.pow(2, value[0] / value[1]);\n if (denominator <= 1) {\n return `${Math.round(1 / denominator)}`;\n }\n return `1/${Math.round(denominator)}`;\n },\n WhiteBalance(value) {\n if (value === 0) {\n return 'Auto white balance';\n } else if (value === 1) {\n return 'Manual white balance';\n }\n return 'Unknown';\n },\n XResolution: (value) => '' + Math.round(value[0] / value[1]),\n YResolution: (value) => '' + Math.round(value[0] / value[1])\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x000b: 'ProcessingSoftware',\n 0x00fe: {\n name: 'SubfileType',\n description: (value) => ({\n 0x0: 'Full-resolution image',\n 0x1: 'Reduced-resolution image',\n 0x2: 'Single page of multi-page image',\n 0x3: 'Single page of multi-page reduced-resolution image',\n 0x4: 'Transparency mask',\n 0x5: 'Transparency mask of reduced-resolution image',\n 0x6: 'Transparency mask of multi-page image',\n 0x7: 'Transparency mask of reduced-resolution multi-page image',\n 0x10001: 'Alternate reduced-resolution image',\n 0xffffffff: 'Invalid'\n })[value] || 'Unknown'\n },\n 0x00ff: {\n name: 'OldSubfileType',\n description: (value) => ({\n 0: 'Full-resolution image',\n 1: 'Reduced-resolution image',\n 2: 'Single page of multi-page image'\n })[value] || 'Unknown'\n },\n 0x0100: 'ImageWidth',\n 0x0101: 'ImageLength',\n 0x0102: 'BitsPerSample',\n 0x0103: 'Compression',\n 0x0106: 'PhotometricInterpretation',\n 0x0107: {\n name: 'Thresholding',\n description: (value) => ({\n 1: 'No dithering or halftoning',\n 2: 'Ordered dither or halfton',\n 3: 'Randomized dither'\n })[value] || 'Unknown'\n },\n 0x0108: 'CellWidth',\n 0x0109: 'CellLength',\n 0x010a: {\n name: 'FillOrder',\n description: (value) => ({\n 1: 'Normal',\n 2: 'Reversed'\n })[value] || 'Unknown'\n },\n 0x010d: 'DocumentName',\n 0x010e: 'ImageDescription',\n 0x010f: 'Make',\n 0x0110: 'Model',\n 0x0111: 'StripOffsets',\n 0x0112: {\n name: 'Orientation',\n description: (value) => {\n if (value === 1) {\n return 'top-left';\n }\n if (value === 2) {\n return 'top-right';\n }\n if (value === 3) {\n return 'bottom-right';\n }\n if (value === 4) {\n return 'bottom-left';\n }\n if (value === 5) {\n return 'left-top';\n }\n if (value === 6) {\n return 'right-top';\n }\n if (value === 7) {\n return 'right-bottom';\n }\n if (value === 8) {\n return 'left-bottom';\n }\n return 'Undefined';\n }\n },\n 0x0115: 'SamplesPerPixel',\n 0x0116: 'RowsPerStrip',\n 0x0117: 'StripByteCounts',\n 0x0118: 'MinSampleValue',\n 0x0119: 'MaxSampleValue',\n 0x011a: {\n 'name': 'XResolution',\n 'description': TagNamesCommon.XResolution\n },\n 0x011b: {\n 'name': 'YResolution',\n 'description': TagNamesCommon.YResolution\n },\n 0x011c: 'PlanarConfiguration',\n 0x011d: 'PageName',\n 0x011e: {\n 'name': 'XPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011f: {\n 'name': 'YPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x0122: {\n name: 'GrayResponseUnit',\n description: (value) => ({\n 1: '0.1',\n 2: '0.001',\n 3: '0.0001',\n 4: '1e-05',\n 5: '1e-06'\n })[value] || 'Unknown'\n },\n 0x0128: {\n name: 'ResolutionUnit',\n description: TagNamesCommon.ResolutionUnit\n },\n 0x0129: 'PageNumber',\n 0x012d: 'TransferFunction',\n 0x0131: 'Software',\n 0x0132: 'DateTime',\n 0x013b: 'Artist',\n 0x013c: 'HostComputer',\n 0x013d: 'Predictor',\n 0x013e: {\n 'name': 'WhitePoint',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x013f: {\n 'name': 'PrimaryChromaticities',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x0141: 'HalftoneHints',\n 0x0142: 'TileWidth',\n 0x0143: 'TileLength',\n 0x014a: 'A100DataOffset',\n 0x014c: {\n name: 'InkSet',\n description: (value) => ({\n 1: 'CMYK',\n 2: 'Not CMYK'\n })[value] || 'Unknown'\n },\n 0x0151: 'TargetPrinter',\n 0x0152: {\n name: 'ExtraSamples',\n description: (value) => ({\n 0: 'Unspecified',\n 1: 'Associated Alpha',\n 2: 'Unassociated Alpha',\n })[value] || 'Unknown'\n },\n 0x0153: {\n name: 'SampleFormat',\n description: (value) => {\n const formats = {\n 1: 'Unsigned',\n 2: 'Signed',\n 3: 'Float',\n 4: 'Undefined',\n 5: 'Complex int',\n 6: 'Complex float',\n };\n if (!Array.isArray(value)) {\n return 'Unknown';\n }\n return value.map((sample) => formats[sample] || 'Unknown').join(', ');\n }\n },\n 0x0201: 'JPEGInterchangeFormat',\n 0x0202: 'JPEGInterchangeFormatLength',\n 0x0211: {\n 'name': 'YCbCrCoefficients',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join('/');\n }\n },\n 0x0212: 'YCbCrSubSampling',\n 0x0213: {\n name: 'YCbCrPositioning',\n description: (value) => {\n if (value === 1) {\n return 'centered';\n }\n if (value === 2) {\n return 'co-sited';\n }\n return 'undefined ' + value;\n }\n },\n 0x0214: {\n 'name': 'ReferenceBlackWhite',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join(', ');\n }\n },\n 0x02bc: 'ApplicationNotes',\n 0x4746: 'Rating',\n 0x4749: 'RatingPercent',\n 0x8298: {\n name: 'Copyright',\n description: (value) => value.join('; ')\n },\n 0x830e: 'PixelScale',\n 0x83bb: 'IPTC-NAA',\n 0x8480: 'IntergraphMatrix',\n 0x8482: 'ModelTiePoint',\n 0x8546: 'SEMInfo',\n 0x85d8: 'ModelTransform',\n 0x8649: 'PhotoshopSettings',\n 0x8769: 'Exif IFD Pointer',\n 0x8773: 'ICC_Profile',\n 0x87af: 'GeoTiffDirectory',\n 0x87b0: 'GeoTiffDoubleParams',\n 0x87b1: 'GeoTiffAsciiParams',\n 0x8825: 'GPS Info IFD Pointer',\n 0x9c9b: 'XPTitle',\n 0x9c9c: 'XPComment',\n 0x9c9d: 'XPAuthor',\n 0x9c9e: 'XPKeywords',\n 0x9c9f: 'XPSubject',\n 0xa480: 'GDALMetadata',\n 0xa481: 'GDALNoData',\n 0xc4a5: 'PrintIM',\n 0xc613: 'DNGBackwardVersion',\n 0xc614: 'UniqueCameraModel',\n 0xc615: 'LocalizedCameraModel',\n 0xc621: 'ColorMatrix1',\n 0xc622: 'ColorMatrix2',\n 0xc623: 'CameraCalibration1',\n 0xc624: 'CameraCalibration2',\n 0xc625: 'ReductionMatrix1',\n 0xc626: 'ReductionMatrix2',\n 0xc627: 'AnalogBalance',\n 0xc628: 'AsShotNeutral',\n 0xc629: 'AsShotWhiteXY',\n 0xc62a: 'BaselineExposure',\n 0xc62b: 'BaselineNoise',\n 0xc62c: 'BaselineSharpness',\n 0xc62e: 'LinearResponseLimit',\n 0xc62f: 'CameraSerialNumber',\n 0xc630: 'DNGLensInfo',\n 0xc633: 'ShadowScale',\n 0xc635: {\n name: 'MakerNoteSafety',\n description: (value) => ({\n 0: 'Unsafe',\n 1: 'Safe'\n })[value] || 'Unknown'\n },\n 0xc65a: {\n name: 'CalibrationIlluminant1',\n description: TagNamesCommon['LightSource']\n },\n 0xc65b: {\n name: 'CalibrationIlluminant2',\n description: TagNamesCommon['LightSource']\n },\n 0xc65d: 'RawDataUniqueID',\n 0xc68b: 'OriginalRawFileName',\n 0xc68c: 'OriginalRawFileData',\n 0xc68f: 'AsShotICCProfile',\n 0xc690: 'AsShotPreProfileMatrix',\n 0xc691: 'CurrentICCProfile',\n 0xc692: 'CurrentPreProfileMatrix',\n 0xc6bf: 'ColorimetricReference',\n 0xc6c5: 'SRawType',\n 0xc6d2: 'PanasonicTitle',\n 0xc6d3: 'PanasonicTitle2',\n 0xc6f3: 'CameraCalibrationSig',\n 0xc6f4: 'ProfileCalibrationSig',\n 0xc6f5: 'ProfileIFD',\n 0xc6f6: 'AsShotProfileName',\n 0xc6f8: 'ProfileName',\n 0xc6f9: 'ProfileHueSatMapDims',\n 0xc6fa: 'ProfileHueSatMapData1',\n 0xc6fb: 'ProfileHueSatMapData2',\n 0xc6fc: 'ProfileToneCurve',\n 0xc6fd: {\n name: 'ProfileEmbedPolicy',\n description: (value) => ({\n 0: 'Allow Copying',\n 1: 'Embed if Used',\n 2: 'Never Embed',\n 3: 'No Restrictions'\n })[value] || 'Unknown'\n },\n 0xc6fe: 'ProfileCopyright',\n 0xc714: 'ForwardMatrix1',\n 0xc715: 'ForwardMatrix2',\n 0xc716: 'PreviewApplicationName',\n 0xc717: 'PreviewApplicationVersion',\n 0xc718: 'PreviewSettingsName',\n 0xc719: 'PreviewSettingsDigest',\n 0xc71a: {\n name: 'PreviewColorSpace',\n description: (value) => ({\n 1: 'Gray Gamma 2.2',\n 2: 'sRGB',\n 3: 'Adobe RGB',\n 4: 'ProPhoto RGB'\n })[value] || 'Unknown'\n },\n 0xc71b: 'PreviewDateTime',\n 0xc71c: 'RawImageDigest',\n 0xc71d: 'OriginalRawFileDigest',\n 0xc725: 'ProfileLookTableDims',\n 0xc726: 'ProfileLookTableData',\n 0xc763: 'TimeCodes',\n 0xc764: 'FrameRate',\n 0xc772: 'TStop',\n 0xc789: 'ReelName',\n 0xc791: 'OriginalDefaultFinalSize',\n 0xc792: 'OriginalBestQualitySize',\n 0xc793: 'OriginalDefaultCropSize',\n 0xc7a1: 'CameraLabel',\n 0xc7a3: {\n name: 'ProfileHueSatMapEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a4: {\n name: 'ProfileLookTableEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a5: 'BaselineExposureOffset',\n 0xc7a6: {\n name: 'DefaultBlackRender',\n description: (value) => ({\n 0: 'Auto',\n 1: 'None'\n })[value] || 'Unknown'\n },\n 0xc7a7: 'NewRawImageDigest',\n 0xc7a8: 'RawToPreviewGain'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getEncodedString, getCalculatedGpsValue} from './tag-names-utils.js';\n\nexport default {\n 0x0000: {\n 'name': 'GPSVersionID',\n 'description': (value) => {\n if (value[0] === 2 && value[1] === 2 && value[2] === 0 && value[3] === 0) {\n return 'Version 2.2';\n }\n return 'Unknown';\n }\n },\n 0x0001: {\n 'name': 'GPSLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0002: {\n 'name': 'GPSLatitude',\n 'description': getCalculatedGpsValue\n },\n 0x0003: {\n 'name': 'GPSLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0004: {\n 'name': 'GPSLongitude',\n 'description': getCalculatedGpsValue\n },\n 0x0005: {\n 'name': 'GPSAltitudeRef',\n 'description': (value) => {\n if (value === 0) {\n return 'Sea level';\n } else if (value === 1) {\n return 'Sea level reference (negative value)';\n }\n return 'Unknown';\n }\n },\n 0x0006: {\n 'name': 'GPSAltitude',\n 'description': (value) => {\n return (value[0] / value[1]) + ' m';\n }\n },\n 0x0007: {\n 'name': 'GPSTimeStamp',\n 'description': (values) => {\n return values.map(([numerator, denominator]) => {\n const num = numerator / denominator;\n if (/^\\d(\\.|$)/.test(`${num}`)) {\n return `0${num}`;\n }\n return num;\n }).join(':');\n }\n },\n 0x0008: 'GPSSatellites',\n 0x0009: {\n 'name': 'GPSStatus',\n 'description': (value) => {\n const status = value.join('');\n if (status === 'A') {\n return 'Measurement in progress';\n } else if (status === 'V') {\n return 'Measurement Interoperability';\n }\n return 'Unknown';\n }\n },\n 0x000a: {\n 'name': 'GPSMeasureMode',\n 'description': (value) => {\n const mode = value.join('');\n if (mode === '2') {\n return '2-dimensional measurement';\n } else if (mode === '3') {\n return '3-dimensional measurement';\n }\n return 'Unknown';\n }\n },\n 0x000b: 'GPSDOP',\n 0x000c: {\n 'name': 'GPSSpeedRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers per hour';\n } else if (ref === 'M') {\n return 'Miles per hour';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x000d: 'GPSSpeed',\n 0x000e: {\n 'name': 'GPSTrackRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x000f: 'GPSTrack',\n 0x0010: {\n 'name': 'GPSImgDirectionRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0011: 'GPSImgDirection',\n 0x0012: 'GPSMapDatum',\n 0x0013: {\n 'name': 'GPSDestLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0014: {\n 'name': 'GPSDestLatitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0015: {\n 'name': 'GPSDestLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0016: {\n 'name': 'GPSDestLongitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0017: {\n 'name': 'GPSDestBearingRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0018: 'GPSDestBearing',\n 0x0019: {\n 'name': 'GPSDestDistanceRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers';\n } else if (ref === 'M') {\n return 'Miles';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x001a: 'GPSDestDistance',\n 0x001b: {\n 'name': 'GPSProcessingMethod',\n 'description': getEncodedString\n },\n 0x001c: {\n 'name': 'GPSAreaInformation',\n 'description': getEncodedString\n },\n 0x001d: 'GPSDateStamp',\n 0x001e: {\n 'name': 'GPSDifferential',\n 'description': (value) => {\n if (value === 0) {\n return 'Measurement without differential correction';\n } else if (value === 1) {\n return 'Differential correction applied';\n }\n return 'Unknown';\n }\n },\n 0x001f: 'GPSHPositioningError'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0x0001: 'InteroperabilityIndex',\n 0x0002: {\n name: 'InteroperabilityVersion',\n description: (value) => getStringValue(value)\n },\n 0x1000: 'RelatedImageFileFormat',\n 0x1001: 'RelatedImageWidth',\n 0x1002: 'RelatedImageHeight'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0xb000: {\n 'name': 'MPFVersion',\n 'description': (value) => getStringValue(value)\n },\n 0xb001: 'NumberOfImages',\n 0xb002: 'MPEntry',\n 0xb003: 'ImageUIDList',\n 0xb004: 'TotalFrames'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport Constants from './constants.js';\nimport TagNames0thIfd from './tag-names-0th-ifd.js';\nimport TagNamesExifIfd from './tag-names-exif-ifd.js';\nimport TagNamesGpsIfd from './tag-names-gps-ifd.js';\nimport TagNamesInteroperabilityIfd from './tag-names-interoperability-ifd.js';\nimport TagNamesMpfIfd from './tag-names-mpf-ifd.js';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport const IFD_TYPE_0TH = '0th';\nexport const IFD_TYPE_1ST = '1st';\nexport const IFD_TYPE_EXIF = 'exif';\nexport const IFD_TYPE_GPS = 'gps';\nexport const IFD_TYPE_INTEROPERABILITY = 'interoperability';\nexport const IFD_TYPE_MPF = 'mpf';\n\nexport default {\n [IFD_TYPE_0TH]: tagNames0thExifIfds,\n [IFD_TYPE_1ST]: TagNames0thIfd,\n [IFD_TYPE_EXIF]: tagNames0thExifIfds,\n [IFD_TYPE_GPS]: TagNamesGpsIfd,\n [IFD_TYPE_INTEROPERABILITY]: TagNamesInteroperabilityIfd,\n [IFD_TYPE_MPF]: Constants.USE_MPF ? TagNamesMpfIfd : {},\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue, getEncodedString} from './tag-names-utils.js';\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x829a: {\n 'name': 'ExposureTime',\n 'description': TagNamesCommon.ExposureTime\n },\n 0x829d: {\n 'name': 'FNumber',\n 'description': TagNamesCommon.FNumber\n },\n 0x8822: {\n 'name': 'ExposureProgram',\n 'description': TagNamesCommon.ExposureProgram\n },\n 0x8824: 'SpectralSensitivity',\n 0x8827: 'ISOSpeedRatings',\n 0x8828: {\n 'name': 'OECF',\n 'description': () => '[Raw OECF table data]'\n },\n 0x882a: 'TimeZoneOffset',\n 0x882b: 'SelfTimerMode',\n 0x8830: {\n name: 'SensitivityType',\n description: (value) => ({\n 1: 'Standard Output Sensitivity',\n 2: 'Recommended Exposure Index',\n 3: 'ISO Speed',\n 4: 'Standard Output Sensitivity and Recommended Exposure Index',\n 5: 'Standard Output Sensitivity and ISO Speed',\n 6: 'Recommended Exposure Index and ISO Speed',\n 7: 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed'\n })[value] || 'Unknown'\n },\n 0x8831: 'StandardOutputSensitivity',\n 0x8832: 'RecommendedExposureIndex',\n 0x8833: 'ISOSpeed',\n 0x8834: 'ISOSpeedLatitudeyyy',\n 0x8835: 'ISOSpeedLatitudezzz',\n 0x9000: {\n 'name': 'ExifVersion',\n 'description': (value) => getStringValue(value)\n },\n 0x9003: 'DateTimeOriginal',\n 0x9004: 'DateTimeDigitized',\n 0x9009: 'GooglePlusUploadCode',\n 0x9010: 'OffsetTime',\n 0x9011: 'OffsetTimeOriginal',\n 0x9012: 'OffsetTimeDigitized',\n 0x9101: {\n 'name': 'ComponentsConfiguration',\n 'description': TagNamesCommon.ComponentsConfiguration\n },\n 0x9102: 'CompressedBitsPerPixel',\n 0x9201: {\n 'name': 'ShutterSpeedValue',\n 'description': TagNamesCommon.ShutterSpeedValue\n },\n 0x9202: {\n 'name': 'ApertureValue',\n 'description': TagNamesCommon.ApertureValue\n },\n 0x9203: 'BrightnessValue',\n 0x9204: 'ExposureBiasValue',\n 0x9205: {\n 'name': 'MaxApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9206: {\n 'name': 'SubjectDistance',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9207: {\n 'name': 'MeteringMode',\n 'description': TagNamesCommon.MeteringMode\n },\n 0x9208: {\n 'name': 'LightSource',\n description: TagNamesCommon.LightSource\n },\n 0x9209: {\n 'name': 'Flash',\n 'description': (value) => {\n if (value === 0x00) {\n return 'Flash did not fire';\n } else if (value === 0x01) {\n return 'Flash fired';\n } else if (value === 0x05) {\n return 'Strobe return light not detected';\n } else if (value === 0x07) {\n return 'Strobe return light detected';\n } else if (value === 0x09) {\n return 'Flash fired, compulsory flash mode';\n } else if (value === 0x0d) {\n return 'Flash fired, compulsory flash mode, return light not detected';\n } else if (value === 0x0f) {\n return 'Flash fired, compulsory flash mode, return light detected';\n } else if (value === 0x10) {\n return 'Flash did not fire, compulsory flash mode';\n } else if (value === 0x18) {\n return 'Flash did not fire, auto mode';\n } else if (value === 0x19) {\n return 'Flash fired, auto mode';\n } else if (value === 0x1d) {\n return 'Flash fired, auto mode, return light not detected';\n } else if (value === 0x1f) {\n return 'Flash fired, auto mode, return light detected';\n } else if (value === 0x20) {\n return 'No flash function';\n } else if (value === 0x41) {\n return 'Flash fired, red-eye reduction mode';\n } else if (value === 0x45) {\n return 'Flash fired, red-eye reduction mode, return light not detected';\n } else if (value === 0x47) {\n return 'Flash fired, red-eye reduction mode, return light detected';\n } else if (value === 0x49) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode';\n } else if (value === 0x4d) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected';\n } else if (value === 0x4f) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected';\n } else if (value === 0x59) {\n return 'Flash fired, auto mode, red-eye reduction mode';\n } else if (value === 0x5d) {\n return 'Flash fired, auto mode, return light not detected, red-eye reduction mode';\n } else if (value === 0x5f) {\n return 'Flash fired, auto mode, return light detected, red-eye reduction mode';\n }\n return 'Unknown';\n }\n },\n 0x920a: {\n 'name': 'FocalLength',\n 'description': TagNamesCommon.FocalLength\n },\n 0x9211: 'ImageNumber',\n 0x9212: {\n name: 'SecurityClassification',\n description: (value) => ({\n 'C': 'Confidential',\n 'R': 'Restricted',\n 'S': 'Secret',\n 'T': 'Top Secret',\n 'U': 'Unclassified'\n })[value] || 'Unknown'\n },\n 0x9213: 'ImageHistory',\n 0x9214: {\n 'name': 'SubjectArea',\n 'description': (value) => {\n if (value.length === 2) {\n return `Location; X: ${value[0]}, Y: ${value[1]}`;\n } else if (value.length === 3) {\n return `Circle; X: ${value[0]}, Y: ${value[1]}, diameter: ${value[2]}`;\n } else if (value.length === 4) {\n return `Rectangle; X: ${value[0]}, Y: ${value[1]}, width: ${value[2]}, height: ${value[3]}`;\n }\n return 'Unknown';\n }\n },\n 0x927c: {\n 'name': 'MakerNote',\n 'description': () => '[Raw maker note data]'\n },\n 0x9286: {\n 'name': 'UserComment',\n 'description': getEncodedString\n },\n 0x9290: 'SubSecTime',\n 0x9291: 'SubSecTimeOriginal',\n 0x9292: 'SubSecTimeDigitized',\n 0x9400: {\n 'name': 'AmbientTemperature',\n 'description': (value) => (value[0] / value[1]) + ' °C'\n },\n 0x9401: {\n 'name': 'Humidity',\n 'description': (value) => (value[0] / value[1]) + ' %'\n },\n 0x9402: {\n 'name': 'Pressure',\n 'description': (value) => (value[0] / value[1]) + ' hPa'\n },\n 0x9403: {\n 'name': 'WaterDepth',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9404: {\n 'name': 'Acceleration',\n 'description': (value) => (value[0] / value[1]) + ' mGal'\n },\n 0x9405: {\n 'name': 'CameraElevationAngle',\n 'description': (value) => (value[0] / value[1]) + ' °'\n },\n 0xa000: {\n 'name': 'FlashpixVersion',\n 'description': (value) => value.map((charCode) => String.fromCharCode(charCode)).join('')\n },\n 0xa001: {\n 'name': 'ColorSpace',\n 'description': TagNamesCommon.ColorSpace\n },\n 0xa002: 'PixelXDimension',\n 0xa003: 'PixelYDimension',\n 0xa004: 'RelatedSoundFile',\n 0xa005: 'Interoperability IFD Pointer',\n 0xa20b: 'FlashEnergy',\n 0xa20c: {\n 'name': 'SpatialFrequencyResponse',\n 'description': () => '[Raw SFR table data]'\n },\n 0xa20e: 'FocalPlaneXResolution',\n 0xa20f: 'FocalPlaneYResolution',\n 0xa210: {\n 'name': 'FocalPlaneResolutionUnit',\n 'description': TagNamesCommon.FocalPlaneResolutionUnit\n },\n 0xa214: {\n 'name': 'SubjectLocation',\n 'description': ([x, y]) => `X: ${x}, Y: ${y}`\n },\n 0xa215: 'ExposureIndex',\n 0xa217: {\n 'name': 'SensingMethod',\n 'description': (value) => {\n if (value === 1) {\n return 'Undefined';\n } else if (value === 2) {\n return 'One-chip color area sensor';\n } else if (value === 3) {\n return 'Two-chip color area sensor';\n } else if (value === 4) {\n return 'Three-chip color area sensor';\n } else if (value === 5) {\n return 'Color sequential area sensor';\n } else if (value === 7) {\n return 'Trilinear sensor';\n } else if (value === 8) {\n return 'Color sequential linear sensor';\n }\n return 'Unknown';\n }\n },\n 0xa300: {\n 'name': 'FileSource',\n 'description': (value) => {\n if (value === 3) {\n return 'DSC';\n }\n return 'Unknown';\n }\n },\n 0xa301: {\n 'name': 'SceneType',\n 'description': (value) => {\n if (value === 1) {\n return 'A directly photographed image';\n }\n return 'Unknown';\n }\n },\n 0xa302: {\n 'name': 'CFAPattern',\n 'description': () => '[Raw CFA pattern table data]'\n },\n 0xa401: {\n 'name': 'CustomRendered',\n 'description': TagNamesCommon.CustomRendered\n },\n 0xa402: {\n 'name': 'ExposureMode',\n 'description': TagNamesCommon.ExposureMode\n },\n 0xa403: {\n 'name': 'WhiteBalance',\n 'description': TagNamesCommon.WhiteBalance\n },\n 0xa404: {\n 'name': 'DigitalZoomRatio',\n 'description': (value) => {\n if (value[0] === 0) {\n return 'Digital zoom was not used';\n }\n return '' + (value[0] / value[1]);\n }\n },\n 0xa405: {\n 'name': 'FocalLengthIn35mmFilm',\n 'description': (value) => {\n if (value === 0) {\n return 'Unknown';\n }\n return value;\n }\n },\n 0xa406: {\n 'name': 'SceneCaptureType',\n 'description': TagNamesCommon.SceneCaptureType\n },\n 0xa407: {\n 'name': 'GainControl',\n 'description': (value) => {\n if (value === 0) {\n return 'None';\n } else if (value === 1) {\n return 'Low gain up';\n } else if (value === 2) {\n return 'High gain up';\n } else if (value === 3) {\n return 'Low gain down';\n } else if (value === 4) {\n return 'High gain down';\n }\n return 'Unknown';\n }\n },\n 0xa408: {\n 'name': 'Contrast',\n 'description': TagNamesCommon.Contrast\n },\n 0xa409: {\n 'name': 'Saturation',\n 'description': TagNamesCommon.Saturation\n },\n 0xa40a: {\n 'name': 'Sharpness',\n 'description': TagNamesCommon.Sharpness\n },\n 0xa40b: {\n 'name': 'DeviceSettingDescription',\n 'description': () => '[Raw device settings table data]'\n },\n 0xa40c: {\n 'name': 'SubjectDistanceRange',\n 'description': (value) => {\n if (value === 1) {\n return 'Macro';\n } else if (value === 2) {\n return 'Close view';\n } else if (value === 3) {\n return 'Distant view';\n }\n return 'Unknown';\n }\n },\n 0xa420: 'ImageUniqueID',\n 0xa430: 'CameraOwnerName',\n 0xa431: 'BodySerialNumber',\n 0xa432: {\n 'name': 'LensSpecification',\n 'description': (value) => {\n const focalLengths = `${value[0][0] / value[0][1]}-${value[1][0] / value[1][1]} mm`;\n if (value[3][1] === 0) {\n return `${focalLengths} f/?`;\n }\n return `${focalLengths} f/${1 / ((value[2][1] / value[2][1]) / (value[3][0] / value[3][1]))}`;\n }\n },\n 0xa433: 'LensMake',\n 0xa434: 'LensModel',\n 0xa435: 'LensSerialNumber',\n 0xa460: {\n name: 'CompositeImage',\n description: (value) => ({\n 1: 'Not a Composite Image',\n 2: 'General Composite Image',\n 3: 'Composite Image Captured While Shooting',\n })[value] || 'Unknown'\n },\n 0xa461: 'SourceImageNumberOfCompositeImage',\n 0xa462: 'SourceExposureTimesOfCompositeImage',\n 0xa500: 'Gamma',\n 0xea1c: 'Padding',\n 0xea1d: 'OffsetSchema',\n 0xfde8: 'OwnerName',\n 0xfde9: 'SerialNumber',\n 0xfdea: 'Lens',\n 0xfe4c: 'RawFile',\n 0xfe4d: 'Converter',\n 0xfe4e: 'WhiteBalance',\n 0xfe51: 'Exposure',\n 0xfe52: 'Shadows',\n 0xfe53: 'Brightness',\n 0xfe54: 'Contrast',\n 0xfe55: 'Saturation',\n 0xfe56: 'Sharpness',\n 0xfe57: 'Smoothness',\n 0xfe58: 'MoireFilter'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport TagNames, {IFD_TYPE_0TH, IFD_TYPE_1ST, IFD_TYPE_EXIF, IFD_TYPE_GPS, IFD_TYPE_INTEROPERABILITY, IFD_TYPE_MPF} from './tag-names.js';\nimport {deferInit, getBase64Image} from './utils.js';\n\nconst EXIF_IFD_POINTER_KEY = 'Exif IFD Pointer';\nconst GPS_INFO_IFD_POINTER_KEY = 'GPS Info IFD Pointer';\nconst INTEROPERABILITY_IFD_POINTER_KEY = 'Interoperability IFD Pointer';\n\nconst getTagValueAt = {\n 1: Types.getByteAt,\n 2: Types.getAsciiAt,\n 3: Types.getShortAt,\n 4: Types.getLongAt,\n 5: Types.getRationalAt,\n 7: Types.getUndefinedAt,\n 9: Types.getSlongAt,\n 10: Types.getSrationalAt,\n 13: Types.getIfdPointerAt\n};\n\nexport default {\n read,\n readMpf\n};\n\nfunction read(dataView, tiffHeaderOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n\n return tags;\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n return readIfd(dataView, IFD_TYPE_0TH, tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder, includeUnknown);\n}\n\nfunction get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_EXIF, tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[GPS_INFO_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_GPS, tiffHeaderOffset, tiffHeaderOffset + tags[GPS_INFO_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_INTEROPERABILITY, tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readMpf(dataView, dataOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, dataOffset);\n const tags = readIfd(dataView, IFD_TYPE_MPF, dataOffset, get0thIfdOffset(dataView, dataOffset, byteOrder), byteOrder, includeUnknown);\n return addMpfImages(dataView, dataOffset, tags, byteOrder);\n}\n\nfunction addMpfImages(dataView, dataOffset, tags, byteOrder) {\n const ENTRY_SIZE = 16;\n\n if (!tags['MPEntry']) {\n return tags;\n }\n\n const images = [];\n for (let i = 0; i < Math.ceil(tags['MPEntry'].value.length / ENTRY_SIZE); i++) {\n images[i] = {};\n\n const attributes = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageFlags'] = getImageFlags(attributes);\n images[i]['ImageFormat'] = getImageFormat(attributes);\n images[i]['ImageType'] = getImageType(attributes);\n\n const imageSize = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 4, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageSize'] = {\n value: imageSize,\n description: '' + imageSize\n };\n\n const imageOffset = isFirstIndividualImage(i) ? 0 : getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 8, Types.getTypeSize('LONG'), byteOrder) + dataOffset;\n images[i]['ImageOffset'] = {\n value: imageOffset,\n description: '' + imageOffset\n };\n\n const dependentImage1EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 12, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage1EntryNumber'] = {\n value: dependentImage1EntryNumber,\n description: '' + dependentImage1EntryNumber\n };\n\n const dependentImage2EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 14, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage2EntryNumber'] = {\n value: dependentImage2EntryNumber,\n description: '' + dependentImage2EntryNumber\n };\n\n images[i].image = dataView.buffer.slice(imageOffset, imageOffset + imageSize);\n deferInit(images[i], 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n tags['Images'] = images;\n\n return tags;\n}\n\nfunction getImageNumberValue(entries, offset, size, byteOrder) {\n if (byteOrder === ByteOrder.LITTLE_ENDIAN) {\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * i);\n }\n return value;\n }\n\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * (size - 1 - i));\n }\n return value;\n}\n\nfunction getImageFlags(attributes) {\n const flags = [\n (attributes >> 31) & 0x1,\n (attributes >> 30) & 0x1,\n (attributes >> 29) & 0x1\n ];\n\n const flagsDescription = [];\n\n if (flags[0]) {\n flagsDescription.push('Dependent Parent Image');\n }\n if (flags[1]) {\n flagsDescription.push('Dependent Child Image');\n }\n if (flags[2]) {\n flagsDescription.push('Representative Image');\n }\n\n return {\n value: flags,\n description: flagsDescription.join(', ') || 'None'\n };\n}\n\nfunction getImageFormat(attributes) {\n const imageFormat = attributes >> 24 & 0x7;\n return {\n value: imageFormat,\n description: imageFormat === 0 ? 'JPEG' : 'Unknown'\n };\n}\n\nfunction getImageType(attributes) {\n const type = attributes & 0xffffff;\n const descriptions = {\n 0x30000: 'Baseline MP Primary Image',\n 0x10001: 'Large Thumbnail (VGA equivalent)',\n 0x10002: 'Large Thumbnail (Full HD equivalent)',\n 0x20001: 'Multi-Frame Image (Panorama)',\n 0x20002: 'Multi-Frame Image (Disparity)',\n 0x20003: 'Multi-Frame Image (Multi-Angle)',\n 0x0: 'Undefined',\n };\n\n return {\n value: type,\n description: descriptions[type] || 'Unknown'\n };\n}\n\nfunction isFirstIndividualImage(i) {\n return i === 0;\n}\n\nfunction readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const FIELD_COUNT_SIZE = Types.getTypeSize('SHORT');\n const FIELD_SIZE = 12;\n\n const tags = {};\n const numberOfFields = getNumberOfFields(dataView, offset, byteOrder);\n\n offset += FIELD_COUNT_SIZE;\n for (let fieldIndex = 0; fieldIndex < numberOfFields; fieldIndex++) {\n if (offset + FIELD_SIZE > dataView.byteLength) {\n break;\n }\n\n const tag = readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown);\n if (tag !== undefined) {\n tags[tag.name] = {\n 'id': tag.id,\n 'value': tag.value,\n 'description': tag.description\n };\n }\n\n offset += FIELD_SIZE;\n }\n\n if (Constants.USE_THUMBNAIL && (offset < dataView.byteLength - Types.getTypeSize('LONG'))) {\n const nextIfdOffset = Types.getLongAt(dataView, offset, byteOrder);\n if (nextIfdOffset !== 0 && ifdType === IFD_TYPE_0TH) {\n tags['Thumbnail'] = readIfd(dataView, IFD_TYPE_1ST, tiffHeaderOffset, tiffHeaderOffset + nextIfdOffset, byteOrder, true);\n }\n }\n\n return tags;\n}\n\nfunction getNumberOfFields(dataView, offset, byteOrder) {\n if (offset + Types.getTypeSize('SHORT') <= dataView.byteLength) {\n return Types.getShortAt(dataView, offset, byteOrder);\n }\n return 0;\n}\n\nfunction readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const TAG_CODE_IPTC_NAA = 0x83bb;\n const TAG_TYPE_OFFSET = Types.getTypeSize('SHORT');\n const TAG_COUNT_OFFSET = TAG_TYPE_OFFSET + Types.getTypeSize('SHORT');\n const TAG_VALUE_OFFSET = TAG_COUNT_OFFSET + Types.getTypeSize('LONG');\n\n const tagCode = Types.getShortAt(dataView, offset, byteOrder);\n const tagType = Types.getShortAt(dataView, offset + TAG_TYPE_OFFSET, byteOrder);\n const tagCount = Types.getLongAt(dataView, offset + TAG_COUNT_OFFSET, byteOrder);\n let tagValue;\n\n if (Types.typeSizes[tagType] === undefined || (!includeUnknown && TagNames[ifdType][tagCode] === undefined)) {\n return undefined;\n }\n\n if (tagValueFitsInOffsetSlot(tagType, tagCount)) {\n tagValue = getTagValue(dataView, offset + TAG_VALUE_OFFSET, tagType, tagCount, byteOrder);\n } else {\n const tagValueOffset = Types.getLongAt(dataView, offset + TAG_VALUE_OFFSET, byteOrder);\n if (tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount)) {\n const forceByteType = tagCode === TAG_CODE_IPTC_NAA;\n tagValue = getTagValue(dataView, tiffHeaderOffset + tagValueOffset, tagType, tagCount, byteOrder, forceByteType);\n } else {\n tagValue = '';\n }\n }\n\n if (tagType === Types.tagTypes['ASCII']) {\n tagValue = splitNullSeparatedAsciiString(tagValue);\n tagValue = decodeAsciiValue(tagValue);\n }\n\n let tagName = `undefined-${tagCode}`;\n let tagDescription = tagValue;\n\n if (TagNames[ifdType][tagCode] !== undefined) {\n if ((TagNames[ifdType][tagCode]['name'] !== undefined) && (TagNames[ifdType][tagCode]['description'] !== undefined)) {\n tagName = TagNames[ifdType][tagCode]['name'];\n try {\n tagDescription = TagNames[ifdType][tagCode]['description'](tagValue);\n } catch (error) {\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n } else if ((tagType === Types.tagTypes['RATIONAL']) || (tagType === Types.tagTypes['SRATIONAL'])) {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = '' + (tagValue[0] / tagValue[1]);\n } else {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n }\n\n return {\n id: tagCode,\n name: tagName,\n value: tagValue,\n description: tagDescription\n };\n}\n\nfunction tagValueFitsInOffsetSlot(tagType, tagCount) {\n return Types.typeSizes[tagType] * tagCount <= Types.getTypeSize('LONG');\n}\n\nfunction getTagValue(dataView, offset, type, count, byteOrder, forceByteType = false) {\n let value = [];\n\n if (forceByteType) {\n count = count * Types.typeSizes[type];\n type = Types.tagTypes['BYTE'];\n }\n for (let valueIndex = 0; valueIndex < count; valueIndex++) {\n value.push(getTagValueAt[type](dataView, offset, byteOrder));\n offset += Types.typeSizes[type];\n }\n\n if (type === Types.tagTypes['ASCII']) {\n value = Types.getAsciiValue(value);\n } else if (value.length === 1) {\n value = value[0];\n }\n\n return value;\n}\n\nfunction tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount) {\n return tiffHeaderOffset + tagValueOffset + Types.typeSizes[tagType] * tagCount <= dataView.byteLength;\n}\n\nfunction splitNullSeparatedAsciiString(string) {\n const tagValue = [];\n let i = 0;\n\n for (let j = 0; j < string.length; j++) {\n if (string[j] === '\\x00') {\n i++;\n continue;\n }\n if (tagValue[i] === undefined) {\n tagValue[i] = '';\n }\n tagValue[i] += string[j];\n }\n\n return tagValue;\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return asciiValue.map((value) => decodeURIComponent(escape(value)));\n } catch (error) {\n return asciiValue;\n }\n}\n\nfunction getDescriptionFromTagValue(tagValue) {\n if (tagValue instanceof Array) {\n return tagValue.join(', ');\n }\n return tagValue;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n const length = getLength(dataView, fileDataOffset);\n const numberOfColorComponents = getNumberOfColorComponents(dataView, fileDataOffset, length);\n return {\n 'Bits Per Sample': getDataPrecision(dataView, fileDataOffset, length),\n 'Image Height': getImageHeight(dataView, fileDataOffset, length),\n 'Image Width': getImageWidth(dataView, fileDataOffset, length),\n 'Color Components': numberOfColorComponents,\n 'Subsampling': numberOfColorComponents && getSubsampling(dataView, fileDataOffset, numberOfColorComponents.value, length)\n };\n}\n\nfunction getLength(dataView, fileDataOffset) {\n return Types.getShortAt(dataView, fileDataOffset);\n}\n\nfunction getDataPrecision(dataView, fileDataOffset, length) {\n const OFFSET = 2;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset, length) {\n const OFFSET = 3;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset, length) {\n const OFFSET = 5;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getNumberOfColorComponents(dataView, fileDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getSubsampling(dataView, fileDataOffset, numberOfColorComponents, length) {\n const OFFSET = 8;\n const SIZE = 3 * numberOfColorComponents;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const components = [];\n\n for (let i = 0; i < numberOfColorComponents; i++) {\n const componentOffset = fileDataOffset + OFFSET + i * 3;\n components.push([\n Types.getByteAt(dataView, componentOffset),\n Types.getByteAt(dataView, componentOffset + 1),\n Types.getByteAt(dataView, componentOffset + 2)\n ]);\n }\n\n return {\n value: components,\n description: components.length > 1 ? getComponentIds(components) + getSamplingType(components) : ''\n };\n}\n\nfunction getComponentIds(components) {\n const ids = {\n 0x01: 'Y',\n 0x02: 'Cb',\n 0x03: 'Cr',\n 0x04: 'I',\n 0x05: 'Q',\n };\n\n return components.map((compontent) => ids[compontent[0]]).join('');\n}\n\nfunction getSamplingType(components) {\n const types = {\n 0x11: '4:4:4 (1 1)',\n 0x12: '4:4:0 (1 2)',\n 0x14: '4:4:1 (1 4)',\n 0x21: '4:2:2 (2 1)',\n 0x22: '4:2:0 (2 2)',\n 0x24: '4:2:1 (2 4)',\n 0x41: '4:1:1 (4 1)',\n 0x42: '4:1:0 (4 2)'\n };\n\n if (components.length === 0 || components[0][1] === undefined || types[components[0][1]] === undefined) {\n return '';\n }\n\n return types[components[0][1]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, jfifDataOffset) {\n const length = getLength(dataView, jfifDataOffset);\n const thumbnailWidth = getThumbnailWidth(dataView, jfifDataOffset, length);\n const thumbnailHeight = getThumbnailHeight(dataView, jfifDataOffset, length);\n const tags = {\n 'JFIF Version': getVersion(dataView, jfifDataOffset, length),\n 'Resolution Unit': getResolutionUnit(dataView, jfifDataOffset, length),\n 'XResolution': getXResolution(dataView, jfifDataOffset, length),\n 'YResolution': getYResolution(dataView, jfifDataOffset, length),\n 'JFIF Thumbnail Width': thumbnailWidth,\n 'JFIF Thumbnail Height': thumbnailHeight\n };\n\n if (thumbnailWidth !== undefined && thumbnailHeight !== undefined) {\n const thumbnail = getThumbnail(dataView, jfifDataOffset, 3 * thumbnailWidth.value * thumbnailHeight.value, length);\n if (thumbnail) {\n tags['JFIF Thumbnail'] = thumbnail;\n }\n }\n\n for (const tagName in tags) {\n if (tags[tagName] === undefined) {\n delete tags[tagName];\n }\n }\n\n return tags;\n}\n\nfunction getLength(dataView, jfifDataOffset) {\n return Types.getShortAt(dataView, jfifDataOffset);\n}\n\nfunction getVersion(dataView, jfifDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const majorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n const minorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET + 1);\n return {\n value: majorVersion * 0x100 + minorVersion,\n description: majorVersion + '.' + minorVersion\n };\n}\n\nfunction getResolutionUnit(dataView, jfifDataOffset, length) {\n const OFFSET = 9;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: getResolutionUnitDescription(value)\n };\n}\n\nfunction getResolutionUnitDescription(value) {\n if (value === 0) {\n return 'None';\n }\n if (value === 1) {\n return 'inches';\n }\n if (value === 2) {\n return 'cm';\n }\n return 'Unknown';\n}\n\nfunction getXResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 10;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getYResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 12;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getThumbnailWidth(dataView, jfifDataOffset, length) {\n const OFFSET = 14;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnailHeight(dataView, jfifDataOffset, length) {\n const OFFSET = 15;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnail(dataView, jfifDataOffset, thumbnailLength, length) {\n const OFFSET = 16;\n\n if (thumbnailLength === 0 || OFFSET + thumbnailLength > length) {\n return undefined;\n }\n\n const value = dataView.buffer.slice(jfifDataOffset + OFFSET, jfifDataOffset + OFFSET + thumbnailLength);\n return {\n value,\n description: '<24-bit RGB pixel data>'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 'iptc': {\n 0x0100: {\n 'name': 'Model Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0105: {\n 'name': 'Destination',\n 'repeatable': true\n },\n 0x0114: {\n 'name': 'File Format',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0116: {\n 'name': 'File Format Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x011e: 'Service Identifier',\n 0x0128: 'Envelope Number',\n 0x0132: 'Product ID',\n 0x013c: 'Envelope Priority',\n 0x0146: {\n 'name': 'Date Sent',\n 'description': getCreationDate\n },\n 0x0150: {\n 'name': 'Time Sent',\n 'description': getCreationTime\n },\n 0x015a: {\n 'name': 'Coded Character Set',\n 'description': getEncodingName,\n 'encoding_name': getEncodingName,\n },\n 0x0164: 'UNO',\n 0x0178: {\n 'name': 'ARM Identifier',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x017a: {\n 'name': 'ARM Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0200: {\n 'name': 'Record Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0203: 'Object Type Reference',\n 0x0204: 'Object Attribute Reference',\n 0x0205: 'Object Name',\n 0x0207: 'Edit Status',\n 0x0208: {\n 'name': 'Editorial Update',\n 'description': (value) => {\n if (getStringValue(value) === '01') {\n return 'Additional Language';\n }\n return 'Unknown';\n }\n },\n 0x020a: 'Urgency',\n 0x020c: {\n 'name': 'Subject Reference',\n 'repeatable': true,\n 'description': (value) => {\n const parts = getStringValue(value).split(':');\n return parts[2] + (parts[3] ? '/' + parts[3] : '') + (parts[4] ? '/' + parts[4] : '');\n }\n },\n 0x020f: 'Category',\n 0x0214: {\n 'name': 'Supplemental Category',\n 'repeatable': true\n },\n 0x0216: 'Fixture Identifier',\n 0x0219: {\n 'name': 'Keywords',\n 'repeatable': true\n },\n 0x021a: {\n 'name': 'Content Location Code',\n 'repeatable': true\n },\n 0x021b: {\n 'name': 'Content Location Name',\n 'repeatable': true\n },\n 0x021e: 'Release Date',\n 0x0223: 'Release Time',\n 0x0225: 'Expiration Date',\n 0x0226: 'Expiration Time',\n 0x0228: 'Special Instructions',\n 0x022a: {\n 'name': 'Action Advised',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === '01') {\n return 'Object Kill';\n } else if (string === '02') {\n return 'Object Replace';\n } else if (string === '03') {\n return 'Object Append';\n } else if (string === '04') {\n return 'Object Reference';\n }\n return 'Unknown';\n }\n },\n 0x022d: {\n 'name': 'Reference Service',\n 'repeatable': true\n },\n 0x022f: {\n 'name': 'Reference Date',\n 'repeatable': true\n },\n 0x0232: {\n 'name': 'Reference Number',\n 'repeatable': true\n },\n 0x0237: {\n 'name': 'Date Created',\n 'description': getCreationDate\n },\n 0x023c: {\n 'name': 'Time Created',\n 'description': getCreationTime\n },\n 0x023e: {\n 'name': 'Digital Creation Date',\n 'description': getCreationDate\n },\n 0x023f: {\n 'name': 'Digital Creation Time',\n 'description': getCreationTime\n },\n 0x0241: 'Originating Program',\n 0x0246: 'Program Version',\n 0x024b: {\n 'name': 'Object Cycle',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'a') {\n return 'morning';\n } else if (string === 'p') {\n return 'evening';\n } else if (string === 'b') {\n return 'both';\n }\n return 'Unknown';\n }\n },\n 0x0250: {\n 'name': 'By-line',\n 'repeatable': true\n },\n 0x0255: {\n 'name': 'By-line Title',\n 'repeatable': true\n },\n 0x025a: 'City',\n 0x025c: 'Sub-location',\n 0x025f: 'Province/State',\n 0x0264: 'Country/Primary Location Code',\n 0x0265: 'Country/Primary Location Name',\n 0x0267: 'Original Transmission Reference',\n 0x0269: 'Headline',\n 0x026e: 'Credit',\n 0x0273: 'Source',\n 0x0274: 'Copyright Notice',\n 0x0276: {\n 'name': 'Contact',\n 'repeatable': true\n },\n 0x0278: 'Caption/Abstract',\n 0x027a: {\n 'name': 'Writer/Editor',\n 'repeatable': true\n },\n 0x027d: {\n 'name': 'Rasterized Caption',\n 'description': (value) => value\n },\n 0x0282: 'Image Type',\n 0x0283: {\n 'name': 'Image Orientation',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'P') {\n return 'Portrait';\n } else if (string === 'L') {\n return 'Landscape';\n } else if (string === 'S') {\n return 'Square';\n }\n return 'Unknown';\n }\n },\n 0x0287: 'Language Identifier',\n 0x0296: {\n 'name': 'Audio Type',\n 'description': (value) => {\n const stringValue = getStringValue(value);\n const character0 = stringValue.charAt(0);\n const character1 = stringValue.charAt(1);\n let description = '';\n\n if (character0 === '1') {\n description += 'Mono';\n } else if (character0 === '2') {\n description += 'Stereo';\n }\n\n if (character1 === 'A') {\n description += ', actuality';\n } else if (character1 === 'C') {\n description += ', question and answer session';\n } else if (character1 === 'M') {\n description += ', music, transmitted by itself';\n } else if (character1 === 'Q') {\n description += ', response to a question';\n } else if (character1 === 'R') {\n description += ', raw sound';\n } else if (character1 === 'S') {\n description += ', scener';\n } else if (character1 === 'V') {\n description += ', voicer';\n } else if (character1 === 'W') {\n description += ', wrap';\n }\n\n if (description !== '') {\n return description;\n }\n return stringValue;\n }\n },\n 0x0297: {\n 'name': 'Audio Sampling Rate',\n 'description': (value) => parseInt(getStringValue(value), 10) + ' Hz'\n },\n 0x0298: {\n 'name': 'Audio Sampling Resolution',\n 'description': (value) => {\n const bits = parseInt(getStringValue(value), 10);\n return bits + (bits === 1 ? ' bit' : ' bits');\n }\n },\n 0x0299: {\n 'name': 'Audio Duration',\n 'description': (value) => {\n const duration = getStringValue(value);\n if (duration.length >= 6) {\n return duration.substr(0, 2) + ':' + duration.substr(2, 2) + ':' + duration.substr(4, 2);\n }\n return duration;\n }\n },\n 0x029a: 'Audio Outcue',\n 0x02ba: 'Short Document ID',\n 0x02bb: 'Unique Document ID',\n 0x02bc: 'Owner ID',\n 0x02c8: {\n 'name': (value) => {\n if (value.length === 2) {\n return 'ObjectData Preview File Format';\n }\n return 'Record 2 destination';\n },\n 'description': (value) => {\n if (value.length === 2) {\n const intValue = (value[0] << 8) + value[1];\n if (intValue === 0) {\n return 'No ObjectData';\n } else if (intValue === 1) {\n return 'IPTC-NAA Digital Newsphoto Parameter Record';\n } else if (intValue === 2) {\n return 'IPTC7901 Recommended Message Format';\n } else if (intValue === 3) {\n return 'Tagged Image File Format (Adobe/Aldus Image data)';\n } else if (intValue === 4) {\n return 'Illustrator (Adobe Graphics data)';\n } else if (intValue === 5) {\n return 'AppleSingle (Apple Computer Inc)';\n } else if (intValue === 6) {\n return 'NAA 89-3 (ANPA 1312)';\n } else if (intValue === 7) {\n return 'MacBinary II';\n } else if (intValue === 8) {\n return 'IPTC Unstructured Character Oriented File Format (UCOFF)';\n } else if (intValue === 9) {\n return 'United Press International ANPA 1312 variant';\n } else if (intValue === 10) {\n return 'United Press International Down-Load Message';\n } else if (intValue === 11) {\n return 'JPEG File Interchange (JFIF)';\n } else if (intValue === 12) {\n return 'Photo-CD Image-Pac (Eastman Kodak)';\n } else if (intValue === 13) {\n return 'Microsoft Bit Mapped Graphics File [*.BMP]';\n } else if (intValue === 14) {\n return 'Digital Audio File [*.WAV] (Microsoft & Creative Labs)';\n } else if (intValue === 15) {\n return 'Audio plus Moving Video [*.AVI] (Microsoft)';\n } else if (intValue === 16) {\n return 'PC DOS/Windows Executable Files [*.COM][*.EXE]';\n } else if (intValue === 17) {\n return 'Compressed Binary File [*.ZIP] (PKWare Inc)';\n } else if (intValue === 18) {\n return 'Audio Interchange File Format AIFF (Apple Computer Inc)';\n } else if (intValue === 19) {\n return 'RIFF Wave (Microsoft Corporation)';\n } else if (intValue === 20) {\n return 'Freehand (Macromedia/Aldus)';\n } else if (intValue === 21) {\n return 'Hypertext Markup Language \"HTML\" (The Internet Society)';\n } else if (intValue === 22) {\n return 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC';\n } else if (intValue === 23) {\n return 'MPEG 2 Audio Layer 3, ISO/IEC';\n } else if (intValue === 24) {\n return 'Portable Document File (*.PDF) Adobe';\n } else if (intValue === 25) {\n return 'News Industry Text Format (NITF)';\n } else if (intValue === 26) {\n return 'Tape Archive (*.TAR)';\n } else if (intValue === 27) {\n return 'Tidningarnas Telegrambyrå NITF version (TTNITF DTD)';\n } else if (intValue === 28) {\n return 'Ritzaus Bureau NITF version (RBNITF DTD)';\n } else if (intValue === 29) {\n return 'Corel Draw [*.CDR]';\n }\n return `Unknown format ${intValue}`;\n }\n return getStringValue(value);\n }\n },\n 0x02c9: {\n 'name': 'ObjectData Preview File Format Version',\n 'description': (value, tags) => {\n // Format ID, Version ID, Version Description\n const formatVersions = {\n '00': {'00': '1'},\n '01': {'01': '1', '02': '2', '03': '3', '04': '4'},\n '02': {'04': '4'},\n '03': {'01': '5.0', '02': '6.0'},\n '04': {'01': '1.40'},\n '05': {'01': '2'},\n '06': {'01': '1'},\n '11': {'01': '1.02'},\n '20': {'01': '3.1', '02': '4.0', '03': '5.0', '04': '5.5'},\n '21': {'02': '2.0'}\n };\n const stringValue = getStringValue(value);\n\n if (tags['ObjectData Preview File Format']) {\n const objectDataPreviewFileFormat = getStringValue(tags['ObjectData Preview File Format'].value);\n if (formatVersions[objectDataPreviewFileFormat]\n && formatVersions[objectDataPreviewFileFormat][stringValue]) {\n return formatVersions[objectDataPreviewFileFormat][stringValue];\n }\n }\n\n return stringValue;\n }\n },\n 0x02ca: 'ObjectData Preview Data',\n 0x070a: {\n 'name': 'Size Mode',\n 'description': (value) => {\n return (value[0]).toString();\n }\n },\n 0x0714: {\n 'name': 'Max Subfile Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075a: {\n 'name': 'ObjectData Size Announced',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075f: {\n 'name': 'Maximum ObjectData Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n }\n }\n};\n\nfunction getCreationDate(value) {\n const date = getStringValue(value);\n\n if (date.length >= 8) {\n return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);\n }\n\n return date;\n}\n\nfunction getCreationTime(value) {\n const time = getStringValue(value);\n let parsedTime = time;\n\n if (time.length >= 6) {\n parsedTime = time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);\n if (time.length === 11) {\n parsedTime += time.substr(6, 1) + time.substr(7, 2) + ':' + time.substr(9, 2);\n }\n }\n\n return parsedTime;\n}\n\nfunction getEncodingName(value) {\n const string = getStringValue(value);\n if (string === '\\x1b%G') {\n return 'UTF-8';\n } else if (string === '\\x1b%5') {\n return 'Windows-1252';\n } else if (string === '\\x1b%/G') {\n return 'UTF-8 Level 1';\n } else if (string === '\\x1b%/H') {\n return 'UTF-8 Level 2';\n } else if (string === '\\x1b%/I') {\n return 'UTF-8 Level 3';\n } else if (string === '\\x1B/A') {\n return 'ISO-8859-1';\n } else if (string === '\\x1B/B') {\n return 'ISO-8859-2';\n } else if (string === '\\x1B/C') {\n return 'ISO-8859-3';\n } else if (string === '\\x1B/D') {\n return 'ISO-8859-4';\n } else if (string === '\\x1B/@') {\n return 'ISO-8859-5';\n } else if (string === '\\x1B/G') {\n return 'ISO-8859-6';\n } else if (string === '\\x1B/F') {\n return 'ISO-8859-7';\n } else if (string === '\\x1B/H') {\n return 'ISO-8859-8';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof TextDecoder !== 'undefined') {\n return TextDecoder;\n }\n\n return undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TextDecoder from './text-decoder.js';\n\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n decode,\n TAG_HEADER_SIZE\n};\n\nfunction decode(encoding, tagValue) {\n const Decoder = TextDecoder.get();\n if ((typeof Decoder !== 'undefined') && (encoding !== undefined)) {\n try {\n return new Decoder(encoding).decode(Uint8Array.from(tagValue));\n } catch (error) {\n // Pass through and fall back to ASCII decoding.\n }\n }\n\n const stringValue = tagValue.map((charCode) => String.fromCharCode(charCode)).join('');\n return decodeAsciiValue(stringValue);\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return decodeURIComponent(escape(asciiValue));\n } catch (error) {\n return asciiValue;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport IptcTagNames from './iptc-tag-names.js';\nimport TagDecoder from './tag-decoder.js';\n\nconst BYTES_8BIM = 0x3842494d;\nconst BYTES_8BIM_SIZE = 4;\nconst RESOURCE_BLOCK_HEADER_SIZE = BYTES_8BIM_SIZE + 8;\nconst NAA_RESOURCE_BLOCK_TYPE = 0x0404;\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n read\n};\n\nfunction read(dataView, dataOffset, includeUnknown) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0, includeUnknown);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset, includeUnknown);\n } catch (error) {\n return {};\n }\n}\n\nfunction getNaaResourceBlock(dataView, dataOffset) {\n while (dataOffset + RESOURCE_BLOCK_HEADER_SIZE <= dataView.byteLength) {\n const resourceBlock = getResourceBlock(dataView, dataOffset);\n if (isNaaResourceBlock(resourceBlock)) {\n return {naaBlock: resourceBlock, dataOffset: dataOffset + RESOURCE_BLOCK_HEADER_SIZE};\n }\n dataOffset += RESOURCE_BLOCK_HEADER_SIZE + resourceBlock.size + getBlockPadding(resourceBlock);\n }\n throw new Error('No IPTC NAA resource block.');\n}\n\nfunction getResourceBlock(dataView, dataOffset) {\n const RESOURCE_BLOCK_SIZE_OFFSET = 10;\n\n if (dataView.getUint32(dataOffset, false) !== BYTES_8BIM) {\n throw new Error('Not an IPTC resource block.');\n }\n\n return {\n type: dataView.getUint16(dataOffset + BYTES_8BIM_SIZE),\n size: dataView.getUint16(dataOffset + RESOURCE_BLOCK_SIZE_OFFSET)\n };\n}\n\nfunction isNaaResourceBlock(resourceBlock) {\n return resourceBlock.type === NAA_RESOURCE_BLOCK_TYPE;\n}\n\nfunction getBlockPadding(resourceBlock) {\n if (resourceBlock.size % 2 !== 0) {\n return 1;\n }\n return 0;\n}\n\nfunction parseTags(dataView, naaBlock, dataOffset, includeUnknown) {\n const tags = {};\n let encoding = undefined;\n\n const endOfBlockOffset = dataOffset + naaBlock['size'];\n\n while ((dataOffset < endOfBlockOffset) && (dataOffset < dataView.byteLength)) {\n const {tag, tagSize} = readTag(dataView, dataOffset, tags, encoding, includeUnknown);\n\n if (tag === null) {\n break;\n }\n\n if (tag) {\n if ('encoding' in tag) {\n encoding = tag.encoding;\n }\n\n if ((tags[tag.name] === undefined) || (tag['repeatable'] === undefined)) {\n tags[tag.name] = {\n id: tag.id,\n value: tag.value,\n description: tag.description\n };\n } else {\n if (!(tags[tag.name] instanceof Array)) {\n tags[tag.name] = [{\n id: tags[tag.name].id,\n value: tags[tag.name].value,\n description: tags[tag.name].description\n }];\n }\n tags[tag.name].push({\n id: tag.id,\n value: tag.value,\n description: tag.description\n });\n }\n }\n\n dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding, includeUnknown) {\n const TAG_CODE_OFFSET = 1;\n const TAG_SIZE_OFFSET = 3;\n\n if (leadByteIsMissing(dataView, dataOffset)) {\n return {tag: null, tagSize: 0};\n }\n\n const tagCode = dataView.getUint16(dataOffset + TAG_CODE_OFFSET);\n const tagSize = dataView.getUint16(dataOffset + TAG_SIZE_OFFSET);\n\n if (!includeUnknown && !IptcTagNames['iptc'][tagCode]) {\n return {tag: undefined, tagSize};\n }\n\n const tagValue = getTagValue(dataView, dataOffset + TAG_HEADER_SIZE, tagSize);\n\n const tag = {\n id: tagCode,\n name: getTagName(IptcTagNames['iptc'][tagCode], tagCode, tagValue),\n value: tagValue,\n description: getTagDescription(IptcTagNames['iptc'][tagCode], tagValue, tags, encoding)\n };\n if (tagIsRepeatable(tagCode)) {\n tag['repeatable'] = true;\n }\n if (tagContainsEncoding(tagCode)) {\n tag['encoding'] = IptcTagNames['iptc'][tagCode]['encoding_name'](tagValue);\n }\n\n return {tag, tagSize};\n}\n\nfunction leadByteIsMissing(dataView, dataOffset) {\n const TAG_LEAD_BYTE = 0x1c;\n return dataView.getUint8(dataOffset) !== TAG_LEAD_BYTE;\n}\n\nfunction getTagValue(dataView, offset, size) {\n const value = [];\n\n for (let valueIndex = 0; valueIndex < size; valueIndex++) {\n value.push(dataView.getUint8(offset + valueIndex));\n }\n\n return value;\n}\n\nfunction getTagName(tag, tagCode, tagValue) {\n if (!tag) {\n return `undefined-${tagCode}`;\n }\n if (tagIsName(tag)) {\n return tag;\n }\n if (hasDynamicName(tag)) {\n return tag['name'](tagValue);\n }\n return tag['name'];\n}\n\nfunction tagIsName(tag) {\n return typeof tag === 'string';\n}\n\nfunction hasDynamicName(tag) {\n return typeof (tag['name']) === 'function';\n}\n\nfunction getTagDescription(tag, tagValue, tags, encoding) {\n if (hasDescriptionProperty(tag)) {\n try {\n return tag['description'](tagValue, tags);\n } catch (error) {\n // Fall through to next handler.\n }\n }\n if (tagValueIsText(tag, tagValue)) {\n return TagDecoder.decode(encoding, tagValue);\n }\n return tagValue;\n}\n\nfunction tagValueIsText(tag, tagValue) {\n return tag && tagValue instanceof Array;\n}\n\nfunction hasDescriptionProperty(tag) {\n return tag && tag['description'] !== undefined;\n}\n\nfunction tagIsRepeatable(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['repeatable'];\n}\n\nfunction tagContainsEncoding(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['encoding_name'] !== undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 'tiff:Orientation'(value) {\n if (value === '1') {\n return 'Horizontal (normal)';\n }\n if (value === '2') {\n return 'Mirror horizontal';\n }\n if (value === '3') {\n return 'Rotate 180';\n }\n if (value === '4') {\n return 'Mirror vertical';\n }\n if (value === '5') {\n return 'Mirror horizontal and rotate 270 CW';\n }\n if (value === '6') {\n return 'Rotate 90 CW';\n }\n if (value === '7') {\n return 'Mirror horizontal and rotate 90 CW';\n }\n if (value === '8') {\n return 'Rotate 270 CW';\n }\n return value;\n },\n 'tiff:ResolutionUnit': (value) => TagNamesCommon.ResolutionUnit(parseInt(value, 10)),\n 'tiff:XResolution': (value) => fraction(TagNamesCommon.XResolution, value),\n 'tiff:YResolution': (value) => fraction(TagNamesCommon.YResolution, value),\n 'exif:ApertureValue': (value) => fraction(TagNamesCommon.ApertureValue, value),\n 'exif:GPSLatitude': calculateGPSValue,\n 'exif:GPSLongitude': calculateGPSValue,\n 'exif:FNumber': (value) => fraction(TagNamesCommon.FNumber, value),\n 'exif:FocalLength': (value) => fraction(TagNamesCommon.FocalLength, value),\n 'exif:FocalPlaneResolutionUnit': (value) => TagNamesCommon.FocalPlaneResolutionUnit(parseInt(value, 10)),\n 'exif:ColorSpace': (value) => TagNamesCommon.ColorSpace(parseNumber(value)),\n 'exif:ComponentsConfiguration'(value, description) {\n if (/^\\d, \\d, \\d, \\d$/.test(description)) {\n const numbers = description.split(', ').map((number) => number.charCodeAt(0));\n return TagNamesCommon.ComponentsConfiguration(numbers);\n }\n return description;\n },\n 'exif:Contrast': (value) => TagNamesCommon.Contrast(parseInt(value, 10)),\n 'exif:CustomRendered': (value) => TagNamesCommon.CustomRendered(parseInt(value, 10)),\n 'exif:ExposureMode': (value) => TagNamesCommon.ExposureMode(parseInt(value, 10)),\n 'exif:ExposureProgram': (value) => TagNamesCommon.ExposureProgram(parseInt(value, 10)),\n 'exif:ExposureTime'(value) {\n if (isFraction(value)) {\n return TagNamesCommon.ExposureTime(value.split('/').map((number) => parseInt(number, 10)));\n }\n return value;\n },\n 'exif:MeteringMode': (value) => TagNamesCommon.MeteringMode(parseInt(value, 10)),\n 'exif:Saturation': (value) => TagNamesCommon.Saturation(parseInt(value, 10)),\n 'exif:SceneCaptureType': (value) => TagNamesCommon.SceneCaptureType(parseInt(value, 10)),\n 'exif:Sharpness': (value) => TagNamesCommon.Sharpness(parseInt(value, 10)),\n 'exif:ShutterSpeedValue': (value) => fraction(TagNamesCommon.ShutterSpeedValue, value),\n 'exif:WhiteBalance': (value) => TagNamesCommon.WhiteBalance(parseInt(value, 10))\n};\n\nfunction fraction(func, value) {\n if (isFraction(value)) {\n return func(value.split('/'));\n }\n return value;\n}\n\nfunction parseNumber(value) {\n if (value.substring(0, 2) === '0x') {\n return parseInt(value.substring(2), 16);\n }\n return parseInt(value, 10);\n}\n\nfunction isFraction(value) {\n return /^-?\\d+\\/-?\\d+$/.test(value);\n}\n\nfunction calculateGPSValue(value) {\n const [degreesString, minutesString] = value.split(',');\n if ((degreesString !== undefined) && (minutesString !== undefined)) {\n const degrees = parseFloat(degreesString);\n const minutes = parseFloat(minutesString);\n const ref = minutesString.charAt(minutesString.length - 1);\n if ((!Number.isNaN(degrees)) && (!Number.isNaN(minutes))) {\n return '' + (degrees + minutes / 60) + ref;\n }\n }\n return value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView, objectAssign} from './utils.js';\nimport XmpTagNames from './xmp-tag-names.js';\nimport DOMParser from './dom-parser.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunks) {\n const tags = {};\n\n if (typeof dataView === 'string') {\n readTags(tags, dataView);\n return tags;\n }\n\n const [standardXmp, extendedXmp] = extractCompleteChunks(dataView, chunks);\n\n const hasStandardTags = readTags(tags, standardXmp);\n\n if (extendedXmp) {\n const hasExtendedTags = readTags(tags, extendedXmp);\n\n if (!hasStandardTags && !hasExtendedTags) {\n // Some writers are not spec-compliant in that they split an XMP\n // metadata tree over both the standard XMP block and the extended\n // XMP block. If we failed parsing both of the XMPs in the regular\n // way, we try to combine them to see if that works better.\n delete tags._raw;\n readTags(tags, combineChunks(dataView, chunks));\n }\n }\n\n return tags;\n}\n\n// The first chunk is always the regular XMP document. Then there is something\n// called extended XMP. The extended XMP is also a single XMP document but it\n// can be divided into multiple chunks that need to be combined into one.\nfunction extractCompleteChunks(dataView, chunks) {\n if (chunks.length === 0) {\n return [];\n }\n\n const completeChunks = [combineChunks(dataView, chunks.slice(0, 1))];\n if (chunks.length > 1) {\n completeChunks.push(combineChunks(dataView, chunks.slice(1)));\n }\n\n return completeChunks;\n}\n\nfunction combineChunks(dataView, chunks) {\n const totalLength = chunks.reduce((size, chunk) => size + chunk.length, 0);\n const combinedChunks = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const slice = dataView.buffer.slice(chunk.dataOffset, chunk.dataOffset + chunk.length);\n combinedChunks.set(new Uint8Array(slice), offset);\n offset += chunk.length;\n }\n\n return new DataView(combinedChunks.buffer);\n}\n\nfunction readTags(tags, chunkDataView) {\n try {\n const {doc, raw} = getDocument(chunkDataView);\n tags._raw = (tags._raw || '') + raw;\n const rdf = getRDF(doc);\n\n objectAssign(tags, parseXMPObject(convertToObject(rdf, true)));\n return true;\n } catch (error) {\n return false;\n }\n}\n\nfunction getDocument(chunkDataView) {\n const domParser = DOMParser.get();\n if (!domParser) {\n console.warn('Warning: DOMParser is not available. It is needed to be able to parse XMP tags.'); // eslint-disable-line no-console\n throw new Error();\n }\n\n const xmlString = typeof chunkDataView === 'string' ? chunkDataView : getStringFromDataView(chunkDataView, 0, chunkDataView.byteLength);\n const doc = domParser.parseFromString(trimXmlSource(xmlString), 'application/xml');\n\n if (doc.documentElement.nodeName === 'parsererror') {\n throw new Error(doc.documentElement.textContent);\n }\n\n return {\n doc,\n raw: xmlString,\n };\n}\n\nfunction trimXmlSource(xmlSource) {\n return xmlSource.replace(/^.+(<\\?xpacket begin)/, '$1').replace(/(<\\?xpacket end=\".*\"\\?>).+$/, '$1');\n}\n\nfunction getRDF(node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n if (node.childNodes[i].tagName === 'x:xmpmeta') {\n return getRDF(node.childNodes[i]);\n }\n if (node.childNodes[i].tagName === 'rdf:RDF') {\n return node.childNodes[i];\n }\n }\n\n throw new Error();\n}\n\nfunction convertToObject(node, isTopNode = false) {\n const childNodes = getChildNodes(node);\n\n if (hasTextOnlyContent(childNodes)) {\n if (isTopNode) {\n return {};\n }\n return getTextValue(childNodes[0]);\n }\n\n return getElementsFromNodes(childNodes);\n}\n\nfunction getChildNodes(node) {\n const elements = [];\n\n for (let i = 0; i < node.childNodes.length; i++) {\n elements.push(node.childNodes[i]);\n }\n\n return elements;\n}\n\nfunction hasTextOnlyContent(nodes) {\n return (nodes.length === 1) && (nodes[0].nodeName === '#text');\n}\n\nfunction getTextValue(node) {\n return node.nodeValue;\n}\n\nfunction getElementsFromNodes(nodes) {\n const elements = {};\n\n nodes.forEach((node) => {\n if (isElement(node)) {\n const nodeElement = getElementFromNode(node);\n\n if (elements[node.nodeName] !== undefined) {\n if (!Array.isArray(elements[node.nodeName])) {\n elements[node.nodeName] = [elements[node.nodeName]];\n }\n elements[node.nodeName].push(nodeElement);\n } else {\n elements[node.nodeName] = nodeElement;\n }\n }\n });\n\n return elements;\n}\n\nfunction isElement(node) {\n return (node.nodeName) && (node.nodeName !== '#text');\n}\n\nfunction getElementFromNode(node) {\n return {\n attributes: getAttributes(node),\n value: convertToObject(node)\n };\n}\n\nfunction getAttributes(element) {\n const attributes = {};\n\n for (let i = 0; i < element.attributes.length; i++) {\n attributes[element.attributes[i].nodeName] = decodeURIComponent(escape(element.attributes[i].value));\n }\n\n return attributes;\n}\n\nfunction parseXMPObject(xmpObject) {\n const tags = {};\n\n if (typeof xmpObject === 'string') {\n return xmpObject;\n }\n\n for (const nodeName in xmpObject) {\n let nodes = xmpObject[nodeName];\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n nodes.forEach((node) => {\n objectAssign(tags, parseNodeAttributesAsTags(node.attributes));\n if (typeof node.value === 'object') {\n objectAssign(tags, parseNodeChildrenAsTags(node.value));\n }\n });\n }\n\n return tags;\n}\n\nfunction parseNodeAttributesAsTags(attributes) {\n const tags = {};\n\n for (const name in attributes) {\n if (isTagAttribute(name)) {\n tags[getLocalName(name)] = {\n value: attributes[name],\n attributes: {},\n description: getDescription(attributes[name], name)\n };\n }\n }\n\n return tags;\n}\n\nfunction isTagAttribute(name) {\n return (name !== 'rdf:parseType') && (!isNamespaceDefinition(name));\n}\n\nfunction isNamespaceDefinition(name) {\n return name.split(':')[0] === 'xmlns';\n}\n\nfunction getLocalName(name) {\n if (/^MicrosoftPhoto(_\\d+_)?:Rating$/i.test(name)) {\n return 'RatingPercent';\n }\n return name.split(':')[1];\n}\n\nfunction getDescription(value, name = undefined) {\n if (Array.isArray(value)) {\n const arrayDescription = getDescriptionOfArray(value);\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value, arrayDescription);\n }\n return arrayDescription;\n }\n if (typeof value === 'object') {\n return getDescriptionOfObject(value);\n }\n\n try {\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value);\n }\n return decodeURIComponent(escape(value));\n } catch (error) {\n return value;\n }\n}\n\nfunction getDescriptionOfArray(value) {\n return value.map((item) => {\n if (item.value !== undefined) {\n return getDescription(item.value);\n }\n return getDescription(item);\n }).join(', ');\n}\n\nfunction getDescriptionOfObject(value) {\n const descriptions = [];\n\n for (const key in value) {\n descriptions.push(`${getClearTextKey(key)}: ${getDescription(value[key].value)}`);\n }\n\n return descriptions.join('; ');\n}\n\nfunction getClearTextKey(key) {\n if (key === 'CiAdrCity') {\n return 'CreatorCity';\n }\n if (key === 'CiAdrCtry') {\n return 'CreatorCountry';\n }\n if (key === 'CiAdrExtadr') {\n return 'CreatorAddress';\n }\n if (key === 'CiAdrPcode') {\n return 'CreatorPostalCode';\n }\n if (key === 'CiAdrRegion') {\n return 'CreatorRegion';\n }\n if (key === 'CiEmailWork') {\n return 'CreatorWorkEmail';\n }\n if (key === 'CiTelWork') {\n return 'CreatorWorkPhone';\n }\n if (key === 'CiUrlWork') {\n return 'CreatorWorkUrl';\n }\n return key;\n}\n\nfunction parseNodeChildrenAsTags(children) {\n const tags = {};\n\n for (const name in children) {\n if (!isNamespaceDefinition(name)) {\n tags[getLocalName(name)] = parseNodeAsTag(children[name], name);\n }\n }\n\n return tags;\n}\n\nfunction parseNodeAsTag(node, name) {\n if (hasNestedSimpleRdfDescription(node)) {\n return parseNodeAsSimpleRdfDescription(node, name);\n }\n if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n }\n if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n }\n if (isArray(node)) {\n return parseNodeAsArray(node, name);\n }\n return parseNodeAsSimpleValue(node, name);\n}\n\nfunction hasNestedSimpleRdfDescription(node) {\n return ((node.attributes['rdf:parseType'] === 'Resource') && (node.value['rdf:value'] !== undefined))\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] !== undefined));\n}\n\nfunction parseNodeAsSimpleRdfDescription(node, name) {\n const attributes = parseNodeAttributes(node);\n\n if (node.value['rdf:Description'] !== undefined) {\n node = node.value['rdf:Description'];\n }\n\n objectAssign(attributes, parseNodeAttributes(node), parseNodeChildrenAsAttributes(node));\n\n const value = parseRdfValue(node);\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseNodeAttributes(node) {\n const attributes = {};\n\n for (const name in node.attributes) {\n if ((name !== 'rdf:parseType') && (name !== 'rdf:resource') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.attributes[name];\n }\n }\n\n return attributes;\n}\n\nfunction parseNodeChildrenAsAttributes(node) {\n const attributes = {};\n\n for (const name in node.value) {\n if ((name !== 'rdf:value') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.value[name].value;\n }\n }\n\n return attributes;\n}\n\nfunction parseRdfValue(node) {\n return getURIValue(node.value['rdf:value']) || node.value['rdf:value'].value;\n}\n\nfunction hasNestedStructureRdfDescription(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] === undefined));\n}\n\nfunction parseNodeAsStructureRdfDescription(node, name) {\n const tag = {\n value: {},\n attributes: {}\n };\n\n if (node.value['rdf:Description'] !== undefined) {\n objectAssign(tag.value, parseNodeAttributesAsTags(node.value['rdf:Description'].attributes));\n objectAssign(tag.attributes, parseNodeAttributes(node));\n node = node.value['rdf:Description'];\n }\n\n objectAssign(tag.value, parseNodeChildrenAsTags(node.value));\n\n tag.description = getDescription(tag.value, name);\n\n return tag;\n}\n\nfunction isCompactStructure(node) {\n return (Object.keys(node.value).length === 0)\n && (node.attributes['xml:lang'] === undefined)\n && (node.attributes['rdf:resource'] === undefined);\n}\n\nfunction parseNodeAsCompactStructure(node, name) {\n const value = parseNodeAttributesAsTags(node.attributes);\n\n return {\n value,\n attributes: {},\n description: getDescription(value, name)\n };\n}\n\nfunction isArray(node) {\n return getArrayChild(node.value) !== undefined;\n}\n\nfunction getArrayChild(value) {\n return value['rdf:Bag'] || value['rdf:Seq'] || value['rdf:Alt'];\n}\n\nfunction parseNodeAsArray(node, name) {\n let items = getArrayChild(node.value).value['rdf:li'];\n const attributes = parseNodeAttributes(node);\n const value = [];\n\n if (items === undefined) {\n items = [];\n } else if (!Array.isArray(items)) {\n items = [items];\n }\n\n items.forEach((item) => {\n value.push(parseArrayValue(item));\n });\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseArrayValue(item) {\n if (hasNestedSimpleRdfDescription(item)) {\n return parseNodeAsSimpleRdfDescription(item);\n }\n if (hasNestedStructureRdfDescription(item)) {\n return parseNodeAsStructureRdfDescription(item).value;\n }\n if (isCompactStructure(item)) {\n return parseNodeAsCompactStructure(item).value;\n }\n\n return parseNodeAsSimpleValue(item);\n}\n\nfunction parseNodeAsSimpleValue(node, name) {\n const value = getURIValue(node) || parseXMPObject(node.value);\n\n return {\n value,\n attributes: parseNodeAttributes(node),\n description: getDescription(value, name)\n };\n}\n\nfunction getURIValue(node) {\n return node.attributes && node.attributes['rdf:resource'];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser();\n }\n try {\n // eslint-disable-next-line no-undef\n return new (__non_webpack_require__('@xmldom/xmldom').DOMParser)({\n errorHandler: {\n error: () => {\n throw new Error('Faulty XML');\n }\n }\n });\n } catch (error) {\n return undefined;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport const iccTags = {\n 'desc': {\n 'name': 'ICC Description',\n },\n 'cprt': {\n 'name': 'ICC Copyright',\n },\n 'dmdd': {\n 'name': 'ICC Device Model Description',\n },\n 'vued': {\n 'name': 'ICC Viewing Conditions Description',\n },\n 'dmnd': {\n 'name': 'ICC Device Manufacturer for Display',\n },\n 'tech': {\n 'name': 'Technology',\n },\n};\n\nexport const iccProfile = {\n 4: {\n 'name': 'Preferred CMM type',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => value !== null ? toCompany(value) : '',\n },\n 8: {\n 'name': 'Profile Version',\n 'value': (dataView, offset) => {\n return (dataView.getUint8(offset)).toString(10) + '.'\n + (dataView.getUint8(offset + 1) >> 4).toString(10) + '.'\n + (dataView.getUint8(offset + 1) % 16).toString(10);\n }\n },\n 12: {\n 'name': 'Profile/Device class',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => {\n switch (value.toLowerCase()) {\n case 'scnr': return 'Input Device profile';\n case 'mntr': return 'Display Device profile';\n case 'prtr': return 'Output Device profile';\n case 'link': return 'DeviceLink profile';\n case 'abst': return 'Abstract profile';\n case 'spac': return 'ColorSpace profile';\n case 'nmcl': return 'NamedColor profile';\n case 'cenc': return 'ColorEncodingSpace profile';\n case 'mid ': return 'MultiplexIdentification profile';\n case 'mlnk': return 'MultiplexLink profile';\n case 'mvis': return 'MultiplexVisualization profile';\n default: return value;\n }\n }\n },\n 16: {\n 'name': 'Color Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 20: {\n 'name': 'Connection Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 24: {\n 'name': 'ICC Profile Date',\n 'value': (dataView, offset) => parseDate(dataView, offset).toISOString()\n },\n 36: {\n 'name': 'ICC Signature',\n 'value': (dataView, offset) => sliceToString(dataView.buffer.slice(offset, offset + 4))\n },\n 40: {\n 'name': 'Primary Platform',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 48: {\n 'name': 'Device Manufacturer',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 52: {\n 'name': 'Device Model Number',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 64: {\n 'name': 'Rendering Intent',\n 'value': (dataView, offset) => dataView.getUint32(offset),\n 'description': (value) => {\n switch (value) {\n case 0: return 'Perceptual';\n case 1: return 'Relative Colorimetric';\n case 2: return 'Saturation';\n case 3: return 'Absolute Colorimetric';\n default: return value;\n }\n }\n },\n\n 80: {\n 'name': 'Profile Creator',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n};\n\nfunction parseDate(dataView, offset) {\n const year = dataView.getUint16(offset);\n const month = dataView.getUint16(offset + 2) - 1;\n const day = dataView.getUint16(offset + 4);\n const hours = dataView.getUint16(offset + 6);\n const minutes = dataView.getUint16(offset + 8);\n const seconds = dataView.getUint16(offset + 10);\n return new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction toCompany(value) {\n switch (value.toLowerCase()) {\n case 'appl': return 'Apple';\n case 'adbe': return 'Adobe';\n case 'msft': return 'Microsoft';\n case 'sunw': return 'Sun Microsystems';\n case 'sgi': return 'Silicon Graphics';\n case 'tgnt': return 'Taligent';\n default: return value;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\nimport {iccTags, iccProfile} from './icc-tag-names.js';\nimport {getStringFromDataView, getUnicodeStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nconst PROFILE_HEADER_LENGTH = 84;\nconst ICC_TAG_COUNT_OFFSET = 128;\nconst ICC_SIGNATURE = 'acsp';\nconst TAG_TYPE_DESC = 'desc';\nconst TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE = 'mluc';\nconst TAG_TYPE_TEXT = 'text';\nconst TAG_TYPE_SIGNATURE = 'sig ';\nconst TAG_TABLE_SINGLE_TAG_DATA = 12;\n\n// ICC profile data can be longer than application segment max length of ~64k.\n// so it can be split into multiple APP2 segments. Each segment includes\n// total chunk count and chunk number.\n// Here we read all chunks into single continious array of bytes.\nfunction read(dataView, iccData) {\n try {\n const totalIccProfileLength = iccData.reduce((sum, icc) => sum + icc.length, 0);\n\n const iccBinaryData = new Uint8Array(totalIccProfileLength);\n let offset = 0;\n const buffer = getBuffer(dataView);\n\n for (let chunkNumber = 1; chunkNumber <= iccData.length; chunkNumber++) {\n const iccDataChunk = iccData.find((x) => x.chunkNumber === chunkNumber);\n if (!iccDataChunk) {\n throw new Error(`ICC chunk ${chunkNumber} not found`);\n }\n\n const data = buffer.slice(iccDataChunk.offset, iccDataChunk.offset + iccDataChunk.length);\n const chunkData = new Uint8Array(data);\n\n iccBinaryData.set(chunkData, offset);\n offset += chunkData.length;\n }\n\n return parseTags(new DataView(iccBinaryData.buffer));\n } catch (error) {\n return {};\n }\n}\n\nfunction getBuffer(dataView) {\n if (Array.isArray(dataView)) {\n return (new DataView(Uint8Array.from(dataView).buffer)).buffer;\n }\n return dataView.buffer;\n}\n\nfunction iccDoesNotHaveTagCount(buffer) {\n return buffer.length < (ICC_TAG_COUNT_OFFSET + 4);\n}\n\nfunction hasTagsData(buffer, tagHeaderOffset) {\n return buffer.length < tagHeaderOffset + TAG_TABLE_SINGLE_TAG_DATA;\n}\n\nexport function parseTags(dataView) {\n const buffer = dataView.buffer;\n\n const length = dataView.getUint32();\n if (dataView.byteLength !== length) {\n throw new Error('ICC profile length not matching');\n }\n\n if (dataView.length < PROFILE_HEADER_LENGTH) {\n throw new Error('ICC profile too short');\n }\n\n const tags = {};\n\n const iccProfileKeys = Object.keys(iccProfile);\n for (let i = 0; i < iccProfileKeys.length; i++) {\n const offset = iccProfileKeys[i];\n const profileEntry = iccProfile[offset];\n const value = profileEntry.value(dataView, parseInt(offset, 10));\n let description = value;\n if (profileEntry.description) {\n description = profileEntry.description(value);\n }\n\n tags[profileEntry.name] = {\n value,\n description\n };\n }\n\n const signature = sliceToString(buffer.slice(36, 40));\n if (signature !== ICC_SIGNATURE) {\n throw new Error('ICC profile: missing signature');\n }\n\n /* ICC data is incomplete but we have header parsed so lets return it */\n if (iccDoesNotHaveTagCount(buffer)) {\n return tags;\n }\n\n const tagCount = dataView.getUint32(128);\n let tagHeaderOffset = 132;\n\n for (let i = 0; i < tagCount; i++) {\n if (hasTagsData(buffer, tagHeaderOffset)) {\n // Tags are corrupted (offset too far), return what we parsed until now\n return tags;\n }\n const tagSignature = getStringFromDataView(dataView, tagHeaderOffset, 4);\n const tagOffset = dataView.getUint32(tagHeaderOffset + 4);\n const tagSize = dataView.getUint32(tagHeaderOffset + 8);\n\n if (tagOffset > buffer.length) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n const tagType = getStringFromDataView(dataView, tagOffset, 4);\n\n if (tagType === TAG_TYPE_DESC) {\n const tagValueSize = dataView.getUint32(tagOffset + 8);\n if (tagValueSize > tagSize) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n\n const val = sliceToString(buffer.slice(tagOffset + 12, tagOffset + tagValueSize + 11));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE) {\n const numRecords = dataView.getUint32(tagOffset + 8);\n const recordSize = dataView.getUint32(tagOffset + 12);\n let offset = tagOffset + 16;\n const val = [];\n for (let recordNum = 0; recordNum < numRecords; recordNum++) {\n const languageCode = getStringFromDataView(dataView, offset + 0, 2);\n const countryCode = getStringFromDataView(dataView, offset + 2, 2);\n const textLength = dataView.getUint32(offset + 4);\n const textOffset = dataView.getUint32(offset + 8);\n\n const text = getUnicodeStringFromDataView(dataView, tagOffset + textOffset, textLength);\n val.push({languageCode, countryCode, text});\n offset += recordSize;\n }\n if (numRecords === 1) {\n addTag(tags, tagSignature, val[0].text);\n } else {\n const valObj = {};\n for (let valIndex = 0; valIndex < val.length; valIndex++) {\n valObj[`${val[valIndex].languageCode}-${val[valIndex].countryCode}`] = val[valIndex].text;\n }\n addTag(tags, tagSignature, valObj);\n }\n } else if (tagType === TAG_TYPE_TEXT) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + tagSize - 7));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_SIGNATURE) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + 12));\n addTag(tags, tagSignature, val);\n }\n tagHeaderOffset = tagHeaderOffset + 12;\n }\n\n return tags;\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction addTag(tags, tagSignature, value) {\n if (iccTags[tagSignature]) {\n tags[iccTags[tagSignature].name] = {value, description: value};\n } else {\n tags[tagSignature] = {value, description: value};\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n return {\n 'Image Width': getImageWidth(dataView, fileDataOffset),\n 'Image Height': getImageHeight(dataView, fileDataOffset),\n 'Bit Depth': getBitDepth(dataView, fileDataOffset),\n 'Color Type': getColorType(dataView, fileDataOffset),\n 'Compression': getCompression(dataView, fileDataOffset),\n 'Filter': getFilter(dataView, fileDataOffset),\n 'Interlace': getInterlace(dataView, fileDataOffset)\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset) {\n const OFFSET = 0;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset) {\n const OFFSET = 4;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getBitDepth(dataView, fileDataOffset) {\n const OFFSET = 8;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}`\n };\n}\n\nfunction getColorType(dataView, fileDataOffset) {\n const OFFSET = 9;\n const SIZE = 1;\n const COLOR_TYPES = {\n 0: 'Grayscale',\n 2: 'RGB',\n 3: 'Palette',\n 4: 'Grayscale with Alpha',\n 6: 'RGB with Alpha'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: COLOR_TYPES[value] || 'Unknown'\n };\n}\n\nfunction getCompression(dataView, fileDataOffset) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Deflate/Inflate' : 'Unknown'\n };\n}\n\nfunction getFilter(dataView, fileDataOffset) {\n const OFFSET = 11;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Adaptive' : 'Unknown'\n };\n}\n\nfunction getInterlace(dataView, fileDataOffset) {\n const OFFSET = 12;\n const SIZE = 1;\n const INTERLACE_TYPES = {\n 0: 'Noninterlaced',\n 1: 'Adam7 Interlace'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: INTERLACE_TYPES[value] || 'Unknown'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValueFromArray} from './utils.js';\nimport TagDecoder from './tag-decoder.js';\nimport {TYPE_TEXT, TYPE_ITXT} from './image-header-png.js';\n\nexport default {\n read\n};\n\nconst STATE_KEYWORD = 'STATE_KEYWORD';\nconst STATE_COMPRESSION = 'STATE_COMPRESSION';\nconst STATE_LANG = 'STATE_LANG';\nconst STATE_TRANSLATED_KEYWORD = 'STATE_TRANSLATED_KEYWORD';\nconst STATE_TEXT = 'STATE_TEXT';\nconst COMPRESSION_SECTION_LENGTH = 2;\n\nfunction read(dataView, pngTextChunks) {\n return pngTextChunks.reduce((tags, {offset, length, type}) => {\n const {name, value, description} = getNameAndValue(dataView, offset, length, type);\n if (name) {\n tags[name] = {\n value,\n description\n };\n }\n return tags;\n }, {});\n}\n\nfunction getNameAndValue(dataView, offset, length, type) {\n const keywordChars = [];\n const langChars = [];\n const translatedKeywordChars = [];\n const valueChars = [];\n let parsingState = STATE_KEYWORD;\n\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n if (parsingState === STATE_COMPRESSION) {\n const compressionFlag = dataView.getUint8(offset + i);\n if (compressionFlag !== 0) {\n return {}; // We don't support compression.\n }\n i += COMPRESSION_SECTION_LENGTH;\n parsingState = moveToNextState(type, parsingState);\n }\n const byte = dataView.getUint8(offset + i);\n if (byte === 0) {\n parsingState = moveToNextState(type, parsingState);\n } else if (parsingState === STATE_KEYWORD) {\n keywordChars.push(byte);\n } else if (parsingState === STATE_LANG) {\n langChars.push(byte);\n } else if (parsingState === STATE_TRANSLATED_KEYWORD) {\n translatedKeywordChars.push(byte);\n } else {\n valueChars.push(byte);\n }\n }\n\n const textValue = getStringValueFromArray(valueChars);\n\n return {\n name: getName(type, langChars, keywordChars),\n value: textValue,\n description: type === TYPE_ITXT ? TagDecoder.decode('UTF-8', valueChars) : textValue\n };\n}\n\nfunction moveToNextState(type, parsingState) {\n if (parsingState === STATE_KEYWORD && type === TYPE_ITXT) {\n return STATE_COMPRESSION;\n }\n if (parsingState === STATE_COMPRESSION) {\n return STATE_LANG;\n }\n if (parsingState === STATE_LANG) {\n return STATE_TRANSLATED_KEYWORD;\n }\n return STATE_TEXT;\n}\n\nfunction getName(type, langChars, keywordChars) {\n const name = getStringValueFromArray(keywordChars);\n if (type === TYPE_TEXT || langChars.length === 0) {\n return name;\n }\n const lang = getStringValueFromArray(langChars);\n return `${name} (${lang})`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {PNG_CHUNK_LENGTH_OFFSET, PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_DATA_OFFSET, PNG_CHUNK_TYPE_SIZE, TYPE_PHYS, TYPE_TIME} from './image-header-png.js';\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunkOffsets) {\n const tags = {};\n\n for (let i = 0; i < chunkOffsets.length; i++) {\n const chunkLength = Types.getLongAt(dataView, chunkOffsets[i] + PNG_CHUNK_LENGTH_OFFSET);\n const chunkType = getStringFromDataView(dataView, chunkOffsets[i] + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n\n if (chunkType === TYPE_PHYS) {\n tags['Pixels Per Unit X'] = getPixelsPerUnitX(dataView, chunkOffsets[i], chunkLength);\n tags['Pixels Per Unit Y'] = getPixelsPerUnitY(dataView, chunkOffsets[i], chunkLength);\n tags['Pixel Units'] = getPixelUnits(dataView, chunkOffsets[i], chunkLength);\n } else if (chunkType === TYPE_TIME) {\n tags['Modify Date'] = getModifyDate(dataView, chunkOffsets[i], chunkLength);\n }\n }\n\n return tags;\n}\n\nfunction getPixelsPerUnitX(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 0;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelsPerUnitY(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 4;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelUnits(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 8;\n const TAG_SIZE = 1;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: value === 1 ? 'meters' : 'Unknown'\n };\n}\n\nfunction getModifyDate(dataView, chunkOffset, chunkLength) {\n const TIME_TAG_SIZE = 7;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, 0, TIME_TAG_SIZE)) {\n return undefined;\n }\n\n const year = Types.getShortAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET);\n const month = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 2);\n const day = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 3);\n const hours = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 4);\n const minutes = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 5);\n const seconds = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 6);\n\n return {\n value: [year, month, day, hours, minutes, seconds],\n description: `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)} ${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`\n };\n}\n\nfunction tagFitsInBuffer(dataView, chunkOffset, chunkLength, tagOffset, tagSize) {\n return tagOffset + tagSize <= chunkLength && chunkOffset + PNG_CHUNK_DATA_OFFSET + tagOffset + tagSize <= dataView.byteLength;\n}\n\nfunction pad(number, size) {\n return `${'0'.repeat(size - ('' + number).length)}${number}`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nconst IMAGE_WIDTH_OFFSET = 4;\nconst IMAGE_HEIGHT_OFFSET = 7;\n\n// https://developers.google.com/speed/webp/docs/riff_container#extended_file_format\nfunction read(dataView, chunkOffset) {\n const tags = {};\n\n const flags = Types.getByteAt(dataView, chunkOffset);\n\n tags['Alpha'] = getAlpha(flags);\n tags['Animation'] = getAnimation(flags);\n tags['ImageWidth'] = getThreeByteValue(dataView, chunkOffset + IMAGE_WIDTH_OFFSET);\n tags['ImageHeight'] = getThreeByteValue(dataView, chunkOffset + IMAGE_HEIGHT_OFFSET);\n\n return tags;\n}\n\nfunction getAlpha(flags) {\n const value = flags & 0x10;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getAnimation(flags) {\n const value = flags & 0x02;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getThreeByteValue(dataView, offset) {\n // Values are stored little-endian.\n const value = Types.getByteAt(dataView, offset)\n + 256 * Types.getByteAt(dataView, offset + 1)\n + 256 * 256 * Types.getByteAt(dataView, offset + 2)\n + 1; // Value is 1-based, i.e. a value of 7 means 8px.\n\n return {\n value,\n description: value + 'px'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {deferInit, getBase64Image} from './utils.js';\n\n// https://exiftool.org/TagNames/EXIF.html#Compression\nconst COMPRESSION_JPEG = [6, 7, 99];\n\nexport default {\n get,\n};\n\nfunction get(dataView, thumbnailTags, tiffHeaderOffset) {\n if (hasJpegThumbnail(thumbnailTags)) {\n thumbnailTags.type = 'image/jpeg';\n const offset = tiffHeaderOffset + thumbnailTags.JPEGInterchangeFormat.value;\n thumbnailTags.image = dataView.buffer.slice(offset, offset + thumbnailTags.JPEGInterchangeFormatLength.value);\n deferInit(thumbnailTags, 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n // There is a small possibility of thumbnails in TIFF format but they are\n // not stored as a self-contained image file and would be much more\n // difficult to extract.\n // https://exiftool.org/forum/index.php?topic=3273.msg14778#msg14778\n\n return thumbnailTags;\n}\n\nfunction hasJpegThumbnail(tags) {\n return tags && ((tags.Compression === undefined) || (COMPRESSION_JPEG.includes(tags.Compression.value)))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n/**\n * Thrown when no Exif metadata was found for the given image.\n *\n * @param {string} message The error message.\n */\nfunction MetadataMissingError(message) {\n this.name = 'MetadataMissingError';\n this.message = message || 'No Exif data';\n this.stack = (new Error()).stack;\n}\n\nMetadataMissingError.prototype = new Error;\n\nexport default {\n MetadataMissingError,\n};\n","/**\n * ExifReader\n * http://github.com/mattiasw/exifreader\n * Copyright (C) 2011-2023 Mattias Wallander \n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/* global Buffer, __non_webpack_require__ */\n\nimport {objectAssign, dataUriToBuffer} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport {getCalculatedGpsValue} from './tag-names-utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport FileTags from './file-tags.js';\nimport JfifTags from './jfif-tags.js';\nimport IptcTags from './iptc-tags.js';\nimport XmpTags from './xmp-tags.js';\nimport IccTags from './icc-tags.js';\nimport PngFileTags from './png-file-tags.js';\nimport PngTextTags from './png-text-tags.js';\nimport PngTags from './png-tags.js';\nimport Vp8xTags from './vp8x-tags.js';\nimport Thumbnail from './thumbnail.js';\nimport exifErrors from './errors.js';\n\nexport default {\n load,\n loadView,\n errors: exifErrors,\n};\n\nexport const errors = exifErrors;\n\nexport function load(data, options) {\n if (isFilePathOrURL(data)) {\n return loadFile(data, options).then((fileContents) => loadFromData(fileContents, options));\n }\n if (isBrowserFileObject(data)) {\n return loadFileObject(data).then((fileContents) => loadFromData(fileContents, options));\n }\n return loadFromData(data, options);\n}\n\nfunction isFilePathOrURL(data) {\n return typeof data === 'string';\n}\n\nfunction loadFile(filename, options) {\n if (/^https?:\\/\\//.test(filename)) {\n if (typeof fetch !== 'undefined') {\n return browserFetchRemoteFile(filename, options);\n }\n\n return nodeFetchRemoteFile(filename, options);\n }\n\n if (isDataUri(filename)) {\n return Promise.resolve(dataUriToBuffer(filename));\n }\n\n return loadLocalFile(filename, options);\n}\n\nfunction browserFetchRemoteFile(url, {length} = {}) {\n const options = {method: 'GET'};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n return fetch(url, options).then((response) => response.arrayBuffer());\n}\n\nfunction nodeFetchRemoteFile(url, {length} = {}) {\n return new Promise((resolve, reject) => {\n const options = {};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n\n const get = requireNodeGet(url);\n get(url, options, (response) => {\n if ((response.statusCode >= 200) && (response.statusCode <= 299)) {\n const data = [];\n response.on('data', (chunk) => data.push(Buffer.from(chunk)));\n response.on('error', (error) => reject(error));\n response.on('end', () => resolve(Buffer.concat(data)));\n } else {\n reject(`Could not fetch file: ${response.statusCode} ${response.statusMessage}`);\n response.resume();\n }\n }).on('error', (error) => reject(error));\n });\n}\n\nfunction requireNodeGet(url) {\n if (/^https:\\/\\//.test(url)) {\n return __non_webpack_require__('https').get;\n }\n return __non_webpack_require__('http').get;\n}\n\nfunction isDataUri(filename) {\n return /^data:[^;,]*(;base64)?,/.test(filename);\n}\n\nfunction loadLocalFile(filename, {length} = {}) {\n return new Promise((resolve, reject) => {\n const fs = requireNodeFs();\n fs.open(filename, (error, fd) => {\n if (error) {\n reject(error);\n } else {\n fs.stat(filename, (error, stat) => {\n if (error) {\n reject(error);\n } else {\n const size = Math.min(stat.size, length !== undefined ? length : stat.size);\n const buffer = Buffer.alloc(size);\n const options = {\n buffer,\n length: size\n };\n fs.read(fd, options, (error) => {\n if (error) {\n reject(error);\n } else {\n fs.close(fd, (error) => {\n if (error) {\n console.warn(`Could not close file ${filename}:`, error); // eslint-disable-line no-console\n }\n resolve(buffer);\n });\n }\n });\n }\n });\n }\n });\n });\n}\n\nfunction requireNodeFs() {\n try {\n return __non_webpack_require__('fs');\n } catch (error) {\n return undefined;\n }\n}\n\nfunction isBrowserFileObject(data) {\n return (typeof window !== 'undefined') && (typeof File !== 'undefined') && (data instanceof File);\n}\n\nfunction loadFileObject(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => resolve(readerEvent.target.result);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction loadFromData(data, options) {\n if (isNodeBuffer(data)) {\n // File data read in Node can share the underlying buffer with other\n // data. Therefore it's safest to get a new one to avoid weird bugs.\n data = (new Uint8Array(data)).buffer;\n }\n return loadView(getDataView(data), options);\n}\n\nfunction isNodeBuffer(data) {\n try {\n return Buffer.isBuffer(data);\n } catch (error) {\n return false;\n }\n}\n\nfunction getDataView(data) {\n try {\n return new DataView(data);\n } catch (error) {\n return new DataViewWrapper(data);\n }\n}\n\nexport function loadView(dataView, {expanded = false, includeUnknown = false} = {expanded: false, includeUnknown: false}) {\n let foundMetaData = false;\n let tags = {};\n\n const {\n fileType,\n fileDataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset,\n pngHeaderOffset,\n pngTextChunks,\n pngChunkOffsets,\n vp8xChunkOffset,\n } = ImageHeader.parseAppMarkers(dataView);\n\n if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {\n foundMetaData = true;\n const readTags = FileTags.read(dataView, fileDataOffset);\n if (expanded) {\n tags.file = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_JFIF && hasJfifData(jfifDataOffset)) {\n foundMetaData = true;\n const readTags = JfifTags.read(dataView, jfifDataOffset);\n if (expanded) {\n tags.jfif = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_EXIF && hasExifData(tiffHeaderOffset)) {\n foundMetaData = true;\n const readTags = Tags.read(dataView, tiffHeaderOffset, includeUnknown);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (expanded) {\n tags.exif = readTags;\n addGpsGroup(tags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n\n if (Constants.USE_TIFF && Constants.USE_IPTC && readTags['IPTC-NAA'] && !hasIptcData(iptcDataOffset)) {\n const readIptcTags = IptcTags.read(readTags['IPTC-NAA'].value, 0, includeUnknown);\n if (expanded) {\n tags.iptc = readIptcTags;\n } else {\n tags = objectAssign({}, tags, readIptcTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_XMP && readTags['ApplicationNotes'] && !hasXmpData(xmpChunks)) {\n const readXmpTags = XmpTags.read(getStringValueFromArray(readTags['ApplicationNotes'].value));\n if (expanded) {\n tags.xmp = readXmpTags;\n } else {\n delete readXmpTags._raw;\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_ICC && readTags['ICC_Profile'] && !hasIccData(iccChunks)) {\n const readIccTags = IccTags.read(\n readTags['ICC_Profile'].value,\n [{\n offset: 0,\n length: readTags['ICC_Profile'].value.length,\n chunkNumber: 1,\n chunksTotal: 1\n }]\n );\n if (expanded) {\n tags.icc = readIccTags;\n } else {\n tags = objectAssign({}, tags, readIccTags);\n }\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset, includeUnknown);\n if (expanded) {\n tags.iptc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_XMP && hasXmpData(xmpChunks)) {\n foundMetaData = true;\n const readTags = XmpTags.read(dataView, xmpChunks);\n if (expanded) {\n tags.xmp = readTags;\n } else {\n delete readTags._raw;\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if ((Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks);\n if (expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_MPF && hasMpfData(mpfDataOffset)) {\n foundMetaData = true;\n const readMpfTags = Tags.readMpf(dataView, mpfDataOffset, includeUnknown);\n if (expanded) {\n tags.mpf = readMpfTags;\n } else {\n tags = objectAssign({}, tags, readMpfTags);\n }\n }\n\n if (Constants.USE_PNG && Constants.USE_PNG_FILE && hasPngFileData(pngHeaderOffset)) {\n foundMetaData = true;\n const readTags = PngFileTags.read(dataView, pngHeaderOffset);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngTextData(pngTextChunks)) {\n foundMetaData = true;\n const readTags = PngTextTags.read(dataView, pngTextChunks);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngText = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngData(pngChunkOffsets)) {\n foundMetaData = true;\n const readTags = PngTags.read(dataView, pngChunkOffsets);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_WEBP && hasVp8xData(vp8xChunkOffset)) {\n foundMetaData = true;\n const readTags = Vp8xTags.read(dataView, vp8xChunkOffset);\n if (expanded) {\n tags.riff = !tags.riff ? readTags : objectAssign({}, tags.riff, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n foundMetaData = true;\n tags.Thumbnail = thumbnail;\n } else {\n delete tags.Thumbnail;\n }\n\n if (fileType) {\n if (expanded) {\n if (!tags.file) {\n tags.file = {};\n }\n tags.file.FileType = fileType;\n } else {\n tags.FileType = fileType;\n }\n }\n\n if (!foundMetaData) {\n throw new exifErrors.MetadataMissingError();\n }\n\n return tags;\n}\n\nfunction hasFileData(fileDataOffset) {\n return fileDataOffset !== undefined;\n}\n\nfunction hasJfifData(jfifDataOffset) {\n return jfifDataOffset !== undefined;\n}\n\nfunction hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\n}\n\nfunction addGpsGroup(tags) {\n if (tags.exif) {\n if (tags.exif.GPSLatitude && tags.exif.GPSLatitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Latitude = getCalculatedGpsValue(tags.exif.GPSLatitude.value);\n if (tags.exif.GPSLatitudeRef.value.join('') === 'S') {\n tags.gps.Latitude = -tags.gps.Latitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSLongitude && tags.exif.GPSLongitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Longitude = getCalculatedGpsValue(tags.exif.GPSLongitude.value);\n if (tags.exif.GPSLongitudeRef.value.join('') === 'W') {\n tags.gps.Longitude = -tags.gps.Longitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSAltitude && tags.exif.GPSAltitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Altitude = tags.exif.GPSAltitude.value[0] / tags.exif.GPSAltitude.value[1];\n if (tags.exif.GPSAltitudeRef.value === 1) {\n tags.gps.Altitude = -tags.gps.Altitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n }\n}\n\nfunction hasIptcData(iptcDataOffset) {\n return iptcDataOffset !== undefined;\n}\n\nfunction hasXmpData(xmpChunks) {\n return Array.isArray(xmpChunks) && xmpChunks.length > 0;\n}\n\nfunction hasIccData(iccDataOffsets) {\n return Array.isArray(iccDataOffsets) && iccDataOffsets.length > 0;\n}\n\nfunction hasMpfData(mpfDataOffset) {\n return mpfDataOffset !== undefined;\n}\n\nfunction hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n\nfunction hasPngTextData(pngTextChunks) {\n return pngTextChunks !== undefined;\n}\n\nfunction hasPngData(pngChunkOffsets) {\n return pngChunkOffsets !== undefined;\n}\n\nfunction hasVp8xData(vp8xChunkOffset) {\n return vp8xChunkOffset !== undefined;\n}\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","getStringFromDataView","dataView","offset","length","chars","i","byteLength","push","getUint8","getStringValueFromArray","getUnicodeStringFromDataView","getUint16","charArray","map","charCode","String","fromCharCode","join","objectAssign","arguments","property","deferInit","object","initializer","initialized","configurable","apply","writable","getBase64Image","image","btoa","Array","reduce","Uint8Array","data","byte","Buffer","undefined","from","toString","DataView","buffer","readUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt32LE","readInt32BE","bufferTypeIsUnsupported","Error","littleEndian","getStringValue","getEncodedString","encoding","slice","getCalculatedGpsValue","LITTLE_ENDIAN","tiffHeaderOffset","APP1_MARKER","isSOF0Marker","appMarkerPosition","isSOF2Marker","isApp2ICCMarker","APP2_ICC_IDENTIFIER","isApp2MPFMarker","APP2_MPF_IDENTIFIER","isApp0JfifMarker","APP1_EXIF_IDENTIFIER","isApp1ExifMarker","isApp1XmpMarker","APP1_XMP_IDENTIFIER","isXmpIdentifier","isApp1ExtendedXmpMarker","APP1_XMP_EXTENDED_IDENTIFIER","isExtendedXmpIdentifier","getXmpChunkDetails","fieldLength","dataOffset","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","APP13_IPTC_IDENTIFIER","isAppMarker","appMarker","isFillByte","PNG_ID","TYPE_ITXT","TYPE_PHYS","TYPE_TIME","isPngImageHeaderChunk","isPngXmpChunk","PNG_CHUNK_LENGTH_SIZE","PNG_XMP_PREFIX","isPngTextChunk","chunkType","isPngExifChunk","isPngChunk","SUPPORTED_PNG_CHUNK_TYPES","includes","getPngXmpDataOffset","PNG_CHUNK_DATA_OFFSET","numberOfNullSeparators","getAtomLength","atomLength","getUint32","extendsToEndOfFile","hasExtendedSize","hasEmptyHighBits","ByteOrder","hasTiffMarker","Tiff","addFileType","hasAppMarkers","Jpeg","sof0DataOffset","sof2DataOffset","jfifDataOffset","iptcDataOffset","xmpChunks","iccChunks","mpfDataOffset","iccDataOffset","iccDataLength","iccChunkNumber","APP_ID_OFFSET","iccChunksTotal","ICC_CHUNK_NUMBER_OFFSET","chunkNumber","chunksTotal","fileDataOffset","Png","offsets","pngHeaderOffset","pngTextChunks","type","pngChunkOffsets","heicMajorBrand","HEIC_ID_OFFSET","HEIC_ID","indexOf","Heic","findMetaAtom","metaOffset","metaLength","metaEndOffset","Math","min","ilocOffset","exifItemOffset","colrOffset","itemName","findMetaItems","exifOffset","exifItemIndex","exifPointer","findExifOffset","colorType","findIccChunks","RIFF_ID","WEBP_MARKER","Webp","vp8xChunkOffset","chunkId","chunkSize","EXIF_IDENTIFIER","fileType","fileTypeDescription","description","typeSizes","tagTypes","getAsciiValue","getByteAt","getAsciiAt","getShortAt","byteOrder","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","typeName","getInt32","ApertureValue","pow","sqrt","toFixed","ColorSpace","ComponentsConfiguration","character","Contrast","CustomRendered","ExposureMode","ExposureProgram","ExposureTime","round","FNumber","FocalLength","FocalPlaneResolutionUnit","LightSource","MeteringMode","ResolutionUnit","Saturation","SceneCaptureType","Sharpness","ShutterSpeedValue","denominator","WhiteBalance","XResolution","YResolution","name","TagNamesCommon","values","formats","isArray","sample","ref","num","test","status","mode","tagNames0thExifIfds","TagNames0thIfd","x","y","focalLengths","IFD_TYPE_0TH","IFD_TYPE_EXIF","IFD_TYPE_INTEROPERABILITY","TagNamesGpsIfd","TagNamesInteroperabilityIfd","TagNamesMpfIfd","getTagValueAt","Types","includeUnknown","tags","readIfd","get0thIfdOffset","read0thIfd","INTEROPERABILITY_IFD_POINTER_KEY","readInteroperabilityIfd","GPS_INFO_IFD_POINTER_KEY","readGpsIfd","EXIF_IFD_POINTER_KEY","readExifIfd","ENTRY_SIZE","images","ceil","attributes","getImageNumberValue","getImageFlags","getImageFormat","getImageType","imageSize","imageOffset","isFirstIndividualImage","dependentImage1EntryNumber","dependentImage2EntryNumber","addMpfImages","entries","size","flags","flagsDescription","imageFormat","ifdType","FIELD_COUNT_SIZE","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","id","nextIfdOffset","tagValue","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","TagNames","tagValueFitsInOffsetSlot","getTagValue","tagValueOffset","tagValueFitsInDataView","asciiValue","decodeURIComponent","escape","error","decodeAsciiValue","string","j","splitNullSeparatedAsciiString","tagName","tagDescription","getDescriptionFromTagValue","count","forceByteType","valueIndex","getLength","numberOfColorComponents","OFFSET","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","thumbnailWidth","getThumbnailWidth","thumbnailHeight","getThumbnailHeight","getVersion","getResolutionUnit","getXResolution","getYResolution","thumbnail","thumbnailLength","getThumbnail","majorVersion","minorVersion","getResolutionUnitDescription","getCreationDate","getCreationTime","getEncodingName","parts","split","stringValue","character0","charAt","character1","parseInt","bits","duration","substr","intValue","formatVersions","objectDataPreviewFileFormat","n","date","time","parsedTime","Decoder","TextDecoder","decode","parseTags","BYTES_8BIM_SIZE","resourceBlock","getResourceBlock","isNaaResourceBlock","naaBlock","getBlockPadding","getNaaResourceBlock","endOfBlockOffset","tagSize","leadByteIsMissing","IptcTagNames","getTagName","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","TagDecoder","fraction","calculateGPSValue","substring","parseNumber","numbers","number","charCodeAt","isFraction","func","degreesString","minutesString","degrees","parseFloat","minutes","Number","isNaN","chunks","readTags","completeChunks","combineChunks","extractCompleteChunks","standardXmp","extendedXmp","hasStandardTags","hasExtendedTags","_raw","totalLength","chunk","combinedChunks","set","chunkDataView","domParser","DOMParser","__non_webpack_require__","errorHandler","console","warn","xmlString","doc","parseFromString","replace","documentElement","nodeName","textContent","raw","getDocument","parseXMPObject","convertToObject","getRDF","node","childNodes","isTopNode","getChildNodes","hasTextOnlyContent","getTextValue","getElementsFromNodes","elements","nodes","nodeValue","forEach","isElement","nodeElement","getAttributes","getElementFromNode","element","xmpObject","parseNodeAttributesAsTags","parseNodeChildrenAsTags","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","arrayDescription","getDescriptionOfArray","XmpTagNames","getDescriptionOfObject","item","descriptions","getClearTextKey","children","parseNodeAsTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAsStructureRdfDescription","isCompactStructure","parseNodeAsCompactStructure","getArrayChild","items","parseNodeAttributes","parseNodeAsSimpleValue","parseArrayValue","parseNodeAsArray","parseNodeChildrenAsAttributes","getURIValue","parseRdfValue","keys","iccTags","iccProfile","toCompany","toLowerCase","year","month","day","hours","seconds","Date","UTC","parseDate","toISOString","iccData","totalIccProfileLength","sum","icc","iccBinaryData","getBuffer","iccDataChunk","find","chunkData","iccProfileKeys","profileEntry","sliceToString","ICC_SIGNATURE","ICC_TAG_COUNT_OFFSET","iccDoesNotHaveTagCount","tagHeaderOffset","hasTagsData","tagSignature","tagOffset","TAG_TYPE_DESC","tagValueSize","addTag","TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE","numRecords","recordSize","val","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","TAG_TYPE_TEXT","TAG_TYPE_SIGNATURE","getBitDepth","getColorType","getCompression","getFilter","getInterlace","keywordChars","langChars","translatedKeywordChars","valueChars","parsingState","STATE_KEYWORD","STATE_COMPRESSION","moveToNextState","STATE_LANG","STATE_TRANSLATED_KEYWORD","textValue","getName","getNameAndValue","lang","chunkOffsets","chunkLength","getPixelsPerUnitX","getPixelsPerUnitY","getPixelUnits","getModifyDate","chunkOffset","tagFitsInBuffer","pad","repeat","getAlpha","getAnimation","getThreeByteValue","COMPRESSION_JPEG","thumbnailTags","Compression","JPEGInterchangeFormat","JPEGInterchangeFormatLength","MetadataMissingError","message","stack","load","loadView","errors","exifErrors","options","isFilePathOrURL","filename","fetch","url","method","isInteger","headers","range","then","response","arrayBuffer","browserFetchRemoteFile","Promise","resolve","reject","requireNodeGet","statusCode","on","concat","statusMessage","resume","nodeFetchRemoteFile","isDataUri","dataUri","atob","char","decodedData","dataUriToBuffer","fs","requireNodeFs","open","fd","stat","alloc","read","close","loadLocalFile","loadFile","fileContents","loadFromData","window","File","isBrowserFileObject","file","reader","FileReader","onload","readerEvent","target","result","onerror","readAsArrayBuffer","isBuffer","isNodeBuffer","DataViewWrapper","getDataView","expanded","foundMetaData","ImageHeader","hasFileData","FileTags","hasJfifData","JfifTags","jfif","hasExifData","Tags","Thumbnail","exif","addGpsGroup","hasIptcData","readIptcTags","IptcTags","iptc","hasXmpData","readXmpTags","XmpTags","xmp","hasIccData","readIccTags","IccTags","hasMpfData","readMpfTags","mpf","hasPngFileData","PngFileTags","png","pngFile","hasPngTextData","PngTextTags","pngText","hasPngData","PngTags","hasVp8xData","Vp8xTags","riff","FileType","GPSLatitude","GPSLatitudeRef","gps","Latitude","GPSLongitude","GPSLongitudeRef","Longitude","GPSAltitude","GPSAltitudeRef","Altitude","iccDataOffsets","pngFileDataOffset"],"sourceRoot":""} \ No newline at end of file diff --git a/src/exif-reader.js b/src/exif-reader.js index 534501b..e92a66f 100644 --- a/src/exif-reader.js +++ b/src/exif-reader.js @@ -23,6 +23,7 @@ import IccTags from './icc-tags.js'; import PngFileTags from './png-file-tags.js'; import PngTextTags from './png-text-tags.js'; import PngTags from './png-tags.js'; +import Vp8xTags from './vp8x-tags.js'; import Thumbnail from './thumbnail.js'; import exifErrors from './errors.js'; @@ -196,6 +197,7 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} = let tags = {}; const { + fileType, fileDataOffset, jfifDataOffset, tiffHeaderOffset, @@ -205,7 +207,8 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} = mpfDataOffset, pngHeaderOffset, pngTextChunks, - pngChunkOffsets + pngChunkOffsets, + vp8xChunkOffset, } = ImageHeader.parseAppMarkers(dataView); if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) { @@ -353,6 +356,16 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} = } } + if (Constants.USE_WEBP && hasVp8xData(vp8xChunkOffset)) { + foundMetaData = true; + const readTags = Vp8xTags.read(dataView, vp8xChunkOffset); + if (expanded) { + tags.riff = !tags.riff ? readTags : objectAssign({}, tags.riff, readTags); + } else { + tags = objectAssign({}, tags, readTags); + } + } + const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_EXIF && Constants.USE_THUMBNAIL @@ -364,6 +377,17 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} = delete tags.Thumbnail; } + if (fileType) { + if (expanded) { + if (!tags.file) { + tags.file = {}; + } + tags.file.FileType = fileType; + } else { + tags.FileType = fileType; + } + } + if (!foundMetaData) { throw new exifErrors.MetadataMissingError(); } @@ -450,3 +474,7 @@ function hasPngTextData(pngTextChunks) { function hasPngData(pngChunkOffsets) { return pngChunkOffsets !== undefined; } + +function hasVp8xData(vp8xChunkOffset) { + return vp8xChunkOffset !== undefined; +} diff --git a/src/image-header-webp.js b/src/image-header-webp.js index 81ba8a2..1f3d2a2 100644 --- a/src/image-header-webp.js +++ b/src/image-header-webp.js @@ -31,6 +31,7 @@ function findOffsets(dataView) { let tiffHeaderOffset; let xmpChunks; let iccChunks; + let vp8xChunkOffset; while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) { const chunkId = getStringFromDataView(dataView, offset, 4); @@ -57,6 +58,9 @@ function findOffsets(dataView) { chunkNumber: 1, chunksTotal: 1 }]; + } else if (chunkId === 'VP8X') { + hasAppMarkers = true; + vp8xChunkOffset = offset + CHUNK_HEADER_SIZE; } offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1); @@ -66,6 +70,7 @@ function findOffsets(dataView) { hasAppMarkers, tiffHeaderOffset, xmpChunks, - iccChunks + iccChunks, + vp8xChunkOffset }; } diff --git a/src/image-header.js b/src/image-header.js index 2f9b31a..4b014fe 100644 --- a/src/image-header.js +++ b/src/image-header.js @@ -8,6 +8,7 @@ import Jpeg from './image-header-jpeg.js'; import Png from './image-header-png.js'; import Heic from './image-header-heic.js'; import Webp from './image-header-webp.js'; +import {objectAssign} from './utils.js'; export default { parseAppMarkers @@ -15,24 +16,28 @@ export default { function parseAppMarkers(dataView) { if (Constants.USE_TIFF && Tiff.isTiffFile(dataView)) { - return Tiff.findTiffOffsets(); + return addFileType(Tiff.findTiffOffsets(), 'tiff', 'TIFF'); } if (Constants.USE_JPEG && Jpeg.isJpegFile(dataView)) { - return Jpeg.findJpegOffsets(dataView); + return addFileType(Jpeg.findJpegOffsets(dataView), 'jpeg', 'JPEG'); } if (Constants.USE_PNG && Png.isPngFile(dataView)) { - return Png.findPngOffsets(dataView); + return addFileType(Png.findPngOffsets(dataView), 'png', 'PNG'); } if (Constants.USE_HEIC && Heic.isHeicFile(dataView)) { - return Heic.findHeicOffsets(dataView); + return addFileType(Heic.findHeicOffsets(dataView), 'heic', 'HEIC'); } if (Constants.USE_WEBP && Webp.isWebpFile(dataView)) { - return Webp.findOffsets(dataView); + return addFileType(Webp.findOffsets(dataView), 'webp', 'WebP'); } throw new Error('Invalid image format'); } + +function addFileType(offsets, fileType, fileTypeDescription) { + return objectAssign({}, offsets, {fileType: {value: fileType, description: fileTypeDescription}}); +} diff --git a/src/vp8x-tags.js b/src/vp8x-tags.js new file mode 100644 index 0000000..27c9dea --- /dev/null +++ b/src/vp8x-tags.js @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +import Types from './types.js'; + +export default { + read +}; + +const IMAGE_WIDTH_OFFSET = 4; +const IMAGE_HEIGHT_OFFSET = 7; + +// https://developers.google.com/speed/webp/docs/riff_container#extended_file_format +function read(dataView, chunkOffset) { + const tags = {}; + + const flags = Types.getByteAt(dataView, chunkOffset); + + tags['Alpha'] = getAlpha(flags); + tags['Animation'] = getAnimation(flags); + tags['ImageWidth'] = getThreeByteValue(dataView, chunkOffset + IMAGE_WIDTH_OFFSET); + tags['ImageHeight'] = getThreeByteValue(dataView, chunkOffset + IMAGE_HEIGHT_OFFSET); + + return tags; +} + +function getAlpha(flags) { + const value = flags & 0x10; + return { + value: value ? 1 : 0, + description: value ? 'Yes' : 'No' + }; +} + +function getAnimation(flags) { + const value = flags & 0x02; + return { + value: value ? 1 : 0, + description: value ? 'Yes' : 'No' + }; +} + +function getThreeByteValue(dataView, offset) { + // Values are stored little-endian. + const value = Types.getByteAt(dataView, offset) + + 256 * Types.getByteAt(dataView, offset + 1) + + 256 * 256 * Types.getByteAt(dataView, offset + 2) + + 1; // Value is 1-based, i.e. a value of 7 means 8px. + + return { + value, + description: value + 'px' + }; +}