LLVMFuzzerTestOneInput:
    7|  29.4k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    8|       |  // Invalid files generate a lot of warnings, so switch off logging.
    9|  29.4k|  Exiv2::LogMsg::setLevel(Exiv2::LogMsg::mute);
   10|       |
   11|  29.4k|  try {
   12|  29.4k|    Exiv2::DataBuf data_copy(data, size);
   13|  29.4k|    Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open(data_copy.c_data(), size);
   14|  29.4k|    assert(image.get() != 0);
   15|       |
   16|  29.4k|    image->readMetadata();
   17|  20.0M|    for (auto& md : image->exifData()) {
  ------------------
  |  Branch (17:19): [True: 20.0M, False: 29.4k]
  ------------------
   18|  20.0M|      if (md.tagName().substr(0, 2) != "0x") {
  ------------------
  |  Branch (18:11): [True: 574k, False: 19.4M]
  ------------------
   19|   574k|        md.print();
   20|   574k|        md.print(&image->exifData());
   21|   574k|      }
   22|  20.0M|    }
   23|  29.4k|    for (auto& md : image->iptcData()) {
  ------------------
  |  Branch (23:19): [True: 2.99k, False: 29.4k]
  ------------------
   24|  2.99k|      if (md.tagName().substr(0, 2) != "0x") {
  ------------------
  |  Branch (24:11): [True: 1.93k, False: 1.06k]
  ------------------
   25|  1.93k|        md.print();
   26|  1.93k|        md.print(&image->exifData());
   27|  1.93k|      }
   28|  2.99k|    }
   29|  29.4k|    for (auto& md : image->xmpData()) {
  ------------------
  |  Branch (29:19): [True: 9.18k, False: 29.4k]
  ------------------
   30|  9.18k|      if (md.tagName().substr(0, 2) != "0x") {
  ------------------
  |  Branch (30:11): [True: 9.18k, False: 0]
  ------------------
   31|  9.18k|        md.print();
   32|  9.18k|        md.print(&image->exifData());
   33|  9.18k|      }
   34|  9.18k|    }
   35|       |
   36|       |    // Print to a std::ostringstream so that the fuzzer doesn't
   37|       |    // produce lots of garbage on stdout.
   38|  29.4k|    std::ostringstream buffer;
   39|  29.4k|    image->printStructure(buffer, Exiv2::kpsNone);
   40|  29.4k|    image->printStructure(buffer, Exiv2::kpsBasic);
   41|  29.4k|    image->printStructure(buffer, Exiv2::kpsXMP);
   42|  29.4k|    image->printStructure(buffer, Exiv2::kpsRecursive);
   43|  29.4k|    image->printStructure(buffer, Exiv2::kpsIccProfile);
   44|  29.4k|    image->printStructure(buffer, Exiv2::kpsIptcErase);
   45|       |
   46|  29.4k|    image->writeMetadata();
   47|       |
   48|  29.4k|  } catch (...) {
   49|       |    // Exiv2 throws an exception if the metadata is invalid.
   50|  27.8k|  }
   51|       |
   52|  29.4k|  return 0;
   53|  29.4k|}

_ZN5Exiv28AsfVideo7GUIDTagC2EjttNSt3__15arrayIhLm8EEE:
   82|    124|        data1_(data1), data2_(data2), data3_(data3), data4_(data4) {
   83|    124|    }
_ZNK5Exiv28AsfVideo12HeaderReader7getSizeEv:
  105|  1.88k|    [[nodiscard]] uint64_t getSize() const {
  106|  1.88k|      return size_;
  107|  1.88k|    }
_ZNK5Exiv28AsfVideo12HeaderReader16getRemainingSizeEv:
  109|    546|    [[nodiscard]] uint64_t getRemainingSize() const {
  110|    546|      return remaining_size_;
  111|    546|    }
_ZN5Exiv28AsfVideo12HeaderReader5getIdEv:
  113|  1.78k|    [[nodiscard]] DataBuf& getId() {
  114|  1.78k|      return IdBuf_;
  115|  1.78k|    }

_ZN5Exiv28IoCloserC2ERNS_7BasicIoE:
  249|  82.0k|  explicit IoCloser(BasicIo& bio) : bio_(bio) {
  250|  82.0k|  }
_ZN5Exiv28IoCloserD2Ev:
  252|  82.0k|  virtual ~IoCloser() {
  253|  82.0k|    close();
  254|  82.0k|  }
_ZN5Exiv28IoCloser5closeEv:
  260|  82.0k|  void close() {
  261|  82.0k|    if (bio_.isopen())
  ------------------
  |  Branch (261:9): [True: 82.0k, False: 0]
  ------------------
  262|  82.0k|      bio_.close();
  263|  82.0k|  }
_ZN5Exiv27BasicIoC2Ev:
   40|  59.8k|  BasicIo() = default;

_ZN5Exiv24IlocC2Ejjj:
   24|  9.54k|  explicit Iloc(uint32_t ID = 0, uint32_t start = 0, uint32_t length = 0) : ID_(ID), start_(start), length_(length) {
   25|  9.54k|  }

_ZN5Exiv25ErrorC2INSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEENS_9ErrorCodeERKT_:
  243|  2.55k|  Error(ErrorCode code, const A& arg1) : code_(code), arg1_(toBasicString<char>(arg1)) {
  244|  2.55k|    setMsg(1);
  245|  2.55k|  }
_ZN5Exiv213toBasicStringIcNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS2_IT_NS3_IS8_EENS5_IS8_EEEERKT0_:
  153|  2.55k|std::basic_string<charT> toBasicString(const T& arg) {
  154|  2.55k|  std::basic_ostringstream<charT> os;
  155|  2.55k|  os << arg;
  156|  2.55k|  return os.str();
  157|  2.55k|}
_ZN5Exiv213toBasicStringIcA4_cEENSt3__112basic_stringIT_NS2_11char_traitsIS4_EENS2_9allocatorIS4_EEEERKT0_:
  153|     83|std::basic_string<charT> toBasicString(const T& arg) {
  154|     83|  std::basic_ostringstream<charT> os;
  155|     83|  os << arg;
  156|     83|  return os.str();
  157|     83|}
_ZN5Exiv25ErrorC2IA10_cEENS_9ErrorCodeERKT_:
  243|     14|  Error(ErrorCode code, const A& arg1) : code_(code), arg1_(toBasicString<char>(arg1)) {
  244|     14|    setMsg(1);
  245|     14|  }
_ZN5Exiv213toBasicStringIcA10_cEENSt3__112basic_stringIT_NS2_11char_traitsIS4_EENS2_9allocatorIS4_EEEERKT0_:
  153|     14|std::basic_string<charT> toBasicString(const T& arg) {
  154|     14|  std::basic_ostringstream<charT> os;
  155|     14|  os << arg;
  156|     14|  return os.str();
  157|     14|}
_ZN5Exiv25ErrorC2IA5_cEENS_9ErrorCodeERKT_:
  243|  4.63k|  Error(ErrorCode code, const A& arg1) : code_(code), arg1_(toBasicString<char>(arg1)) {
  244|  4.63k|    setMsg(1);
  245|  4.63k|  }
_ZN5Exiv213toBasicStringIcA5_cEENSt3__112basic_stringIT_NS2_11char_traitsIS4_EENS2_9allocatorIS4_EEEERKT0_:
  153|  4.63k|std::basic_string<charT> toBasicString(const T& arg) {
  154|  4.63k|  std::basic_ostringstream<charT> os;
  155|  4.63k|  os << arg;
  156|  4.63k|  return os.str();
  157|  4.63k|}
_ZN5Exiv25ErrorC2IA4_cEENS_9ErrorCodeERKT_:
  243|     83|  Error(ErrorCode code, const A& arg1) : code_(code), arg1_(toBasicString<char>(arg1)) {
  244|     83|    setMsg(1);
  245|     83|  }
_ZN5Exiv25ErrorC2IPKcA6_cEENS_9ErrorCodeERKT_RKT0_:
  250|     15|      code_(code), arg1_(toBasicString<char>(arg1)), arg2_(toBasicString<char>(arg2)) {
  251|     15|    setMsg(2);
  252|     15|  }
_ZN5Exiv213toBasicStringIcPKcEENSt3__112basic_stringIT_NS3_11char_traitsIS5_EENS3_9allocatorIS5_EEEERKT0_:
  153|     36|std::basic_string<charT> toBasicString(const T& arg) {
  154|     36|  std::basic_ostringstream<charT> os;
  155|     36|  os << arg;
  156|     36|  return os.str();
  157|     36|}
_ZN5Exiv213toBasicStringIcA6_cEENSt3__112basic_stringIT_NS2_11char_traitsIS4_EENS2_9allocatorIS4_EEEERKT0_:
  153|     15|std::basic_string<charT> toBasicString(const T& arg) {
  154|     15|  std::basic_ostringstream<charT> os;
  155|     15|  os << arg;
  156|     15|  return os.str();
  157|     15|}
_ZN5Exiv25ErrorC2IPKcEENS_9ErrorCodeERKT_:
  243|     21|  Error(ErrorCode code, const A& arg1) : code_(code), arg1_(toBasicString<char>(arg1)) {
  244|     21|    setMsg(1);
  245|     21|  }
_ZN5Exiv25ErrorC2IA61_cEENS_9ErrorCodeERKT_:
  243|     14|  Error(ErrorCode code, const A& arg1) : code_(code), arg1_(toBasicString<char>(arg1)) {
  244|     14|    setMsg(1);
  245|     14|  }
_ZN5Exiv213toBasicStringIcA61_cEENSt3__112basic_stringIT_NS2_11char_traitsIS4_EENS2_9allocatorIS4_EEEERKT0_:
  153|     14|std::basic_string<charT> toBasicString(const T& arg) {
  154|     14|  std::basic_ostringstream<charT> os;
  155|     14|  os << arg;
  156|     14|  return os.str();
  157|     14|}

_ZN5Exiv28ExifData5beginEv:
  438|  83.6k|  iterator begin() {
  439|  83.6k|    return exifMetadata_.begin();
  440|  83.6k|  }
_ZN5Exiv28ExifData3endEv:
  442|  5.05M|  iterator end() {
  443|  5.05M|    return exifMetadata_.end();
  444|  5.05M|  }
_ZNK5Exiv28ExifData5beginEv:
  455|  2.29k|  [[nodiscard]] const_iterator begin() const {
  456|  2.29k|    return exifMetadata_.begin();
  457|  2.29k|  }
_ZNK5Exiv28ExifData3endEv:
  459|   145k|  [[nodiscard]] const_iterator end() const {
  460|   145k|    return exifMetadata_.end();
  461|   145k|  }
_ZNK5Exiv28ExifData5emptyEv:
  468|  6.24k|  [[nodiscard]] bool empty() const {
  469|  6.24k|    return exifMetadata_.empty();
  470|  6.24k|  }
_ZN5Exiv210ExifParser6encodeERNSt3__16vectorIhNS1_9allocatorIhEEEENS_9ByteOrderERNS_8ExifDataE:
  564|  2.84k|  static void encode(Blob& blob, ByteOrder byteOrder, ExifData& exifData) {
  565|  2.84k|    encode(blob, nullptr, 0, byteOrder, exifData);
  566|  2.84k|  }

_ZNK5Exiv215ImageCtorParams6createEv:
   53|  5.58k|  bool create() const {
   54|  5.58k|    return create_;
   55|  5.58k|  }
_ZNK5Exiv215ImageCtorParams19max_recursion_depthEv:
   57|  32.1k|  size_t max_recursion_depth() const {
   58|  32.1k|    return max_recursion_depth_;
   59|  32.1k|  }
_ZNK5Exiv25Image17iccProfileDefinedEv:
  240|  1.12k|  [[nodiscard]] virtual bool iccProfileDefined() const {
  241|  1.12k|    return !iccProfile_.empty();
  242|  1.12k|  }
_ZN5Exiv25Image16setTypeSupportedENS_9ImageTypeEt:
  481|     62|  void setTypeSupported(ImageType imageType, uint16_t supportedMetadata) {
  482|     62|    imageType_ = imageType;
  483|     62|    supportedMetadata_ = supportedMetadata;
  484|     62|  }
_ZNK5Exiv25Image9imageTypeEv:
  487|  30.0k|  [[nodiscard]] ImageType imageType() const {
  488|  30.0k|    return imageType_;
  489|  30.0k|  }

_ZN5Exiv28IptcData5beginEv:
  207|  25.1k|  iterator begin() {
  208|  25.1k|    return iptcMetadata_.begin();
  209|  25.1k|  }
_ZN5Exiv28IptcData3endEv:
  211|  29.1k|  iterator end() {
  212|  29.1k|    return iptcMetadata_.end();
  213|  29.1k|  }
_ZN5Exiv28IptcData5clearEv:
  199|  31.6k|  void clear() {
  200|  31.6k|    iptcMetadata_.clear();
  201|  31.6k|  }
_ZNK5Exiv28IptcData5beginEv:
  229|    389|  [[nodiscard]] const_iterator begin() const {
  230|    389|    return iptcMetadata_.begin();
  231|    389|  }
_ZNK5Exiv28IptcData3endEv:
  233|    389|  [[nodiscard]] const_iterator end() const {
  234|    389|    return iptcMetadata_.end();
  235|    389|  }
_ZNK5Exiv28IptcData5emptyEv:
  247|  15.0k|  [[nodiscard]] bool empty() const {
  248|  15.0k|    return iptcMetadata_.empty();
  249|  15.0k|  }

_ZN5Exiv28Internal11MatroskaTagC2EmNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_16matroskaTypeEnumENS0_19matroskaProcessEnumE:
   69|    396|      _id(id), _label(std::move(label)), _type(type), _process(process) {
   70|    396|  }
_ZN5Exiv28Internal11MatroskaTagC2EmNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
   73|    152|      _id(id),
   74|    152|      _label(std::move(label)),
   75|    152|      _type(matroskaTypeEnum::UndefinedType),
   76|    152|      _process(matroskaProcessEnum::Undefined) {
   77|    152|  }
_ZNK5Exiv28Internal11MatroskaTageqEm:
   79|  2.23M|  bool operator==(uint64_t id) const {
   80|  2.23M|    return id == _id;
   81|  2.23M|  }
_ZNK5Exiv28Internal11MatroskaTag9isSkippedEv:
   83|  67.3k|  [[nodiscard]] bool isSkipped() const {
   84|  67.3k|    return _process == Skip;
   85|  67.3k|  }
_ZNK5Exiv28Internal11MatroskaTag11isCompositeEv:
   86|  48.2k|  [[nodiscard]] bool isComposite() const {
   87|  48.2k|    return _process == Composite;
   88|  48.2k|  }

_ZN5Exiv29MetadatumC2Ev:
  261|  45.3M|  Metadatum() = default;
_ZN5Exiv23KeyC2Ev:
   79|  67.2M|  Key() = default;
_ZN5Exiv23KeyC2ERKS0_:
   80|   584k|  Key(const Key&) = default;

_ZNK5Exiv212DecodeParams19max_recursion_depthEv:
   25|  42.4k|  size_t max_recursion_depth() const {
   26|  42.4k|    return max_recursion_depth_;
   27|  42.4k|  }

_ZN5Exiv212PreviewImageD2Ev:
   54|    485|  ~PreviewImage() = default;

_ZN5Exiv213XmpProperties7XmpLockC2Ev:
   76|  1.22M|    XmpLock() : lock_(getMutex()) {
   77|  1.22M|    }

_ZNK5Exiv29RiffVideo12HeaderReader7getSizeEv:
   55|  28.2k|    [[nodiscard]] uint64_t getSize() const {
   56|  28.2k|      return size_;
   57|  28.2k|    }
_ZNK5Exiv29RiffVideo12HeaderReader5getIdEv:
   59|   306k|    [[nodiscard]] const std::string& getId() const {
   60|   306k|      return id_;
   61|   306k|    }

_ZN5Exiv28Internal9SliceBaseC2Emm:
   20|  64.4M|  SliceBase(size_t begin, size_t end) : begin_(begin), end_(end) {
   21|  64.4M|    if (begin >= end) {
  ------------------
  |  Branch (21:9): [True: 41, False: 64.4M]
  ------------------
   22|     41|      throw std::out_of_range("Begin must be smaller than end");
   23|     41|    }
   24|  64.4M|  }
_ZNK5Exiv28Internal9SliceBase4sizeEv:
   29|   131M|  [[nodiscard]] size_t size() const noexcept {
   30|       |    // cannot underflow, as we know that begin < end
   31|   131M|    return end_ - begin_;
   32|   131M|  }
_ZNK5Exiv28Internal9SliceBase10rangeCheckEm:
   41|   130M|  void rangeCheck(size_t index) const {
   42|   130M|    if (index >= size()) {
  ------------------
  |  Branch (42:9): [True: 0, False: 130M]
  ------------------
   43|      0|      throw std::out_of_range("Index outside of the slice");
   44|      0|    }
   45|   130M|  }
_ZNK5Exiv28Internal16MutableSliceBaseINS0_15PtrSliceStorageEPhE2atEm:
  174|  1.17M|  [[nodiscard]] const auto& at(size_t index) const {
  175|  1.17M|    return base_type::at(index);
  176|  1.17M|  }
_ZNK5Exiv28Internal14ConstSliceBaseINS0_15PtrSliceStorageEPhE2atEm:
   99|  1.17M|  [[nodiscard]] const auto& at(size_t index) const {
  100|  1.17M|    rangeCheck(index);
  101|       |    // we know: begin_ < end <= size() <= SIZE_T_MAX
  102|       |    // and: index < end - begin
  103|       |    // thus: index + begin < end <= SIZE_T_MAX
  104|       |    // => no overflow is possible
  105|  1.17M|    return storage_.unsafeAt(begin_ + index);
  106|  1.17M|  }
_ZNK5Exiv28Internal15PtrSliceStorageIPhE8unsafeAtEm:
  335|  1.17M|  [[nodiscard]] const auto& unsafeAt(size_t index) const noexcept {
  336|  1.17M|    return data_[index];
  337|  1.17M|  }
_ZN5Exiv214makeSliceUntilIhEENS_5SliceIPT_EES3_m:
  527|  1.64k|[[nodiscard]] Slice<T*> makeSliceUntil(T* ptr, size_t end) {
  528|  1.64k|  return {ptr, 0, end};
  529|  1.64k|}
_ZN5Exiv25SliceIPhEC2ES1_mm:
  466|  53.7k|  Slice(T* ptr, size_t begin, size_t end) : Internal::MutableSliceBase<Internal::PtrSliceStorage, T*>(ptr, begin, end) {
  467|       |    // TODO: use using in C++11
  468|  53.7k|  }
_ZN5Exiv28Internal14ConstSliceBaseINS0_15PtrSliceStorageEPhEC2ERS3_mm:
   90|  53.7k|  ConstSliceBase(data_type& data, size_t begin, size_t end) : SliceBase(begin, end), storage_(data, begin, end) {
   91|  53.7k|  }
_ZN5Exiv28Internal15PtrSliceStorageIPhEC2ES2_mm:
  319|  53.7k|  PtrSliceStorage(storage_type ptr, size_t /*begin*/, size_t /*end*/) : data_(ptr) {
  320|  53.7k|    if (!ptr) {
  ------------------
  |  Branch (320:9): [True: 0, False: 53.7k]
  ------------------
  321|      0|      throw std::invalid_argument("Null pointer passed to slice constructor");
  322|      0|    }
  323|  53.7k|  }
_ZNK5Exiv25SliceIPhE8subSliceEmm:
  474|  1.28k|  [[nodiscard]] Slice<const T*> subSlice(size_t begin, size_t end) const {
  475|  1.28k|    return this->to_const_base().template subSlice<Slice<const T*>>(begin, end);
  476|  1.28k|  }
_ZNK5Exiv28Internal16MutableSliceBaseINS0_15PtrSliceStorageEPhE13to_const_baseEv:
  210|  1.28k|  [[nodiscard]] ConstSliceBase<storage_type, const data_type> to_const_base() const noexcept {
  211|  1.28k|    return {this->storage_.data_, this->begin_, this->end_};
  212|  1.28k|  }
_ZN5Exiv28Internal14ConstSliceBaseINS0_15PtrSliceStorageEKPhEC2ERS4_mm:
   90|  1.28k|  ConstSliceBase(data_type& data, size_t begin, size_t end) : SliceBase(begin, end), storage_(data, begin, end) {
   91|  1.28k|  }
_ZN5Exiv28Internal15PtrSliceStorageIKPhEC2ES2_mm:
  319|  1.28k|  PtrSliceStorage(storage_type ptr, size_t /*begin*/, size_t /*end*/) : data_(ptr) {
  320|  1.28k|    if (!ptr) {
  ------------------
  |  Branch (320:9): [True: 0, False: 1.28k]
  ------------------
  321|      0|      throw std::invalid_argument("Null pointer passed to slice constructor");
  322|      0|    }
  323|  1.28k|  }
_ZNK5Exiv28Internal14ConstSliceBaseINS0_15PtrSliceStorageEKPhE8subSliceINS_5SliceIPKhEEEET_mm:
  131|  1.28k|  [[nodiscard]] slice_type subSlice(size_t begin, size_t end) const {
  132|  1.28k|    this->rangeCheck(begin);
  133|       |    // end == size() is a legal value, since end is the first
  134|       |    // element beyond the slice
  135|       |    // end == 0 is not a legal value (subtraction will underflow and
  136|       |    // throw an exception)
  137|  1.28k|    this->rangeCheck(end - 1);
  138|       |    // additions are safe, begin and end are smaller than size()
  139|  1.28k|    const size_t new_begin = begin + this->begin_;
  140|  1.28k|    const size_t new_end = this->begin_ + end;
  141|  1.28k|    if (new_end > this->end_) {
  ------------------
  |  Branch (141:9): [True: 0, False: 1.28k]
  ------------------
  142|      0|      throw std::out_of_range("Invalid input parameters to slice");
  143|      0|    }
  144|  1.28k|    return {storage_.data_, new_begin, new_end};
  145|  1.28k|  }
_ZN5Exiv25SliceIPKhEC2ES2_mm:
  451|  64.4M|      Internal::ConstSliceBase<Internal::PtrSliceStorage, const T*>(ptr, begin, end) {
  452|       |    // TODO: use using in C++11
  453|  64.4M|  }
_ZN5Exiv28Internal14ConstSliceBaseINS0_15PtrSliceStorageEPKhEC2ERS4_mm:
   90|  64.4M|  ConstSliceBase(data_type& data, size_t begin, size_t end) : SliceBase(begin, end), storage_(data, begin, end) {
   91|  64.4M|  }
_ZN5Exiv28Internal15PtrSliceStorageIPKhEC2ES3_mm:
  319|  64.4M|  PtrSliceStorage(storage_type ptr, size_t /*begin*/, size_t /*end*/) : data_(ptr) {
  320|  64.4M|    if (!ptr) {
  ------------------
  |  Branch (320:9): [True: 0, False: 64.4M]
  ------------------
  321|      0|      throw std::invalid_argument("Null pointer passed to slice constructor");
  322|      0|    }
  323|  64.4M|  }
_ZNK5Exiv28Internal14ConstSliceBaseINS0_15PtrSliceStorageEPKhE2atEm:
   99|   128M|  [[nodiscard]] const auto& at(size_t index) const {
  100|   128M|    rangeCheck(index);
  101|       |    // we know: begin_ < end <= size() <= SIZE_T_MAX
  102|       |    // and: index < end - begin
  103|       |    // thus: index + begin < end <= SIZE_T_MAX
  104|       |    // => no overflow is possible
  105|   128M|    return storage_.unsafeAt(begin_ + index);
  106|   128M|  }
_ZNK5Exiv28Internal15PtrSliceStorageIPKhE8unsafeAtEm:
  335|   128M|  [[nodiscard]] const auto& unsafeAt(size_t index) const noexcept {
  336|   128M|    return data_[index];
  337|   128M|  }
_ZN5Exiv29makeSliceIKNS_5SliceIPhEEEENS1_IT_EERS5_mm:
  486|  1.26k|[[nodiscard]] Slice<T> makeSlice(T& cont, size_t begin, size_t end) {
  487|  1.26k|  return {cont, begin, end};
  488|  1.26k|}
_ZN5Exiv28Internal14ConstSliceBaseINS0_16ContainerStorageEKNS_5SliceIPhEEEC2ERS6_mm:
   90|  1.26k|  ConstSliceBase(data_type& data, size_t begin, size_t end) : SliceBase(begin, end), storage_(data, begin, end) {
   91|  1.26k|  }
_ZN5Exiv28Internal16ContainerStorageIKNS_5SliceIPhEEEC2ERS5_mm:
  256|  1.25k|  ContainerStorage(container& data, size_t /* begin*/, size_t end) : data_(data) {
  257|  1.25k|    if (end > data.size()) {
  ------------------
  |  Branch (257:9): [True: 0, False: 1.25k]
  ------------------
  258|      0|      throw std::out_of_range("Invalid input parameters to slice");
  259|      0|    }
  260|  1.25k|  }
_ZNK5Exiv28Internal14ConstSliceBaseINS0_16ContainerStorageEKNS_5SliceIPhEEE2atEm:
   99|  7.30k|  [[nodiscard]] const auto& at(size_t index) const {
  100|  7.30k|    rangeCheck(index);
  101|       |    // we know: begin_ < end <= size() <= SIZE_T_MAX
  102|       |    // and: index < end - begin
  103|       |    // thus: index + begin < end <= SIZE_T_MAX
  104|       |    // => no overflow is possible
  105|  7.30k|    return storage_.unsafeAt(begin_ + index);
  106|  7.30k|  }
_ZNK5Exiv28Internal16ContainerStorageIKNS_5SliceIPhEEE8unsafeAtEm:
  268|  7.30k|  [[nodiscard]] const auto& unsafeAt(size_t index) const {
  269|  7.30k|    return data_.at(index);
  270|  7.30k|  }
_ZN5Exiv214makeSliceUntilIKhEENS_5SliceIPT_EES4_m:
  527|  64.4M|[[nodiscard]] Slice<T*> makeSliceUntil(T* ptr, size_t end) {
  528|  64.4M|  return {ptr, 0, end};
  529|  64.4M|}

_ZN5Exiv27DataBuf5beginEv:
  158|  2.28M|  [[nodiscard]] auto begin() noexcept {
  159|  2.28M|    return pData_.begin();
  160|  2.28M|  }
_ZN5Exiv27DataBuf3endEv:
  162|  19.4k|  [[nodiscard]] auto end() noexcept {
  163|  19.4k|    return pData_.end();
  164|  19.4k|  }
_ZNK5Exiv27DataBuf5beginEv:
  166|  2.45k|  [[nodiscard]] auto begin() const noexcept {
  167|  2.45k|    return pData_.begin();
  168|  2.45k|  }
_ZNK5Exiv27DataBuf3endEv:
  170|  2.38k|  [[nodiscard]] auto end() const noexcept {
  171|  2.38k|    return pData_.end();
  172|  2.38k|  }
_ZNK5Exiv27DataBuf4sizeEv:
  174|  2.65M|  [[nodiscard]] size_t size() const {
  175|  2.65M|    return pData_.size();
  176|  2.65M|  }
_ZNK5Exiv27DataBuf5emptyEv:
  207|  18.6k|  [[nodiscard]] bool empty() const {
  208|  18.6k|    return pData_.empty();
  209|  18.6k|  }
_ZN5Exiv27DataBufC2Ev:
  126|  2.66M|  DataBuf() = default;
_ZN5Exiv27DataBufaSEOS0_:
  134|  2.34k|  DataBuf& operator=(DataBuf&& other) = default;
image.cpp:_ZN5Exiv24findIKN12_GLOBAL__N_18RegistryENS_9ImageTypeELm30EEEPKT_RAT1__S5_RKT0_:
  460|  32.0k|const T* find(T (&src)[N], const K& key) {
  461|  32.0k|  static_assert(N > 0, "Passed zero length find");
  462|  32.0k|  auto rc = std::find(src, src + N, key);
  463|  32.0k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 0, False: 32.0k]
  ------------------
  464|  32.0k|}
_ZN5Exiv28toStringItEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|  78.9k|std::string toString(const T& arg) {
  480|  78.9k|  return toStringHelper(arg, std::is_integral<T>());
  481|  78.9k|}
_ZN5Exiv214toStringHelperItEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb1EEE:
  468|  78.9k|std::string toStringHelper(const T& arg, std::true_type) {
  469|  78.9k|  return std::to_string(arg);
  470|  78.9k|}
_ZN5Exiv29getUShortIPKhEEtRKNS_5SliceIT_EENS_9ByteOrderE:
  240|  64.4M|uint16_t getUShort(const Slice<T>& buf, ByteOrder byteOrder) {
  241|  64.4M|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (241:7): [True: 2.00M, False: 62.4M]
  ------------------
  242|  2.00M|    return static_cast<byte>(buf.at(1)) << 8 | static_cast<byte>(buf.at(0));
  243|  2.00M|  }
  244|  62.4M|  return static_cast<byte>(buf.at(0)) << 8 | static_cast<byte>(buf.at(1));
  245|  64.4M|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEhLm13EEEPKT_RAT1__S4_RKT0_:
  460|  71.4k|const T* find(T (&src)[N], const K& key) {
  461|  71.4k|  static_assert(N > 0, "Passed zero length find");
  462|  71.4k|  auto rc = std::find(src, src + N, key);
  463|  71.4k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 69.2k, False: 2.21k]
  ------------------
  464|  71.4k|}
types.cpp:_ZN5Exiv24findIKN12_GLOBAL__N_113TypeInfoTableENS_6TypeIdELm24EEEPKT_RAT1__S5_RKT0_:
  460|  62.0M|const T* find(T (&src)[N], const K& key) {
  461|  62.0M|  static_assert(N > 0, "Passed zero length find");
  462|  62.0M|  auto rc = std::find(src, src + N, key);
  463|  62.0M|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 4.99M, False: 57.0M]
  ------------------
  464|  62.0M|}
_ZN5Exiv28toStringIjEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|  6.44k|std::string toString(const T& arg) {
  480|  6.44k|  return toStringHelper(arg, std::is_integral<T>());
  481|  6.44k|}
_ZN5Exiv214toStringHelperIjEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb1EEE:
  468|  6.44k|std::string toStringHelper(const T& arg, std::true_type) {
  469|  6.44k|  return std::to_string(arg);
  470|  6.44k|}
_ZN5Exiv28toStringINSt3__14pairIjjEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|    130|std::string toString(const T& arg) {
  480|    130|  return toStringHelper(arg, std::is_integral<T>());
  481|    130|}
_ZN5Exiv214toStringHelperINSt3__14pairIjjEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb0EEE:
  473|    130|std::string toStringHelper(const T& arg, std::false_type) {
  474|    130|  std::ostringstream os;
  475|    130|  os << arg;
  476|    130|  return os.str();
  477|    130|}
_ZN5Exiv28toStringIsEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|  1.10k|std::string toString(const T& arg) {
  480|  1.10k|  return toStringHelper(arg, std::is_integral<T>());
  481|  1.10k|}
_ZN5Exiv214toStringHelperIsEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb1EEE:
  468|  1.10k|std::string toStringHelper(const T& arg, std::true_type) {
  469|  1.10k|  return std::to_string(arg);
  470|  1.10k|}
_ZN5Exiv28toStringIiEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|   128k|std::string toString(const T& arg) {
  480|   128k|  return toStringHelper(arg, std::is_integral<T>());
  481|   128k|}
_ZN5Exiv214toStringHelperIiEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb1EEE:
  468|   128k|std::string toStringHelper(const T& arg, std::true_type) {
  469|   128k|  return std::to_string(arg);
  470|   128k|}
_ZN5Exiv28toStringINSt3__14pairIiiEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|    314|std::string toString(const T& arg) {
  480|    314|  return toStringHelper(arg, std::is_integral<T>());
  481|    314|}
_ZN5Exiv214toStringHelperINSt3__14pairIiiEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb0EEE:
  473|    314|std::string toStringHelper(const T& arg, std::false_type) {
  474|    314|  std::ostringstream os;
  475|    314|  os << arg;
  476|    314|  return os.str();
  477|    314|}
_ZN5Exiv28toStringIfEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|  1.73k|std::string toString(const T& arg) {
  480|  1.73k|  return toStringHelper(arg, std::is_integral<T>());
  481|  1.73k|}
_ZN5Exiv214toStringHelperIfEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb0EEE:
  473|  1.73k|std::string toStringHelper(const T& arg, std::false_type) {
  474|  1.73k|  std::ostringstream os;
  475|  1.73k|  os << arg;
  476|  1.73k|  return os.str();
  477|  1.73k|}
_ZN5Exiv28toStringIdEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|   118k|std::string toString(const T& arg) {
  480|   118k|  return toStringHelper(arg, std::is_integral<T>());
  481|   118k|}
_ZN5Exiv214toStringHelperIdEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb0EEE:
  473|   118k|std::string toStringHelper(const T& arg, std::false_type) {
  474|   118k|  std::ostringstream os;
  475|   118k|  os << arg;
  476|   118k|  return os.str();
  477|   118k|}
_ZN5Exiv28toStringImEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|  4.85k|std::string toString(const T& arg) {
  480|  4.85k|  return toStringHelper(arg, std::is_integral<T>());
  481|  4.85k|}
_ZN5Exiv214toStringHelperImEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb1EEE:
  468|  4.85k|std::string toStringHelper(const T& arg, std::true_type) {
  469|  4.85k|  return std::to_string(arg);
  470|  4.85k|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm4EEEPKT_RAT1__S4_RKT0_:
  460|    834|const T* find(T (&src)[N], const K& key) {
  461|    834|  static_assert(N > 0, "Passed zero length find");
  462|    834|  auto rc = std::find(src, src + N, key);
  463|    834|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 528, False: 306]
  ------------------
  464|    834|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm6EEEPKT_RAT1__S4_RKT0_:
  460|    385|const T* find(T (&src)[N], const K& key) {
  461|    385|  static_assert(N > 0, "Passed zero length find");
  462|    385|  auto rc = std::find(src, src + N, key);
  463|    385|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 118, False: 267]
  ------------------
  464|    385|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm5EEEPKT_RAT1__S4_RKT0_:
  460|    427|const T* find(T (&src)[N], const K& key) {
  461|    427|  static_assert(N > 0, "Passed zero length find");
  462|    427|  auto rc = std::find(src, src + N, key);
  463|    427|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 309, False: 118]
  ------------------
  464|    427|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm198EEEPKT_RAT1__S4_RKT0_:
  460|  48.9k|const T* find(T (&src)[N], const K& key) {
  461|  48.9k|  static_assert(N > 0, "Passed zero length find");
  462|  48.9k|  auto rc = std::find(src, src + N, key);
  463|  48.9k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 644, False: 48.3k]
  ------------------
  464|  48.9k|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm2EEEPKT_RAT1__S4_RKT0_:
  460|  1.55k|const T* find(T (&src)[N], const K& key) {
  461|  1.55k|  static_assert(N > 0, "Passed zero length find");
  462|  1.55k|  auto rc = std::find(src, src + N, key);
  463|  1.55k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 878, False: 679]
  ------------------
  464|  1.55k|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm3EEEPKT_RAT1__S4_RKT0_:
  460|  2.81k|const T* find(T (&src)[N], const K& key) {
  461|  2.81k|  static_assert(N > 0, "Passed zero length find");
  462|  2.81k|  auto rc = std::find(src, src + N, key);
  463|  2.81k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.65k, False: 1.15k]
  ------------------
  464|  2.81k|}
_ZN5Exiv24findIKNS_8Internal11MatroskaTagEmLm7EEEPKT_RAT1__S4_RKT0_:
  460|  2.53k|const T* find(T (&src)[N], const K& key) {
  461|  2.53k|  static_assert(N > 0, "Passed zero length find");
  462|  2.53k|  auto rc = std::find(src, src + N, key);
  463|  2.53k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 2.06k, False: 467]
  ------------------
  464|  2.53k|}
_ZN5Exiv28toStringIPKhEENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKT_:
  479|  1.23k|std::string toString(const T& arg) {
  480|  1.23k|  return toStringHelper(arg, std::is_integral<T>());
  481|  1.23k|}
_ZN5Exiv214toStringHelperIPKhEENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKT_NS3_17integral_constantIbLb0EEE:
  473|  1.23k|std::string toStringHelper(const T& arg, std::false_type) {
  474|  1.23k|  std::ostringstream os;
  475|  1.23k|  os << arg;
  476|  1.23k|  return os.str();
  477|  1.23k|}
_ZN5Exiv28toStringIlEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_:
  479|    564|std::string toString(const T& arg) {
  480|    564|  return toStringHelper(arg, std::is_integral<T>());
  481|    564|}
_ZN5Exiv214toStringHelperIlEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_NS1_17integral_constantIbLb1EEE:
  468|    564|std::string toStringHelper(const T& arg, std::true_type) {
  469|    564|  return std::to_string(arg);
  470|    564|}
_ZN5Exiv28toStringIPhEENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKT_:
  479|   374k|std::string toString(const T& arg) {
  480|   374k|  return toStringHelper(arg, std::is_integral<T>());
  481|   374k|}
_ZN5Exiv214toStringHelperIPhEENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKT_NS2_17integral_constantIbLb0EEE:
  473|   374k|std::string toStringHelper(const T& arg, std::false_type) {
  474|   374k|  std::ostringstream os;
  475|   374k|  os << arg;
  476|   374k|  return os.str();
  477|   374k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm6EEEPKT_RAT1__S4_RKT0_:
  460|    115|const T* find(T (&src)[N], const K& key) {
  461|    115|  static_assert(N > 0, "Passed zero length find");
  462|    115|  auto rc = std::find(src, src + N, key);
  463|    115|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 62, False: 53]
  ------------------
  464|    115|}
_ZN5Exiv24findIKNS_8Internal13TagVocabularyENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm32EEEPKT_RAT1__SB_RKT0_:
  460|  2.16k|const T* find(T (&src)[N], const K& key) {
  461|  2.16k|  static_assert(N > 0, "Passed zero length find");
  462|  2.16k|  auto rc = std::find(src, src + N, key);
  463|  2.16k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.79k, False: 364]
  ------------------
  464|  2.16k|}
_ZN5Exiv24findIKNS_8Internal13TagVocabularyENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm61EEEPKT_RAT1__SB_RKT0_:
  460|  2.16k|const T* find(T (&src)[N], const K& key) {
  461|  2.16k|  static_assert(N > 0, "Passed zero length find");
  462|  2.16k|  auto rc = std::find(src, src + N, key);
  463|  2.16k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.95k, False: 206]
  ------------------
  464|  2.16k|}
_ZN5Exiv24findIKNS_8Internal13TagVocabularyENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm2EEEPKT_RAT1__SB_RKT0_:
  460|    738|const T* find(T (&src)[N], const K& key) {
  461|    738|  static_assert(N > 0, "Passed zero length find");
  462|    738|  auto rc = std::find(src, src + N, key);
  463|    738|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 671, False: 67]
  ------------------
  464|    738|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm41EEEPKT_RAT1__S4_RKT0_:
  460|   102k|const T* find(T (&src)[N], const K& key) {
  461|   102k|  static_assert(N > 0, "Passed zero length find");
  462|   102k|  auto rc = std::find(src, src + N, key);
  463|   102k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 94.0k, False: 8.27k]
  ------------------
  464|   102k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEiLm3EEEPKT_RAT1__S4_RKT0_:
  460|  16.2k|const T* find(T (&src)[N], const K& key) {
  461|  16.2k|  static_assert(N > 0, "Passed zero length find");
  462|  16.2k|  auto rc = std::find(src, src + N, key);
  463|  16.2k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 7.14k, False: 9.09k]
  ------------------
  464|  16.2k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEiLm6EEEPKT_RAT1__S4_RKT0_:
  460|  2.58k|const T* find(T (&src)[N], const K& key) {
  461|  2.58k|  static_assert(N > 0, "Passed zero length find");
  462|  2.58k|  auto rc = std::find(src, src + N, key);
  463|  2.58k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 2.02k, False: 563]
  ------------------
  464|  2.58k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEiLm11EEEPKT_RAT1__S4_RKT0_:
  460|  2.57k|const T* find(T (&src)[N], const K& key) {
  461|  2.57k|  static_assert(N > 0, "Passed zero length find");
  462|  2.57k|  auto rc = std::find(src, src + N, key);
  463|  2.57k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.86k, False: 708]
  ------------------
  464|  2.57k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEiLm2EEEPKT_RAT1__S4_RKT0_:
  460|    593|const T* find(T (&src)[N], const K& key) {
  461|    593|  static_assert(N > 0, "Passed zero length find");
  462|    593|  auto rc = std::find(src, src + N, key);
  463|    593|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 222, False: 371]
  ------------------
  464|    593|}
_ZN5Exiv24findIKNS_8Internal13TagVocabularyENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm86EEEPKT_RAT1__SB_RKT0_:
  460|   113k|const T* find(T (&src)[N], const K& key) {
  461|   113k|  static_assert(N > 0, "Passed zero length find");
  462|   113k|  auto rc = std::find(src, src + N, key);
  463|   113k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 104k, False: 9.27k]
  ------------------
  464|   113k|}
_ZN5Exiv24findIKNS_8Internal13TagVocabularyENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm17EEEPKT_RAT1__SB_RKT0_:
  460|  77.5k|const T* find(T (&src)[N], const K& key) {
  461|  77.5k|  static_assert(N > 0, "Passed zero length find");
  462|  77.5k|  auto rc = std::find(src, src + N, key);
  463|  77.5k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 76.7k, False: 798]
  ------------------
  464|  77.5k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEtLm31EEEPKT_RAT1__S4_RKT0_:
  460|    831|const T* find(T (&src)[N], const K& key) {
  461|    831|  static_assert(N > 0, "Passed zero length find");
  462|    831|  auto rc = std::find(src, src + N, key);
  463|    831|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 178, False: 653]
  ------------------
  464|    831|}
_ZN5Exiv24findIKNS_8Internal13TagVocabularyENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm16EEEPKT_RAT1__SB_RKT0_:
  460|    693|const T* find(T (&src)[N], const K& key) {
  461|    693|  static_assert(N > 0, "Passed zero length find");
  462|    693|  auto rc = std::find(src, src + N, key);
  463|    693|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 233, False: 460]
  ------------------
  464|    693|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm6EEEPKT_RAT1__S4_RKT0_:
  460|  19.5k|const T* find(T (&src)[N], const K& key) {
  461|  19.5k|  static_assert(N > 0, "Passed zero length find");
  462|  19.5k|  auto rc = std::find(src, src + N, key);
  463|  19.5k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 9.48k, False: 10.0k]
  ------------------
  464|  19.5k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm2EEEPKT_RAT1__S4_RKT0_:
  460|  31.1k|const T* find(T (&src)[N], const K& key) {
  461|  31.1k|  static_assert(N > 0, "Passed zero length find");
  462|  31.1k|  auto rc = std::find(src, src + N, key);
  463|  31.1k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 23.1k, False: 7.97k]
  ------------------
  464|  31.1k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm5EEEPKT_RAT1__S4_RKT0_:
  460|  17.8k|const T* find(T (&src)[N], const K& key) {
  461|  17.8k|  static_assert(N > 0, "Passed zero length find");
  462|  17.8k|  auto rc = std::find(src, src + N, key);
  463|  17.8k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 9.72k, False: 8.13k]
  ------------------
  464|  17.8k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm4EEEPKT_RAT1__S4_RKT0_:
  460|  19.4k|const T* find(T (&src)[N], const K& key) {
  461|  19.4k|  static_assert(N > 0, "Passed zero length find");
  462|  19.4k|  auto rc = std::find(src, src + N, key);
  463|  19.4k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 7.32k, False: 12.1k]
  ------------------
  464|  19.4k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm7EEEPKT_RAT1__S4_RKT0_:
  460|  11.0k|const T* find(T (&src)[N], const K& key) {
  461|  11.0k|  static_assert(N > 0, "Passed zero length find");
  462|  11.0k|  auto rc = std::find(src, src + N, key);
  463|  11.0k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 4.94k, False: 6.11k]
  ------------------
  464|  11.0k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm17EEEPKT_RAT1__S4_RKT0_:
  460|  2.77k|const T* find(T (&src)[N], const K& key) {
  461|  2.77k|  static_assert(N > 0, "Passed zero length find");
  462|  2.77k|  auto rc = std::find(src, src + N, key);
  463|  2.77k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 956, False: 1.81k]
  ------------------
  464|  2.77k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm8EEEPKT_RAT1__S4_RKT0_:
  460|  18.9k|const T* find(T (&src)[N], const K& key) {
  461|  18.9k|  static_assert(N > 0, "Passed zero length find");
  462|  18.9k|  auto rc = std::find(src, src + N, key);
  463|  18.9k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 10.1k, False: 8.81k]
  ------------------
  464|  18.9k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm3EEEPKT_RAT1__S4_RKT0_:
  460|  60.9k|const T* find(T (&src)[N], const K& key) {
  461|  60.9k|  static_assert(N > 0, "Passed zero length find");
  462|  60.9k|  auto rc = std::find(src, src + N, key);
  463|  60.9k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 38.3k, False: 22.6k]
  ------------------
  464|  60.9k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm11EEEPKT_RAT1__S4_RKT0_:
  460|  11.3k|const T* find(T (&src)[N], const K& key) {
  461|  11.3k|  static_assert(N > 0, "Passed zero length find");
  462|  11.3k|  auto rc = std::find(src, src + N, key);
  463|  11.3k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 4.04k, False: 7.34k]
  ------------------
  464|  11.3k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm25EEEPKT_RAT1__S4_RKT0_:
  460|  2.61k|const T* find(T (&src)[N], const K& key) {
  461|  2.61k|  static_assert(N > 0, "Passed zero length find");
  462|  2.61k|  auto rc = std::find(src, src + N, key);
  463|  2.61k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 458, False: 2.16k]
  ------------------
  464|  2.61k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm19EEEPKT_RAT1__S4_RKT0_:
  460|    528|const T* find(T (&src)[N], const K& key) {
  461|    528|  static_assert(N > 0, "Passed zero length find");
  462|    528|  auto rc = std::find(src, src + N, key);
  463|    528|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 308, False: 220]
  ------------------
  464|    528|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm81EEEPKT_RAT1__S4_RKT0_:
  460|     82|const T* find(T (&src)[N], const K& key) {
  461|     82|  static_assert(N > 0, "Passed zero length find");
  462|     82|  auto rc = std::find(src, src + N, key);
  463|     82|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 34, False: 48]
  ------------------
  464|     82|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm10EEEPKT_RAT1__S4_RKT0_:
  460|  17.1k|const T* find(T (&src)[N], const K& key) {
  461|  17.1k|  static_assert(N > 0, "Passed zero length find");
  462|  17.1k|  auto rc = std::find(src, src + N, key);
  463|  17.1k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 10.8k, False: 6.36k]
  ------------------
  464|  17.1k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm53EEEPKT_RAT1__S4_RKT0_:
  460|    152|const T* find(T (&src)[N], const K& key) {
  461|    152|  static_assert(N > 0, "Passed zero length find");
  462|    152|  auto rc = std::find(src, src + N, key);
  463|    152|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 38, False: 114]
  ------------------
  464|    152|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm18EEEPKT_RAT1__S4_RKT0_:
  460|  6.08k|const T* find(T (&src)[N], const K& key) {
  461|  6.08k|  static_assert(N > 0, "Passed zero length find");
  462|  6.08k|  auto rc = std::find(src, src + N, key);
  463|  6.08k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 2.78k, False: 3.30k]
  ------------------
  464|  6.08k|}
nikonmn_int.cpp:_ZN5Exiv24findIKZNS_8Internal15Nikon3MakerNote11printLensIdERNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataERKNS3_12basic_stringIcS6_NS3_9allocatorIcEEEEE8FMntLenshLm579EEEPKT_RAT1__SN_RKT0_:
  460|     85|const T* find(T (&src)[N], const K& key) {
  461|     85|  static_assert(N > 0, "Passed zero length find");
  462|     85|  auto rc = std::find(src, src + N, key);
  463|     85|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 3, False: 82]
  ------------------
  464|     85|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm12EEEPKT_RAT1__S4_RKT0_:
  460|  6.83k|const T* find(T (&src)[N], const K& key) {
  461|  6.83k|  static_assert(N > 0, "Passed zero length find");
  462|  6.83k|  auto rc = std::find(src, src + N, key);
  463|  6.83k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 3.91k, False: 2.91k]
  ------------------
  464|  6.83k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm13EEEPKT_RAT1__S4_RKT0_:
  460|  8.19k|const T* find(T (&src)[N], const K& key) {
  461|  8.19k|  static_assert(N > 0, "Passed zero length find");
  462|  8.19k|  auto rc = std::find(src, src + N, key);
  463|  8.19k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.87k, False: 6.32k]
  ------------------
  464|  8.19k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm34EEEPKT_RAT1__S4_RKT0_:
  460|  1.69k|const T* find(T (&src)[N], const K& key) {
  461|  1.69k|  static_assert(N > 0, "Passed zero length find");
  462|  1.69k|  auto rc = std::find(src, src + N, key);
  463|  1.69k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 476, False: 1.22k]
  ------------------
  464|  1.69k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm16EEEPKT_RAT1__S4_RKT0_:
  460|  2.84k|const T* find(T (&src)[N], const K& key) {
  461|  2.84k|  static_assert(N > 0, "Passed zero length find");
  462|  2.84k|  auto rc = std::find(src, src + N, key);
  463|  2.84k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 770, False: 2.07k]
  ------------------
  464|  2.84k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm27EEEPKT_RAT1__S4_RKT0_:
  460|  3.41k|const T* find(T (&src)[N], const K& key) {
  461|  3.41k|  static_assert(N > 0, "Passed zero length find");
  462|  3.41k|  auto rc = std::find(src, src + N, key);
  463|  3.41k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 384, False: 3.03k]
  ------------------
  464|  3.41k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm9EEEPKT_RAT1__S4_RKT0_:
  460|  11.7k|const T* find(T (&src)[N], const K& key) {
  461|  11.7k|  static_assert(N > 0, "Passed zero length find");
  462|  11.7k|  auto rc = std::find(src, src + N, key);
  463|  11.7k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 4.90k, False: 6.82k]
  ------------------
  464|  11.7k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm32EEEPKT_RAT1__S4_RKT0_:
  460|  2.46k|const T* find(T (&src)[N], const K& key) {
  461|  2.46k|  static_assert(N > 0, "Passed zero length find");
  462|  2.46k|  auto rc = std::find(src, src + N, key);
  463|  2.46k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 348, False: 2.11k]
  ------------------
  464|  2.46k|}
_ZN5Exiv24findIKNS_9GroupInfoENS_5IfdIdELm126EEEPKT_RAT1__S4_RKT0_:
  460|  64.0M|const T* find(T (&src)[N], const K& key) {
  461|  64.0M|  static_assert(N > 0, "Passed zero length find");
  462|  64.0M|  auto rc = std::find(src, src + N, key);
  463|  64.0M|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 0, False: 64.0M]
  ------------------
  464|  64.0M|}
_ZN5Exiv24findIKNS_9GroupInfoENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEELm126EEEPKT_RAT1__SA_RKT0_:
  460|  23.9M|const T* find(T (&src)[N], const K& key) {
  461|  23.9M|  static_assert(N > 0, "Passed zero length find");
  462|  23.9M|  auto rc = std::find(src, src + N, key);
  463|  23.9M|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 0, False: 23.9M]
  ------------------
  464|  23.9M|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm1EEEPKT_RAT1__S4_RKT0_:
  460|     90|const T* find(T (&src)[N], const K& key) {
  461|     90|  static_assert(N > 0, "Passed zero length find");
  462|     90|  auto rc = std::find(src, src + N, key);
  463|     90|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 70, False: 20]
  ------------------
  464|     90|}
_ZN5Exiv24findIKNS_8Internal15TiffMappingInfoENS2_3KeyELm5EEEPKT_RAT1__S5_RKT0_:
  460|  23.3M|const T* find(T (&src)[N], const K& key) {
  461|  23.3M|  static_assert(N > 0, "Passed zero length find");
  462|  23.3M|  auto rc = std::find(src, src + N, key);
  463|  23.3M|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 23.3M, False: 5.40k]
  ------------------
  464|  23.3M|}
_ZN5Exiv27DataBufC2EOS0_:
  132|  1.55k|  DataBuf(DataBuf&&) = default;
_ZN5Exiv24findIKNS_9XmpNsInfoENS1_2NsELm47EEEPKT_RAT1__S4_RKT0_:
  460|  11.1k|const T* find(T (&src)[N], const K& key) {
  461|  11.1k|  static_assert(N > 0, "Passed zero length find");
  462|  11.1k|  auto rc = std::find(src, src + N, key);
  463|  11.1k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 10.1k, False: 1.03k]
  ------------------
  464|  11.1k|}
_ZN5Exiv24findIKNS_9XmpNsInfoENS1_6PrefixELm47EEEPKT_RAT1__S4_RKT0_:
  460|   605k|const T* find(T (&src)[N], const K& key) {
  461|   605k|  static_assert(N > 0, "Passed zero length find");
  462|   605k|  auto rc = std::find(src, src + N, key);
  463|   605k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 6, False: 605k]
  ------------------
  464|   605k|}
properties.cpp:_ZN5Exiv24findIKN12_GLOBAL__N_112XmpPrintInfoENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm67EEEPKT_RAT1__SB_RKT0_:
  460|  17.5k|const T* find(T (&src)[N], const K& key) {
  461|  17.5k|  static_assert(N > 0, "Passed zero length find");
  462|  17.5k|  auto rc = std::find(src, src + N, key);
  463|  17.5k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 17.5k, False: 0]
  ------------------
  464|  17.5k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm534EEEPKT_RAT1__S4_RKT0_:
  460|     26|const T* find(T (&src)[N], const K& key) {
  461|     26|  static_assert(N > 0, "Passed zero length find");
  462|     26|  auto rc = std::find(src, src + N, key);
  463|     26|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 0, False: 26]
  ------------------
  464|     26|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm357EEEPKT_RAT1__S4_RKT0_:
  460|    128|const T* find(T (&src)[N], const K& key) {
  461|    128|  static_assert(N > 0, "Passed zero length find");
  462|    128|  auto rc = std::find(src, src + N, key);
  463|    128|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 90, False: 38]
  ------------------
  464|    128|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm14EEEPKT_RAT1__S4_RKT0_:
  460|  7.86k|const T* find(T (&src)[N], const K& key) {
  461|  7.86k|  static_assert(N > 0, "Passed zero length find");
  462|  7.86k|  auto rc = std::find(src, src + N, key);
  463|  7.86k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 4.84k, False: 3.01k]
  ------------------
  464|  7.86k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm22EEEPKT_RAT1__S4_RKT0_:
  460|  2.94k|const T* find(T (&src)[N], const K& key) {
  461|  2.94k|  static_assert(N > 0, "Passed zero length find");
  462|  2.94k|  auto rc = std::find(src, src + N, key);
  463|  2.94k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 998, False: 1.95k]
  ------------------
  464|  2.94k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm71EEEPKT_RAT1__S4_RKT0_:
  460|  3.89k|const T* find(T (&src)[N], const K& key) {
  461|  3.89k|  static_assert(N > 0, "Passed zero length find");
  462|  3.89k|  auto rc = std::find(src, src + N, key);
  463|  3.89k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 584, False: 3.30k]
  ------------------
  464|  3.89k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm38EEEPKT_RAT1__S4_RKT0_:
  460|  4.79k|const T* find(T (&src)[N], const K& key) {
  461|  4.79k|  static_assert(N > 0, "Passed zero length find");
  462|  4.79k|  auto rc = std::find(src, src + N, key);
  463|  4.79k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 3.16k, False: 1.63k]
  ------------------
  464|  4.79k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm76EEEPKT_RAT1__S4_RKT0_:
  460|    150|const T* find(T (&src)[N], const K& key) {
  461|    150|  static_assert(N > 0, "Passed zero length find");
  462|    150|  auto rc = std::find(src, src + N, key);
  463|    150|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 112, False: 38]
  ------------------
  464|    150|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm35EEEPKT_RAT1__S4_RKT0_:
  460|    260|const T* find(T (&src)[N], const K& key) {
  461|    260|  static_assert(N > 0, "Passed zero length find");
  462|    260|  auto rc = std::find(src, src + N, key);
  463|    260|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 166, False: 94]
  ------------------
  464|    260|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEhLm3EEEPKT_RAT1__S4_RKT0_:
  460|    238|const T* find(T (&src)[N], const K& key) {
  461|    238|  static_assert(N > 0, "Passed zero length find");
  462|    238|  auto rc = std::find(src, src + N, key);
  463|    238|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 110, False: 128]
  ------------------
  464|    238|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm20EEEPKT_RAT1__S4_RKT0_:
  460|  1.44k|const T* find(T (&src)[N], const K& key) {
  461|  1.44k|  static_assert(N > 0, "Passed zero length find");
  462|  1.44k|  auto rc = std::find(src, src + N, key);
  463|  1.44k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 468, False: 975]
  ------------------
  464|  1.44k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm33EEEPKT_RAT1__S4_RKT0_:
  460|  1.91k|const T* find(T (&src)[N], const K& key) {
  461|  1.91k|  static_assert(N > 0, "Passed zero length find");
  462|  1.91k|  auto rc = std::find(src, src + N, key);
  463|  1.91k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 344, False: 1.57k]
  ------------------
  464|  1.91k|}
_ZN5Exiv24findIKNS_8Internal14TiffMnRegistryENSt3__117basic_string_viewIcNS4_11char_traitsIcEEEELm26EEEPKT_RAT1__S9_RKT0_:
  460|  36.5k|const T* find(T (&src)[N], const K& key) {
  461|  36.5k|  static_assert(N > 0, "Passed zero length find");
  462|  36.5k|  auto rc = std::find(src, src + N, key);
  463|  36.5k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.49k, False: 35.0k]
  ------------------
  464|  36.5k|}
_ZN5Exiv24findIKNS_8Internal14TiffMnRegistryENS_5IfdIdELm26EEEPKT_RAT1__S5_RKT0_:
  460|  5.88k|const T* find(T (&src)[N], const K& key) {
  461|  5.88k|  static_assert(N > 0, "Passed zero length find");
  462|  5.88k|  auto rc = std::find(src, src + N, key);
  463|  5.88k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 0, False: 5.88k]
  ------------------
  464|  5.88k|}
_ZN5Exiv24findIKNS_8Internal13NikonArrayIdxENS2_3KeyELm34EEEPKT_RAT1__S5_RKT0_:
  460|    618|const T* find(T (&src)[N], const K& key) {
  461|    618|  static_assert(N > 0, "Passed zero length find");
  462|    618|  auto rc = std::find(src, src + N, key);
  463|    618|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 56, False: 562]
  ------------------
  464|    618|}
_ZN5Exiv28stringToIjEET_RKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERb:
  495|     28|T stringTo(const std::string& s, bool& ok) {
  496|     28|  std::istringstream is(s);
  497|     28|  T tmp = T();
  498|     28|  ok = static_cast<bool>(is >> tmp);
  499|     28|  std::string rest;
  500|     28|  is >> std::skipws >> rest;
  501|     28|  if (!rest.empty())
  ------------------
  |  Branch (501:7): [True: 9, False: 19]
  ------------------
  502|      9|    ok = false;
  503|     28|  return tmp;
  504|     28|}
_ZN5Exiv24findIKPKcNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm19EEEPKT_RAT1__SB_RKT0_:
  460|     66|const T* find(T (&src)[N], const K& key) {
  461|     66|  static_assert(N > 0, "Passed zero length find");
  462|     66|  auto rc = std::find(src, src + N, key);
  463|     66|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 59, False: 7]
  ------------------
  464|     66|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm205EEEPKT_RAT1__S4_RKT0_:
  460|  3.57k|const T* find(T (&src)[N], const K& key) {
  461|  3.57k|  static_assert(N > 0, "Passed zero length find");
  462|  3.57k|  auto rc = std::find(src, src + N, key);
  463|  3.57k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 480, False: 3.09k]
  ------------------
  464|  3.57k|}
_ZN5Exiv24findIKPKcNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm5EEEPKT_RAT1__SB_RKT0_:
  460|    125|const T* find(T (&src)[N], const K& key) {
  461|    125|  static_assert(N > 0, "Passed zero length find");
  462|    125|  auto rc = std::find(src, src + N, key);
  463|    125|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 121, False: 4]
  ------------------
  464|    125|}
minoltamn_int.cpp:_ZN5Exiv24findIKZNS_8Internal22printMinoltaSonyLensIDERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEE9LensIdFctjLm6EEEPKT_RAT1__SG_RKT0_:
  460|  1.78k|const T* find(T (&src)[N], const K& key) {
  461|  1.78k|  static_assert(N > 0, "Passed zero length find");
  462|  1.78k|  auto rc = std::find(src, src + N, key);
  463|  1.78k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 553, False: 1.23k]
  ------------------
  464|  1.78k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm15EEEPKT_RAT1__S4_RKT0_:
  460|  3.22k|const T* find(T (&src)[N], const K& key) {
  461|  3.22k|  static_assert(N > 0, "Passed zero length find");
  462|  3.22k|  auto rc = std::find(src, src + N, key);
  463|  3.22k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 962, False: 2.26k]
  ------------------
  464|  3.22k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm45EEEPKT_RAT1__S4_RKT0_:
  460|  2.34k|const T* find(T (&src)[N], const K& key) {
  461|  2.34k|  static_assert(N > 0, "Passed zero length find");
  462|  2.34k|  auto rc = std::find(src, src + N, key);
  463|  2.34k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 204, False: 2.14k]
  ------------------
  464|  2.34k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm23EEEPKT_RAT1__S4_RKT0_:
  460|  1.40k|const T* find(T (&src)[N], const K& key) {
  461|  1.40k|  static_assert(N > 0, "Passed zero length find");
  462|  1.40k|  auto rc = std::find(src, src + N, key);
  463|  1.40k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 666, False: 736]
  ------------------
  464|  1.40k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm77EEEPKT_RAT1__S4_RKT0_:
  460|    374|const T* find(T (&src)[N], const K& key) {
  461|    374|  static_assert(N > 0, "Passed zero length find");
  462|    374|  auto rc = std::find(src, src + N, key);
  463|    374|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 98, False: 276]
  ------------------
  464|    374|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEmLm298EEEPKT_RAT1__S4_RKT0_:
  460|     47|const T* find(T (&src)[N], const K& key) {
  461|     47|  static_assert(N > 0, "Passed zero length find");
  462|     47|  auto rc = std::find(src, src + N, key);
  463|     47|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 0, False: 47]
  ------------------
  464|     47|}
pentaxmn_int.cpp:_ZN5Exiv24findIKZNS_8InternalL13printLensTypeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEE9LensIdFctjLm14EEEPKT_RAT1__SG_RKT0_:
  460|  2.12k|const T* find(T (&src)[N], const K& key) {
  461|  2.12k|  static_assert(N > 0, "Passed zero length find");
  462|  2.12k|  auto rc = std::find(src, src + N, key);
  463|  2.12k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 798, False: 1.32k]
  ------------------
  464|  2.12k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm298EEEPKT_RAT1__S4_RKT0_:
  460|    626|const T* find(T (&src)[N], const K& key) {
  461|    626|  static_assert(N > 0, "Passed zero length find");
  462|    626|  auto rc = std::find(src, src + N, key);
  463|    626|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 100, False: 526]
  ------------------
  464|    626|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm147EEEPKT_RAT1__S4_RKT0_:
  460|    192|const T* find(T (&src)[N], const K& key) {
  461|    192|  static_assert(N > 0, "Passed zero length find");
  462|    192|  auto rc = std::find(src, src + N, key);
  463|    192|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 178, False: 14]
  ------------------
  464|    192|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm79EEEPKT_RAT1__S4_RKT0_:
  460|    782|const T* find(T (&src)[N], const K& key) {
  461|    782|  static_assert(N > 0, "Passed zero length find");
  462|    782|  auto rc = std::find(src, src + N, key);
  463|    782|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 574, False: 208]
  ------------------
  464|    782|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm75EEEPKT_RAT1__S4_RKT0_:
  460|  1.90k|const T* find(T (&src)[N], const K& key) {
  461|  1.90k|  static_assert(N > 0, "Passed zero length find");
  462|  1.90k|  auto rc = std::find(src, src + N, key);
  463|  1.90k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 646, False: 1.25k]
  ------------------
  464|  1.90k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm7EEEPKT_RAT1__S4_RKT0_:
  460|    950|const T* find(T (&src)[N], const K& key) {
  461|    950|  static_assert(N > 0, "Passed zero length find");
  462|    950|  auto rc = std::find(src, src + N, key);
  463|    950|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 206, False: 744]
  ------------------
  464|    950|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm71EEEPKT_RAT1__S4_RKT0_:
  460|  4.23k|const T* find(T (&src)[N], const K& key) {
  461|  4.23k|  static_assert(N > 0, "Passed zero length find");
  462|  4.23k|  auto rc = std::find(src, src + N, key);
  463|  4.23k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 452, False: 3.78k]
  ------------------
  464|  4.23k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm20EEEPKT_RAT1__S4_RKT0_:
  460|  1.94k|const T* find(T (&src)[N], const K& key) {
  461|  1.94k|  static_assert(N > 0, "Passed zero length find");
  462|  1.94k|  auto rc = std::find(src, src + N, key);
  463|  1.94k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 286, False: 1.65k]
  ------------------
  464|  1.94k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsEjLm2EEEPKT_RAT1__S4_RKT0_:
  460|    342|const T* find(T (&src)[N], const K& key) {
  461|    342|  static_assert(N > 0, "Passed zero length find");
  462|    342|  auto rc = std::find(src, src + N, key);
  463|    342|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 284, False: 58]
  ------------------
  464|    342|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm80EEEPKT_RAT1__S4_RKT0_:
  460|    980|const T* find(T (&src)[N], const K& key) {
  461|    980|  static_assert(N > 0, "Passed zero length find");
  462|    980|  auto rc = std::find(src, src + N, key);
  463|    980|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 449, False: 531]
  ------------------
  464|    980|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm36EEEPKT_RAT1__S4_RKT0_:
  460|  1.37k|const T* find(T (&src)[N], const K& key) {
  461|  1.37k|  static_assert(N > 0, "Passed zero length find");
  462|  1.37k|  auto rc = std::find(src, src + N, key);
  463|  1.37k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 120, False: 1.25k]
  ------------------
  464|  1.37k|}
_ZN5Exiv24findIKNS_8Internal16StringTagDetailsENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm5EEEPKT_RAT1__SB_RKT0_:
  460|    816|const T* find(T (&src)[N], const K& key) {
  461|    816|  static_assert(N > 0, "Passed zero length find");
  462|    816|  auto rc = std::find(src, src + N, key);
  463|    816|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 452, False: 364]
  ------------------
  464|    816|}
_ZN5Exiv24findIKNS_8Internal16StringTagDetailsENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm30EEEPKT_RAT1__SB_RKT0_:
  460|    374|const T* find(T (&src)[N], const K& key) {
  461|    374|  static_assert(N > 0, "Passed zero length find");
  462|    374|  auto rc = std::find(src, src + N, key);
  463|    374|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 326, False: 48]
  ------------------
  464|    374|}
_ZN5Exiv24findIKNS_8Internal16StringTagDetailsENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm16EEEPKT_RAT1__SB_RKT0_:
  460|    478|const T* find(T (&src)[N], const K& key) {
  461|    478|  static_assert(N > 0, "Passed zero length find");
  462|    478|  auto rc = std::find(src, src + N, key);
  463|    478|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 326, False: 152]
  ------------------
  464|    478|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm115EEEPKT_RAT1__S4_RKT0_:
  460|  8.95k|const T* find(T (&src)[N], const K& key) {
  461|  8.95k|  static_assert(N > 0, "Passed zero length find");
  462|  8.95k|  auto rc = std::find(src, src + N, key);
  463|  8.95k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 1.04k, False: 7.91k]
  ------------------
  464|  8.95k|}
_ZN5Exiv24findIKNS_8Internal16StringTagDetailsENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm19EEEPKT_RAT1__SB_RKT0_:
  460|    276|const T* find(T (&src)[N], const K& key) {
  461|    276|  static_assert(N > 0, "Passed zero length find");
  462|    276|  auto rc = std::find(src, src + N, key);
  463|    276|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 270, False: 6]
  ------------------
  464|    276|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm26EEEPKT_RAT1__S4_RKT0_:
  460|  2.80k|const T* find(T (&src)[N], const K& key) {
  461|  2.80k|  static_assert(N > 0, "Passed zero length find");
  462|  2.80k|  auto rc = std::find(src, src + N, key);
  463|  2.80k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 470, False: 2.33k]
  ------------------
  464|  2.80k|}
_ZN5Exiv24findIKNS_8Internal10TagDetailsElLm31EEEPKT_RAT1__S4_RKT0_:
  460|  4.53k|const T* find(T (&src)[N], const K& key) {
  461|  4.53k|  static_assert(N > 0, "Passed zero length find");
  462|  4.53k|  auto rc = std::find(src, src + N, key);
  463|  4.53k|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 994, False: 3.54k]
  ------------------
  464|  4.53k|}
_ZN5Exiv24findIKPKcNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEELm34EEEPKT_RAT1__SB_RKT0_:
  460|     41|const T* find(T (&src)[N], const K& key) {
  461|     41|  static_assert(N > 0, "Passed zero length find");
  462|     41|  auto rc = std::find(src, src + N, key);
  463|     41|  return rc == src + N ? nullptr : rc;
  ------------------
  |  Branch (463:10): [True: 37, False: 4]
  ------------------
  464|     41|}

_ZNK5Exiv25Value6typeIdEv:
   85|  77.4M|  TypeId typeId() const {
   86|  77.4M|    return type_;
   87|  77.4M|  }
_ZNK5Exiv25Value5cloneEv:
   93|  47.7M|  UniquePtr clone() const {
   94|  47.7M|    return UniquePtr(clone_());
   95|  47.7M|  }
_ZNK5Exiv25Value2okEv:
  181|  1.49k|  bool ok() const {
  182|  1.49k|    return ok_;
  183|  1.49k|  }
_ZNK5Exiv222LangAltValueComparatorclERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  795|    282|  bool operator()(const std::string& str1, const std::string& str2) const {
  796|    282|    if (str1.size() != str2.size())
  ------------------
  |  Branch (796:9): [True: 126, False: 156]
  ------------------
  797|    126|      return str1.size() > str2.size();
  798|       |
  799|    156|    auto f = [](unsigned char a, unsigned char b) { return std::tolower(a) > std::tolower(b); };
  800|    156|    return std::lexicographical_compare(str1.begin(), str1.end(), str2.begin(), str2.end(), f);
  801|    282|  }
_ZN5Exiv2lsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_5ValueE:
  242|   305k|inline std::ostream& operator<<(std::ostream& os, const Value& value) {
  243|   305k|  return value.write(os);
  244|   305k|}
_ZN5Exiv27getTypeItEENS_6TypeIdEv:
 1083|  16.0M|inline TypeId getType<uint16_t>() {
 1084|  16.0M|  return unsignedShort;
 1085|  16.0M|}
_ZN5Exiv27getTypeIjEENS_6TypeIdEv:
 1088|  28.6k|inline TypeId getType<uint32_t>() {
 1089|  28.6k|  return unsignedLong;
 1090|  28.6k|}
_ZN5Exiv27getTypeINSt3__14pairIjjEEEENS_6TypeIdEv:
 1093|  44.6k|inline TypeId getType<URational>() {
 1094|  44.6k|  return unsignedRational;
 1095|  44.6k|}
_ZN5Exiv27getTypeIsEENS_6TypeIdEv:
 1098|  1.10M|inline TypeId getType<int16_t>() {
 1099|  1.10M|  return signedShort;
 1100|  1.10M|}
_ZN5Exiv27getTypeIiEENS_6TypeIdEv:
 1103|   209k|inline TypeId getType<int32_t>() {
 1104|   209k|  return signedLong;
 1105|   209k|}
_ZN5Exiv27getTypeINSt3__14pairIiiEEEENS_6TypeIdEv:
 1108|  32.1k|inline TypeId getType<Rational>() {
 1109|  32.1k|  return signedRational;
 1110|  32.1k|}
_ZN5Exiv27getTypeIfEENS_6TypeIdEv:
 1113|  10.2k|inline TypeId getType<float>() {
 1114|  10.2k|  return tiffFloat;
 1115|  10.2k|}
_ZN5Exiv27getTypeIdEENS_6TypeIdEv:
 1118|  8.42k|inline TypeId getType<double>() {
 1119|  8.42k|  return tiffDouble;
 1120|  8.42k|}
_ZN5Exiv28getValueItEET_PKhNS_9ByteOrderE:
 1314|  17.2M|inline uint16_t getValue(const byte* buf, ByteOrder byteOrder) {
 1315|  17.2M|  return getUShort(buf, byteOrder);
 1316|  17.2M|}
_ZN5Exiv28getValueIjEET_PKhNS_9ByteOrderE:
 1319|  2.05M|inline uint32_t getValue(const byte* buf, ByteOrder byteOrder) {
 1320|  2.05M|  return getULong(buf, byteOrder);
 1321|  2.05M|}
_ZN5Exiv28getValueINSt3__14pairIjjEEEET_PKhNS_9ByteOrderE:
 1324|   395k|inline URational getValue(const byte* buf, ByteOrder byteOrder) {
 1325|   395k|  return getURational(buf, byteOrder);
 1326|   395k|}
_ZN5Exiv28getValueIsEET_PKhNS_9ByteOrderE:
 1329|  8.43M|inline int16_t getValue(const byte* buf, ByteOrder byteOrder) {
 1330|  8.43M|  return getShort(buf, byteOrder);
 1331|  8.43M|}
_ZN5Exiv28getValueIiEET_PKhNS_9ByteOrderE:
 1334|   330k|inline int32_t getValue(const byte* buf, ByteOrder byteOrder) {
 1335|   330k|  return getLong(buf, byteOrder);
 1336|   330k|}
_ZN5Exiv28getValueINSt3__14pairIiiEEEET_PKhNS_9ByteOrderE:
 1339|   477k|inline Rational getValue(const byte* buf, ByteOrder byteOrder) {
 1340|   477k|  return getRational(buf, byteOrder);
 1341|   477k|}
_ZN5Exiv28getValueIfEET_PKhNS_9ByteOrderE:
 1344|   117k|inline float getValue(const byte* buf, ByteOrder byteOrder) {
 1345|   117k|  return getFloat(buf, byteOrder);
 1346|   117k|}
_ZN5Exiv28getValueIdEET_PKhNS_9ByteOrderE:
 1349|  20.2k|inline double getValue(const byte* buf, ByteOrder byteOrder) {
 1350|  20.2k|  return getDouble(buf, byteOrder);
 1351|  20.2k|}
_ZN5Exiv26toDataItEEmPhT_NS_9ByteOrderE:
 1372|   691k|inline size_t toData(byte* buf, uint16_t t, ByteOrder byteOrder) {
 1373|   691k|  return us2Data(buf, t, byteOrder);
 1374|   691k|}
_ZN5Exiv26toDataIjEEmPhT_NS_9ByteOrderE:
 1380|   123k|inline size_t toData(byte* buf, uint32_t t, ByteOrder byteOrder) {
 1381|   123k|  return ul2Data(buf, t, byteOrder);
 1382|   123k|}
_ZN5Exiv26toDataINSt3__14pairIjjEEEEmPhT_NS_9ByteOrderE:
 1388|   233k|inline size_t toData(byte* buf, URational t, ByteOrder byteOrder) {
 1389|   233k|  return ur2Data(buf, t, byteOrder);
 1390|   233k|}
_ZN5Exiv26toDataIsEEmPhT_NS_9ByteOrderE:
 1396|   133k|inline size_t toData(byte* buf, int16_t t, ByteOrder byteOrder) {
 1397|   133k|  return s2Data(buf, t, byteOrder);
 1398|   133k|}
_ZN5Exiv26toDataIiEEmPhT_NS_9ByteOrderE:
 1404|  42.0k|inline size_t toData(byte* buf, int32_t t, ByteOrder byteOrder) {
 1405|  42.0k|  return l2Data(buf, t, byteOrder);
 1406|  42.0k|}
_ZN5Exiv26toDataINSt3__14pairIiiEEEEmPhT_NS_9ByteOrderE:
 1412|  23.8k|inline size_t toData(byte* buf, Rational t, ByteOrder byteOrder) {
 1413|  23.8k|  return r2Data(buf, t, byteOrder);
 1414|  23.8k|}
_ZN5Exiv26toDataIfEEmPhT_NS_9ByteOrderE:
 1420|   112k|inline size_t toData(byte* buf, float t, ByteOrder byteOrder) {
 1421|   112k|  return f2Data(buf, t, byteOrder);
 1422|   112k|}
_ZN5Exiv26toDataIdEEmPhT_NS_9ByteOrderE:
 1428|  70.0k|inline size_t toData(byte* buf, double t, ByteOrder byteOrder) {
 1429|  70.0k|  return d2Data(buf, t, byteOrder);
 1430|  70.0k|}
_ZNK5Exiv29ValueTypeIdE7toInt64Em:
 1548|  3.26k|inline int64_t ValueType<double>::toInt64(size_t n) const {
 1549|  3.26k|  return float_to_integer_helper<int64_t>(n);
 1550|  3.26k|}
_ZNK5Exiv29ValueTypeIdE8toUint32Em:
 1553|  1.88k|inline uint32_t ValueType<double>::toUint32(size_t n) const {
 1554|  1.88k|  return float_to_integer_helper<uint32_t>(n);
 1555|  1.88k|}
_ZNK5Exiv29ValueTypeIfE7toInt64Em:
 1558|  5.99k|inline int64_t ValueType<float>::toInt64(size_t n) const {
 1559|  5.99k|  return float_to_integer_helper<int64_t>(n);
 1560|  5.99k|}
_ZNK5Exiv29ValueTypeIfE8toUint32Em:
 1562|  4.43k|inline uint32_t ValueType<float>::toUint32(size_t n) const {
 1563|  4.43k|  return float_to_integer_helper<uint32_t>(n);
 1564|  4.43k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE7toInt64Em:
 1567|  66.6k|inline int64_t ValueType<Rational>::toInt64(size_t n) const {
 1568|  66.6k|  return rational_to_integer_helper<int64_t>(n);
 1569|  66.6k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE8toUint32Em:
 1571|  30.5k|inline uint32_t ValueType<Rational>::toUint32(size_t n) const {
 1572|  30.5k|  return rational_to_integer_helper<uint32_t>(n);
 1573|  30.5k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE7toInt64Em:
 1576|  19.7k|inline int64_t ValueType<URational>::toInt64(size_t n) const {
 1577|  19.7k|  return rational_to_integer_helper<int64_t>(n);
 1578|  19.7k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE8toUint32Em:
 1580|  2.94k|inline uint32_t ValueType<URational>::toUint32(size_t n) const {
 1581|  2.94k|  return rational_to_integer_helper<uint32_t>(n);
 1582|  2.94k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE7toFloatEm:
 1591|    484|inline float ValueType<Rational>::toFloat(size_t n) const {
 1592|    484|  ok_ = (value_.at(n).second != 0);
 1593|    484|  if (!ok_)
  ------------------
  |  Branch (1593:7): [True: 9, False: 475]
  ------------------
 1594|      9|    return 0.0f;
 1595|    475|  return static_cast<float>(value_.at(n).first) / value_.at(n).second;
 1596|    484|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE7toFloatEm:
 1599|  2.64k|inline float ValueType<URational>::toFloat(size_t n) const {
 1600|  2.64k|  ok_ = (value_.at(n).second != 0);
 1601|  2.64k|  if (!ok_)
  ------------------
  |  Branch (1601:7): [True: 61, False: 2.58k]
  ------------------
 1602|     61|    return 0.0f;
 1603|  2.58k|  return static_cast<float>(value_.at(n).first) / value_.at(n).second;
 1604|  2.64k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE10toRationalEm:
 1613|  2.93k|inline Rational ValueType<Rational>::toRational(size_t n) const {
 1614|  2.93k|  ok_ = true;
 1615|  2.93k|  return {value_.at(n).first, value_.at(n).second};
 1616|  2.93k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE10toRationalEm:
 1619|  12.0k|inline Rational ValueType<URational>::toRational(size_t n) const {
 1620|  12.0k|  ok_ = true;
 1621|  12.0k|  return {value_.at(n).first, value_.at(n).second};
 1622|  12.0k|}
_ZNK5Exiv29ValueTypeIfE10toRationalEm:
 1625|  3.48k|inline Rational ValueType<float>::toRational(size_t n) const {
 1626|  3.48k|  ok_ = true;
 1627|       |  // Warning: This is a very simple conversion, see floatToRationalCast()
 1628|  3.48k|  return floatToRationalCast(value_.at(n));
 1629|  3.48k|}
_ZNK5Exiv29ValueTypeIdE10toRationalEm:
 1632|  1.80k|inline Rational ValueType<double>::toRational(size_t n) const {
 1633|  1.80k|  ok_ = true;
 1634|       |  // Warning: This is a very simple conversion, see floatToRationalCast()
 1635|  1.80k|  return floatToRationalCast(static_cast<float>(value_.at(n)));
 1636|  1.80k|}
_ZNK5Exiv29ValueTypeIdE23float_to_integer_helperIlEET_m:
 1212|  3.26k|  I float_to_integer_helper(size_t n) const {
 1213|  3.26k|    const auto v = value_.at(n);
 1214|  3.26k|    if (static_cast<decltype(v)>(std::numeric_limits<I>::min()) <= v &&
  ------------------
  |  Branch (1214:9): [True: 2.89k, False: 371]
  ------------------
 1215|  2.89k|        v <= static_cast<decltype(v)>(std::numeric_limits<I>::max())) {
  ------------------
  |  Branch (1215:9): [True: 1.69k, False: 1.19k]
  ------------------
 1216|  1.69k|      return static_cast<I>(std::lround(v));
 1217|  1.69k|    }
 1218|  1.56k|    return 0;
 1219|  3.26k|  }
_ZNK5Exiv29ValueTypeIdE23float_to_integer_helperIjEET_m:
 1212|  1.88k|  I float_to_integer_helper(size_t n) const {
 1213|  1.88k|    const auto v = value_.at(n);
 1214|  1.88k|    if (static_cast<decltype(v)>(std::numeric_limits<I>::min()) <= v &&
  ------------------
  |  Branch (1214:9): [True: 992, False: 895]
  ------------------
 1215|    992|        v <= static_cast<decltype(v)>(std::numeric_limits<I>::max())) {
  ------------------
  |  Branch (1215:9): [True: 521, False: 471]
  ------------------
 1216|    521|      return static_cast<I>(std::lround(v));
 1217|    521|    }
 1218|  1.36k|    return 0;
 1219|  1.88k|  }
_ZNK5Exiv29ValueTypeIfE23float_to_integer_helperIlEET_m:
 1212|  5.99k|  I float_to_integer_helper(size_t n) const {
 1213|  5.99k|    const auto v = value_.at(n);
 1214|  5.99k|    if (static_cast<decltype(v)>(std::numeric_limits<I>::min()) <= v &&
  ------------------
  |  Branch (1214:9): [True: 5.08k, False: 913]
  ------------------
 1215|  5.08k|        v <= static_cast<decltype(v)>(std::numeric_limits<I>::max())) {
  ------------------
  |  Branch (1215:9): [True: 4.51k, False: 569]
  ------------------
 1216|  4.51k|      return static_cast<I>(std::lround(v));
 1217|  4.51k|    }
 1218|  1.48k|    return 0;
 1219|  5.99k|  }
_ZNK5Exiv29ValueTypeIfE23float_to_integer_helperIjEET_m:
 1212|  4.43k|  I float_to_integer_helper(size_t n) const {
 1213|  4.43k|    const auto v = value_.at(n);
 1214|  4.43k|    if (static_cast<decltype(v)>(std::numeric_limits<I>::min()) <= v &&
  ------------------
  |  Branch (1214:9): [True: 3.40k, False: 1.03k]
  ------------------
 1215|  3.40k|        v <= static_cast<decltype(v)>(std::numeric_limits<I>::max())) {
  ------------------
  |  Branch (1215:9): [True: 2.68k, False: 714]
  ------------------
 1216|  2.68k|      return static_cast<I>(std::lround(v));
 1217|  2.68k|    }
 1218|  1.74k|    return 0;
 1219|  4.43k|  }
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE26rational_to_integer_helperIlEET_m:
 1223|  66.6k|  I rational_to_integer_helper(size_t n) const {
 1224|  66.6k|    auto a = value_.at(n).first;
 1225|  66.6k|    auto b = value_.at(n).second;
 1226|       |
 1227|       |    // Protect against divide-by-zero.
 1228|  66.6k|    if (b <= 0) {
  ------------------
  |  Branch (1228:9): [True: 12.7k, False: 53.9k]
  ------------------
 1229|  12.7k|      return 0;
 1230|  12.7k|    }
 1231|       |
 1232|       |    // Check for integer overflow.
 1233|  53.9k|#ifdef __cpp_if_constexpr
 1234|  53.9k|    if constexpr (std::is_signed_v<I> == std::is_signed_v<decltype(a)>) {
 1235|       |#else
 1236|       |    if (std::is_signed<I>::value == std::is_signed<decltype(a)>::value) {
 1237|       |#endif
 1238|       |      // conversion does not change sign
 1239|  53.9k|      const auto imin = std::numeric_limits<I>::min();
 1240|  53.9k|      const auto imax = std::numeric_limits<I>::max();
 1241|  53.9k|      if (imax < b || a < imin || imax < a) {
  ------------------
  |  Branch (1241:11): [True: 81, False: 53.8k]
  |  Branch (1241:23): [True: 0, False: 53.8k]
  |  Branch (1241:35): [True: 0, False: 53.8k]
  ------------------
 1242|      0|        return 0;
 1243|      0|      }
 1244|  53.9k|#ifdef __cpp_if_constexpr
 1245|       |    } else if constexpr (std::is_signed_v<I>) {
 1246|       |#else
 1247|       |    } else if (std::is_signed<I>::value) {
 1248|       |#endif
 1249|       |      // conversion is from unsigned to signed
 1250|       |      const auto imax = static_cast<std::make_unsigned_t<I>>(std::numeric_limits<I>::max());
 1251|       |      if (imax < b || imax < a) {
 1252|       |        return 0;
 1253|       |      }
 1254|       |    } else {
 1255|       |      // conversion is from signed to unsigned
 1256|       |      const auto imax = std::numeric_limits<I>::max();
 1257|       |      if (a < 0) {
 1258|       |        return 0;
 1259|       |      }
 1260|       |      // Inputs are not negative so convert them to unsigned.
 1261|       |      const auto a_u = static_cast<std::make_unsigned_t<decltype(a)>>(a);
 1262|       |      const auto b_u = static_cast<std::make_unsigned_t<decltype(b)>>(b);
 1263|       |      if (imax < b_u || imax < a_u) {
 1264|       |        return 0;
 1265|       |      }
 1266|       |    }
 1267|       |
 1268|  53.9k|    return static_cast<I>(a) / static_cast<I>(b);
 1269|  66.6k|  }
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE26rational_to_integer_helperIjEET_m:
 1223|  30.5k|  I rational_to_integer_helper(size_t n) const {
 1224|  30.5k|    auto a = value_.at(n).first;
 1225|  30.5k|    auto b = value_.at(n).second;
 1226|       |
 1227|       |    // Protect against divide-by-zero.
 1228|  30.5k|    if (b <= 0) {
  ------------------
  |  Branch (1228:9): [True: 5.96k, False: 24.6k]
  ------------------
 1229|  5.96k|      return 0;
 1230|  5.96k|    }
 1231|       |
 1232|       |    // Check for integer overflow.
 1233|  24.6k|#ifdef __cpp_if_constexpr
 1234|       |    if constexpr (std::is_signed_v<I> == std::is_signed_v<decltype(a)>) {
 1235|       |#else
 1236|       |    if (std::is_signed<I>::value == std::is_signed<decltype(a)>::value) {
 1237|       |#endif
 1238|       |      // conversion does not change sign
 1239|       |      const auto imin = std::numeric_limits<I>::min();
 1240|       |      const auto imax = std::numeric_limits<I>::max();
 1241|       |      if (imax < b || a < imin || imax < a) {
 1242|       |        return 0;
 1243|       |      }
 1244|       |#ifdef __cpp_if_constexpr
 1245|       |    } else if constexpr (std::is_signed_v<I>) {
 1246|       |#else
 1247|       |    } else if (std::is_signed<I>::value) {
 1248|       |#endif
 1249|       |      // conversion is from unsigned to signed
 1250|       |      const auto imax = static_cast<std::make_unsigned_t<I>>(std::numeric_limits<I>::max());
 1251|       |      if (imax < b || imax < a) {
 1252|       |        return 0;
 1253|       |      }
 1254|  24.6k|    } else {
 1255|       |      // conversion is from signed to unsigned
 1256|  24.6k|      const auto imax = std::numeric_limits<I>::max();
 1257|  24.6k|      if (a < 0) {
  ------------------
  |  Branch (1257:11): [True: 2.31k, False: 22.3k]
  ------------------
 1258|  2.31k|        return 0;
 1259|  2.31k|      }
 1260|       |      // Inputs are not negative so convert them to unsigned.
 1261|  22.3k|      const auto a_u = static_cast<std::make_unsigned_t<decltype(a)>>(a);
 1262|  22.3k|      const auto b_u = static_cast<std::make_unsigned_t<decltype(b)>>(b);
 1263|  22.3k|      if (imax < b_u || imax < a_u) {
  ------------------
  |  Branch (1263:11): [True: 64, False: 22.2k]
  |  Branch (1263:25): [True: 0, False: 22.2k]
  ------------------
 1264|      0|        return 0;
 1265|      0|      }
 1266|  22.3k|    }
 1267|       |
 1268|  22.3k|    return static_cast<I>(a) / static_cast<I>(b);
 1269|  30.5k|  }
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE26rational_to_integer_helperIlEET_m:
 1223|  19.7k|  I rational_to_integer_helper(size_t n) const {
 1224|  19.7k|    auto a = value_.at(n).first;
 1225|  19.7k|    auto b = value_.at(n).second;
 1226|       |
 1227|       |    // Protect against divide-by-zero.
 1228|  19.7k|    if (b <= 0) {
  ------------------
  |  Branch (1228:9): [True: 706, False: 19.0k]
  ------------------
 1229|    706|      return 0;
 1230|    706|    }
 1231|       |
 1232|       |    // Check for integer overflow.
 1233|  19.0k|#ifdef __cpp_if_constexpr
 1234|       |    if constexpr (std::is_signed_v<I> == std::is_signed_v<decltype(a)>) {
 1235|       |#else
 1236|       |    if (std::is_signed<I>::value == std::is_signed<decltype(a)>::value) {
 1237|       |#endif
 1238|       |      // conversion does not change sign
 1239|       |      const auto imin = std::numeric_limits<I>::min();
 1240|       |      const auto imax = std::numeric_limits<I>::max();
 1241|       |      if (imax < b || a < imin || imax < a) {
 1242|       |        return 0;
 1243|       |      }
 1244|       |#ifdef __cpp_if_constexpr
 1245|  19.0k|    } else if constexpr (std::is_signed_v<I>) {
 1246|       |#else
 1247|       |    } else if (std::is_signed<I>::value) {
 1248|       |#endif
 1249|       |      // conversion is from unsigned to signed
 1250|  19.0k|      const auto imax = static_cast<std::make_unsigned_t<I>>(std::numeric_limits<I>::max());
 1251|  19.0k|      if (imax < b || imax < a) {
  ------------------
  |  Branch (1251:11): [True: 73, False: 18.9k]
  |  Branch (1251:23): [True: 0, False: 18.9k]
  ------------------
 1252|      0|        return 0;
 1253|      0|      }
 1254|       |    } else {
 1255|       |      // conversion is from signed to unsigned
 1256|       |      const auto imax = std::numeric_limits<I>::max();
 1257|       |      if (a < 0) {
 1258|       |        return 0;
 1259|       |      }
 1260|       |      // Inputs are not negative so convert them to unsigned.
 1261|       |      const auto a_u = static_cast<std::make_unsigned_t<decltype(a)>>(a);
 1262|       |      const auto b_u = static_cast<std::make_unsigned_t<decltype(b)>>(b);
 1263|       |      if (imax < b_u || imax < a_u) {
 1264|       |        return 0;
 1265|       |      }
 1266|       |    }
 1267|       |
 1268|  19.0k|    return static_cast<I>(a) / static_cast<I>(b);
 1269|  19.7k|  }
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE26rational_to_integer_helperIjEET_m:
 1223|  2.94k|  I rational_to_integer_helper(size_t n) const {
 1224|  2.94k|    auto a = value_.at(n).first;
 1225|  2.94k|    auto b = value_.at(n).second;
 1226|       |
 1227|       |    // Protect against divide-by-zero.
 1228|  2.94k|    if (b <= 0) {
  ------------------
  |  Branch (1228:9): [True: 387, False: 2.55k]
  ------------------
 1229|    387|      return 0;
 1230|    387|    }
 1231|       |
 1232|       |    // Check for integer overflow.
 1233|  2.55k|#ifdef __cpp_if_constexpr
 1234|  2.55k|    if constexpr (std::is_signed_v<I> == std::is_signed_v<decltype(a)>) {
 1235|       |#else
 1236|       |    if (std::is_signed<I>::value == std::is_signed<decltype(a)>::value) {
 1237|       |#endif
 1238|       |      // conversion does not change sign
 1239|  2.55k|      const auto imin = std::numeric_limits<I>::min();
 1240|  2.55k|      const auto imax = std::numeric_limits<I>::max();
 1241|  2.55k|      if (imax < b || a < imin || imax < a) {
  ------------------
  |  Branch (1241:11): [True: 32, False: 2.52k]
  |  Branch (1241:23): [True: 0, False: 2.52k]
  |  Branch (1241:35): [True: 0, False: 2.52k]
  ------------------
 1242|      0|        return 0;
 1243|      0|      }
 1244|  2.55k|#ifdef __cpp_if_constexpr
 1245|       |    } else if constexpr (std::is_signed_v<I>) {
 1246|       |#else
 1247|       |    } else if (std::is_signed<I>::value) {
 1248|       |#endif
 1249|       |      // conversion is from unsigned to signed
 1250|       |      const auto imax = static_cast<std::make_unsigned_t<I>>(std::numeric_limits<I>::max());
 1251|       |      if (imax < b || imax < a) {
 1252|       |        return 0;
 1253|       |      }
 1254|       |    } else {
 1255|       |      // conversion is from signed to unsigned
 1256|       |      const auto imax = std::numeric_limits<I>::max();
 1257|       |      if (a < 0) {
 1258|       |        return 0;
 1259|       |      }
 1260|       |      // Inputs are not negative so convert them to unsigned.
 1261|       |      const auto a_u = static_cast<std::make_unsigned_t<decltype(a)>>(a);
 1262|       |      const auto b_u = static_cast<std::make_unsigned_t<decltype(b)>>(b);
 1263|       |      if (imax < b_u || imax < a_u) {
 1264|       |        return 0;
 1265|       |      }
 1266|       |    }
 1267|       |
 1268|  2.55k|    return static_cast<I>(a) / static_cast<I>(b);
 1269|  2.94k|  }
_ZN5Exiv29ValueTypeItEC2Ev:
 1433|  16.0M|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  16.0M|}
_ZN5Exiv25ValueD2Ev:
   43|  69.0M|  virtual ~Value() = default;
_ZN5Exiv29ValueTypeItE4readEPKhmNS_9ByteOrderE:
 1467|  16.0M|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|  16.0M|  value_.clear();
 1469|  16.0M|  size_t ts = TypeInfo::typeSize(typeId());
 1470|  16.0M|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 16.0M, False: 0]
  |  Branch (1470:17): [True: 1.15k, False: 16.0M]
  ------------------
 1471|  1.15k|    len = (len / ts) * ts;
 1472|  33.2M|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 17.2M, False: 16.0M]
  ------------------
 1473|  17.2M|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|  17.2M|  }
 1475|  16.0M|  return 0;
 1476|  16.0M|}
_ZN5Exiv29ValueTypeItE4readERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1479|    977|int ValueType<T>::read(const std::string& buf) {
 1480|    977|  std::istringstream is(buf);
 1481|    977|  T tmp;
 1482|    977|  ValueList val;
 1483|  1.81k|  while (is >> tmp)
  ------------------
  |  Branch (1483:10): [True: 836, False: 977]
  ------------------
 1484|    836|    val.push_back(tmp);
 1485|    977|  if (!is.eof())
  ------------------
  |  Branch (1485:7): [True: 8, False: 969]
  ------------------
 1486|      8|    return 1;
 1487|    969|  value_ = std::move(val);
 1488|    969|  return 0;
 1489|    977|}
_ZN5Exiv29ValueTypeItE11setDataAreaEPKhm:
 1649|    172|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    172|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 121, False: 51]
  ------------------
 1651|    121|    pDataArea_ = Blob(buf, buf + len);
 1652|     51|  else
 1653|     51|    pDataArea_.clear();
 1654|    172|  return 0;
 1655|    172|}
_ZNK5Exiv29ValueTypeItE4copyEPhNS_9ByteOrderE:
 1492|  30.5k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  30.5k|  size_t offset = 0;
 1494|   691k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 691k, False: 30.5k]
  ------------------
 1495|   691k|    offset += toData(buf + offset, val, byteOrder);
 1496|   691k|  }
 1497|  30.5k|  return offset;
 1498|  30.5k|}
_ZNK5Exiv29ValueTypeItE5countEv:
 1501|  16.3M|size_t ValueType<T>::count() const {
 1502|  16.3M|  return value_.size();
 1503|  16.3M|}
_ZNK5Exiv29ValueTypeItE4sizeEv:
 1506|   206k|size_t ValueType<T>::size() const {
 1507|   206k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|   206k|}
_ZNK5Exiv29ValueTypeItE5writeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE:
 1516|  50.1k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  50.1k|  auto end = value_.end();
 1518|  50.1k|  auto i = value_.begin();
 1519|   334k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 284k, False: 50.1k]
  ------------------
 1520|   284k|    os << std::setprecision(15) << *i;
 1521|   284k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 234k, False: 50.0k]
  ------------------
 1522|   234k|      os << " ";
 1523|   284k|  }
 1524|  50.1k|  return os;
 1525|  50.1k|}
_ZNK5Exiv29ValueTypeItE8toStringEm:
 1528|    978|std::string ValueType<T>::toString(size_t n) const {
 1529|    978|  ok_ = true;
 1530|    978|  return Exiv2::toString<T>(value_.at(n));
 1531|    978|}
_ZNK5Exiv29ValueTypeItE7toInt64Em:
 1535|   224k|int64_t ValueType<T>::toInt64(size_t n) const {
 1536|   224k|  ok_ = true;
 1537|   224k|  return static_cast<int64_t>(value_.at(n));
 1538|   224k|}
_ZNK5Exiv29ValueTypeItE8toUint32Em:
 1540|  48.7k|uint32_t ValueType<T>::toUint32(size_t n) const {
 1541|  48.7k|  ok_ = true;
 1542|  48.7k|  return static_cast<uint32_t>(value_.at(n));
 1543|  48.7k|}
_ZNK5Exiv29ValueTypeItE7toFloatEm:
 1585|  8.99k|float ValueType<T>::toFloat(size_t n) const {
 1586|  8.99k|  ok_ = true;
 1587|  8.99k|  return static_cast<float>(value_.at(n));
 1588|  8.99k|}
_ZNK5Exiv29ValueTypeItE10toRationalEm:
 1607|    116|Rational ValueType<T>::toRational(size_t n) const {
 1608|    116|  ok_ = true;
 1609|    116|  return {value_.at(n), 1};
 1610|    116|}
_ZNK5Exiv29ValueTypeItE12sizeDataAreaEv:
 1639|  1.22k|size_t ValueType<T>::sizeDataArea() const {
 1640|  1.22k|  return pDataArea_.size();
 1641|  1.22k|}
_ZNK5Exiv29ValueTypeItE8dataAreaEv:
 1644|    119|DataBuf ValueType<T>::dataArea() const {
 1645|    119|  return {pDataArea_.data(), pDataArea_.size()};
 1646|    119|}
_ZNK5Exiv29ValueTypeItE6clone_Ev:
 1511|  32.0M|ValueType<T>* ValueType<T>::clone_() const {
 1512|  32.0M|  return new ValueType<T>(*this);
 1513|  32.0M|}
_ZN5Exiv29ValueTypeItEC2ERKS1_:
 1447|  32.0M|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|  32.0M|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 176, False: 32.0M]
  ------------------
 1449|    176|    pDataArea_ = rhs.pDataArea_;
 1450|  32.0M|}
_ZN5Exiv25ValueC2ERKS0_:
  225|  12.2M|  Value(const Value&) = default;
_ZN5Exiv29ValueTypeIjE4readEPKhmNS_9ByteOrderE:
 1467|   231k|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|   231k|  value_.clear();
 1469|   231k|  size_t ts = TypeInfo::typeSize(typeId());
 1470|   231k|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 231k, False: 0]
  |  Branch (1470:17): [True: 141, False: 231k]
  ------------------
 1471|    141|    len = (len / ts) * ts;
 1472|  2.28M|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 2.05M, False: 231k]
  ------------------
 1473|  2.05M|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|  2.05M|  }
 1475|   231k|  return 0;
 1476|   231k|}
_ZN5Exiv29ValueTypeIjE11setDataAreaEPKhm:
 1649|    212|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    212|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 141, False: 71]
  ------------------
 1651|    141|    pDataArea_ = Blob(buf, buf + len);
 1652|     71|  else
 1653|     71|    pDataArea_.clear();
 1654|    212|  return 0;
 1655|    212|}
_ZNK5Exiv29ValueTypeIjE4copyEPhNS_9ByteOrderE:
 1492|  52.3k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  52.3k|  size_t offset = 0;
 1494|   123k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 123k, False: 52.3k]
  ------------------
 1495|   123k|    offset += toData(buf + offset, val, byteOrder);
 1496|   123k|  }
 1497|  52.3k|  return offset;
 1498|  52.3k|}
_ZNK5Exiv29ValueTypeIjE5countEv:
 1501|   381k|size_t ValueType<T>::count() const {
 1502|   381k|  return value_.size();
 1503|   381k|}
_ZNK5Exiv29ValueTypeIjE4sizeEv:
 1506|   333k|size_t ValueType<T>::size() const {
 1507|   333k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|   333k|}
_ZNK5Exiv29ValueTypeIjE5writeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE:
 1516|  58.9k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  58.9k|  auto end = value_.end();
 1518|  58.9k|  auto i = value_.begin();
 1519|   462k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 403k, False: 58.9k]
  ------------------
 1520|   403k|    os << std::setprecision(15) << *i;
 1521|   403k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 345k, False: 58.8k]
  ------------------
 1522|   345k|      os << " ";
 1523|   403k|  }
 1524|  58.9k|  return os;
 1525|  58.9k|}
_ZNK5Exiv29ValueTypeIjE8toStringEm:
 1528|    226|std::string ValueType<T>::toString(size_t n) const {
 1529|    226|  ok_ = true;
 1530|    226|  return Exiv2::toString<T>(value_.at(n));
 1531|    226|}
_ZNK5Exiv29ValueTypeIjE7toInt64Em:
 1535|  32.9k|int64_t ValueType<T>::toInt64(size_t n) const {
 1536|  32.9k|  ok_ = true;
 1537|  32.9k|  return static_cast<int64_t>(value_.at(n));
 1538|  32.9k|}
_ZNK5Exiv29ValueTypeIjE8toUint32Em:
 1540|  8.30k|uint32_t ValueType<T>::toUint32(size_t n) const {
 1541|  8.30k|  ok_ = true;
 1542|  8.30k|  return static_cast<uint32_t>(value_.at(n));
 1543|  8.30k|}
_ZNK5Exiv29ValueTypeIjE7toFloatEm:
 1585|    116|float ValueType<T>::toFloat(size_t n) const {
 1586|    116|  ok_ = true;
 1587|    116|  return static_cast<float>(value_.at(n));
 1588|    116|}
_ZNK5Exiv29ValueTypeIjE10toRationalEm:
 1607|    480|Rational ValueType<T>::toRational(size_t n) const {
 1608|    480|  ok_ = true;
 1609|    480|  return {value_.at(n), 1};
 1610|    480|}
_ZNK5Exiv29ValueTypeIjE12sizeDataAreaEv:
 1639|  2.20k|size_t ValueType<T>::sizeDataArea() const {
 1640|  2.20k|  return pDataArea_.size();
 1641|  2.20k|}
_ZNK5Exiv29ValueTypeIjE8dataAreaEv:
 1644|    277|DataBuf ValueType<T>::dataArea() const {
 1645|    277|  return {pDataArea_.data(), pDataArea_.size()};
 1646|    277|}
_ZNK5Exiv29ValueTypeIjE6clone_Ev:
 1511|   548k|ValueType<T>* ValueType<T>::clone_() const {
 1512|   548k|  return new ValueType<T>(*this);
 1513|   548k|}
_ZN5Exiv29ValueTypeIjEC2ERKS1_:
 1447|   548k|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|   548k|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 173, False: 548k]
  ------------------
 1449|    173|    pDataArea_ = rhs.pDataArea_;
 1450|   548k|}
_ZN5Exiv29ValueTypeINSt3__14pairIjjEEEC2Ev:
 1433|  44.6k|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  44.6k|}
_ZN5Exiv29ValueTypeINSt3__14pairIjjEEE4readEPKhmNS_9ByteOrderE:
 1467|  44.6k|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|  44.6k|  value_.clear();
 1469|  44.6k|  size_t ts = TypeInfo::typeSize(typeId());
 1470|  44.6k|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 44.6k, False: 0]
  |  Branch (1470:17): [True: 0, False: 44.6k]
  ------------------
 1471|      0|    len = (len / ts) * ts;
 1472|   440k|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 395k, False: 44.6k]
  ------------------
 1473|   395k|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|   395k|  }
 1475|  44.6k|  return 0;
 1476|  44.6k|}
_ZN5Exiv29ValueTypeINSt3__14pairIjjEEE11setDataAreaEPKhm:
 1649|    147|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    147|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 96, False: 51]
  ------------------
 1651|     96|    pDataArea_ = Blob(buf, buf + len);
 1652|     51|  else
 1653|     51|    pDataArea_.clear();
 1654|    147|  return 0;
 1655|    147|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE4copyEPhNS_9ByteOrderE:
 1492|  16.1k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  16.1k|  size_t offset = 0;
 1494|   233k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 233k, False: 16.1k]
  ------------------
 1495|   233k|    offset += toData(buf + offset, val, byteOrder);
 1496|   233k|  }
 1497|  16.1k|  return offset;
 1498|  16.1k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE5countEv:
 1501|  93.2k|size_t ValueType<T>::count() const {
 1502|  93.2k|  return value_.size();
 1503|  93.2k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE4sizeEv:
 1506|  49.8k|size_t ValueType<T>::size() const {
 1507|  49.8k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|  49.8k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE5writeERNS1_13basic_ostreamIcNS1_11char_traitsIcEEEE:
 1516|  4.16k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  4.16k|  auto end = value_.end();
 1518|  4.16k|  auto i = value_.begin();
 1519|  25.1k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 20.9k, False: 4.16k]
  ------------------
 1520|  20.9k|    os << std::setprecision(15) << *i;
 1521|  20.9k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 17.0k, False: 3.97k]
  ------------------
 1522|  17.0k|      os << " ";
 1523|  20.9k|  }
 1524|  4.16k|  return os;
 1525|  4.16k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE8toStringEm:
 1528|    130|std::string ValueType<T>::toString(size_t n) const {
 1529|    130|  ok_ = true;
 1530|    130|  return Exiv2::toString<T>(value_.at(n));
 1531|    130|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE12sizeDataAreaEv:
 1639|  1.27k|size_t ValueType<T>::sizeDataArea() const {
 1640|  1.27k|  return pDataArea_.size();
 1641|  1.27k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE8dataAreaEv:
 1644|    131|DataBuf ValueType<T>::dataArea() const {
 1645|    131|  return {pDataArea_.data(), pDataArea_.size()};
 1646|    131|}
_ZNK5Exiv29ValueTypeINSt3__14pairIjjEEE6clone_Ev:
 1511|   112k|ValueType<T>* ValueType<T>::clone_() const {
 1512|   112k|  return new ValueType<T>(*this);
 1513|   112k|}
_ZN5Exiv29ValueTypeINSt3__14pairIjjEEEC2ERKS4_:
 1447|   112k|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|   112k|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 98, False: 112k]
  ------------------
 1449|     98|    pDataArea_ = rhs.pDataArea_;
 1450|   112k|}
_ZN5Exiv29ValueTypeIsEC2Ev:
 1433|  1.10M|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  1.10M|}
_ZN5Exiv29ValueTypeIsE4readEPKhmNS_9ByteOrderE:
 1467|  1.10M|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|  1.10M|  value_.clear();
 1469|  1.10M|  size_t ts = TypeInfo::typeSize(typeId());
 1470|  1.10M|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 1.10M, False: 0]
  |  Branch (1470:17): [True: 570, False: 1.09M]
  ------------------
 1471|    570|    len = (len / ts) * ts;
 1472|  9.53M|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 8.43M, False: 1.10M]
  ------------------
 1473|  8.43M|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|  8.43M|  }
 1475|  1.10M|  return 0;
 1476|  1.10M|}
_ZN5Exiv29ValueTypeIsE4readERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1479|  3.87k|int ValueType<T>::read(const std::string& buf) {
 1480|  3.87k|  std::istringstream is(buf);
 1481|  3.87k|  T tmp;
 1482|  3.87k|  ValueList val;
 1483|  11.7k|  while (is >> tmp)
  ------------------
  |  Branch (1483:10): [True: 7.89k, False: 3.87k]
  ------------------
 1484|  7.89k|    val.push_back(tmp);
 1485|  3.87k|  if (!is.eof())
  ------------------
  |  Branch (1485:7): [True: 0, False: 3.87k]
  ------------------
 1486|      0|    return 1;
 1487|  3.87k|  value_ = std::move(val);
 1488|  3.87k|  return 0;
 1489|  3.87k|}
_ZN5Exiv29ValueTypeIsE11setDataAreaEPKhm:
 1649|    297|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    297|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 131, False: 166]
  ------------------
 1651|    131|    pDataArea_ = Blob(buf, buf + len);
 1652|    166|  else
 1653|    166|    pDataArea_.clear();
 1654|    297|  return 0;
 1655|    297|}
_ZNK5Exiv29ValueTypeIsE4copyEPhNS_9ByteOrderE:
 1492|  7.45k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  7.45k|  size_t offset = 0;
 1494|   133k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 133k, False: 7.45k]
  ------------------
 1495|   133k|    offset += toData(buf + offset, val, byteOrder);
 1496|   133k|  }
 1497|  7.45k|  return offset;
 1498|  7.45k|}
_ZNK5Exiv29ValueTypeIsE5countEv:
 1501|  14.9M|size_t ValueType<T>::count() const {
 1502|  14.9M|  return value_.size();
 1503|  14.9M|}
_ZNK5Exiv29ValueTypeIsE4sizeEv:
 1506|  27.0k|size_t ValueType<T>::size() const {
 1507|  27.0k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|  27.0k|}
_ZNK5Exiv29ValueTypeIsE5writeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE:
 1516|  11.5k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  11.5k|  auto end = value_.end();
 1518|  11.5k|  auto i = value_.begin();
 1519|   129k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 118k, False: 11.5k]
  ------------------
 1520|   118k|    os << std::setprecision(15) << *i;
 1521|   118k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 106k, False: 11.4k]
  ------------------
 1522|   106k|      os << " ";
 1523|   118k|  }
 1524|  11.5k|  return os;
 1525|  11.5k|}
_ZNK5Exiv29ValueTypeIsE8toStringEm:
 1528|    284|std::string ValueType<T>::toString(size_t n) const {
 1529|    284|  ok_ = true;
 1530|    284|  return Exiv2::toString<T>(value_.at(n));
 1531|    284|}
_ZNK5Exiv29ValueTypeIsE7toInt64Em:
 1535|  13.8M|int64_t ValueType<T>::toInt64(size_t n) const {
 1536|  13.8M|  ok_ = true;
 1537|  13.8M|  return static_cast<int64_t>(value_.at(n));
 1538|  13.8M|}
_ZNK5Exiv29ValueTypeIsE8toUint32Em:
 1540|  12.5k|uint32_t ValueType<T>::toUint32(size_t n) const {
 1541|  12.5k|  ok_ = true;
 1542|  12.5k|  return static_cast<uint32_t>(value_.at(n));
 1543|  12.5k|}
_ZNK5Exiv29ValueTypeIsE7toFloatEm:
 1585|    216|float ValueType<T>::toFloat(size_t n) const {
 1586|    216|  ok_ = true;
 1587|    216|  return static_cast<float>(value_.at(n));
 1588|    216|}
_ZNK5Exiv29ValueTypeIsE10toRationalEm:
 1607|    262|Rational ValueType<T>::toRational(size_t n) const {
 1608|    262|  ok_ = true;
 1609|    262|  return {value_.at(n), 1};
 1610|    262|}
_ZNK5Exiv29ValueTypeIsE12sizeDataAreaEv:
 1639|  3.21k|size_t ValueType<T>::sizeDataArea() const {
 1640|  3.21k|  return pDataArea_.size();
 1641|  3.21k|}
_ZNK5Exiv29ValueTypeIsE8dataAreaEv:
 1644|     63|DataBuf ValueType<T>::dataArea() const {
 1645|     63|  return {pDataArea_.data(), pDataArea_.size()};
 1646|     63|}
_ZNK5Exiv29ValueTypeIsE6clone_Ev:
 1511|  2.22M|ValueType<T>* ValueType<T>::clone_() const {
 1512|  2.22M|  return new ValueType<T>(*this);
 1513|  2.22M|}
_ZN5Exiv29ValueTypeIsEC2ERKS1_:
 1447|  2.22M|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|  2.22M|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 172, False: 2.22M]
  ------------------
 1449|    172|    pDataArea_ = rhs.pDataArea_;
 1450|  2.22M|}
_ZN5Exiv29ValueTypeIiEC2Ev:
 1433|   209k|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|   209k|}
_ZN5Exiv29ValueTypeIiE4readEPKhmNS_9ByteOrderE:
 1467|   209k|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|   209k|  value_.clear();
 1469|   209k|  size_t ts = TypeInfo::typeSize(typeId());
 1470|   209k|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 209k, False: 0]
  |  Branch (1470:17): [True: 955, False: 208k]
  ------------------
 1471|    955|    len = (len / ts) * ts;
 1472|   539k|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 330k, False: 209k]
  ------------------
 1473|   330k|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|   330k|  }
 1475|   209k|  return 0;
 1476|   209k|}
_ZN5Exiv29ValueTypeIiE11setDataAreaEPKhm:
 1649|    203|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    203|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 100, False: 103]
  ------------------
 1651|    100|    pDataArea_ = Blob(buf, buf + len);
 1652|    103|  else
 1653|    103|    pDataArea_.clear();
 1654|    203|  return 0;
 1655|    203|}
_ZNK5Exiv29ValueTypeIiE4copyEPhNS_9ByteOrderE:
 1492|  5.40k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  5.40k|  size_t offset = 0;
 1494|  42.0k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 42.0k, False: 5.40k]
  ------------------
 1495|  42.0k|    offset += toData(buf + offset, val, byteOrder);
 1496|  42.0k|  }
 1497|  5.40k|  return offset;
 1498|  5.40k|}
_ZNK5Exiv29ValueTypeIiE5countEv:
 1501|   247k|size_t ValueType<T>::count() const {
 1502|   247k|  return value_.size();
 1503|   247k|}
_ZNK5Exiv29ValueTypeIiE4sizeEv:
 1506|  21.1k|size_t ValueType<T>::size() const {
 1507|  21.1k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|  21.1k|}
_ZNK5Exiv29ValueTypeIiE5writeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE:
 1516|  4.68k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  4.68k|  auto end = value_.end();
 1518|  4.68k|  auto i = value_.begin();
 1519|   168k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 164k, False: 4.68k]
  ------------------
 1520|   164k|    os << std::setprecision(15) << *i;
 1521|   164k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 159k, False: 4.50k]
  ------------------
 1522|   159k|      os << " ";
 1523|   164k|  }
 1524|  4.68k|  return os;
 1525|  4.68k|}
_ZNK5Exiv29ValueTypeIiE8toStringEm:
 1528|    206|std::string ValueType<T>::toString(size_t n) const {
 1529|    206|  ok_ = true;
 1530|    206|  return Exiv2::toString<T>(value_.at(n));
 1531|    206|}
_ZNK5Exiv29ValueTypeIiE7toInt64Em:
 1535|  21.6k|int64_t ValueType<T>::toInt64(size_t n) const {
 1536|  21.6k|  ok_ = true;
 1537|  21.6k|  return static_cast<int64_t>(value_.at(n));
 1538|  21.6k|}
_ZNK5Exiv29ValueTypeIiE8toUint32Em:
 1540|  2.67k|uint32_t ValueType<T>::toUint32(size_t n) const {
 1541|  2.67k|  ok_ = true;
 1542|  2.67k|  return static_cast<uint32_t>(value_.at(n));
 1543|  2.67k|}
_ZNK5Exiv29ValueTypeIiE7toFloatEm:
 1585|     86|float ValueType<T>::toFloat(size_t n) const {
 1586|     86|  ok_ = true;
 1587|     86|  return static_cast<float>(value_.at(n));
 1588|     86|}
_ZNK5Exiv29ValueTypeIiE10toRationalEm:
 1607|    276|Rational ValueType<T>::toRational(size_t n) const {
 1608|    276|  ok_ = true;
 1609|    276|  return {value_.at(n), 1};
 1610|    276|}
_ZNK5Exiv29ValueTypeIiE12sizeDataAreaEv:
 1639|  1.16k|size_t ValueType<T>::sizeDataArea() const {
 1640|  1.16k|  return pDataArea_.size();
 1641|  1.16k|}
_ZNK5Exiv29ValueTypeIiE8dataAreaEv:
 1644|    163|DataBuf ValueType<T>::dataArea() const {
 1645|    163|  return {pDataArea_.data(), pDataArea_.size()};
 1646|    163|}
_ZNK5Exiv29ValueTypeIiE6clone_Ev:
 1511|   429k|ValueType<T>* ValueType<T>::clone_() const {
 1512|   429k|  return new ValueType<T>(*this);
 1513|   429k|}
_ZN5Exiv29ValueTypeIiEC2ERKS1_:
 1447|   429k|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|   429k|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 105, False: 429k]
  ------------------
 1449|    105|    pDataArea_ = rhs.pDataArea_;
 1450|   429k|}
_ZN5Exiv29ValueTypeINSt3__14pairIiiEEEC2Ev:
 1433|  32.1k|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  32.1k|}
_ZN5Exiv29ValueTypeINSt3__14pairIiiEEE4readEPKhmNS_9ByteOrderE:
 1467|  32.1k|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|  32.1k|  value_.clear();
 1469|  32.1k|  size_t ts = TypeInfo::typeSize(typeId());
 1470|  32.1k|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 32.1k, False: 0]
  |  Branch (1470:17): [True: 0, False: 32.1k]
  ------------------
 1471|      0|    len = (len / ts) * ts;
 1472|   509k|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 477k, False: 32.1k]
  ------------------
 1473|   477k|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|   477k|  }
 1475|  32.1k|  return 0;
 1476|  32.1k|}
_ZN5Exiv29ValueTypeINSt3__14pairIiiEEE11setDataAreaEPKhm:
 1649|  1.52k|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|  1.52k|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 1.09k, False: 436]
  ------------------
 1651|  1.09k|    pDataArea_ = Blob(buf, buf + len);
 1652|    436|  else
 1653|    436|    pDataArea_.clear();
 1654|  1.52k|  return 0;
 1655|  1.52k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE4copyEPhNS_9ByteOrderE:
 1492|  11.4k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  11.4k|  size_t offset = 0;
 1494|  23.8k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 23.8k, False: 11.4k]
  ------------------
 1495|  23.8k|    offset += toData(buf + offset, val, byteOrder);
 1496|  23.8k|  }
 1497|  11.4k|  return offset;
 1498|  11.4k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE5countEv:
 1501|  95.4k|size_t ValueType<T>::count() const {
 1502|  95.4k|  return value_.size();
 1503|  95.4k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE4sizeEv:
 1506|  33.9k|size_t ValueType<T>::size() const {
 1507|  33.9k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|  33.9k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE5writeERNS1_13basic_ostreamIcNS1_11char_traitsIcEEEE:
 1516|  7.34k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  7.34k|  auto end = value_.end();
 1518|  7.34k|  auto i = value_.begin();
 1519|  54.3k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 46.9k, False: 7.34k]
  ------------------
 1520|  46.9k|    os << std::setprecision(15) << *i;
 1521|  46.9k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 39.6k, False: 7.29k]
  ------------------
 1522|  39.6k|      os << " ";
 1523|  46.9k|  }
 1524|  7.34k|  return os;
 1525|  7.34k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE8toStringEm:
 1528|    314|std::string ValueType<T>::toString(size_t n) const {
 1529|    314|  ok_ = true;
 1530|    314|  return Exiv2::toString<T>(value_.at(n));
 1531|    314|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE12sizeDataAreaEv:
 1639|  1.81k|size_t ValueType<T>::sizeDataArea() const {
 1640|  1.81k|  return pDataArea_.size();
 1641|  1.81k|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE8dataAreaEv:
 1644|     31|DataBuf ValueType<T>::dataArea() const {
 1645|     31|  return {pDataArea_.data(), pDataArea_.size()};
 1646|     31|}
_ZNK5Exiv29ValueTypeINSt3__14pairIiiEEE6clone_Ev:
 1511|  80.5k|ValueType<T>* ValueType<T>::clone_() const {
 1512|  80.5k|  return new ValueType<T>(*this);
 1513|  80.5k|}
_ZN5Exiv29ValueTypeINSt3__14pairIiiEEEC2ERKS4_:
 1447|  80.5k|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|  80.5k|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 1.86k, False: 78.6k]
  ------------------
 1449|  1.86k|    pDataArea_ = rhs.pDataArea_;
 1450|  80.5k|}
_ZN5Exiv29ValueTypeIfEC2Ev:
 1433|  10.2k|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  10.2k|}
_ZN5Exiv29ValueTypeIfE4readEPKhmNS_9ByteOrderE:
 1467|  10.2k|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|  10.2k|  value_.clear();
 1469|  10.2k|  size_t ts = TypeInfo::typeSize(typeId());
 1470|  10.2k|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 10.2k, False: 0]
  |  Branch (1470:17): [True: 0, False: 10.2k]
  ------------------
 1471|      0|    len = (len / ts) * ts;
 1472|   128k|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 117k, False: 10.2k]
  ------------------
 1473|   117k|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|   117k|  }
 1475|  10.2k|  return 0;
 1476|  10.2k|}
_ZN5Exiv29ValueTypeIfE11setDataAreaEPKhm:
 1649|    696|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    696|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 367, False: 329]
  ------------------
 1651|    367|    pDataArea_ = Blob(buf, buf + len);
 1652|    329|  else
 1653|    329|    pDataArea_.clear();
 1654|    696|  return 0;
 1655|    696|}
_ZNK5Exiv29ValueTypeIfE4copyEPhNS_9ByteOrderE:
 1492|  7.00k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  7.00k|  size_t offset = 0;
 1494|   112k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 112k, False: 7.00k]
  ------------------
 1495|   112k|    offset += toData(buf + offset, val, byteOrder);
 1496|   112k|  }
 1497|  7.00k|  return offset;
 1498|  7.00k|}
_ZNK5Exiv29ValueTypeIfE5countEv:
 1501|  32.1k|size_t ValueType<T>::count() const {
 1502|  32.1k|  return value_.size();
 1503|  32.1k|}
_ZNK5Exiv29ValueTypeIfE4sizeEv:
 1506|  22.2k|size_t ValueType<T>::size() const {
 1507|  22.2k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|  22.2k|}
_ZNK5Exiv29ValueTypeIfE5writeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE:
 1516|  2.63k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  2.63k|  auto end = value_.end();
 1518|  2.63k|  auto i = value_.begin();
 1519|  67.2k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 64.5k, False: 2.63k]
  ------------------
 1520|  64.5k|    os << std::setprecision(15) << *i;
 1521|  64.5k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 61.9k, False: 2.59k]
  ------------------
 1522|  61.9k|      os << " ";
 1523|  64.5k|  }
 1524|  2.63k|  return os;
 1525|  2.63k|}
_ZNK5Exiv29ValueTypeIfE8toStringEm:
 1528|    234|std::string ValueType<T>::toString(size_t n) const {
 1529|    234|  ok_ = true;
 1530|    234|  return Exiv2::toString<T>(value_.at(n));
 1531|    234|}
_ZNK5Exiv29ValueTypeIfE7toFloatEm:
 1585|    119|float ValueType<T>::toFloat(size_t n) const {
 1586|    119|  ok_ = true;
 1587|    119|  return static_cast<float>(value_.at(n));
 1588|    119|}
_ZNK5Exiv29ValueTypeIfE12sizeDataAreaEv:
 1639|  2.05k|size_t ValueType<T>::sizeDataArea() const {
 1640|  2.05k|  return pDataArea_.size();
 1641|  2.05k|}
_ZNK5Exiv29ValueTypeIfE8dataAreaEv:
 1644|    193|DataBuf ValueType<T>::dataArea() const {
 1645|    193|  return {pDataArea_.data(), pDataArea_.size()};
 1646|    193|}
_ZNK5Exiv29ValueTypeIfE6clone_Ev:
 1511|  33.4k|ValueType<T>* ValueType<T>::clone_() const {
 1512|  33.4k|  return new ValueType<T>(*this);
 1513|  33.4k|}
_ZN5Exiv29ValueTypeIfEC2ERKS1_:
 1447|  33.4k|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|  33.4k|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 266, False: 33.2k]
  ------------------
 1449|    266|    pDataArea_ = rhs.pDataArea_;
 1450|  33.4k|}
_ZN5Exiv29ValueTypeIdEC2Ev:
 1433|  8.42k|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  8.42k|}
_ZN5Exiv29ValueTypeIdE4readEPKhmNS_9ByteOrderE:
 1467|  8.42k|int ValueType<T>::read(const byte* buf, size_t len, ByteOrder byteOrder) {
 1468|  8.42k|  value_.clear();
 1469|  8.42k|  size_t ts = TypeInfo::typeSize(typeId());
 1470|  8.42k|  if (ts > 0 && len % ts != 0)
  ------------------
  |  Branch (1470:7): [True: 8.42k, False: 0]
  |  Branch (1470:17): [True: 0, False: 8.42k]
  ------------------
 1471|      0|    len = (len / ts) * ts;
 1472|  28.6k|  for (size_t i = 0; i < len; i += ts) {
  ------------------
  |  Branch (1472:22): [True: 20.2k, False: 8.42k]
  ------------------
 1473|  20.2k|    value_.push_back(getValue<T>(buf + i, byteOrder));
 1474|  20.2k|  }
 1475|  8.42k|  return 0;
 1476|  8.42k|}
_ZN5Exiv29ValueTypeIdE11setDataAreaEPKhm:
 1649|    296|int ValueType<T>::setDataArea(const byte* buf, size_t len) {
 1650|    296|  if (len > 0)
  ------------------
  |  Branch (1650:7): [True: 161, False: 135]
  ------------------
 1651|    161|    pDataArea_ = Blob(buf, buf + len);
 1652|    135|  else
 1653|    135|    pDataArea_.clear();
 1654|    296|  return 0;
 1655|    296|}
_ZNK5Exiv29ValueTypeIdE4copyEPhNS_9ByteOrderE:
 1492|  7.11k|size_t ValueType<T>::copy(byte* buf, ByteOrder byteOrder) const {
 1493|  7.11k|  size_t offset = 0;
 1494|  70.0k|  for (const auto& val : value_) {
  ------------------
  |  Branch (1494:24): [True: 70.0k, False: 7.11k]
  ------------------
 1495|  70.0k|    offset += toData(buf + offset, val, byteOrder);
 1496|  70.0k|  }
 1497|  7.11k|  return offset;
 1498|  7.11k|}
_ZNK5Exiv29ValueTypeIdE5countEv:
 1501|  21.9k|size_t ValueType<T>::count() const {
 1502|  21.9k|  return value_.size();
 1503|  21.9k|}
_ZNK5Exiv29ValueTypeIdE4sizeEv:
 1506|  23.4k|size_t ValueType<T>::size() const {
 1507|  23.4k|  return TypeInfo::typeSize(typeId()) * value_.size();
 1508|  23.4k|}
_ZNK5Exiv29ValueTypeIdE5writeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE:
 1516|  1.29k|std::ostream& ValueType<T>::write(std::ostream& os) const {
 1517|  1.29k|  auto end = value_.end();
 1518|  1.29k|  auto i = value_.begin();
 1519|  7.40k|  while (i != end) {
  ------------------
  |  Branch (1519:10): [True: 6.11k, False: 1.29k]
  ------------------
 1520|  6.11k|    os << std::setprecision(15) << *i;
 1521|  6.11k|    if (++i != end)
  ------------------
  |  Branch (1521:9): [True: 4.92k, False: 1.19k]
  ------------------
 1522|  4.92k|      os << " ";
 1523|  6.11k|  }
 1524|  1.29k|  return os;
 1525|  1.29k|}
_ZNK5Exiv29ValueTypeIdE8toStringEm:
 1528|     26|std::string ValueType<T>::toString(size_t n) const {
 1529|     26|  ok_ = true;
 1530|     26|  return Exiv2::toString<T>(value_.at(n));
 1531|     26|}
_ZNK5Exiv29ValueTypeIdE7toFloatEm:
 1585|    205|float ValueType<T>::toFloat(size_t n) const {
 1586|    205|  ok_ = true;
 1587|    205|  return static_cast<float>(value_.at(n));
 1588|    205|}
_ZNK5Exiv29ValueTypeIdE12sizeDataAreaEv:
 1639|  2.66k|size_t ValueType<T>::sizeDataArea() const {
 1640|  2.66k|  return pDataArea_.size();
 1641|  2.66k|}
_ZNK5Exiv29ValueTypeIdE8dataAreaEv:
 1644|    307|DataBuf ValueType<T>::dataArea() const {
 1645|    307|  return {pDataArea_.data(), pDataArea_.size()};
 1646|    307|}
_ZNK5Exiv29ValueTypeIdE6clone_Ev:
 1511|  27.6k|ValueType<T>* ValueType<T>::clone_() const {
 1512|  27.6k|  return new ValueType<T>(*this);
 1513|  27.6k|}
_ZN5Exiv29ValueTypeIdEC2ERKS1_:
 1447|  27.6k|ValueType<T>::ValueType(const ValueType<T>& rhs) : Value(rhs.typeId()), value_(rhs.value_) {
 1448|  27.6k|  if (!rhs.pDataArea_.empty())
  ------------------
  |  Branch (1448:7): [True: 112, False: 27.5k]
  ------------------
 1449|    112|    pDataArea_ = rhs.pDataArea_;
 1450|  27.6k|}
_ZZNK5Exiv222LangAltValueComparatorclERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ENKUlhhE_clEhh:
  799|  2.21k|    auto f = [](unsigned char a, unsigned char b) { return std::tolower(a) > std::tolower(b); };
_ZN5Exiv29ValueTypeIjEC2Ev:
 1433|  28.6k|ValueType<T>::ValueType() : Value(getType<T>()) {
 1434|  28.6k|}

_ZNK5Exiv27XmpData9usePacketEv:
  217|  8.26k|  [[nodiscard]] bool usePacket() const {
  218|  8.26k|    return usePacket_;
  219|  8.26k|  }
_ZN5Exiv27XmpData9usePacketEb:
  222|  35.7k|  bool usePacket(bool b) {
  223|  35.7k|    bool r = usePacket_;
  224|  35.7k|    usePacket_ = b;
  225|  35.7k|    return r;
  226|  35.7k|  }
_ZN5Exiv27XmpData9setPacketENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  228|  34.7k|  void setPacket(std::string xmpPacket) {
  229|  34.7k|    xmpPacket_ = std::move(xmpPacket);
  230|  34.7k|    usePacket(false);
  231|  34.7k|  }
_ZNK5Exiv27XmpData10nsBindingsEv:
  261|  3.60k|  [[nodiscard]] const std::map<std::string, std::string>& nsBindings() const {
  262|  3.60k|    return nsBindings_;
  263|  3.60k|  }
_ZN5Exiv27XmpDataC2Ev:
  141|  38.5k|  XmpData() = default;
_ZN5Exiv28XmpdatumaSINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEERS0_RKT_:
  396|  10.1k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|  10.1k|    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|       |    setValue(Exiv2::toString(value));
  405|  10.1k|  return *this;
  406|  10.1k|}
_ZN5Exiv28XmpdatumaSIdEERS0_RKT_:
  396|   118k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|   118k|    setValue(Exiv2::toString(value));
  405|   118k|  return *this;
  406|   118k|}
_ZN5Exiv28XmpdatumaSImEERS0_RKT_:
  396|  4.12k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|  4.12k|    setValue(Exiv2::toString(value));
  405|  4.12k|  return *this;
  406|  4.12k|}
_ZN5Exiv28XmpdatumaSIjEERS0_RKT_:
  396|  6.21k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|  6.21k|    setValue(Exiv2::toString(value));
  405|  6.21k|  return *this;
  406|  6.21k|}
_ZN5Exiv28XmpdatumaSIPKhEERS0_RKT_:
  396|  1.23k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|  1.23k|    setValue(Exiv2::toString(value));
  405|  1.23k|  return *this;
  406|  1.23k|}
_ZN5Exiv28XmpdatumaSIA4_cEERS0_RKT_:
  396|  1.07k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|  1.07k|    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|       |    setValue(Exiv2::toString(value));
  405|  1.07k|  return *this;
  406|  1.07k|}
_ZN5Exiv28XmpdatumaSIlEERS0_RKT_:
  396|    564|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|    564|    setValue(Exiv2::toString(value));
  405|    564|  return *this;
  406|    564|}
_ZN5Exiv28XmpdatumaSIfEERS0_RKT_:
  396|  1.50k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|  1.50k|    setValue(Exiv2::toString(value));
  405|  1.50k|  return *this;
  406|  1.50k|}
_ZN5Exiv28XmpdatumaSIA18_cEERS0_RKT_:
  396|    381|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|    381|    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|       |    setValue(Exiv2::toString(value));
  405|    381|  return *this;
  406|    381|}
_ZN5Exiv28XmpdatumaSItEERS0_RKT_:
  396|  77.9k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|  77.9k|    setValue(Exiv2::toString(value));
  405|  77.9k|  return *this;
  406|  77.9k|}
_ZN5Exiv28XmpdatumaSIsEERS0_RKT_:
  396|    820|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|    820|    setValue(Exiv2::toString(value));
  405|    820|  return *this;
  406|    820|}
_ZN5Exiv28XmpdatumaSIPhEERS0_RKT_:
  396|   121k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|   121k|    setValue(Exiv2::toString(value));
  405|   121k|  return *this;
  406|   121k|}
_ZN5Exiv28XmpdatumaSIPKcEERS0_RKT_:
  396|  15.4k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|  15.4k|    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|       |    setValue(Exiv2::toString(value));
  405|  15.4k|  return *this;
  406|  15.4k|}
_ZN5Exiv28XmpdatumaSIiEERS0_RKT_:
  396|   128k|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|       |    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|   128k|    setValue(Exiv2::toString(value));
  405|   128k|  return *this;
  406|   128k|}
_ZN5Exiv28XmpdatumaSIA12_cEERS0_RKT_:
  396|     14|Xmpdatum& Xmpdatum::operator=(const T& value) {
  397|       |  if constexpr (std::is_same_v<T, bool>)
  398|       |    setValue(value ? "True" : "False");
  399|       |  else if constexpr (std::is_convertible_v<T, std::string>)
  400|     14|    setValue(value);
  401|       |  else if constexpr (std::is_base_of_v<Value, T>)
  402|       |    setValue(&value);
  403|       |  else
  404|       |    setValue(Exiv2::toString(value));
  405|     14|  return *this;
  406|     14|}

_ZNK5Exiv28AsfVideo7GUIDTageqERKS1_:
   42|  8.05k|bool AsfVideo::GUIDTag::operator==(const AsfVideo::GUIDTag& other) const {
   43|  8.05k|  return data1_ == other.data1_ && data2_ == other.data2_ && data3_ == other.data3_ && data4_ == other.data4_;
  ------------------
  |  Branch (43:10): [True: 1.20k, False: 6.85k]
  |  Branch (43:36): [True: 1.19k, False: 7]
  |  Branch (43:62): [True: 1.18k, False: 10]
  |  Branch (43:88): [True: 1.18k, False: 3]
  ------------------
   44|  8.05k|}
_ZN5Exiv28AsfVideo7GUIDTagC2EPKh:
   46|  10.3k|AsfVideo::GUIDTag::GUIDTag(const uint8_t* bytes) {
   47|  10.3k|  data1_ = Exiv2::getULong(bytes, ByteOrder::littleEndian);
   48|  10.3k|  data2_ = Exiv2::getUShort(bytes + DWORD, ByteOrder::littleEndian);
   49|  10.3k|  data3_ = Exiv2::getUShort(bytes + DWORD + WORD, ByteOrder::littleEndian);
   50|  10.3k|  std::copy(bytes + QWORD, bytes + (2 * QWORD), data4_.begin());
   51|  10.3k|}
_ZNK5Exiv28AsfVideo7GUIDTag9to_stringEv:
   53|     80|std::string AsfVideo::GUIDTag::to_string() const {
   54|       |  // Concatenate all strings into a single string
   55|       |  // Convert the string to uppercase
   56|       |  // Example of output 399595EC-8667-4E2D-8FDB-98814CE76C1E
   57|     80|  return stringFormat("{:08X}-{:04X}-{:04X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}", data1_, data2_, data3_,
  ------------------
  |  |   18|     80|#define stringFormat std::format
  ------------------
   58|     80|                      data4_[0], data4_[1], data4_[2], data4_[3], data4_[4], data4_[5], data4_[6], data4_[7]);
   59|     80|}
_ZNK5Exiv28AsfVideo7GUIDTagltERKS1_:
   61|  15.4k|bool AsfVideo::GUIDTag::operator<(const GUIDTag& other) const {
   62|  15.4k|  if (data1_ != other.data1_)
  ------------------
  |  Branch (62:7): [True: 11.7k, False: 3.68k]
  ------------------
   63|  11.7k|    return data1_ < other.data1_;
   64|  3.68k|  if (data2_ != other.data2_)
  ------------------
  |  Branch (64:7): [True: 321, False: 3.36k]
  ------------------
   65|    321|    return data2_ < other.data2_;
   66|  3.36k|  if (data3_ != other.data3_)
  ------------------
  |  Branch (66:7): [True: 347, False: 3.01k]
  ------------------
   67|    347|    return data3_ < other.data3_;
   68|  3.01k|  return std::lexicographical_compare(data4_.begin(), data4_.end(), other.data4_.begin(), other.data4_.end());
   69|  3.36k|}
_ZN5Exiv28AsfVideoC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  183|    394|    Image(ImageType::asf, mdNone, std::move(io), params) {
  184|    394|}  // AsfVideo::AsfVideo
_ZNK5Exiv28AsfVideo8mimeTypeEv:
  186|    394|std::string AsfVideo::mimeType() const {
  187|    394|  return "video/asf";
  188|    394|}
_ZN5Exiv28AsfVideo12readMetadataEv:
  193|    394|void AsfVideo::readMetadata() {
  194|    394|  if (io_->open() != 0)
  ------------------
  |  Branch (194:7): [True: 0, False: 394]
  ------------------
  195|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  196|       |
  197|       |  // Ensure that this is the correct image type
  198|    394|  if (!isAsfType(*io_, false)) {
  ------------------
  |  Branch (198:7): [True: 0, False: 394]
  ------------------
  199|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (199:9): [True: 0, False: 0]
  |  Branch (199:25): [True: 0, False: 0]
  ------------------
  200|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  201|      0|    throw Error(ErrorCode::kerNotAnImage, "ASF");
  202|      0|  }
  203|       |
  204|    394|  IoCloser closer(*io_);
  205|    394|  clearMetadata();
  206|    394|  io_->seek(0, BasicIo::beg);
  207|    394|  height_ = width_ = 1;
  208|       |
  209|    394|  xmpData()["Xmp.video.FileSize"] = io_->size() / 1048576.;
  210|    394|  xmpData()["Xmp.video.MimeType"] = mimeType();
  211|       |
  212|    394|  decodeBlock(0);
  213|       |
  214|    394|  xmpData_["Xmp.video.AspectRatio"] = getAspectRatio(width_, height_);
  215|    394|}  // AsfVideo::readMetadata
_ZN5Exiv28AsfVideo12HeaderReaderC2ERKNSt3__110unique_ptrINS_7BasicIoENS2_14default_deleteIS4_EEEE:
  217|  1.88k|AsfVideo::HeaderReader::HeaderReader(const BasicIo::UniquePtr& io) : IdBuf_(GUID) {
  218|  1.88k|  if (io->size() >= io->tell() + GUID + QWORD) {
  ------------------
  |  Branch (218:7): [True: 1.88k, False: 0]
  ------------------
  219|  1.88k|    io->readOrThrow(IdBuf_.data(), IdBuf_.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  220|       |
  221|  1.88k|    size_ = readQWORDTag(io);
  222|  1.88k|    if (size_ >= GUID + QWORD)
  ------------------
  |  Branch (222:9): [True: 918, False: 964]
  ------------------
  223|    918|      remaining_size_ = size_ - GUID - QWORD;
  224|  1.88k|  }
  225|  1.88k|}
_ZN5Exiv28AsfVideo11decodeBlockEm:
  227|  1.91k|void AsfVideo::decodeBlock(size_t depth) {
  228|  1.91k|  Internal::enforce(GUID + QWORD <= io_->size() - io_->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  229|  1.91k|  HeaderReader objectHeader(io_);
  230|       |#ifdef EXIV2_DEBUG_MESSAGES
  231|       |  EXV_INFO << "decodeBlock = " << GUIDTag(objectHeader.getId().data()).to_string()
  232|       |           << "\tsize= " << objectHeader.getSize() << "\t " << io_->tell() << "/" << io_->size() << '\n';
  233|       |#endif
  234|  1.91k|  Internal::enforce(objectHeader.getSize() <= io_->size() - io_->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  235|  1.91k|  auto tag = GUIDReferenceTags.find(GUIDTag(objectHeader.getId().data()));
  236|       |
  237|  1.91k|  if (tag != GUIDReferenceTags.end()) {
  ------------------
  |  Branch (237:7): [True: 1.25k, False: 660]
  ------------------
  238|  1.25k|    if (tag->second == "Header")
  ------------------
  |  Branch (238:9): [True: 409, False: 849]
  ------------------
  239|    409|      decodeHeader(depth + 1);
  240|    849|    else if (tag->second == "File_Properties")
  ------------------
  |  Branch (240:14): [True: 81, False: 768]
  ------------------
  241|     81|      fileProperties();
  242|    768|    else if (tag->second == "Stream_Properties")
  ------------------
  |  Branch (242:14): [True: 388, False: 380]
  ------------------
  243|    388|      streamProperties();
  244|    380|    else if (tag->second == "Header_Extension")
  ------------------
  |  Branch (244:14): [True: 2, False: 378]
  ------------------
  245|      2|      headerExtension();
  246|    378|    else if (tag->second == "Codec_List")
  ------------------
  |  Branch (246:14): [True: 67, False: 311]
  ------------------
  247|     67|      codecList();
  248|    311|    else if (tag->second == "Extended_Content_Description")
  ------------------
  |  Branch (248:14): [True: 128, False: 183]
  ------------------
  249|    128|      extendedContentDescription();
  250|    183|    else if (tag->second == "Content_Description")
  ------------------
  |  Branch (250:14): [True: 135, False: 48]
  ------------------
  251|    135|      contentDescription();
  252|     48|    else if (tag->second == "Extended_Stream_Properties")
  ------------------
  |  Branch (252:14): [True: 30, False: 18]
  ------------------
  253|     30|      extendedStreamProperties();
  254|     18|    else if (tag->second == "Degradable_JPEG_Media")
  ------------------
  |  Branch (254:14): [True: 0, False: 18]
  ------------------
  255|      0|      DegradableJPEGMedia();
  256|     18|    else {  // tag found but not processed
  257|       |      // Make sure that the remaining size is non-zero, so that we won't
  258|       |      // keep revisiting the same location in the file.
  259|     18|      const uint64_t remaining_size = objectHeader.getRemainingSize();
  260|     18|      Internal::enforce(remaining_size > 0, Exiv2::ErrorCode::kerCorruptedMetadata);
  261|     18|      io_->seekOrThrow(io_->tell() + remaining_size, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  262|     18|    }
  263|  1.25k|  } else {  // tag not found
  264|       |    // Make sure that the remaining size is non-zero, so that we won't keep
  265|       |    // revisiting the same location in the file.
  266|    660|    const uint64_t remaining_size = objectHeader.getRemainingSize();
  267|    660|    Internal::enforce(remaining_size > 0, Exiv2::ErrorCode::kerCorruptedMetadata);
  268|    660|    io_->seekOrThrow(io_->tell() + remaining_size, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  269|    660|  }
  270|       |
  271|  1.91k|}  // AsfVideo::decodeBlock
_ZN5Exiv28AsfVideo12decodeHeaderEm:
  273|    409|void AsfVideo::decodeHeader(size_t depth) {
  274|    409|  Internal::enforce(depth <= max_recursion_depth_, Exiv2::ErrorCode::kerCorruptedMetadata);
  275|    409|  DataBuf nbHeadersBuf(DWORD + 1);
  276|    409|  io_->readOrThrow(nbHeadersBuf.data(), DWORD, Exiv2::ErrorCode::kerCorruptedMetadata);
  277|       |
  278|    409|  uint32_t nb_headers = Exiv2::getULong(nbHeadersBuf.data(), littleEndian);
  279|    409|  Internal::enforce(nb_headers < std::numeric_limits<uint32_t>::max(), Exiv2::ErrorCode::kerCorruptedMetadata);
  280|    409|  io_->seekOrThrow(io_->tell() + (BYTE * 2), BasicIo::beg,
  281|    409|                   ErrorCode::kerFailedToReadImageData);  // skip two reserved tags
  282|  1.93k|  for (uint32_t i = 0; i < nb_headers; i++) {
  ------------------
  |  Branch (282:24): [True: 1.52k, False: 409]
  ------------------
  283|  1.52k|    decodeBlock(depth);
  284|  1.52k|  }
  285|    409|}
_ZN5Exiv28AsfVideo24extendedStreamPropertiesEv:
  287|     30|void AsfVideo::extendedStreamProperties() {
  288|     30|  xmpData()["Xmp.video.StartTimecode"] = readQWORDTag(io_);  // Start Time
  289|     30|  xmpData()["Xmp.video.EndTimecode"] = readWORDTag(io_);     // End Time
  290|       |
  291|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Data Bitrate
  292|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Buffer Size
  293|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Initial Buffer Fullness
  294|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Alternate Data Bitrate
  295|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Alternate Buffer Size
  296|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Alternate Initial Buffer Fullness
  297|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Maximum Object Size
  298|     30|  io_->seek(io_->tell() + DWORD, BasicIo::beg);  // ignore Flags Buffer Size
  299|     30|  io_->seek(io_->tell() + WORD, BasicIo::beg);   // ignore Flags Stream Number
  300|     30|  io_->seek(io_->tell() + WORD, BasicIo::beg);   // ignore Stream Language ID Index
  301|       |
  302|     30|  xmpData()["Xmp.video.FrameRate"] = readWORDTag(io_);  // Average Time Per Frame
  303|     30|  uint16_t stream_name_count = readWORDTag(io_);
  304|     30|  uint16_t payload_ext_sys_count = readWORDTag(io_);
  305|       |
  306|  1.18k|  for (uint16_t i = 0; i < stream_name_count; i++) {
  ------------------
  |  Branch (306:24): [True: 1.15k, False: 30]
  ------------------
  307|  1.15k|    io_->seek(io_->tell() + WORD, BasicIo::beg);  // ignore Language ID Index
  308|  1.15k|    uint16_t stream_length = readWORDTag(io_);
  309|  1.15k|    if (stream_length)
  ------------------
  |  Branch (309:9): [True: 823, False: 331]
  ------------------
  310|    823|      io_->seek(io_->tell() + stream_length, BasicIo::beg);  // ignore Stream name
  311|  1.15k|  }
  312|       |
  313|    709|  for (uint16_t i = 0; i < payload_ext_sys_count; i++) {
  ------------------
  |  Branch (313:24): [True: 679, False: 30]
  ------------------
  314|    679|    io_->seek(io_->tell() + GUID, BasicIo::beg);  // ignore Extension System ID
  315|    679|    io_->seek(io_->tell() + WORD, BasicIo::beg);  // ignore Extension Data Size
  316|    679|    uint16_t ext_sys_info_length = readWORDTag(io_);
  317|    679|    if (ext_sys_info_length)
  ------------------
  |  Branch (317:9): [True: 371, False: 308]
  ------------------
  318|    371|      io_->seek(io_->tell() + ext_sys_info_length, BasicIo::beg);  // ignore Extension System Info
  319|    679|  }
  320|     30|}  // AsfVideo::extendedStreamProperties
_ZN5Exiv28AsfVideo16streamPropertiesEv:
  337|    388|void AsfVideo::streamProperties() {
  338|    388|  DataBuf streamTypedBuf(GUID);
  339|    388|  io_->readOrThrow(streamTypedBuf.data(), streamTypedBuf.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  340|       |
  341|    388|  enum class streamTypeInfo { Audio = 1, Video = 2 };
  342|    388|  auto stream = streamTypeInfo{0};
  343|       |
  344|    388|  auto tag_stream_type = GUIDReferenceTags.find(GUIDTag(streamTypedBuf.data()));
  345|    388|  if (tag_stream_type != GUIDReferenceTags.end()) {
  ------------------
  |  Branch (345:7): [True: 170, False: 218]
  ------------------
  346|    170|    if (tag_stream_type->second == "Audio_Media")
  ------------------
  |  Branch (346:9): [True: 0, False: 170]
  ------------------
  347|      0|      stream = streamTypeInfo::Audio;
  348|    170|    else if (tag_stream_type->second == "Video_Media")
  ------------------
  |  Branch (348:14): [True: 0, False: 170]
  ------------------
  349|      0|      stream = streamTypeInfo::Video;
  350|       |
  351|    170|    io_->seek(io_->tell() + GUID, BasicIo::beg);  // ignore Error Correction Type
  352|       |
  353|    170|    uint64_t time_offset = readQWORDTag(io_);
  354|    170|    if (stream == streamTypeInfo::Video)
  ------------------
  |  Branch (354:9): [True: 0, False: 170]
  ------------------
  355|      0|      xmpData()["Xmp.video.TimeOffset"] = time_offset;
  356|    170|    else if (stream == streamTypeInfo::Audio)
  ------------------
  |  Branch (356:14): [True: 0, False: 170]
  ------------------
  357|      0|      xmpData()["Xmp.audio.TimeOffset"] = time_offset;
  358|       |
  359|    170|    auto specific_data_length = readDWORDTag(io_);
  360|    170|    auto correction_data_length = readDWORDTag(io_);
  361|       |
  362|    170|    io_->seek(io_->tell() + WORD /*Flags*/ + DWORD /*Reserved*/ + specific_data_length + correction_data_length,
  363|    170|              BasicIo::beg);
  364|    170|  }
  365|       |
  366|    388|}  // AsfVideo::streamProperties
_ZN5Exiv28AsfVideo9codecListEv:
  368|     67|void AsfVideo::codecList() {
  369|     67|  io_->seek(io_->tell() + GUID /*reserved*/, BasicIo::beg);
  370|     67|  auto entries_count = readDWORDTag(io_);
  371|    320|  for (uint32_t i = 0; i < entries_count; i++) {
  ------------------
  |  Branch (371:24): [True: 253, False: 67]
  ------------------
  372|    253|    uint16_t codec_type = readWORDTag(io_) * 2;
  373|    253|    std::string codec = (codec_type == 1) ? "Xmp.video" : "Xmp.audio";
  ------------------
  |  Branch (373:25): [True: 0, False: 253]
  ------------------
  374|       |
  375|    253|    if (uint16_t codec_name_length = readWORDTag(io_) * 2)
  ------------------
  |  Branch (375:18): [True: 149, False: 104]
  ------------------
  376|    149|      xmpData()[codec + std::string(".CodecName")] = readStringWcharTag(io_, codec_name_length);
  377|       |
  378|    253|    if (uint16_t codec_desc_length = readWORDTag(io_))
  ------------------
  |  Branch (378:18): [True: 195, False: 58]
  ------------------
  379|    195|      xmpData()[codec + std::string(".CodecDescription")] = readStringWcharTag(io_, codec_desc_length);
  380|       |
  381|    253|    uint16_t codec_info_length = readWORDTag(io_);
  382|    253|    Internal::enforce(codec_info_length && codec_info_length < io_->size() - io_->tell(),
  ------------------
  |  Branch (382:23): [True: 223, False: 30]
  |  Branch (382:44): [True: 213, False: 10]
  ------------------
  383|    253|                      Exiv2::ErrorCode::kerCorruptedMetadata);
  384|    253|    xmpData()[codec + std::string(".CodecInfo")] = readStringTag(io_, codec_info_length);
  385|    253|  }
  386|     67|}  // AsfVideo::codecList
_ZNK5Exiv28AsfVideo15headerExtensionEv:
  388|      2|void AsfVideo::headerExtension() const {
  389|      2|  io_->seek(io_->tell() + GUID /*reserved1*/ + WORD /*Reserved2*/, BasicIo::beg);
  390|      2|  auto header_ext_data_length = readDWORDTag(io_);
  391|      2|  io_->seek(io_->tell() + header_ext_data_length, BasicIo::beg);
  392|      2|}  // AsfVideo::headerExtension
_ZN5Exiv28AsfVideo26extendedContentDescriptionEv:
  394|    128|void AsfVideo::extendedContentDescription() {
  395|    128|  uint16_t content_descriptor_count = readWORDTag(io_);
  396|    128|  std::string value;
  397|       |
  398|  89.5k|  for (uint16_t i = 0; i < content_descriptor_count; i++) {
  ------------------
  |  Branch (398:24): [True: 89.4k, False: 105]
  ------------------
  399|  89.4k|    if (uint16_t descriptor_name_length = readWORDTag(io_))
  ------------------
  |  Branch (399:18): [True: 1.51k, False: 87.9k]
  ------------------
  400|  1.51k|      value += readStringWcharTag(io_, descriptor_name_length);  // Descriptor Name
  401|       |
  402|  89.4k|    uint16_t descriptor_value_data_type = readWORDTag(io_);
  403|  89.4k|    if (uint16_t descriptor_value_length = readWORDTag(io_)) {
  ------------------
  |  Branch (403:18): [True: 2.02k, False: 87.4k]
  ------------------
  404|       |      // Descriptor Value
  405|  2.02k|      switch (descriptor_value_data_type) {
  ------------------
  |  Branch (405:15): [True: 877, False: 1.14k]
  ------------------
  406|    202|        case 0 /*Unicode string */:
  ------------------
  |  Branch (406:9): [True: 202, False: 1.82k]
  ------------------
  407|    202|          value += std::string(": ") + readStringWcharTag(io_, descriptor_value_length);
  408|    202|          break;
  409|    262|        case 1 /*BYTE array  */:
  ------------------
  |  Branch (409:9): [True: 262, False: 1.76k]
  ------------------
  410|    262|          value += std::string(": ") + readStringTag(io_, descriptor_value_length);
  411|    262|          break;
  412|    245|        case 2 /*BOOL*/:
  ------------------
  |  Branch (412:9): [True: 245, False: 1.78k]
  ------------------
  413|    245|          value += std::string(": ") + std::to_string(readWORDTag(io_));
  414|    245|          break;
  415|     10|        case 3 /*DWORD */:
  ------------------
  |  Branch (415:9): [True: 10, False: 2.01k]
  ------------------
  416|     10|          value += std::string(": ") + std::to_string(readDWORDTag(io_));
  417|     10|          break;
  418|     65|        case 4 /*QWORD */:
  ------------------
  |  Branch (418:9): [True: 65, False: 1.96k]
  ------------------
  419|     65|          value += std::string(": ") + std::to_string(readQWORDTag(io_));
  420|     65|          break;
  421|     93|        case 5 /*WORD*/:
  ------------------
  |  Branch (421:9): [True: 93, False: 1.93k]
  ------------------
  422|     93|          value += std::string(": ") + std::to_string(readWORDTag(io_));
  423|     93|          break;
  424|  2.02k|      }
  425|  2.02k|    }
  426|  89.4k|    value += std::string(", ");
  427|  89.4k|  }
  428|       |
  429|    105|  xmpData()["Xmp.video.ExtendedContentDescription"] = value;
  430|    105|}  // AsfVideo::extendedContentDescription
_ZN5Exiv28AsfVideo18contentDescriptionEv:
  432|    135|void AsfVideo::contentDescription() {
  433|    135|  uint16_t title_length = readWORDTag(io_);
  434|    135|  uint16_t author_length = readWORDTag(io_);
  435|    135|  uint16_t copyright_length = readWORDTag(io_);
  436|    135|  uint16_t desc_length = readWORDTag(io_);
  437|    135|  uint16_t rating_length = readWORDTag(io_);
  438|       |
  439|    135|  if (title_length)
  ------------------
  |  Branch (439:7): [True: 12, False: 123]
  ------------------
  440|     12|    xmpData()["Xmp.video.Title"] = readStringWcharTag(io_, title_length);
  441|       |
  442|    135|  if (author_length)
  ------------------
  |  Branch (442:7): [True: 12, False: 123]
  ------------------
  443|     12|    xmpData()["Xmp.video.Author"] = readStringWcharTag(io_, author_length);
  444|       |
  445|    135|  if (copyright_length)
  ------------------
  |  Branch (445:7): [True: 44, False: 91]
  ------------------
  446|     44|    xmpData()["Xmp.video.Copyright"] = readStringWcharTag(io_, copyright_length);
  447|       |
  448|    135|  if (desc_length)
  ------------------
  |  Branch (448:7): [True: 122, False: 13]
  ------------------
  449|    122|    xmpData()["Xmp.video.Description"] = readStringWcharTag(io_, desc_length);
  450|       |
  451|    135|  if (rating_length)
  ------------------
  |  Branch (451:7): [True: 121, False: 14]
  ------------------
  452|    121|    xmpData()["Xmp.video.Rating"] = readStringWcharTag(io_, rating_length);
  453|       |
  454|    135|}  // AsfVideo::extendedContentDescription
_ZN5Exiv28AsfVideo14filePropertiesEv:
  456|     81|void AsfVideo::fileProperties() {
  457|     81|  DataBuf FileIddBuf(GUID);
  458|     81|  io_->readOrThrow(FileIddBuf.data(), FileIddBuf.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  459|     81|  xmpData()["Xmp.video.FileID"] = GUIDTag(FileIddBuf.data()).to_string();
  460|     81|  xmpData()["Xmp.video.FileLength"] = readQWORDTag(io_);
  461|     81|  xmpData()["Xmp.video.CreationDate"] = readQWORDTag(io_);
  462|     81|  xmpData()["Xmp.video.DataPackets"] = readQWORDTag(io_);
  463|     81|  xmpData()["Xmp.video.duration"] = readQWORDTag(io_);
  464|     81|  xmpData()["Xmp.video.SendDuration"] = readQWORDTag(io_);
  465|     81|  xmpData()["Xmp.video.Preroll"] = readQWORDTag(io_);
  466|       |
  467|     81|  io_->seek(io_->tell() + DWORD + DWORD + DWORD,
  468|     81|            BasicIo::beg);  // ignore Flags, Minimum Data Packet Size and Maximum Data Packet Size
  469|     81|  xmpData()["Xmp.video.MaxBitRate"] = readDWORDTag(io_);
  470|     81|}  // AsfVideo::fileProperties
_ZN5Exiv214newAsfInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  472|    394|Image::UniquePtr newAsfInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  473|    394|  auto image = std::make_unique<AsfVideo>(std::move(io), params);
  474|    394|  if (!image->good()) {
  ------------------
  |  Branch (474:7): [True: 0, False: 394]
  ------------------
  475|      0|    return nullptr;
  476|      0|  }
  477|    394|  return image;
  478|    394|}
_ZN5Exiv29isAsfTypeERNS_7BasicIoEb:
  480|  8.20k|bool isAsfType(BasicIo& iIo, bool advance) {
  481|  8.20k|  byte buf[GUID];
  482|  8.20k|  iIo.read(buf, GUID);
  483|       |
  484|  8.20k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (484:7): [True: 0, False: 8.20k]
  |  Branch (484:22): [True: 147, False: 8.05k]
  ------------------
  485|    147|    return false;
  486|    147|  }
  487|       |
  488|  8.05k|  bool matched = isASFType(buf);
  489|  8.05k|  if (!advance || !matched) {
  ------------------
  |  Branch (489:7): [True: 8.05k, False: 0]
  |  Branch (489:19): [True: 0, False: 0]
  ------------------
  490|  8.05k|    iIo.seek(0, BasicIo::beg);
  491|  8.05k|  }
  492|       |
  493|  8.05k|  return matched;
  494|  8.20k|}
asfvideo.cpp:_ZN5Exiv2L9isASFTypeEPKh:
  178|  8.05k|static bool isASFType(const byte buf[]) {
  179|  8.05k|  return Header == AsfVideo::GUIDTag(buf);
  180|  8.05k|}

_ZN5Exiv27BasicIoD2Ev:
   60|  59.8k|BasicIo::~BasicIo() = default;
_ZN5Exiv27BasicIo11readOrThrowEPhmNS_9ErrorCodeE:
   62|  2.73M|void BasicIo::readOrThrow(byte* buf, size_t rcount, ErrorCode err) {
   63|  2.73M|  const size_t nread = read(buf, rcount);
   64|  2.73M|  Internal::enforce(nread == rcount, err);
   65|  2.73M|  Internal::enforce(!error(), err);
   66|  2.73M|}
_ZN5Exiv27BasicIo11seekOrThrowElNS0_8PositionENS_9ErrorCodeE:
   68|  68.3k|void BasicIo::seekOrThrow(int64_t offset, Position pos, ErrorCode err) {
   69|  68.3k|  const int r = seek(offset, pos);
   70|  68.3k|  Internal::enforce(r == 0, err);
   71|  68.3k|}
_ZN5Exiv25MemIo4ImplC2EPKhm:
  627|  37.0k|MemIo::Impl::Impl(const byte* data, size_t size) : data_(const_cast<byte*>(data)), size_(size) {
  628|  37.0k|}
_ZN5Exiv25MemIo4Impl7reserveEm:
  681|  3.50M|void MemIo::Impl::reserve(size_t wcount) {
  682|  3.50M|  const size_t need = wcount + idx_;
  683|  3.50M|  size_t blockSize = 32 * 1024;  // 32768
  684|  3.50M|  const size_t maxBlockSize = 4 * 1024 * 1024;
  685|       |
  686|  3.50M|  if (!isMalloced_) {
  ------------------
  |  Branch (686:7): [True: 14.7k, False: 3.49M]
  ------------------
  687|       |    // Minimum size for 1st block
  688|  14.7k|    auto size = std::max<size_t>(blockSize * (1 + need / blockSize), size_);
  689|  14.7k|    auto data = static_cast<byte*>(std::malloc(size));
  690|  14.7k|    if (!data) {
  ------------------
  |  Branch (690:9): [True: 0, False: 14.7k]
  ------------------
  691|      0|      throw Error(ErrorCode::kerMallocFailed);
  692|      0|    }
  693|  14.7k|    if (data_) {
  ------------------
  |  Branch (693:9): [True: 0, False: 14.7k]
  ------------------
  694|      0|      std::memcpy(data, data_, size_);
  695|      0|    }
  696|  14.7k|    data_ = data;
  697|  14.7k|    sizeAlloced_ = size;
  698|  14.7k|    isMalloced_ = true;
  699|  14.7k|  }
  700|       |
  701|  3.50M|  if (need > size_) {
  ------------------
  |  Branch (701:7): [True: 3.49M, False: 11.4k]
  ------------------
  702|  3.49M|    if (need > sizeAlloced_) {
  ------------------
  |  Branch (702:9): [True: 12.6k, False: 3.48M]
  ------------------
  703|  12.6k|      blockSize = std::min(2 * sizeAlloced_, maxBlockSize);
  704|       |      // Allocate in blocks
  705|  12.6k|      size_t want = blockSize * (1 + need / blockSize);
  706|  12.6k|      data_ = static_cast<byte*>(std::realloc(data_, want));
  707|  12.6k|      if (!data_) {
  ------------------
  |  Branch (707:11): [True: 0, False: 12.6k]
  ------------------
  708|      0|        throw Error(ErrorCode::kerMallocFailed);
  709|      0|      }
  710|  12.6k|      sizeAlloced_ = want;
  711|  12.6k|    }
  712|  3.49M|    size_ = need;
  713|  3.49M|  }
  714|  3.50M|}
_ZN5Exiv25MemIoC2Ev:
  716|  22.8k|MemIo::MemIo() : p_(std::make_unique<Impl>()) {
  717|  22.8k|}
_ZN5Exiv25MemIoC2EPKhm:
  719|  37.0k|MemIo::MemIo(const byte* data, size_t size) : p_(std::make_unique<Impl>(data, size)) {
  720|  37.0k|}
_ZN5Exiv25MemIoD2Ev:
  722|  59.8k|MemIo::~MemIo() {
  723|  59.8k|  if (p_->isMalloced_) {
  ------------------
  |  Branch (723:7): [True: 14.2k, False: 45.6k]
  ------------------
  724|  14.2k|    std::free(p_->data_);
  725|  14.2k|  }
  726|  59.8k|}
_ZN5Exiv25MemIo5writeEPKhm:
  728|  3.48M|size_t MemIo::write(const byte* data, size_t wcount) {
  729|  3.48M|  p_->reserve(wcount);
  730|  3.48M|  if (data) {
  ------------------
  |  Branch (730:7): [True: 3.47M, False: 11.3k]
  ------------------
  731|  3.47M|    std::memcpy(&p_->data_[p_->idx_], data, wcount);
  732|  3.47M|  }
  733|  3.48M|  p_->idx_ += wcount;
  734|  3.48M|  return wcount;
  735|  3.48M|}
_ZN5Exiv25MemIo8transferERNS_7BasicIoE:
  737|  9.96k|void MemIo::transfer(BasicIo& src) {
  738|  9.96k|  if (auto memIo = dynamic_cast<MemIo*>(&src)) {
  ------------------
  |  Branch (738:12): [True: 9.96k, False: 0]
  ------------------
  739|       |    // Optimization if src is another instance of MemIo
  740|  9.96k|    if (p_->isMalloced_) {
  ------------------
  |  Branch (740:9): [True: 555, False: 9.41k]
  ------------------
  741|    555|      std::free(p_->data_);
  742|    555|    }
  743|  9.96k|    p_->idx_ = 0;
  744|  9.96k|    p_->data_ = memIo->p_->data_;
  745|  9.96k|    p_->size_ = memIo->p_->size_;
  746|  9.96k|    p_->isMalloced_ = memIo->p_->isMalloced_;
  747|  9.96k|    memIo->p_->idx_ = 0;
  748|  9.96k|    memIo->p_->data_ = nullptr;
  749|  9.96k|    memIo->p_->size_ = 0;
  750|  9.96k|    memIo->p_->isMalloced_ = false;
  751|  9.96k|  } else {
  752|       |    // Generic reopen to reset position to start
  753|      0|    if (src.open() != 0) {
  ------------------
  |  Branch (753:9): [True: 0, False: 0]
  ------------------
  754|      0|      throw Error(ErrorCode::kerDataSourceOpenFailed, src.path(), strError());
  755|      0|    }
  756|      0|    p_->idx_ = 0;
  757|      0|    write(src);
  758|      0|    src.close();
  759|      0|  }
  760|  9.96k|  if (error() || src.error())
  ------------------
  |  Branch (760:7): [True: 0, False: 9.96k]
  |  Branch (760:18): [True: 0, False: 9.96k]
  ------------------
  761|      0|    throw Error(ErrorCode::kerMemoryTransferFailed, strError());
  762|  9.96k|}
_ZN5Exiv25MemIo4putbEh:
  782|  20.1k|int MemIo::putb(byte data) {
  783|  20.1k|  p_->reserve(1);
  784|  20.1k|  p_->data_[p_->idx_++] = data;
  785|  20.1k|  return data;
  786|  20.1k|}
_ZN5Exiv25MemIo4seekElNS_7BasicIo8PositionE:
  788|  1.12M|int MemIo::seek(int64_t offset, Position pos) {
  789|  1.12M|  int64_t newIdx = 0;
  790|       |
  791|  1.12M|  switch (pos) {
  ------------------
  |  Branch (791:11): [True: 1.12M, False: 0]
  ------------------
  792|   651k|    case BasicIo::cur:
  ------------------
  |  Branch (792:5): [True: 651k, False: 471k]
  ------------------
  793|   651k|      newIdx = p_->idx_ + offset;
  794|   651k|      break;
  795|   471k|    case BasicIo::beg:
  ------------------
  |  Branch (795:5): [True: 471k, False: 651k]
  ------------------
  796|   471k|      newIdx = offset;
  797|   471k|      break;
  798|     93|    case BasicIo::end:
  ------------------
  |  Branch (798:5): [True: 93, False: 1.12M]
  ------------------
  799|     93|      newIdx = p_->size_ + offset;
  800|     93|      break;
  801|  1.12M|  }
  802|       |
  803|  1.12M|  if (newIdx < 0)
  ------------------
  |  Branch (803:7): [True: 0, False: 1.12M]
  ------------------
  804|      0|    return 1;
  805|       |
  806|  1.12M|  if (newIdx > static_cast<int64_t>(p_->size_)) {
  ------------------
  |  Branch (806:7): [True: 4.39k, False: 1.11M]
  ------------------
  807|  4.39k|    p_->eof_ = true;
  808|  4.39k|    return 1;
  809|  4.39k|  }
  810|       |
  811|  1.11M|  p_->idx_ = static_cast<size_t>(newIdx);
  812|  1.11M|  p_->eof_ = false;
  813|  1.11M|  return 0;
  814|  1.12M|}
_ZN5Exiv25MemIo4mmapEb:
  816|  34.7k|byte* MemIo::mmap(bool /*isWriteable*/) {
  817|  34.7k|  return p_->data_;
  818|  34.7k|}
_ZNK5Exiv25MemIo4tellEv:
  824|  1.18M|size_t MemIo::tell() const {
  825|  1.18M|  return p_->idx_;
  826|  1.18M|}
_ZNK5Exiv25MemIo4sizeEv:
  828|   680k|size_t MemIo::size() const {
  829|   680k|  return p_->size_;
  830|   680k|}
_ZN5Exiv25MemIo4openEv:
  832|   160k|int MemIo::open() {
  833|   160k|  p_->idx_ = 0;
  834|   160k|  p_->eof_ = false;
  835|   160k|  return 0;
  836|   160k|}
_ZNK5Exiv25MemIo6isopenEv:
  838|  86.0k|bool MemIo::isopen() const {
  839|  86.0k|  return true;
  840|  86.0k|}
_ZN5Exiv25MemIo5closeEv:
  842|  83.5k|int MemIo::close() {
  843|  83.5k|  return 0;
  844|  83.5k|}
_ZN5Exiv25MemIo4readEm:
  846|   323k|DataBuf MemIo::read(size_t rcount) {
  847|   323k|  DataBuf buf(rcount);
  848|   323k|  size_t readCount = read(buf.data(), buf.size());
  849|   323k|  buf.resize(readCount);
  850|   323k|  return buf;
  851|   323k|}
_ZN5Exiv25MemIo4readEPhm:
  853|  4.10M|size_t MemIo::read(byte* buf, size_t rcount) {
  854|  4.10M|  const auto avail = std::max<size_t>(p_->size_ - p_->idx_, 0);
  855|  4.10M|  const auto allow = std::min<size_t>(rcount, avail);
  856|  4.10M|  if (allow > 0) {
  ------------------
  |  Branch (856:7): [True: 4.00M, False: 101k]
  ------------------
  857|  4.00M|    std::memcpy(buf, &p_->data_[p_->idx_], allow);
  858|  4.00M|  }
  859|  4.10M|  p_->idx_ += allow;
  860|  4.10M|  if (rcount > avail) {
  ------------------
  |  Branch (860:7): [True: 10.4k, False: 4.09M]
  ------------------
  861|  10.4k|    p_->eof_ = true;
  862|  10.4k|  }
  863|  4.10M|  return allow;
  864|  4.10M|}
_ZN5Exiv25MemIo4getbEv:
  866|  13.3M|int MemIo::getb() {
  867|  13.3M|  if (p_->idx_ >= p_->size_) {
  ------------------
  |  Branch (867:7): [True: 520, False: 13.3M]
  ------------------
  868|    520|    p_->eof_ = true;
  869|    520|    return EOF;
  870|    520|  }
  871|  13.3M|  return p_->data_[p_->idx_++];
  872|  13.3M|}
_ZNK5Exiv25MemIo5errorEv:
  874|  3.63M|int MemIo::error() const {
  875|  3.63M|  return 0;
  876|  3.63M|}
_ZNK5Exiv25MemIo3eofEv:
  878|   897k|bool MemIo::eof() const {
  879|   897k|  return p_->eof_;
  880|   897k|}
_ZNK5Exiv25MemIo4pathEv:
  882|  41.7k|const std::string& MemIo::path() const noexcept {
  883|  41.7k|  static std::string _path{"MemIo"};
  884|  41.7k|  return _path;
  885|  41.7k|}
_ZN5Exiv25MemIo16populateFakeDataEv:
  887|    861|void MemIo::populateFakeData() {
  888|    861|}
_ZN5Exiv25MemIo4ImplC2Ev:
  607|  22.8k|  Impl() = default;                     //!< Default constructor

_ZNK5Exiv24Iloc8toStringEv:
   82|     36|std::string Iloc::toString() const {
   83|     36|  return stringFormat("ID = {} from,length = {},{}", ID_, start_, length_);
  ------------------
  |  |   18|     36|#define stringFormat std::format
  ------------------
   84|     36|}
_ZN5Exiv29BmffImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   87|  5.05k|    Image(ImageType::bmff, mdExif | mdIptc | mdXmp, std::move(io), params) {
   88|  5.05k|}  // BmffImage::BmffImage
_ZN5Exiv29BmffImage7toAsciiEj:
   90|  57.6k|std::string BmffImage::toAscii(uint32_t n) {
   91|  57.6k|  std::string result(sizeof(uint32_t), '\0');
   92|   288k|  for (size_t i = 0; i < result.size(); ++i) {
  ------------------
  |  Branch (92:22): [True: 230k, False: 57.6k]
  ------------------
   93|   230k|    auto c = static_cast<unsigned char>(n >> (8 * (3 - i)));
   94|   230k|    if (c == 0)
  ------------------
  |  Branch (94:9): [True: 17.9k, False: 212k]
  ------------------
   95|  17.9k|      result[i] = '_';
   96|   212k|    else if (c < 32 || c > 126)
  ------------------
  |  Branch (96:14): [True: 7.56k, False: 205k]
  |  Branch (96:24): [True: 17.8k, False: 187k]
  ------------------
   97|  25.4k|      result[i] = '.';
   98|   187k|    else
   99|   187k|      result[i] = static_cast<char>(c);
  100|   230k|  }
  101|  57.6k|  return result;
  102|  57.6k|}
_ZN5Exiv29BmffImage7fullBoxEj:
  109|  72.2k|bool BmffImage::fullBox(uint32_t box) {
  110|  72.2k|  return box == TAG::meta || box == TAG::iinf || box == TAG::iloc || box == TAG::thmb || box == TAG::prvw;
  ------------------
  |  Branch (110:10): [True: 14.6k, False: 57.5k]
  |  Branch (110:30): [True: 717, False: 56.8k]
  |  Branch (110:50): [True: 514, False: 56.2k]
  |  Branch (110:70): [True: 961, False: 55.3k]
  |  Branch (110:90): [True: 1.52k, False: 53.8k]
  ------------------
  111|  72.2k|}
_ZNK5Exiv29BmffImage10pixelWidthEv:
  151|     12|uint32_t BmffImage::pixelWidth() const {
  152|     12|  auto imageWidth = exifData_.findKey(Exiv2::ExifKey("Exif.Photo.PixelXDimension"));
  153|     12|  if (imageWidth == exifData_.end() || imageWidth->count() == 0)
  ------------------
  |  Branch (153:7): [True: 12, False: 0]
  |  Branch (153:7): [True: 12, False: 0]
  |  Branch (153:40): [True: 0, False: 0]
  ------------------
  154|     12|    return pixelWidth_;
  155|      0|  return imageWidth->toUint32();
  156|     12|}
_ZNK5Exiv29BmffImage11pixelHeightEv:
  158|     12|uint32_t BmffImage::pixelHeight() const {
  159|     12|  auto imageHeight = exifData_.findKey(Exiv2::ExifKey("Exif.Photo.PixelYDimension"));
  160|     12|  if (imageHeight == exifData_.end() || imageHeight->count() == 0)
  ------------------
  |  Branch (160:7): [True: 12, False: 0]
  |  Branch (160:7): [True: 12, False: 0]
  |  Branch (160:41): [True: 0, False: 0]
  ------------------
  161|     12|    return pixelHeight_;
  162|      0|  return imageHeight->toUint32();
  163|     12|}
_ZN5Exiv29BmffImage8uuidNameERKNS_7DataBufE:
  165|    381|std::string BmffImage::uuidName(const Exiv2::DataBuf& uuid) {
  166|    381|  const char* uuidCano = "\x85\xC0\xB6\x87\x82\xF\x11\xE0\x81\x11\xF4\xCE\x46\x2B\x6A\x48";
  167|    381|  const char* uuidXmp = "\xBE\x7A\xCF\xCB\x97\xA9\x42\xE8\x9C\x71\x99\x94\x91\xE3\xAF\xAC";
  168|    381|  const char* uuidCanp = "\xEA\xF4\x2B\x5E\x1C\x98\x4B\x88\xB9\xFB\xB7\xDC\x40\x6E\x4D\x16";
  169|    381|  if (uuid.cmpBytes(0, uuidCano, 16) == 0)
  ------------------
  |  Branch (169:7): [True: 123, False: 258]
  ------------------
  170|    123|    return "cano";
  171|    258|  if (uuid.cmpBytes(0, uuidXmp, 16) == 0)
  ------------------
  |  Branch (171:7): [True: 59, False: 199]
  ------------------
  172|     59|    return "xmp";
  173|    199|  if (uuid.cmpBytes(0, uuidCanp, 16) == 0)
  ------------------
  |  Branch (173:7): [True: 24, False: 175]
  ------------------
  174|     24|    return "canp";
  175|    175|  return "";
  176|    199|}
_ZN5Exiv29BmffImage16brotliUncompressEPKhmRNS_7DataBufE:
  184|    144|void BmffImage::brotliUncompress(const byte* compressedBuf, size_t compressedBufSize, DataBuf& arr) {
  185|    144|  auto decoder = BrotliDecoder(BrotliDecoderCreateInstance(nullptr, nullptr, nullptr), BrotliDecoderDestroyInstance);
  186|    144|  size_t uncompressedLen = compressedBufSize * 2;  // just a starting point
  187|    144|  BrotliDecoderResult result = BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
  188|    144|  int dos = 0;
  189|    144|  size_t available_in = compressedBufSize;
  190|    144|  const byte* next_in = compressedBuf;
  191|    144|  size_t available_out;
  192|    144|  byte* next_out;
  193|    144|  size_t total_out = 0;
  194|       |
  195|    340|  while (result != BROTLI_DECODER_RESULT_SUCCESS) {
  ------------------
  |  Branch (195:10): [True: 241, False: 99]
  ------------------
  196|    241|    arr.alloc(uncompressedLen);
  197|    241|    available_out = uncompressedLen - total_out;
  198|    241|    next_out = arr.data() + total_out;
  199|    241|    result =
  200|    241|        BrotliDecoderDecompressStream(decoder.get(), &available_in, &next_in, &available_out, &next_out, &total_out);
  201|    241|    if (result == BROTLI_DECODER_RESULT_SUCCESS) {
  ------------------
  |  Branch (201:9): [True: 99, False: 142]
  ------------------
  202|     99|      arr.resize(total_out);
  203|    142|    } else if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) {
  ------------------
  |  Branch (203:16): [True: 104, False: 38]
  ------------------
  204|    104|      uncompressedLen *= 2;
  205|       |      // DoS protection - can't be bigger than 128k
  206|    104|      if (uncompressedLen > 131072) {
  ------------------
  |  Branch (206:11): [True: 18, False: 86]
  ------------------
  207|     18|        if (++dos > 1 || total_out > 131072)
  ------------------
  |  Branch (207:13): [True: 5, False: 13]
  |  Branch (207:26): [True: 2, False: 11]
  ------------------
  208|      7|          break;
  209|     11|        uncompressedLen = 131072;
  210|     11|      }
  211|    104|    } else if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT) {
  ------------------
  |  Branch (211:16): [True: 17, False: 21]
  ------------------
  212|       |      // compressed input buffer in incomplete
  213|     17|      throw Error(ErrorCode::kerFailedToReadImageData);
  214|     21|    } else {
  215|       |      // something bad happened
  216|     21|      throw Error(ErrorCode::kerErrorMessage, BrotliDecoderErrorString(BrotliDecoderGetErrorCode(decoder.get())));
  217|     21|    }
  218|    241|  }
  219|       |
  220|    106|  if (result != BROTLI_DECODER_RESULT_SUCCESS) {
  ------------------
  |  Branch (220:7): [True: 7, False: 99]
  ------------------
  221|      7|    throw Error(ErrorCode::kerFailedToReadImageData);
  222|      7|  }
  223|    106|}
_ZN5Exiv29BmffImage10boxHandlerERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEmm:
  227|  73.9k|                               uint64_t pbox_end, size_t depth) {
  228|  73.9k|  const size_t address = io_->tell();
  229|       |  // never visit a box twice!
  230|  73.9k|  if (depth == 0)
  ------------------
  |  Branch (230:7): [True: 57.9k, False: 15.9k]
  ------------------
  231|  57.9k|    visits_.clear();
  232|  73.9k|  if (visits_.contains(address) || visits_.size() > visits_max_ || depth >= max_recursion_depth_) {
  ------------------
  |  Branch (232:7): [True: 0, False: 73.9k]
  |  Branch (232:36): [True: 12, False: 73.9k]
  |  Branch (232:68): [True: 0, False: 73.9k]
  ------------------
  233|     12|    throw Error(ErrorCode::kerCorruptedMetadata);
  234|     12|  }
  235|  73.9k|  visits_.insert(address);
  236|       |
  237|       |#ifdef EXIV2_DEBUG_MESSAGES
  238|       |  bool bTrace = true;
  239|       |#else
  240|  73.9k|  bool bTrace = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (240:17): [True: 21.7k, False: 52.1k]
  |  Branch (240:39): [True: 21.7k, False: 30.4k]
  ------------------
  241|  73.9k|#endif
  242|       |
  243|       |  // 8-byte buffer for parsing the box length and type.
  244|  73.9k|  byte hdrbuf[2 * sizeof(uint32_t)];
  245|       |
  246|  73.9k|  size_t hdrsize = sizeof(hdrbuf);
  247|  73.9k|  Internal::enforce(hdrsize <= static_cast<size_t>(pbox_end - address), Exiv2::ErrorCode::kerCorruptedMetadata);
  248|  73.9k|  if (io_->read(hdrbuf, sizeof(hdrbuf)) != sizeof(hdrbuf))
  ------------------
  |  Branch (248:7): [True: 0, False: 73.9k]
  ------------------
  249|      0|    return pbox_end;
  250|       |
  251|       |  // The box length is encoded as a uint32_t by default, but the special value 1 means
  252|       |  // that it's a uint64_t.
  253|  73.9k|  uint64_t box_length = getULong(&hdrbuf[0], endian_);
  254|  73.9k|  uint32_t box_type = getULong(&hdrbuf[sizeof(uint32_t)], endian_);
  255|  73.9k|  bool bLF = true;
  256|       |
  257|  73.9k|  if (bTrace) {
  ------------------
  |  Branch (257:7): [True: 43.4k, False: 30.4k]
  ------------------
  258|  43.4k|    bLF = true;
  259|  43.4k|    out << Internal::indent(depth) << "Exiv2::BmffImage::boxHandler: " << toAscii(box_type)
  260|  43.4k|        << stringFormat(" {:8}->{} ", address, box_length);
  ------------------
  |  |   18|  43.4k|#define stringFormat std::format
  ------------------
  261|  43.4k|  }
  262|       |
  263|  73.9k|  if (box_length == 1) {
  ------------------
  |  Branch (263:7): [True: 71, False: 73.8k]
  ------------------
  264|       |    // The box size is encoded as a uint64_t, so we need to read another 8 bytes.
  265|     71|    hdrsize += 8;
  266|     71|    Internal::enforce(hdrsize <= static_cast<size_t>(pbox_end - address), Exiv2::ErrorCode::kerCorruptedMetadata);
  267|     71|    DataBuf data(8);
  268|     71|    io_->read(data.data(), data.size());
  269|     71|    box_length = data.read_uint64(0, endian_);
  270|     71|  }
  271|       |
  272|  73.9k|  if (box_length == 0) {
  ------------------
  |  Branch (272:7): [True: 28.9k, False: 45.0k]
  ------------------
  273|       |    // Zero length is also valid and indicates box extends to the end of file.
  274|  28.9k|    box_length = pbox_end - address;
  275|  28.9k|  }
  276|       |
  277|       |  // read data in box and restore file position
  278|  73.9k|  const size_t restore = io_->tell();
  279|  73.9k|  Internal::enforce(box_length >= hdrsize, Exiv2::ErrorCode::kerCorruptedMetadata);
  280|  73.9k|  Internal::enforce(box_length - hdrsize <= pbox_end - restore, Exiv2::ErrorCode::kerCorruptedMetadata);
  281|       |
  282|  73.9k|  const auto buffer_size = box_length - hdrsize;
  283|  73.9k|  if (skipBox(box_type)) {
  ------------------
  |  Branch (283:7): [True: 1.26k, False: 72.6k]
  ------------------
  284|  1.26k|    if (bTrace) {
  ------------------
  |  Branch (284:9): [True: 834, False: 434]
  ------------------
  285|    834|      out << '\n';
  286|    834|    }
  287|       |    // The enforce() above checks that restore + buffer_size won't
  288|       |    // exceed pbox_end, and by implication, won't exceed LONG_MAX
  289|  1.26k|    return restore + buffer_size;
  290|  1.26k|  }
  291|       |
  292|  72.6k|  DataBuf data(static_cast<size_t>(buffer_size));
  293|  72.6k|  const size_t box_end = restore + data.size();
  294|  72.6k|  io_->read(data.data(), data.size());
  295|  72.6k|  io_->seek(restore, BasicIo::beg);
  296|       |
  297|  72.6k|  size_t skip = 0;  // read position in data.pData_
  298|  72.6k|  uint8_t version = 0;
  299|  72.6k|  uint32_t flags = 0;
  300|       |
  301|  72.6k|  if (fullBox(box_type)) {
  ------------------
  |  Branch (301:7): [True: 18.4k, False: 54.2k]
  ------------------
  302|  18.4k|    Internal::enforce(data.size() - skip >= 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  303|  18.4k|    flags = data.read_uint32(skip, endian_);  // version/flags
  304|  18.4k|    version = static_cast<uint8_t>(flags >> 24);
  305|  18.4k|    flags &= 0x00ffffff;
  306|  18.4k|    skip += 4;
  307|  18.4k|  }
  308|       |
  309|  72.6k|  switch (box_type) {
  310|       |    //  See notes in skipBox()
  311|  21.8k|    case TAG::ftyp: {
  ------------------
  |  Branch (311:5): [True: 21.8k, False: 50.7k]
  ------------------
  312|  21.8k|      Internal::enforce(data.size() >= 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  313|  21.8k|      fileType_ = data.read_uint32(0, endian_);
  314|  21.8k|      if (bTrace) {
  ------------------
  |  Branch (314:11): [True: 14.1k, False: 7.74k]
  ------------------
  315|  14.1k|        out << "brand: " << toAscii(fileType_);
  316|  14.1k|      }
  317|  21.8k|    } break;
  318|       |
  319|       |    // 8.11.6.1
  320|    717|    case TAG::iinf: {
  ------------------
  |  Branch (320:5): [True: 717, False: 71.9k]
  ------------------
  321|    717|      if (bTrace) {
  ------------------
  |  Branch (321:11): [True: 390, False: 327]
  ------------------
  322|    390|        out << '\n';
  323|    390|        bLF = false;
  324|    390|      }
  325|       |
  326|    717|      Internal::enforce(data.size() - skip >= 2, Exiv2::ErrorCode::kerCorruptedMetadata);
  327|    717|      uint16_t n = data.read_uint16(skip, endian_);
  328|    717|      skip += 2;
  329|       |
  330|    717|      io_->seek(skip, BasicIo::cur);
  331|  1.42k|      while (n-- > 0) {
  ------------------
  |  Branch (331:14): [True: 705, False: 717]
  ------------------
  332|    705|        io_->seek(boxHandler(out, option, box_end, depth + 1), BasicIo::beg);
  333|    705|      }
  334|    717|    } break;
  335|       |
  336|       |    // 8.11.6.2
  337|  1.42k|    case TAG::infe: {  // .__._.__hvc1_ 2 0 0 1 0 1 0 0 104 118 99 49 0
  ------------------
  |  Branch (337:5): [True: 1.42k, False: 71.2k]
  ------------------
  338|  1.42k|      Internal::enforce(data.size() - skip >= 8, Exiv2::ErrorCode::kerCorruptedMetadata);
  339|  1.42k|      /* getULong (data.pData_+skip,endian_) ; */ skip += 4;
  340|  1.42k|      uint16_t ID = data.read_uint16(skip, endian_);
  341|  1.42k|      skip += 2;
  342|  1.42k|      /* getShort(data.pData_+skip,endian_) ; */ skip += 2;  // protection
  343|  1.42k|      std::string id;
  344|       |      // Check that the string has a '\0' terminator.
  345|  1.42k|      const char* str = data.c_str(skip);
  346|  1.42k|      const size_t maxlen = data.size() - skip;
  347|  1.42k|      Internal::enforce(maxlen > 0 && strnlen(str, maxlen) < maxlen, Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (347:25): [True: 1.42k, False: 1]
  |  Branch (347:39): [True: 1.42k, False: 1]
  ------------------
  348|  1.42k|      std::string name(str);
  349|  1.42k|      if (Internal::contains(name, "Exif")) {  // "Exif" or "ExifExif"
  ------------------
  |  Branch (349:11): [True: 62, False: 1.36k]
  ------------------
  350|     62|        exifID_ = ID;
  351|     62|        id = " *** Exif ***";
  352|  1.36k|      } else if (Internal::contains(name, "mime\0xmp") || Internal::contains(name, "mime\0application/rdf+xml")) {
  ------------------
  |  Branch (352:18): [True: 62, False: 1.30k]
  |  Branch (352:59): [True: 0, False: 1.30k]
  ------------------
  353|     60|        xmpID_ = ID;
  354|     60|        id = " *** XMP ***";
  355|     60|      }
  356|  1.42k|      if (bTrace) {
  ------------------
  |  Branch (356:11): [True: 859, False: 567]
  ------------------
  357|    859|        out << stringFormat("ID = {:3} {} {}", ID, name, id);
  ------------------
  |  |   18|    859|#define stringFormat std::format
  ------------------
  358|    859|      }
  359|  1.42k|    } break;
  360|       |
  361|     87|    case TAG::moov:
  ------------------
  |  Branch (361:5): [True: 87, False: 72.5k]
  ------------------
  362|    128|    case TAG::iprp:
  ------------------
  |  Branch (362:5): [True: 41, False: 72.6k]
  ------------------
  363|    390|    case TAG::ipco:
  ------------------
  |  Branch (363:5): [True: 262, False: 72.3k]
  ------------------
  364|  15.0k|    case TAG::meta: {
  ------------------
  |  Branch (364:5): [True: 14.6k, False: 57.9k]
  ------------------
  365|  15.0k|      if (bTrace) {
  ------------------
  |  Branch (365:11): [True: 5.91k, False: 9.17k]
  ------------------
  366|  5.91k|        out << '\n';
  367|  5.91k|        bLF = false;
  368|  5.91k|      }
  369|  15.0k|      io_->seek(skip, BasicIo::cur);
  370|  30.0k|      while (io_->tell() < box_end) {
  ------------------
  |  Branch (370:14): [True: 14.9k, False: 15.0k]
  ------------------
  371|  14.9k|        io_->seek(boxHandler(out, option, box_end, depth + 1), BasicIo::beg);
  372|  14.9k|      }
  373|       |      // post-process meta box to recover Exif and XMP
  374|  15.0k|      if (box_type == TAG::meta) {
  ------------------
  |  Branch (374:11): [True: 8.51k, False: 6.56k]
  ------------------
  375|  8.51k|        auto ilo = ilocs_.find(exifID_);
  376|  8.51k|        if (ilo != ilocs_.end()) {
  ------------------
  |  Branch (376:13): [True: 31, False: 8.48k]
  ------------------
  377|     31|          const Iloc& iloc = ilo->second;
  378|     31|          if (bTrace) {
  ------------------
  |  Branch (378:15): [True: 23, False: 8]
  ------------------
  379|     23|            out << Internal::indent(depth) << "Exiv2::BMFF Exif: " << iloc.toString() << '\n';
  380|     23|          }
  381|     31|          parseTiff(Internal::Tag::root, iloc.length_, iloc.start_);
  382|     31|        }
  383|  8.51k|        ilo = ilocs_.find(xmpID_);
  384|  8.51k|        if (ilo != ilocs_.end()) {
  ------------------
  |  Branch (384:13): [True: 18, False: 8.49k]
  ------------------
  385|     18|          const Iloc& iloc = ilo->second;
  386|     18|          if (bTrace) {
  ------------------
  |  Branch (386:15): [True: 13, False: 5]
  ------------------
  387|     13|            out << Internal::indent(depth) << "Exiv2::BMFF XMP: " << iloc.toString() << '\n';
  388|     13|          }
  389|     18|          parseXmp(iloc.length_, iloc.start_);
  390|     18|        }
  391|  8.51k|        ilocs_.clear();
  392|  8.51k|      }
  393|  15.0k|    } break;
  394|       |
  395|       |    // 8.11.3.1
  396|    513|    case TAG::iloc: {
  ------------------
  |  Branch (396:5): [True: 513, False: 72.1k]
  ------------------
  397|    513|      Internal::enforce(data.size() - skip >= 2, Exiv2::ErrorCode::kerCorruptedMetadata);
  398|    513|      uint8_t u = data.read_uint8(skip++);
  399|    513|      uint16_t offsetSize = u >> 4;
  400|    513|      uint16_t lengthSize = u & 0xF;
  401|       |#if 0
  402|       |                uint16_t indexSize  = 0       ;
  403|       |                u             = data.read_uint8(skip++);
  404|       |                if ( version == 1 || version == 2 ) {
  405|       |                    indexSize = u & 0xF ;
  406|       |                }
  407|       |#else
  408|    513|      skip++;
  409|    513|#endif
  410|    513|      Internal::enforce(data.size() - skip >= (version < 2u ? 2u : 4u), Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (410:48): [True: 426, False: 87]
  ------------------
  411|    513|      uint32_t itemCount = version < 2 ? data.read_uint16(skip, endian_) : data.read_uint32(skip, endian_);
  ------------------
  |  Branch (411:28): [True: 425, False: 88]
  ------------------
  412|    513|      skip += version < 2 ? 2 : 4;
  ------------------
  |  Branch (412:15): [True: 425, False: 88]
  ------------------
  413|    513|      if (itemCount && itemCount < box_length / 14 && offsetSize == 4 && lengthSize == 4 &&
  ------------------
  |  Branch (413:11): [True: 470, False: 43]
  |  Branch (413:24): [True: 383, False: 87]
  |  Branch (413:55): [True: 350, False: 33]
  |  Branch (413:74): [True: 328, False: 22]
  ------------------
  414|    328|          ((box_length - 16) % itemCount) == 0) {
  ------------------
  |  Branch (414:11): [True: 307, False: 21]
  ------------------
  415|    307|        if (bTrace) {
  ------------------
  |  Branch (415:13): [True: 172, False: 135]
  ------------------
  416|    172|          out << '\n';
  417|    172|          bLF = false;
  418|    172|        }
  419|    307|        auto step = (static_cast<size_t>(box_length) - 16) / itemCount;  // length of data per item.
  420|    307|        size_t base = skip;
  421|  7.26k|        for (uint32_t i = 0; i < itemCount; i++) {
  ------------------
  |  Branch (421:30): [True: 6.96k, False: 307]
  ------------------
  422|  6.96k|          skip = base + (i * step);  // move in 14, 16 or 18 byte steps
  423|  6.96k|          Internal::enforce(data.size() - skip >= (version > 2u ? 4u : 2u), Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (423:52): [True: 43, False: 6.91k]
  ------------------
  424|  6.96k|          Internal::enforce(data.size() - skip >= step, Exiv2::ErrorCode::kerCorruptedMetadata);
  425|  6.96k|          uint32_t ID = version > 2 ? data.read_uint32(skip, endian_) : data.read_uint16(skip, endian_);
  ------------------
  |  Branch (425:25): [True: 34, False: 6.92k]
  ------------------
  426|  6.96k|          auto offset = [&data, skip, step] {
  427|  6.96k|            if (step == 14 || step == 16)
  428|  6.96k|              return data.read_uint32(skip + step - 8, endian_);
  429|  6.96k|            if (step == 18)
  430|  6.96k|              return data.read_uint32(skip + 4, endian_);
  431|  6.96k|            return 0u;
  432|  6.96k|          }();
  433|       |
  434|  6.96k|          uint32_t ldata = data.read_uint32(skip + step - 4, endian_);
  435|  6.96k|          if (bTrace) {
  ------------------
  |  Branch (435:15): [True: 3.85k, False: 3.11k]
  ------------------
  436|  3.85k|            out << Internal::indent(depth)
  437|  3.85k|                << stringFormat("{:8} | {:8} |   ID | {:4} | {:6},{:6}\n", address + skip, step, ID, offset, ldata);
  ------------------
  |  |   18|  3.85k|#define stringFormat std::format
  ------------------
  438|  3.85k|          }
  439|       |          // save data for post-processing in meta box
  440|  6.96k|          if (offset && ldata && ID != unknownID_) {
  ------------------
  |  Branch (440:15): [True: 5.91k, False: 1.05k]
  |  Branch (440:25): [True: 5.62k, False: 286]
  |  Branch (440:34): [True: 5.32k, False: 304]
  ------------------
  441|  5.32k|            ilocs_[ID] = Iloc{ID, offset, ldata};
  442|  5.32k|          }
  443|  6.96k|        }
  444|    307|      }
  445|    513|    } break;
  446|       |
  447|    419|    case TAG::ispe: {
  ------------------
  |  Branch (447:5): [True: 419, False: 72.2k]
  ------------------
  448|    419|      Internal::enforce(data.size() - skip >= 12, Exiv2::ErrorCode::kerCorruptedMetadata);
  449|    419|      skip += 4;
  450|    419|      uint32_t width = data.read_uint32(skip, endian_);
  451|    419|      skip += 4;
  452|    419|      uint32_t height = data.read_uint32(skip, endian_);
  453|    419|      skip += 4;
  454|    419|      if (bTrace) {
  ------------------
  |  Branch (454:11): [True: 270, False: 149]
  ------------------
  455|    270|        out << stringFormat("pixelWidth_, pixelHeight_ = {}, {}", width, height);
  ------------------
  |  |   18|    270|#define stringFormat std::format
  ------------------
  456|    270|      }
  457|       |      // HEIC files can have multiple ispe records
  458|       |      // Store largest width/height
  459|    419|      if (width > pixelWidth_ && height > pixelHeight_) {
  ------------------
  |  Branch (459:11): [True: 216, False: 203]
  |  Branch (459:34): [True: 25, False: 191]
  ------------------
  460|     25|        pixelWidth_ = width;
  461|     25|        pixelHeight_ = height;
  462|     25|      }
  463|    419|    } break;
  464|       |
  465|       |    // 12.1.5.2
  466|    268|    case TAG::colr: {
  ------------------
  |  Branch (466:5): [True: 268, False: 72.3k]
  ------------------
  467|    268|      if (data.size() >= (skip + 4 + 8)) {  // .____.HLino..__mntrR 2 0 0 0 0 12 72 76 105 110 111 2 16 ...
  ------------------
  |  Branch (467:11): [True: 256, False: 12]
  ------------------
  468|       |        // https://www.ics.uci.edu/~dan/class/267/papers/jpeg2000.pdf
  469|    256|        uint8_t meth = data.read_uint8(skip + 0);
  470|    256|        uint8_t prec = data.read_uint8(skip + 1);
  471|    256|        uint8_t approx = data.read_uint8(skip + 2);
  472|    256|        auto colour_type = std::string(data.c_str(), 4);
  473|    256|        skip += 4;
  474|    256|        if (colour_type == "rICC" || colour_type == "prof") {
  ------------------
  |  Branch (474:13): [True: 1, False: 255]
  |  Branch (474:38): [True: 5, False: 250]
  ------------------
  475|      6|          DataBuf profile(data.c_data(skip), data.size() - skip);
  476|      6|          setIccProfile(std::move(profile));
  477|    250|        } else if (meth == 2 && prec == 0 && approx == 0) {
  ------------------
  |  Branch (477:20): [True: 90, False: 160]
  |  Branch (477:33): [True: 81, False: 9]
  |  Branch (477:46): [True: 75, False: 6]
  ------------------
  478|       |          // JP2000 files have a 3 byte head // 2 0 0 icc......
  479|     75|          skip -= 1;
  480|     75|          DataBuf profile(data.c_data(skip), data.size() - skip);
  481|     75|          setIccProfile(std::move(profile));
  482|     75|        }
  483|    256|      }
  484|    268|    } break;
  485|       |
  486|    381|    case TAG::uuid: {
  ------------------
  |  Branch (486:5): [True: 381, False: 72.2k]
  ------------------
  487|    381|      DataBuf uuid(16);
  488|    381|      io_->read(uuid.data(), uuid.size());
  489|    381|      std::string name = uuidName(uuid);
  490|    381|      if (bTrace) {
  ------------------
  |  Branch (490:11): [True: 228, False: 153]
  ------------------
  491|    228|        out << " uuidName " << name << '\n';
  492|    228|        bLF = false;
  493|    228|      }
  494|    381|      if (name == "cano" || name == "canp") {
  ------------------
  |  Branch (494:11): [True: 123, False: 258]
  |  Branch (494:29): [True: 24, False: 234]
  ------------------
  495|    147|        if (name == "canp") {
  ------------------
  |  Branch (495:13): [True: 24, False: 123]
  ------------------
  496|       |          // based on
  497|       |          // https://github.com/lclevy/canon_cr3/blob/7be75d6/parse_cr3.py#L271
  498|     24|          io_->seek(8, BasicIo::cur);
  499|     24|        }
  500|    421|        while (io_->tell() < box_end) {
  ------------------
  |  Branch (500:16): [True: 274, False: 147]
  ------------------
  501|    274|          io_->seek(boxHandler(out, option, box_end, depth + 1), BasicIo::beg);
  502|    274|        }
  503|    234|      } else if (name == "xmp") {
  ------------------
  |  Branch (503:18): [True: 59, False: 175]
  ------------------
  504|     59|        parseXmp(box_length, io_->tell());
  505|     59|      }
  506|    381|    } break;
  507|       |
  508|  1.49k|    case TAG::cmt1:
  ------------------
  |  Branch (508:5): [True: 1.49k, False: 71.1k]
  ------------------
  509|  1.49k|      parseTiff(Internal::Tag::root, box_length);
  510|  1.49k|      break;
  511|    205|    case TAG::cmt2:
  ------------------
  |  Branch (511:5): [True: 205, False: 72.4k]
  ------------------
  512|    205|      parseTiff(Internal::Tag::cmt2, box_length);
  513|    205|      break;
  514|  10.4k|    case TAG::cmt3:
  ------------------
  |  Branch (514:5): [True: 10.4k, False: 62.1k]
  ------------------
  515|  10.4k|      parseTiff(Internal::Tag::cmt3, box_length);
  516|  10.4k|      break;
  517|  1.11k|    case TAG::cmt4:
  ------------------
  |  Branch (517:5): [True: 1.11k, False: 71.5k]
  ------------------
  518|  1.11k|      parseTiff(Internal::Tag::cmt4, box_length);
  519|  1.11k|      break;
  520|  7.96k|    case TAG::exif:
  ------------------
  |  Branch (520:5): [True: 7.96k, False: 64.6k]
  ------------------
  521|  7.96k|      parseTiff(Internal::Tag::root, buffer_size, io_->tell());
  522|  7.96k|      break;
  523|    755|    case TAG::xml:
  ------------------
  |  Branch (523:5): [True: 755, False: 71.8k]
  ------------------
  524|    755|      parseXmp(buffer_size, io_->tell());
  525|    755|      break;
  526|    144|    case TAG::brob: {
  ------------------
  |  Branch (526:5): [True: 144, False: 72.5k]
  ------------------
  527|    144|      Internal::enforce(data.size() >= 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  528|    144|      uint32_t realType = data.read_uint32(0, endian_);
  529|    144|      if (bTrace) {
  ------------------
  |  Branch (529:11): [True: 46, False: 98]
  ------------------
  530|     46|        out << "type: " << toAscii(realType);
  531|     46|      }
  532|    144|#ifdef EXV_HAVE_BROTLI
  533|    144|      DataBuf arr;
  534|    144|      brotliUncompress(data.c_data(4), data.size() - 4, arr);
  535|    144|      const DecodeParams dp(max_recursion_depth_);
  536|    144|      if (realType == TAG::exif) {
  ------------------
  |  Branch (536:11): [True: 0, False: 144]
  ------------------
  537|      0|        uint32_t offset = Safe::add(arr.read_uint32(0, endian_), 4u);
  538|      0|        Internal::enforce(Safe::add(offset, 4u) < arr.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  539|      0|        Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(), arr.c_data(offset), arr.size() - offset,
  540|      0|                                           Internal::Tag::root, Internal::TiffMapping::findDecoder, dp);
  541|    144|      } else if (realType == TAG::xml) {
  ------------------
  |  Branch (541:18): [True: 0, False: 144]
  ------------------
  542|      0|        try {
  543|      0|          Exiv2::XmpParser::decode(xmpData(), std::string(arr.c_str(), arr.size()), dp);
  544|      0|        } catch (...) {
  545|      0|          throw Error(ErrorCode::kerFailedToReadImageData);
  546|      0|        }
  547|      0|      }
  548|    144|#endif
  549|    144|    } break;
  550|    961|    case TAG::thmb:
  ------------------
  |  Branch (550:5): [True: 961, False: 71.6k]
  ------------------
  551|    961|      switch (version) {
  552|    332|        case 0:  // JPEG
  ------------------
  |  Branch (552:9): [True: 332, False: 629]
  ------------------
  553|    332|          parseCr3Preview(data, out, bTrace, version, skip, skip + 2, skip + 4, skip + 12);
  554|    332|          break;
  555|    368|        case 1:  // HDR
  ------------------
  |  Branch (555:9): [True: 368, False: 593]
  ------------------
  556|    368|          parseCr3Preview(data, out, bTrace, version, skip + 2, skip + 4, skip + 8, skip + 12);
  557|    368|          break;
  558|    261|        default:
  ------------------
  |  Branch (558:9): [True: 261, False: 700]
  ------------------
  559|    261|          break;
  560|    961|      }
  561|    961|      break;
  562|  1.52k|    case TAG::prvw:
  ------------------
  |  Branch (562:5): [True: 1.52k, False: 71.1k]
  ------------------
  563|  1.52k|      switch (version) {
  564|  1.49k|        case 0:  // JPEG
  ------------------
  |  Branch (564:9): [True: 1.49k, False: 26]
  ------------------
  565|  1.49k|        case 1:  // HDR
  ------------------
  |  Branch (565:9): [True: 4, False: 1.51k]
  ------------------
  566|  1.49k|          parseCr3Preview(data, out, bTrace, version, skip + 2, skip + 4, skip + 8, skip + 12);
  567|  1.49k|          break;
  568|     22|        default:
  ------------------
  |  Branch (568:9): [True: 22, False: 1.49k]
  ------------------
  569|     22|          break;
  570|  1.52k|      }
  571|  1.51k|      break;
  572|       |
  573|  6.90k|    default:
  ------------------
  |  Branch (573:5): [True: 6.90k, False: 65.7k]
  ------------------
  574|  6.90k|      break; /* do nothing */
  575|  72.6k|  }
  576|  65.7k|  if (bLF && bTrace)
  ------------------
  |  Branch (576:7): [True: 59.0k, False: 6.69k]
  |  Branch (576:14): [True: 35.9k, False: 23.1k]
  ------------------
  577|  35.9k|    out << '\n';
  578|       |
  579|       |  // return address of next box
  580|  65.7k|  return box_end;
  581|  72.6k|}
_ZN5Exiv29BmffImage9parseTiffEjmm:
  583|  7.99k|void BmffImage::parseTiff(uint32_t root_tag, uint64_t length, uint64_t start) {
  584|  7.99k|  Internal::enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata);
  585|  7.99k|  Internal::enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata);
  586|  7.99k|  Internal::enforce(start <= static_cast<uint64_t>(std::numeric_limits<int64_t>::max()),
  587|  7.99k|                    ErrorCode::kerCorruptedMetadata);
  588|  7.99k|  Internal::enforce(length <= std::numeric_limits<size_t>::max(), ErrorCode::kerCorruptedMetadata);
  589|       |
  590|       |  // read and parse exif data
  591|  7.99k|  const size_t restore = io_->tell();
  592|  7.99k|  DataBuf exif(static_cast<size_t>(length));
  593|  7.99k|  io_->seek(static_cast<int64_t>(start), BasicIo::beg);
  594|  7.99k|  if (exif.size() > 8 && io_->read(exif.data(), exif.size()) == exif.size()) {
  ------------------
  |  Branch (594:7): [True: 7.95k, False: 34]
  |  Branch (594:26): [True: 7.95k, False: 0]
  ------------------
  595|       |    // hunt for "II" or "MM"
  596|  7.95k|    const size_t eof = std::numeric_limits<size_t>::max();  // impossible value for punt
  597|  7.95k|    size_t punt = eof;
  598|   303k|    for (size_t i = 0; i < exif.size() - 9 && punt == eof; ++i) {
  ------------------
  |  Branch (598:24): [True: 303k, False: 70]
  |  Branch (598:47): [True: 295k, False: 7.88k]
  ------------------
  599|   295k|      auto charCurrent = exif.read_uint8(i);
  600|   295k|      auto charNext = exif.read_uint8(i + 1);
  601|   295k|      if (charCurrent == charNext && (charCurrent == 'I' || charCurrent == 'M'))
  ------------------
  |  Branch (601:11): [True: 95.4k, False: 199k]
  |  Branch (601:39): [True: 1.69k, False: 93.7k]
  |  Branch (601:61): [True: 6.19k, False: 87.5k]
  ------------------
  602|  7.89k|        punt = i;
  603|   295k|    }
  604|  7.95k|    if (punt != eof) {
  ------------------
  |  Branch (604:9): [True: 7.89k, False: 64]
  ------------------
  605|  7.89k|      const DecodeParams dp(max_recursion_depth_);
  606|  7.89k|      Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(), exif.c_data(punt), exif.size() - punt,
  607|  7.89k|                                         root_tag, Internal::TiffMapping::findDecoder, dp);
  608|  7.89k|    }
  609|  7.95k|  }
  610|  7.99k|  io_->seek(restore, BasicIo::beg);
  611|  7.99k|}
_ZN5Exiv29BmffImage9parseTiffEjm:
  613|  13.2k|void BmffImage::parseTiff(uint32_t root_tag, uint64_t length) {
  614|  13.2k|  if (length > 8) {
  ------------------
  |  Branch (614:7): [True: 13.1k, False: 96]
  ------------------
  615|  13.1k|    Internal::enforce(length - 8 <= io_->size() - io_->tell(), ErrorCode::kerCorruptedMetadata);
  616|  13.1k|    Internal::enforce(length - 8 <= std::numeric_limits<size_t>::max(), ErrorCode::kerCorruptedMetadata);
  617|  13.1k|    DataBuf data(static_cast<size_t>(length - 8u));
  618|  13.1k|    const size_t bufRead = io_->read(data.data(), data.size());
  619|       |
  620|  13.1k|    if (io_->error())
  ------------------
  |  Branch (620:9): [True: 0, False: 13.1k]
  ------------------
  621|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  622|  13.1k|    if (bufRead != data.size())
  ------------------
  |  Branch (622:9): [True: 0, False: 13.1k]
  ------------------
  623|      0|      throw Error(ErrorCode::kerInputDataReadFailed);
  624|       |
  625|  13.1k|    const DecodeParams dp(max_recursion_depth_);
  626|  13.1k|    Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(), data.c_data(), data.size(), root_tag,
  627|  13.1k|                                       Internal::TiffMapping::findDecoder, dp);
  628|  13.1k|  }
  629|  13.2k|}
_ZN5Exiv29BmffImage8parseXmpEmm:
  631|    832|void BmffImage::parseXmp(uint64_t length, uint64_t start) {
  632|    832|  Internal::enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata);
  633|    832|  Internal::enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata);
  634|       |
  635|    832|  const size_t restore = io_->tell();
  636|    832|  io_->seek(static_cast<int64_t>(start), BasicIo::beg);
  637|       |
  638|    832|  auto lengthSizeT = static_cast<size_t>(length);
  639|    832|  DataBuf xmp(lengthSizeT + 1);
  640|    832|  xmp.write_uint8(lengthSizeT, 0);  // ensure xmp is null terminated!
  641|    832|  if (io_->read(xmp.data(), lengthSizeT) != lengthSizeT)
  ------------------
  |  Branch (641:7): [True: 0, False: 832]
  ------------------
  642|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  643|    832|  if (io_->error())
  ------------------
  |  Branch (643:7): [True: 0, False: 832]
  ------------------
  644|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  645|    832|  try {
  646|    832|    const DecodeParams dp(max_recursion_depth_);
  647|    832|    Exiv2::XmpParser::decode(xmpData(), std::string(xmp.c_str()), dp);
  648|    832|  } catch (...) {
  649|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  650|      0|  }
  651|       |
  652|    827|  io_->seek(restore, BasicIo::beg);
  653|    827|}
_ZN5Exiv29BmffImage15parseCr3PreviewERKNS_7DataBufERNSt3__113basic_ostreamIcNS4_11char_traitsIcEEEEbhmmmm:
  658|  2.19k|                                size_t relative_position) {
  659|       |  // Derived from https://github.com/lclevy/canon_cr3
  660|  2.19k|  const size_t here = io_->tell();
  661|  2.19k|  Internal::enforce(here <= std::numeric_limits<size_t>::max() - relative_position, ErrorCode::kerCorruptedMetadata);
  662|  2.19k|  NativePreview nativePreview;
  663|  2.19k|  nativePreview.position_ = here + relative_position;
  664|  2.19k|  nativePreview.width_ = data.read_uint16(width_offset, endian_);
  665|  2.19k|  nativePreview.height_ = data.read_uint16(height_offset, endian_);
  666|  2.19k|  nativePreview.size_ = data.read_uint32(size_offset, endian_);
  667|  2.19k|  nativePreview.filter_ = "";
  668|  2.19k|  nativePreview.mimeType_ = [version] {
  669|  2.19k|    if (version == 0)
  670|  2.19k|      return "image/jpeg";
  671|  2.19k|    return "application/octet-stream";
  672|  2.19k|  }();
  673|  2.19k|  if (bTrace) {
  ------------------
  |  Branch (673:7): [True: 1.34k, False: 853]
  ------------------
  674|  1.34k|    out << stringFormat("width,height,size = {},{},{}", nativePreview.width_, nativePreview.height_,
  ------------------
  |  |   18|  1.34k|#define stringFormat std::format
  ------------------
  675|  1.34k|                        nativePreview.size_);
  676|  1.34k|  }
  677|  2.19k|  nativePreviews_.push_back(std::move(nativePreview));
  678|  2.19k|}
_ZNK5Exiv29BmffImage11openOrThrowEv:
  697|  13.9k|void BmffImage::openOrThrow() const {
  698|  13.9k|  if (io_->open() != 0) {
  ------------------
  |  Branch (698:7): [True: 0, False: 13.9k]
  ------------------
  699|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  700|      0|  }
  701|       |  // Ensure that this is the correct image type
  702|  13.9k|  if (!isBmffType(*io_, false)) {
  ------------------
  |  Branch (702:7): [True: 0, False: 13.9k]
  ------------------
  703|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (703:9): [True: 0, False: 0]
  |  Branch (703:25): [True: 0, False: 0]
  ------------------
  704|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  705|      0|    throw Error(ErrorCode::kerNotAnImage, "BMFF");
  706|      0|  }
  707|  13.9k|}
_ZN5Exiv29BmffImage12readMetadataEv:
  709|  5.05k|void BmffImage::readMetadata() {
  710|  5.05k|  openOrThrow();
  711|  5.05k|  IoCloser closer(*io_);
  712|       |
  713|  5.05k|  clearMetadata();
  714|  5.05k|  ilocs_.clear();
  715|  5.05k|  visits_max_ = io_->size() / 16;
  716|  5.05k|  unknownID_ = 0xffff;
  717|  5.05k|  exifID_ = unknownID_;
  718|  5.05k|  xmpID_ = unknownID_;
  719|       |
  720|  5.05k|  uint64_t address = 0;
  721|  5.05k|  const auto file_end = io_->size();
  722|  25.9k|  while (address < file_end) {
  ------------------
  |  Branch (722:10): [True: 20.8k, False: 5.05k]
  ------------------
  723|  20.8k|    io_->seek(address, BasicIo::beg);
  724|  20.8k|    address = boxHandler(std::cout, kpsNone, file_end, 0);
  725|  20.8k|  }
  726|  5.05k|  bReadMetadata_ = true;
  727|  5.05k|}  // BmffImage::readMetadata
_ZN5Exiv29BmffImage14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  729|  26.7k|void BmffImage::printStructure(std::ostream& out, Exiv2::PrintStructureOption option, size_t depth) {
  730|  26.7k|  if (!bReadMetadata_)
  ------------------
  |  Branch (730:7): [True: 0, False: 26.7k]
  ------------------
  731|      0|    readMetadata();
  732|       |
  733|  26.7k|  switch (option) {
  734|  8.91k|    default:
  ------------------
  |  Branch (734:5): [True: 8.91k, False: 17.8k]
  ------------------
  735|  8.91k|      break;  // do nothing
  736|       |
  737|  8.91k|    case kpsIccProfile: {
  ------------------
  |  Branch (737:5): [True: 4.45k, False: 22.2k]
  ------------------
  738|  4.45k|      out.write(iccProfile_.c_str(), iccProfile_.size());
  739|  4.45k|    } break;
  740|       |
  741|      0|#ifdef EXV_HAVE_XMP_TOOLKIT
  742|  4.45k|    case kpsXMP: {
  ------------------
  |  Branch (742:5): [True: 4.45k, False: 22.2k]
  ------------------
  743|  4.45k|      std::string xmp;
  744|  4.45k|      if (Exiv2::XmpParser::encode(xmp, xmpData())) {
  ------------------
  |  Branch (744:11): [True: 0, False: 4.45k]
  ------------------
  745|      0|        throw Exiv2::Error(Exiv2::ErrorCode::kerErrorMessage, "Failed to serialize XMP data");
  746|      0|      }
  747|  4.45k|      out << xmp;
  748|  4.45k|    } break;
  749|      0|#endif
  750|  4.46k|    case kpsBasic:  // drop
  ------------------
  |  Branch (750:5): [True: 4.46k, False: 22.2k]
  ------------------
  751|  8.91k|    case kpsRecursive: {
  ------------------
  |  Branch (751:5): [True: 4.45k, False: 22.2k]
  ------------------
  752|  8.91k|      openOrThrow();
  753|  8.91k|      IoCloser closer(*io_);
  754|       |
  755|  8.91k|      uint64_t address = 0;
  756|  8.91k|      const auto file_end = io_->size();
  757|  46.0k|      while (address < file_end) {
  ------------------
  |  Branch (757:14): [True: 37.1k, False: 8.91k]
  ------------------
  758|  37.1k|        io_->seek(address, BasicIo::beg);
  759|  37.1k|        address = boxHandler(out, option, file_end, depth);
  760|  37.1k|      }
  761|  8.91k|    } break;
  762|  26.7k|  }
  763|  26.7k|}
_ZN5Exiv29BmffImage13writeMetadataEv:
  765|  4.45k|void BmffImage::writeMetadata() {
  766|       |  // bmff files are read-only
  767|  4.45k|  throw(Error(ErrorCode::kerWritingImageFormatUnsupported, "BMFF"));
  768|  4.45k|}  // BmffImage::writeMetadata
_ZN5Exiv215newBmffInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  772|  5.05k|Image::UniquePtr newBmffInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  773|  5.05k|  auto image = std::make_unique<BmffImage>(std::move(io), params);
  774|  5.05k|  if (!image->good()) {
  ------------------
  |  Branch (774:7): [True: 0, False: 5.05k]
  ------------------
  775|      0|    return nullptr;
  776|      0|  }
  777|  5.05k|  return image;
  778|  5.05k|}
_ZN5Exiv210isBmffTypeERNS_7BasicIoEb:
  780|  24.4k|bool isBmffType(BasicIo& iIo, bool advance) {
  781|  24.4k|  const int32_t len = 12;
  782|  24.4k|  byte buf[len];
  783|  24.4k|  iIo.read(buf, len);
  784|  24.4k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (784:7): [True: 0, False: 24.4k]
  |  Branch (784:22): [True: 147, False: 24.2k]
  ------------------
  785|    147|    return false;
  786|    147|  }
  787|       |
  788|       |  // bmff should start with "ftyp"
  789|  24.2k|  bool const is_ftyp = (buf[4] == 'f' && buf[5] == 't' && buf[6] == 'y' && buf[7] == 'p');
  ------------------
  |  Branch (789:25): [True: 24.0k, False: 214]
  |  Branch (789:42): [True: 24.0k, False: 13]
  |  Branch (789:59): [True: 24.0k, False: 9]
  |  Branch (789:76): [True: 24.0k, False: 4]
  ------------------
  790|       |  // jxl files have a special start indicator of "JXL "
  791|  24.2k|  bool const is_jxl = (buf[4] == 'J' && buf[5] == 'X' && buf[6] == 'L' && buf[7] == ' ');
  ------------------
  |  Branch (791:24): [True: 20, False: 24.2k]
  |  Branch (791:41): [True: 10, False: 10]
  |  Branch (791:58): [True: 9, False: 1]
  |  Branch (791:75): [True: 8, False: 1]
  ------------------
  792|       |
  793|  24.2k|  bool matched = is_jxl || is_ftyp;
  ------------------
  |  Branch (793:18): [True: 8, False: 24.2k]
  |  Branch (793:28): [True: 24.0k, False: 232]
  ------------------
  794|  24.2k|  if (!advance || !matched) {
  ------------------
  |  Branch (794:7): [True: 24.2k, False: 0]
  |  Branch (794:19): [True: 0, False: 0]
  ------------------
  795|  24.2k|    iIo.seek(0, BasicIo::beg);
  796|  24.2k|  }
  797|  24.2k|  return matched;
  798|  24.4k|}
bmffimage.cpp:_ZN5Exiv2L7skipBoxEj:
  113|  73.4k|static bool skipBox(uint32_t box) {
  114|       |  // Allows boxHandler() to optimise the reading of files by identifying
  115|       |  // box types that we're not interested in. Box types listed here must
  116|       |  // not appear in the cases in switch (box_type) in boxHandler().
  117|  73.4k|  return box == 0 || box == TAG::mdat;  // mdat is where the main image lives and can be huge
  ------------------
  |  Branch (117:10): [True: 535, False: 72.9k]
  |  Branch (117:22): [True: 733, False: 72.2k]
  ------------------
  118|  73.4k|}
bmffimage.cpp:_ZZN5Exiv29BmffImage10boxHandlerERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEmmENK3$_0clEv:
  426|  6.95k|          auto offset = [&data, skip, step] {
  427|  6.95k|            if (step == 14 || step == 16)
  ------------------
  |  Branch (427:17): [True: 3.80k, False: 3.14k]
  |  Branch (427:31): [True: 2.17k, False: 967]
  ------------------
  428|  5.98k|              return data.read_uint32(skip + step - 8, endian_);
  429|    967|            if (step == 18)
  ------------------
  |  Branch (429:17): [True: 543, False: 424]
  ------------------
  430|    543|              return data.read_uint32(skip + 4, endian_);
  431|    424|            return 0u;
  432|    967|          }();
bmffimage.cpp:_ZZN5Exiv29BmffImage15parseCr3PreviewERKNS_7DataBufERNSt3__113basic_ostreamIcNS4_11char_traitsIcEEEEbhmmmmENK3$_0clEv:
  668|  2.19k|  nativePreview.mimeType_ = [version] {
  669|  2.19k|    if (version == 0)
  ------------------
  |  Branch (669:9): [True: 1.82k, False: 372]
  ------------------
  670|  1.82k|      return "image/jpeg";
  671|    372|    return "application/octet-stream";
  672|  2.19k|  }();

_ZN5Exiv28BmpImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   27|     57|    Image(ImageType::bmp, mdNone, std::move(io), params) {
   28|     57|}
_ZN5Exiv28BmpImage12readMetadataEv:
   47|     51|void BmpImage::readMetadata() {
   48|       |#ifdef EXIV2_DEBUG_MESSAGES
   49|       |  std::cerr << "Exiv2::BmpImage::readMetadata: Reading Windows bitmap file " << io_->path() << "\n";
   50|       |#endif
   51|     51|  if (io_->open() != 0) {
  ------------------
  |  Branch (51:7): [True: 0, False: 51]
  ------------------
   52|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   53|      0|  }
   54|     51|  IoCloser closer(*io_);
   55|       |
   56|       |  // Ensure that this is the correct image type
   57|     51|  if (!isBmpType(*io_, false)) {
  ------------------
  |  Branch (57:7): [True: 0, False: 51]
  ------------------
   58|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (58:9): [True: 0, False: 0]
  |  Branch (58:25): [True: 0, False: 0]
  ------------------
   59|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   60|      0|    throw Error(ErrorCode::kerNotAnImage, "BMP");
   61|      0|  }
   62|     51|  clearMetadata();
   63|       |
   64|       |  /*
   65|       |    The Windows bitmap header goes as follows -- all numbers are in little-endian byte order:
   66|       |
   67|       |    offset  length   name                   description
   68|       |    ======  =======  =====================  =======
   69|       |     0      2 bytes  signature              always 'BM'
   70|       |     2      4 bytes  bitmap size
   71|       |     6      4 bytes  reserved
   72|       |    10      4 bytes  bitmap offset
   73|       |    14      4 bytes  header size
   74|       |    18      4 bytes  bitmap width
   75|       |    22      4 bytes  bitmap height
   76|       |    26      2 bytes  plane count
   77|       |    28      2 bytes  depth
   78|       |    30      4 bytes  compression            0 = none; 1 = RLE, 8 bits/pixel; 2 = RLE, 4 bits/pixel; 3 = bitfield;
   79|       |    4 = JPEG; 5 = PNG 34      4 bytes  image size             size of the raw bitmap data, in bytes 38      4
   80|       |    bytes  horizontal resolution  (in pixels per meter) 42      4 bytes  vertical resolution    (in pixels per
   81|       |    meter) 46      4 bytes  color count 50      4 bytes  important colors       number of "important" colors
   82|       |
   83|       |    The layout above describes the BITMAPINFOHEADER (and later) variants, identified by a header size
   84|       |    of 40 bytes or more. The older OS/2 1.x / Windows 2.x format uses the shorter, 12-byte
   85|       |    BITMAPCOREHEADER instead, in which the width and height fields are only 2 bytes wide:
   86|       |
   87|       |    offset  length   name                   description
   88|       |    ======  =======  =====================  =======
   89|       |    14      4 bytes  header size            always 12 for BITMAPCOREHEADER
   90|       |    18      2 bytes  bitmap width
   91|       |    20      2 bytes  bitmap height
   92|       |    22      2 bytes  plane count
   93|       |    24      2 bytes  depth
   94|       |  */
   95|     51|  byte buf[26];
   96|     51|  if (io_->read(buf, sizeof(buf)) == sizeof(buf)) {
  ------------------
  |  Branch (96:7): [True: 51, False: 0]
  ------------------
   97|     51|    const uint32_t headerSize = getULong(buf + 14, littleEndian);
   98|     51|    if (headerSize == 12) {
  ------------------
  |  Branch (98:9): [True: 1, False: 50]
  ------------------
   99|       |      // OS/2 1.x / Windows 2.x BITMAPCOREHEADER: width and height are 16-bit fields.
  100|      1|      pixelWidth_ = getUShort(buf + 18, littleEndian);
  101|      1|      pixelHeight_ = getUShort(buf + 20, littleEndian);
  102|     50|    } else {
  103|     50|      pixelWidth_ = getULong(buf + 18, littleEndian);
  104|     50|      pixelHeight_ = getULong(buf + 22, littleEndian);
  105|     50|    }
  106|     51|  }
  107|     51|}
_ZN5Exiv214newBmpInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  116|     57|Image::UniquePtr newBmpInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  117|     57|  auto image = std::make_unique<BmpImage>(std::move(io), params);
  118|     57|  if (!image->good()) {
  ------------------
  |  Branch (118:7): [True: 6, False: 51]
  ------------------
  119|      6|    return nullptr;
  120|      6|  }
  121|     51|  return image;
  122|     57|}
_ZN5Exiv29isBmpTypeERNS_7BasicIoEb:
  124|  10.2k|bool isBmpType(BasicIo& iIo, bool advance) {
  125|  10.2k|  const int32_t len = 2;
  126|  10.2k|  const std::array<byte, len> BmpImageId{'B', 'M'};
  127|  10.2k|  std::array<byte, len> buf;
  128|  10.2k|  iIo.read(buf.data(), len);
  129|  10.2k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (129:7): [True: 0, False: 10.2k]
  |  Branch (129:22): [True: 147, False: 10.1k]
  ------------------
  130|    147|    return false;
  131|    147|  }
  132|  10.1k|  bool matched = buf == BmpImageId;
  133|  10.1k|  if (!advance || !matched) {
  ------------------
  |  Branch (133:7): [True: 10.1k, False: 0]
  |  Branch (133:19): [True: 0, False: 0]
  ------------------
  134|  10.1k|    iIo.seek(-len, BasicIo::cur);
  135|  10.1k|  }
  136|  10.1k|  return matched;
  137|  10.2k|}

_ZN5Exiv28Internal14CanonMakerNote17printFiFileNumberERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2666|    494|std::ostream& CanonMakerNote::printFiFileNumber(std::ostream& os, const Value& value, const ExifData* metadata) {
 2667|    494|  if (!metadata || value.typeId() != unsignedLong || value.count() == 0) {
  ------------------
  |  Branch (2667:7): [True: 247, False: 247]
  |  Branch (2667:20): [True: 16, False: 231]
  |  Branch (2667:54): [True: 0, False: 231]
  ------------------
 2668|    263|    return os << "(" << value << ")";
 2669|    263|  }
 2670|       |
 2671|    231|  auto pos = metadata->findKey(ExifKey("Exif.Image.Model"));
 2672|    231|  if (pos == metadata->end())
  ------------------
  |  Branch (2672:7): [True: 197, False: 34]
  ------------------
 2673|    197|    return os << "(" << value << ")";
 2674|       |
 2675|       |  // Ported from Exiftool
 2676|     34|  std::string model = pos->toString();
 2677|     34|  if (Internal::contains(model, "20D") || Internal::contains(model, "350D") ||
  ------------------
  |  Branch (2677:7): [True: 3, False: 31]
  |  Branch (2677:7): [True: 5, False: 29]
  |  Branch (2677:43): [True: 1, False: 30]
  ------------------
 2678|     30|      model.substr(model.size() - 8, 8) == "REBEL XT" || Internal::contains(model, "Kiss Digital N")) {
  ------------------
  |  Branch (2678:7): [True: 8, False: 22]
  |  Branch (2678:58): [True: 0, False: 22]
  ------------------
 2679|      5|    uint32_t val = value.toUint32();
 2680|      5|    return os << stringFormat("{}-{:04}", (val & 0xffc0) >> 6, ((val >> 16) & 0xff) + ((val & 0x3f) << 8));
  ------------------
  |  |   18|      5|#define stringFormat std::format
  ------------------
 2681|      5|  }
 2682|     29|  if (Internal::contains(model, "30D") || Internal::contains(model, "400D") || Internal::contains(model, "REBEL XTi") ||
  ------------------
  |  Branch (2682:7): [True: 8, False: 21]
  |  Branch (2682:43): [True: 2, False: 19]
  |  Branch (2682:80): [True: 0, False: 19]
  ------------------
 2683|     19|      Internal::contains(model, "Kiss Digital X") || Internal::contains(model, "K236")) {
  ------------------
  |  Branch (2683:7): [True: 1, False: 18]
  |  Branch (2683:54): [True: 1, False: 17]
  ------------------
 2684|      5|    uint32_t val = value.toUint32();
 2685|      5|    uint32_t dn = (val & 0xffc00) >> 10;
 2686|      8|    while (dn < 100)
  ------------------
  |  Branch (2686:12): [True: 3, False: 5]
  ------------------
 2687|      3|      dn += 0x40;
 2688|      5|    return os << stringFormat("{}-{:04}", dn, ((val & 0x3ff) << 4) + ((val >> 20) & 0x0f));
  ------------------
  |  |   18|      5|#define stringFormat std::format
  ------------------
 2689|      5|  }
 2690|       |
 2691|     24|  return os << "(" << value << ")";
 2692|     29|}
_ZN5Exiv28Internal14CanonMakerNote16printFocalLengthERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2694|    924|std::ostream& CanonMakerNote::printFocalLength(std::ostream& os, const Value& value, const ExifData* metadata) {
 2695|    924|  if (!metadata || value.count() < 4 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (2695:7): [True: 462, False: 462]
  |  Branch (2695:20): [True: 296, False: 166]
  |  Branch (2695:41): [True: 91, False: 75]
  ------------------
 2696|    849|    return os << value;
 2697|    849|  }
 2698|       |
 2699|     75|  ExifKey key("Exif.CanonCs.Lens");
 2700|     75|  auto pos = metadata->findKey(key);
 2701|     75|  if (pos != metadata->end() && pos->value().count() >= 3 && pos->value().typeId() == unsignedShort) {
  ------------------
  |  Branch (2701:7): [True: 63, False: 12]
  |  Branch (2701:7): [True: 46, False: 29]
  |  Branch (2701:33): [True: 46, False: 17]
  |  Branch (2701:62): [True: 46, False: 0]
  ------------------
 2702|     46|    float fu = pos->value().toFloat(2);
 2703|     46|    if (fu != 0.0F) {
  ------------------
  |  Branch (2703:9): [True: 35, False: 11]
  ------------------
 2704|     35|      return os << stringFormat("{:.1f} mm", value.toFloat(1) / fu);
  ------------------
  |  |   18|     35|#define stringFormat std::format
  ------------------
 2705|     35|    }
 2706|     46|  }
 2707|       |
 2708|     40|  return os << value;
 2709|     75|}
_ZN5Exiv28Internal14CanonMakerNote11print0x0008ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2711|    716|std::ostream& CanonMakerNote::print0x0008(std::ostream& os, const Value& value, const ExifData*) {
 2712|    716|  std::string n = value.toString();
 2713|    716|  if (n.length() < 4)
  ------------------
  |  Branch (2713:7): [True: 66, False: 650]
  ------------------
 2714|     66|    return os << "(" << n << ")";
 2715|    650|  return os << n.substr(0, n.length() - 4) << "-" << n.substr(n.length() - 4);
 2716|    716|}
_ZN5Exiv28Internal14CanonMakerNote11print0x000cERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2727|    658|std::ostream& CanonMakerNote::print0x000c(std::ostream& os, const Value& value, const ExifData* exifData) {
 2728|    658|  if (!exifData) {
  ------------------
  |  Branch (2728:7): [True: 329, False: 329]
  ------------------
 2729|    329|    return os << value;
 2730|    329|  }
 2731|       |
 2732|    329|  ExifKey key("Exif.Canon.ModelID");
 2733|    329|  auto pos = exifData->findKey(key);
 2734|       |  // if model is EOS D30
 2735|    329|  if (pos != exifData->end() && pos->value().count() == 1 && pos->value().toInt64() == 0x01140000) {
  ------------------
  |  Branch (2735:7): [True: 168, False: 161]
  |  Branch (2735:7): [True: 0, False: 329]
  |  Branch (2735:33): [True: 69, False: 99]
  |  Branch (2735:62): [True: 0, False: 69]
  ------------------
 2736|      0|    try {
 2737|      0|      uint32_t l = std::stoul(value.toString());
 2738|      0|      return os << stringFormat("{:04x}{:05}", (l >> 16) & 0xFFFF, l & 0xFFFF);
  ------------------
  |  |   18|      0|#define stringFormat std::format
  ------------------
 2739|      0|    } catch (const std::logic_error&) {
 2740|      0|      return os << value;
 2741|      0|    }
 2742|      0|  }
 2743|    329|  return os << value;
 2744|    329|}
_ZN5Exiv28Internal14CanonMakerNote13printCs0x0002ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2746|  3.90k|std::ostream& CanonMakerNote::printCs0x0002(std::ostream& os, const Value& value, const ExifData*) {
 2747|  3.90k|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (2747:7): [True: 0, False: 3.90k]
  |  Branch (2747:42): [True: 0, False: 3.90k]
  ------------------
 2748|      0|    return os << value;
 2749|       |
 2750|  3.90k|  if (auto l = value.toInt64(); l == 0) {
  ------------------
  |  Branch (2750:33): [True: 3.10k, False: 800]
  ------------------
 2751|  3.10k|    os << "Off";
 2752|  3.10k|  } else {
 2753|    800|    os << l / 10.0 << " s";
 2754|    800|  }
 2755|  3.90k|  return os;
 2756|  3.90k|}
_ZN5Exiv28Internal14CanonMakerNote15printCsLensTypeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2899|  3.78k|std::ostream& CanonMakerNote::printCsLensType(std::ostream& os, const Value& value, const ExifData* metadata) {
 2900|  3.78k|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (2900:7): [True: 0, False: 3.78k]
  |  Branch (2900:42): [True: 0, False: 3.78k]
  ------------------
 2901|      0|    return os << "(" << value << ")";
 2902|       |
 2903|       |  // #1034
 2904|  3.78k|  const std::string undefined("undefined");
 2905|  3.78k|  const std::string section("canon");
 2906|  3.78k|  if (Internal::readExiv2Config(section, value.toString(), undefined) != undefined) {
  ------------------
  |  Branch (2906:7): [True: 0, False: 3.78k]
  ------------------
 2907|      0|    return os << Internal::readExiv2Config(section, value.toString(), undefined);
 2908|      0|  }
 2909|       |
 2910|       |  // try our best to determine the lens based on metadata
 2911|       |  // sometimes the result will be a set of multiple choices
 2912|  3.78k|  return printCsLensTypeByMetadata(os, value, metadata);
 2913|  3.78k|}
_ZN5Exiv28Internal14CanonMakerNote11printCsLensERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2915|  3.76k|std::ostream& CanonMakerNote::printCsLens(std::ostream& os, const Value& value, const ExifData*) {
 2916|  3.76k|  if (value.count() < 3 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (2916:7): [True: 268, False: 3.49k]
  |  Branch (2916:28): [True: 0, False: 3.49k]
  ------------------
 2917|    268|    return os << "(" << value << ")";
 2918|    268|  }
 2919|       |
 2920|  3.49k|  float fu = value.toFloat(2);
 2921|  3.49k|  if (fu == 0.0F)
  ------------------
  |  Branch (2921:7): [True: 432, False: 3.06k]
  ------------------
 2922|    432|    return os << value;
 2923|  3.06k|  float len1 = value.toInt64(0) / fu;
 2924|  3.06k|  float len2 = value.toInt64(1) / fu;
 2925|  3.06k|  if (len1 == len2) {
  ------------------
  |  Branch (2925:7): [True: 138, False: 2.92k]
  ------------------
 2926|    138|    return os << stringFormat("{:.1f} mm", len1);
  ------------------
  |  |   18|    138|#define stringFormat std::format
  ------------------
 2927|    138|  }
 2928|  2.92k|  return os << stringFormat("{:.1f} - {:.1f} mm", len2, len1);
  ------------------
  |  |   18|  2.92k|#define stringFormat std::format
  ------------------
 2929|  3.06k|}
_ZN5Exiv28Internal14CanonMakerNote13printLe0x0000ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2931|     10|std::ostream& CanonMakerNote::printLe0x0000(std::ostream& os, const Value& value, const ExifData*) {
 2932|     10|  if (value.typeId() != unsignedByte || value.size() != 5)
  ------------------
  |  Branch (2932:7): [True: 0, False: 10]
  |  Branch (2932:41): [True: 2, False: 8]
  ------------------
 2933|      2|    return os << "(" << value << ")";
 2934|     48|  for (size_t i = 0; i < value.size(); ++i) {
  ------------------
  |  Branch (2934:22): [True: 40, False: 8]
  ------------------
 2935|     40|    os << stringFormat("{:02x}", value.toInt64(i));
  ------------------
  |  |   18|     40|#define stringFormat std::format
  ------------------
 2936|     40|  }
 2937|      8|  return os;
 2938|     10|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0001ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2940|    418|std::ostream& CanonMakerNote::printSi0x0001(std::ostream& os, const Value& value, const ExifData*) {
 2941|    418|  if (value.typeId() == unsignedShort && value.count() > 0) {
  ------------------
  |  Branch (2941:7): [True: 418, False: 0]
  |  Branch (2941:42): [True: 418, False: 0]
  ------------------
 2942|    418|    os << std::exp2(canonEv(value.toInt64()) / 32) * 100.0F;
 2943|    418|  }
 2944|    418|  return os;
 2945|    418|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0002ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2947|    418|std::ostream& CanonMakerNote::printSi0x0002(std::ostream& os, const Value& value, const ExifData*) {
 2948|    418|  if (value.typeId() == unsignedShort && value.count() > 0) {
  ------------------
  |  Branch (2948:7): [True: 418, False: 0]
  |  Branch (2948:42): [True: 418, False: 0]
  ------------------
 2949|       |    // Ported from Exiftool by Will Stokes
 2950|    418|    os << std::exp2(canonEv(value.toInt64())) * (100.0F / 32.0F);
 2951|    418|  }
 2952|    418|  return os;
 2953|    418|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0003ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2955|    418|std::ostream& CanonMakerNote::printSi0x0003(std::ostream& os, const Value& value, const ExifData*) {
 2956|    418|  if (value.typeId() == unsignedShort && value.count() > 0) {
  ------------------
  |  Branch (2956:7): [True: 418, False: 0]
  |  Branch (2956:42): [True: 418, False: 0]
  ------------------
 2957|       |    // The offset of '5' seems to be ok for most Canons (see Exiftool)
 2958|       |    // It might be explained by the fact, that most Canons have a longest
 2959|       |    // exposure of 30s which is 5 EV below 1s
 2960|       |    // see also printSi0x0017
 2961|    418|    auto res = std::lround(100.0 * (static_cast<short>(value.toInt64()) / 32.0 + 5.0));
 2962|    418|    os << stringFormat("{:.2f}", res / 100.0);
  ------------------
  |  |   18|    418|#define stringFormat std::format
  ------------------
 2963|    418|  }
 2964|    418|  return os;
 2965|    418|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0009ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2967|    410|std::ostream& CanonMakerNote::printSi0x0009(std::ostream& os, const Value& value, const ExifData*) {
 2968|    410|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (2968:7): [True: 0, False: 410]
  |  Branch (2968:42): [True: 0, False: 410]
  ------------------
 2969|      0|    return os << value;
 2970|       |
 2971|    410|  const auto l = value.toInt64();
 2972|    410|  os << l << "";
 2973|       |  // Todo: determine unit
 2974|    410|  return os;
 2975|    410|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x000cERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2977|    408|std::ostream& CanonMakerNote::printSi0x000c(std::ostream& os, const Value& value, const ExifData*) {
 2978|    408|  if (value.toInt64() == 0)
  ------------------
  |  Branch (2978:7): [True: 64, False: 344]
  ------------------
 2979|     64|    return os << "--";
 2980|       |
 2981|    344|  return os << value.toInt64() - 128 << " °C";
 2982|    408|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x000dERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2984|    408|std::ostream& CanonMakerNote::printSi0x000d(std::ostream& os, const Value& value, const ExifData*) {
 2985|    408|  if (value.toInt64() == 65535)
  ------------------
  |  Branch (2985:7): [True: 20, False: 388]
  ------------------
 2986|     20|    return os << "--";
 2987|       |
 2988|    388|  return os << value.toInt64() / 32;
 2989|    408|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x000eERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2991|    408|std::ostream& CanonMakerNote::printSi0x000e(std::ostream& os, const Value& value, const ExifData* pExifData) {
 2992|    408|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (2992:7): [True: 0, False: 408]
  |  Branch (2992:42): [True: 0, False: 408]
  ------------------
 2993|      0|    return os << value;
 2994|       |
 2995|    408|  const auto l = value.toUint32();
 2996|    408|  const auto num = (l & 0xf000U) >> 12;
 2997|    408|  os << num << " focus points; ";
 2998|    408|  if (auto used = l & 0x0fffU; used == 0) {
  ------------------
  |  Branch (2998:32): [True: 52, False: 356]
  ------------------
 2999|     52|    os << "none";
 3000|    356|  } else {
 3001|    356|    EXV_PRINT_TAG_BITMASK(canonSiAFPointUsed)(os, value, pExifData);
  ------------------
  |  |  229|    356|#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
  ------------------
 3002|    356|  }
 3003|    408|  os << " used";
 3004|    408|  return os;
 3005|    408|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0013ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3007|    356|std::ostream& CanonMakerNote::printSi0x0013(std::ostream& os, const Value& value, const ExifData*) {
 3008|    356|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (3008:7): [True: 0, False: 356]
  |  Branch (3008:42): [True: 0, False: 356]
  ------------------
 3009|      0|    return os << value;
 3010|       |
 3011|    356|  if (auto l = value.toInt64(); l == 0xffff) {
  ------------------
  |  Branch (3011:33): [True: 28, False: 328]
  ------------------
 3012|     28|    return os << "Infinite";
 3013|     28|  }
 3014|    328|  return os << value.toInt64() / 100.0 << " m";
 3015|    356|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0015ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3017|  8.17k|std::ostream& CanonMakerNote::printSi0x0015(std::ostream& os, const Value& value, const ExifData*) {
 3018|  8.17k|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (3018:7): [True: 0, False: 8.17k]
  |  Branch (3018:42): [True: 0, False: 8.17k]
  ------------------
 3019|      0|    return os << value;
 3020|       |
 3021|  8.17k|  const auto val = static_cast<int16_t>(value.toInt64());
 3022|  8.17k|  if (val < 0)
  ------------------
  |  Branch (3022:7): [True: 684, False: 7.48k]
  ------------------
 3023|    684|    return os << value;
 3024|  7.48k|  return os << stringFormat("F{:.2g}", fnumber(canonEv(val)));
  ------------------
  |  |   18|  7.48k|#define stringFormat std::format
  ------------------
 3025|  8.17k|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0016ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3027|    762|std::ostream& CanonMakerNote::printSi0x0016(std::ostream& os, const Value& value, const ExifData*) {
 3028|    762|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (3028:7): [True: 0, False: 762]
  |  Branch (3028:42): [True: 0, False: 762]
  ------------------
 3029|      0|    return os << value;
 3030|       |
 3031|    762|  auto [u, r] = exposureTime(canonEv(value.toInt64()));
 3032|    762|  os << u;
 3033|    762|  if (r > 1) {
  ------------------
  |  Branch (3033:7): [True: 126, False: 636]
  ------------------
 3034|    126|    os << "/" << r;
 3035|    126|  }
 3036|    762|  return os << " s";
 3037|    762|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0017ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3039|    352|std::ostream& CanonMakerNote::printSi0x0017(std::ostream& os, const Value& value, const ExifData*) {
 3040|    352|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (3040:7): [True: 0, False: 352]
  |  Branch (3040:42): [True: 0, False: 352]
  ------------------
 3041|      0|    return os << value;
 3042|    352|  return os << stringFormat("{:.2f}", (value.toInt64() / 8.0) - 6.0);
  ------------------
  |  |   18|    352|#define stringFormat std::format
  ------------------
 3043|    352|}
_ZN5Exiv28Internal14CanonMakerNote13printSi0x0018ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3045|    350|std::ostream& CanonMakerNote::printSi0x0018(std::ostream& os, const Value& value, const ExifData*) {
 3046|    350|  return os << value.toInt64() / 10;
 3047|    350|}
_ZN5Exiv28Internal14CanonMakerNote20printFiFocusDistanceERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3049|    530|std::ostream& CanonMakerNote::printFiFocusDistance(std::ostream& os, const Value& value, const ExifData*) {
 3050|    530|  if (value.typeId() != signedShort || value.count() == 0)
  ------------------
  |  Branch (3050:7): [True: 0, False: 530]
  |  Branch (3050:40): [True: 0, False: 530]
  ------------------
 3051|      0|    return os << value;
 3052|       |
 3053|    530|  auto l = value.toInt64();
 3054|    530|  if (l == -1) {
  ------------------
  |  Branch (3054:7): [True: 36, False: 494]
  ------------------
 3055|     36|    return os << "Infinite";
 3056|     36|  }
 3057|    494|  return os << stringFormat("{:.2f} m", l / 100.0);
  ------------------
  |  |   18|    494|#define stringFormat std::format
  ------------------
 3058|    530|}
_ZN5Exiv28Internal7canonEvEl:
 3063|  10.8k|float canonEv(int64_t val) {
 3064|       |  // temporarily remove sign
 3065|  10.8k|  int sign = 1;
 3066|  10.8k|  if (val < 0) {
  ------------------
  |  Branch (3066:7): [True: 452, False: 10.3k]
  ------------------
 3067|    452|    sign = -1;
 3068|    452|    val = -val;
 3069|    452|  }
 3070|       |  // remove fraction
 3071|  10.8k|  const auto remainder = val & 0x1f;
 3072|  10.8k|  val -= remainder;
 3073|  10.8k|  auto frac = static_cast<float>(remainder);
 3074|       |  // convert 1/3 (0x0c) and 2/3 (0x14) codes
 3075|  10.8k|  if (frac == 0x0c) {
  ------------------
  |  Branch (3075:7): [True: 698, False: 10.1k]
  ------------------
 3076|    698|    frac = 32.0F / 3;
 3077|  10.1k|  } else if (frac == 0x14) {
  ------------------
  |  Branch (3077:14): [True: 257, False: 9.89k]
  ------------------
 3078|    257|    frac = 64.0F / 3;
 3079|  9.89k|  } else if ((val == 160) && (frac == 0x08)) {  // for Sigma f/6.3 lenses that report f/6.2 to camera
  ------------------
  |  Branch (3079:14): [True: 56, False: 9.83k]
  |  Branch (3079:30): [True: 18, False: 38]
  ------------------
 3080|     18|    frac = 30.0F / 3;
 3081|     18|  }
 3082|  10.8k|  return sign * (val + frac) / 32.0F;
 3083|  10.8k|}
canonmn_int.cpp:_ZN5Exiv28InternalL25printCsLensTypeByMetadataERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2804|  3.78k|std::ostream& printCsLensTypeByMetadata(std::ostream& os, const Value& value, const ExifData* metadata) {
 2805|  3.78k|  if (!metadata || value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (2805:7): [True: 1.89k, False: 1.89k]
  |  Branch (2805:20): [True: 0, False: 1.89k]
  |  Branch (2805:55): [True: 0, False: 1.89k]
  ------------------
 2806|  1.89k|    return os << value;
 2807|       |
 2808|  1.89k|  auto const lensType = value.toInt64();
 2809|       |
 2810|  1.89k|  if (lensType == 0xffff) {
  ------------------
  |  Branch (2810:7): [True: 26, False: 1.86k]
  ------------------
 2811|     26|    return printCsLensFFFF(os, value, metadata);
 2812|     26|  }
 2813|       |
 2814|       |  // get the values we need from the metadata container
 2815|  1.86k|  ExifKey lensKey("Exif.CanonCs.Lens");
 2816|  1.86k|  auto pos = metadata->findKey(lensKey);
 2817|       |  // catch possible error cases
 2818|  1.86k|  if (pos == metadata->end() || pos->value().count() < 3 || pos->value().typeId() != unsignedShort ||
  ------------------
  |  Branch (2818:7): [True: 3, False: 1.86k]
  |  Branch (2818:7): [True: 96, False: 1.76k]
  |  Branch (2818:33): [True: 19, False: 1.84k]
  |  Branch (2818:61): [True: 0, False: 1.84k]
  ------------------
 2819|  1.84k|      pos->value().toFloat(2) == 0.0F) {
  ------------------
  |  Branch (2819:7): [True: 74, False: 1.76k]
  ------------------
 2820|     96|    os << "Unknown Lens (" << lensType << ")";
 2821|     96|    return os;
 2822|     96|  }
 2823|       |
 2824|  1.76k|  auto const exifFlMin = static_cast<int>(static_cast<float>(pos->value().toInt64(1)) / pos->value().toFloat(2));
 2825|  1.76k|  auto const exifFlMax = static_cast<int>(static_cast<float>(pos->value().toInt64(0)) / pos->value().toFloat(2));
 2826|       |
 2827|  1.76k|  ExifKey aperKey("Exif.CanonCs.MaxAperture");
 2828|  1.76k|  pos = metadata->findKey(aperKey);
 2829|  1.76k|  if (pos == metadata->end() || pos->value().count() != 1 || pos->value().typeId() != unsignedShort) {
  ------------------
  |  Branch (2829:7): [True: 5, False: 1.76k]
  |  Branch (2829:7): [True: 10, False: 1.75k]
  |  Branch (2829:33): [True: 5, False: 1.75k]
  |  Branch (2829:62): [True: 0, False: 1.75k]
  ------------------
 2830|     10|    os << "Unknown Lens (" << lensType << ")";
 2831|     10|    return os;
 2832|     10|  }
 2833|       |
 2834|  1.75k|  auto exifAperMax = fnumber(canonEv(static_cast<int16_t>(pos->value().toInt64(0))));
 2835|       |
 2836|       |  // regex to extract short and tele focal length, max aperture at short and tele position
 2837|       |  // and the teleconverter factor from the lens label
 2838|  1.75k|  std::regex const lens_regex(
 2839|       |      // anything at the start
 2840|  1.75k|      ".*?"
 2841|       |      // maybe min focal length and hyphen, surely max focal length e.g.: 24-70mm
 2842|  1.75k|      R"((?:(\d+)-)?(\d+)mm)"
 2843|       |      // anything in-between
 2844|  1.75k|      ".*?"
 2845|       |      // maybe short focal length max aperture and hyphen, surely at least single max aperture e.g.: f/4.5-5.6
 2846|       |      // short and tele indicate apertures at the short (focal_length_min) and tele (focal_length_max)
 2847|       |      // position of the lens
 2848|  1.75k|      R"((?:(?:f/)|T|F)(?:(\d+(?:\.\d+)?)-)?(\d+(?:\.\d)?))"
 2849|       |      // check if there is a teleconverter pattern e.g. + 1.4x
 2850|  1.75k|      R"((?:.*?\+.*?(\d+(?:\.\d+)?)x)?)");
 2851|       |
 2852|  1.75k|  bool unmatched = true;
 2853|       |  // we loop over all our lenses to print out all matching lenses
 2854|       |  // if we have multiple possibilities, they are concatenated by "*OR*"
 2855|   939k|  for (auto&& [val, label] : canonCsLensType) {
  ------------------
  |  Branch (2855:28): [True: 939k, False: 1.75k]
  ------------------
 2856|   939k|    if (val != lensType) {
  ------------------
  |  Branch (2856:9): [True: 936k, False: 3.11k]
  ------------------
 2857|   936k|      continue;
 2858|   936k|    }
 2859|       |
 2860|  3.11k|    std::cmatch base_match;
 2861|  3.11k|    if (!std::regex_search(label, base_match, lens_regex)) {
  ------------------
  |  Branch (2861:9): [True: 0, False: 3.11k]
  ------------------
 2862|       |      // this should never happen, as it would indicate the lens is specified incorrectly
 2863|       |      // in the CanonCsLensType array
 2864|      0|      throw Error(ErrorCode::kerErrorMessage, "Lens regex didn't match for: ", label);
 2865|      0|    }
 2866|       |
 2867|  3.11k|    auto tc = base_match[5].length() > 0 ? string_to_float(base_match[5].str()) : 1.f;
  ------------------
  |  Branch (2867:15): [True: 73, False: 3.04k]
  ------------------
 2868|       |
 2869|  3.11k|    auto flMax = static_cast<int>(std::lround(string_to_float(base_match[2].str()) * tc));
 2870|  3.11k|    int flMin =
 2871|  3.11k|        base_match[1].length() > 0 ? static_cast<int>(std::lround(string_to_float(base_match[1].str()) * tc)) : flMax;
  ------------------
  |  Branch (2871:9): [True: 2.71k, False: 401]
  ------------------
 2872|       |
 2873|  3.11k|    auto aperMaxTele = string_to_float(base_match[4].str()) * tc;
 2874|  3.11k|    auto aperMaxShort = base_match[3].length() > 0 ? string_to_float(base_match[3].str()) * tc : aperMaxTele;
  ------------------
  |  Branch (2874:25): [True: 1.57k, False: 1.53k]
  ------------------
 2875|       |
 2876|  3.11k|    if (flMin != exifFlMin || flMax != exifFlMax || exifAperMax < (aperMaxShort - (.1 * tc)) ||
  ------------------
  |  Branch (2876:9): [True: 3.10k, False: 18]
  |  Branch (2876:31): [True: 4, False: 14]
  |  Branch (2876:53): [True: 4, False: 10]
  ------------------
 2877|  3.11k|        exifAperMax > (aperMaxTele + (.1 * tc))) {
  ------------------
  |  Branch (2877:9): [True: 7, False: 3]
  ------------------
 2878|  3.11k|      continue;
 2879|  3.11k|    }
 2880|       |
 2881|      3|    if (unmatched) {
  ------------------
  |  Branch (2881:9): [True: 2, False: 1]
  ------------------
 2882|      2|      unmatched = false;
 2883|      2|      os << label;
 2884|      2|      continue;
 2885|      2|    }
 2886|       |
 2887|      1|    os << " *OR* " << label;
 2888|      1|  }
 2889|       |
 2890|       |  // if the entire for loop left us with unmatched==false
 2891|       |  // we weren't able to find a single matching lens :(
 2892|  1.75k|  if (unmatched) {
  ------------------
  |  Branch (2892:7): [True: 1.75k, False: 2]
  ------------------
 2893|  1.75k|    os << "Unknown Lens (" << lensType << ")";
 2894|  1.75k|  }
 2895|  1.75k|  return os;
 2896|  1.75k|}
canonmn_int.cpp:_ZN5Exiv28InternalL15printCsLensFFFFERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2758|     26|std::ostream& printCsLensFFFF(std::ostream& os, const Value& value, const ExifData* metadata) {
 2759|     26|  try {
 2760|       |    // 1140
 2761|     26|    const auto itModel = metadata->findKey(ExifKey("Exif.Image.Model"));
 2762|     26|    const auto itLens = metadata->findKey(ExifKey("Exif.CanonCs.Lens"));
 2763|     26|    const auto itApert = metadata->findKey(ExifKey("Exif.CanonCs.MaxAperture"));
 2764|       |
 2765|     26|    if (itModel != metadata->end() && itModel->value().toString() == "Canon EOS 30D" && itLens != metadata->end() &&
  ------------------
  |  Branch (2765:9): [True: 10, False: 16]
  |  Branch (2765:9): [True: 0, False: 26]
  |  Branch (2765:39): [True: 1, False: 9]
  |  Branch (2765:89): [True: 1, False: 0]
  ------------------
 2766|      1|        itLens->value().toString() == "24 24 1" && itApert != metadata->end() &&
  ------------------
  |  Branch (2766:9): [True: 0, False: 1]
  |  Branch (2766:52): [True: 0, False: 0]
  ------------------
 2767|      0|        itApert->value().toString() == "95"  // F2.8
  ------------------
  |  Branch (2767:9): [True: 0, False: 0]
  ------------------
 2768|     26|    ) {
 2769|      0|      return os << "Canon EF-S 24mm f/2.8 STM";
 2770|      0|    }
 2771|     26|  } catch (const std::exception&) {
 2772|      0|  }
 2773|       |
 2774|     26|  return EXV_PRINT_TAG(canonCsLensType)(os, value, metadata);
  ------------------
  |  |  199|     26|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2775|     26|}
canonmn_int.cpp:_ZN5Exiv28InternalL15string_to_floatENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
 2789|  10.6k|float string_to_float(std::string_view str) {
 2790|  10.6k|  float val{};
 2791|  10.6k|  std::stringstream ss;
 2792|  10.6k|  std::locale c_locale("C");
 2793|  10.6k|  ss.imbue(c_locale);
 2794|  10.6k|  ss << str;
 2795|  10.6k|  ss >> val;
 2796|       |
 2797|  10.6k|  if (ss.fail()) {
  ------------------
  |  Branch (2797:7): [True: 0, False: 10.6k]
  ------------------
 2798|      0|    throw Error(ErrorCode::kerErrorMessage, "canonmn_int.cpp:string_to_float failed for: ", str);
 2799|      0|  }
 2800|       |
 2801|  10.6k|  return val;
 2802|  10.6k|}

_ZN5Exiv28Internal14CanonMakerNote7tagListEv:
   38|   258k|  static constexpr auto tagList() {
   39|   258k|    return tagInfo_;
   40|   258k|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListCsEv:
   42|  8.09M|  static constexpr auto tagListCs() {
   43|  8.09M|    return tagInfoCs_;
   44|  8.09M|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListSiEv:
   46|  3.23M|  static constexpr auto tagListSi() {
   47|  3.23M|    return tagInfoSi_;
   48|  3.23M|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListCfEv:
   54|    559|  static constexpr auto tagListCf() {
   55|    559|    return tagInfoCf_;
   56|    559|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListPiEv:
   58|  3.21M|  static constexpr auto tagListPi() {
   59|  3.21M|    return tagInfoPi_;
   60|  3.21M|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListTiEv:
   62|   166k|  static constexpr auto tagListTi() {
   63|   166k|    return tagInfoTi_;
   64|   166k|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListFiEv:
   66|  1.08M|  static constexpr auto tagListFi() {
   67|  1.08M|    return tagInfoFi_;
   68|  1.08M|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListPaEv:
   50|    896|  static constexpr auto tagListPa() {
   51|    896|    return tagInfoPa_;
   52|    896|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListPrEv:
   70|  2.42k|  static constexpr auto tagListPr() {
   71|  2.42k|    return tagInfoPr_;
   72|  2.42k|  }
_ZN5Exiv28Internal14CanonMakerNote14tagListVigCor2Ev:
  134|    229|  static constexpr auto tagListVigCor2() {
  135|    229|    return tagInfoVigCor2_;
  136|    229|  }
_ZN5Exiv28Internal14CanonMakerNote11tagListLiOpEv:
  138|  3.19k|  static constexpr auto tagListLiOp() {
  139|  3.19k|    return tagInfoLiOp_;
  140|  3.19k|  }
_ZN5Exiv28Internal14CanonMakerNote14tagListAfMiAdjEv:
  126|    257|  static constexpr auto tagListAfMiAdj() {
  127|    257|    return tagInfoAfMiAdj_;
  128|    257|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListLeEv:
  142|    200|  static constexpr auto tagListLe() {
  143|    200|    return tagInfoLe_;
  144|    200|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListAmEv:
  146|    822|  static constexpr auto tagListAm() {
  147|    822|    return tagInfoAm_;
  148|    822|  }
_ZN5Exiv28Internal14CanonMakerNote10tagListFilEv:
  154|  5.47k|  static constexpr auto tagListFil() {
  155|  5.47k|    return tagInfoFil_;
  156|  5.47k|  }
_ZN5Exiv28Internal14CanonMakerNote9tagListMeEv:
  150|    855|  static constexpr auto tagListMe() {
  151|    855|    return tagInfoMe_;
  152|    855|  }
_ZN5Exiv28Internal14CanonMakerNote10tagListHdrEv:
  158|    998|  static constexpr auto tagListHdr() {
  159|    998|    return tagInfoHdr_;
  160|    998|  }
_ZN5Exiv28Internal14CanonMakerNote10tagListAfCEv:
  162|  20.4k|  static constexpr auto tagListAfC() {
  163|  20.4k|    return tagInfoAfC_;
  164|  20.4k|  }
_ZN5Exiv28Internal14CanonMakerNote11tagListRawBEv:
  166|    514|  static constexpr auto tagListRawB() {
  167|    514|    return tagInfoRawB_;
  168|    514|  }

_ZN5Exiv28Internal14CasioMakerNote11print0x0006ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  147|    382|std::ostream& CasioMakerNote::print0x0006(std::ostream& os, const Value& value, const ExifData*) {
  148|    382|  return os << stringFormat("{:.2f} m", value.toInt64() / 1000.0);
  ------------------
  |  |   18|    382|#define stringFormat std::format
  ------------------
  149|    382|}
_ZN5Exiv28Internal14CasioMakerNote11print0x0015ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  151|    328|std::ostream& CasioMakerNote::print0x0015(std::ostream& os, const Value& value, const ExifData*) {
  152|       |  // format is:  "YYMM#00#00DDHH#00#00MM#00#00#00#00" or  "YYMM#00#00DDHH#00#00MMSS#00#00#00"
  153|    328|  std::vector<char> numbers;
  154|  12.1k|  for (size_t i = 0; i < value.size(); i++) {
  ------------------
  |  Branch (154:22): [True: 11.8k, False: 328]
  ------------------
  155|  11.8k|    const auto l = value.toInt64(i);
  156|  11.8k|    if (l != 0) {
  ------------------
  |  Branch (156:9): [True: 4.22k, False: 7.61k]
  ------------------
  157|  4.22k|      numbers.push_back(l);
  158|  4.22k|    }
  159|  11.8k|  }
  160|       |
  161|    328|  if (numbers.size() >= 10) {
  ------------------
  |  Branch (161:7): [True: 188, False: 140]
  ------------------
  162|       |    // year
  163|    188|    long l = ((numbers[0] - 48) * 10) + (numbers[1] - 48);
  164|    188|    if (l < 70)
  ------------------
  |  Branch (164:9): [True: 56, False: 132]
  ------------------
  165|     56|      l += 2000;
  166|    132|    else
  167|    132|      l += 1900;
  168|    188|    os << l << ":";
  169|       |    // month, day, hour, minutes
  170|    188|    os << numbers[2] << numbers[3] << ":" << numbers[4] << numbers[5] << " " << numbers[6] << numbers[7] << ":"
  171|    188|       << numbers[8] << numbers[9];
  172|       |    // optional seconds
  173|    188|    if (numbers.size() == 12) {
  ------------------
  |  Branch (173:9): [True: 86, False: 102]
  ------------------
  174|     86|      os << ":" << numbers[10] << numbers[11];
  175|     86|    }
  176|    188|  } else
  177|    140|    os << value;
  178|    328|  return os;
  179|    328|}
_ZN5Exiv28Internal15Casio2MakerNote11print0x2001ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  448|    152|std::ostream& Casio2MakerNote::print0x2001(std::ostream& os, const Value& value, const ExifData*) {
  449|       |  // format is:  "YYMM#00#00DDHH#00#00MM#00#00#00#00"
  450|    152|  std::vector<char> numbers;
  451|  5.30k|  for (size_t i = 0; i < value.size(); i++) {
  ------------------
  |  Branch (451:22): [True: 5.15k, False: 152]
  ------------------
  452|  5.15k|    const auto l = value.toInt64(i);
  453|  5.15k|    if (l != 0) {
  ------------------
  |  Branch (453:9): [True: 2.71k, False: 2.44k]
  ------------------
  454|  2.71k|      numbers.push_back(l);
  455|  2.71k|    }
  456|  5.15k|  }
  457|       |
  458|    152|  if (numbers.size() >= 10) {
  ------------------
  |  Branch (458:7): [True: 74, False: 78]
  ------------------
  459|       |    // year
  460|     74|    long l = ((numbers[0] - 48) * 10) + (numbers[1] - 48);
  461|     74|    if (l < 70)
  ------------------
  |  Branch (461:9): [True: 30, False: 44]
  ------------------
  462|     30|      l += 2000;
  463|     44|    else
  464|     44|      l += 1900;
  465|     74|    os << l << ":";
  466|       |    // month, day, hour, minutes
  467|     74|    os << numbers[2] << numbers[3] << ":" << numbers[4] << numbers[5] << " " << numbers[6] << numbers[7] << ":"
  468|     74|       << numbers[8] << numbers[9];
  469|     74|  } else
  470|     78|    os << value;
  471|    152|  return os;
  472|    152|}
_ZN5Exiv28Internal15Casio2MakerNote11print0x2022ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  474|     90|std::ostream& Casio2MakerNote::print0x2022(std::ostream& os, const Value& value, const ExifData*) {
  475|     90|  if (value.toInt64() >= 0x20000000) {
  ------------------
  |  Branch (475:7): [True: 16, False: 74]
  ------------------
  476|     16|    return os << N_("Inf");
  ------------------
  |  |   41|     16|#define N_(String) String
  ------------------
  477|     16|  }
  478|     74|  return os << stringFormat("{:.2f} m", value.toInt64() / 1000.0);
  ------------------
  |  |   18|     74|#define stringFormat std::format
  ------------------
  479|     90|}

_ZN5Exiv28Internal14CasioMakerNote7tagListEv:
   34|  26.1k|  static constexpr auto tagList() {
   35|  26.1k|    return tagInfo_;
   36|  26.1k|  }
_ZN5Exiv28Internal15Casio2MakerNote7tagListEv:
   52|  34.4k|  static constexpr auto tagList() {
   53|  34.4k|    return tagInfo_;
   54|  34.4k|  }

_ZN5Exiv29ConverterC2ERNS_8ExifDataERNS_7XmpDataE:
  495|    635|    exifData_(&exifData), iptcData_(nullptr), xmpData_(&xmpData), iptcCharset_(nullptr) {
  496|    635|}
_ZN5Exiv29ConverterC2ERNS_8IptcDataERNS_7XmpDataEPKc:
  499|    635|    exifData_(nullptr), iptcData_(&iptcData), xmpData_(&xmpData), iptcCharset_(iptcCharset) {
  500|    635|}
_ZN5Exiv29Converter10cnvFromXmpEv:
  510|  1.27k|void Converter::cnvFromXmp() {
  511|   160k|  for (auto&& c : conversion_) {
  ------------------
  |  Branch (511:17): [True: 160k, False: 1.27k]
  ------------------
  512|   160k|    if ((c.metadataId_ == mdExif && exifData_) || (c.metadataId_ == mdIptc && iptcData_)) {
  ------------------
  |  Branch (512:10): [True: 132k, False: 27.9k]
  |  Branch (512:37): [True: 66.0k, False: 66.0k]
  |  Branch (512:52): [True: 27.9k, False: 66.0k]
  |  Branch (512:79): [True: 13.9k, False: 13.9k]
  ------------------
  513|  80.0k|      std::invoke(c.key2ToKey1_, *this, c.key2_, c.key1_);
  514|  80.0k|    }
  515|   160k|  }
  516|  1.27k|}
_ZN5Exiv29Converter17prepareExifTargetEPKcb:
  521|  1.43k|bool Converter::prepareExifTarget(const char* to, bool force) {
  522|  1.43k|  auto pos = exifData_->findKey(ExifKey(to));
  523|  1.43k|  if (pos == exifData_->end())
  ------------------
  |  Branch (523:7): [True: 1.43k, False: 0]
  ------------------
  524|  1.43k|    return true;
  525|      0|  if (!overwrite_ && !force)
  ------------------
  |  Branch (525:7): [True: 0, False: 0]
  |  Branch (525:22): [True: 0, False: 0]
  ------------------
  526|      0|    return false;
  527|      0|  exifData_->erase(pos);
  528|      0|  return true;
  529|      0|}
_ZN5Exiv29Converter17prepareIptcTargetEPKcb:
  531|    148|bool Converter::prepareIptcTarget(const char* to, bool force) {
  532|    148|  auto pos = iptcData_->findKey(IptcKey(to));
  533|    148|  if (pos == iptcData_->end())
  ------------------
  |  Branch (533:7): [True: 148, False: 0]
  ------------------
  534|    148|    return true;
  535|      0|  if (!overwrite_ && !force)
  ------------------
  |  Branch (535:7): [True: 0, False: 0]
  |  Branch (535:22): [True: 0, False: 0]
  ------------------
  536|      0|    return false;
  537|      0|  while ((pos = iptcData_->findKey(IptcKey(to))) != iptcData_->end()) {
  ------------------
  |  Branch (537:10): [True: 0, False: 0]
  ------------------
  538|      0|    iptcData_->erase(pos);
  539|      0|  }
  540|      0|  return true;
  541|      0|}
_ZN5Exiv29Converter11cnvXmpValueEPKcS2_:
  844|  57.1k|void Converter::cnvXmpValue(const char* from, const char* to) {
  845|  57.1k|  auto pos = xmpData_->findKey(XmpKey(from));
  846|  57.1k|  if (pos == xmpData_->end())
  ------------------
  |  Branch (846:7): [True: 57.1k, False: 8]
  ------------------
  847|  57.1k|    return;
  848|      8|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (848:7): [True: 0, False: 8]
  ------------------
  849|      0|    return;
  850|      8|  std::string value;
  851|      8|  if (!getTextValue(value, pos)) {
  ------------------
  |  Branch (851:7): [True: 0, False: 8]
  ------------------
  852|      0|#ifndef SUPPRESS_WARNINGS
  853|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  854|      0|#endif
  855|      0|    return;
  856|      0|  }
  857|       |  // Todo: Escape non-ASCII characters in XMP text values
  858|      8|  ExifKey key(to);
  859|      8|  if (auto ed = Exifdatum(key); ed.setValue(value) == 0) {
  ------------------
  |  Branch (859:33): [True: 0, False: 8]
  ------------------
  860|      0|    exifData_->add(ed);
  861|      0|  }
  862|      8|  if (erase_)
  ------------------
  |  Branch (862:7): [True: 0, False: 8]
  ------------------
  863|      0|    xmpData_->erase(pos);
  864|      8|}
_ZN5Exiv29Converter13cnvXmpCommentEPKcS2_:
  866|    635|void Converter::cnvXmpComment(const char* from, const char* to) {
  867|    635|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (867:7): [True: 0, False: 635]
  ------------------
  868|      0|    return;
  869|    635|  auto pos = xmpData_->findKey(XmpKey(from));
  870|    635|  if (pos == xmpData_->end())
  ------------------
  |  Branch (870:7): [True: 635, False: 0]
  ------------------
  871|    635|    return;
  872|      0|  std::string value;
  873|      0|  if (!getTextValue(value, pos)) {
  ------------------
  |  Branch (873:7): [True: 0, False: 0]
  ------------------
  874|      0|#ifndef SUPPRESS_WARNINGS
  875|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  876|      0|#endif
  877|      0|    return;
  878|      0|  }
  879|       |  // Assumes the XMP value is encoded in UTF-8, as it should be
  880|      0|  (*exifData_)[to] = "charset=Unicode " + value;
  881|      0|  if (erase_)
  ------------------
  |  Branch (881:7): [True: 0, False: 0]
  ------------------
  882|      0|    xmpData_->erase(pos);
  883|      0|}
_ZN5Exiv29Converter11cnvXmpArrayEPKcS2_:
  885|    635|void Converter::cnvXmpArray(const char* from, const char* to) {
  886|    635|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (886:7): [True: 0, False: 635]
  ------------------
  887|      0|    return;
  888|    635|  auto pos = xmpData_->findKey(XmpKey(from));
  889|    635|  if (pos == xmpData_->end())
  ------------------
  |  Branch (889:7): [True: 635, False: 0]
  ------------------
  890|    635|    return;
  891|      0|  std::string array;
  892|      0|  for (size_t i = 0; i < pos->count(); ++i) {
  ------------------
  |  Branch (892:22): [True: 0, False: 0]
  ------------------
  893|      0|    std::string value = pos->toString(i);
  894|      0|    if (!pos->value().ok()) {
  ------------------
  |  Branch (894:9): [True: 0, False: 0]
  ------------------
  895|      0|#ifndef SUPPRESS_WARNINGS
  896|      0|      EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  897|      0|#endif
  898|      0|      return;
  899|      0|    }
  900|      0|    array += value;
  901|      0|    if (i != pos->count() - 1)
  ------------------
  |  Branch (901:9): [True: 0, False: 0]
  ------------------
  902|      0|      array += " ";
  903|      0|  }
  904|      0|  (*exifData_)[to] = array;
  905|      0|  if (erase_)
  ------------------
  |  Branch (905:7): [True: 0, False: 0]
  ------------------
  906|      0|    xmpData_->erase(pos);
  907|      0|}
_ZN5Exiv29Converter10cnvXmpDateEPKcS2_:
  909|  2.54k|void Converter::cnvXmpDate(const char* from, const char* to) {
  910|  2.54k|  auto pos = xmpData_->findKey(XmpKey(from));
  911|  2.54k|  if (pos == xmpData_->end())
  ------------------
  |  Branch (911:7): [True: 2.39k, False: 148]
  ------------------
  912|  2.39k|    return;
  913|    148|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (913:7): [True: 0, False: 148]
  ------------------
  914|      0|    return;
  915|    148|#ifdef EXV_HAVE_XMP_TOOLKIT
  916|    148|  std::string value = pos->toString();
  917|    148|  if (!pos->value().ok()) {
  ------------------
  |  Branch (917:7): [True: 0, False: 148]
  ------------------
  918|      0|#ifndef SUPPRESS_WARNINGS
  919|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  920|      0|#endif
  921|      0|    return;
  922|      0|  }
  923|    148|  XMP_DateTime datetime;
  924|    148|  try {
  925|    148|    SXMPUtils::ConvertToDate(value, &datetime);
  926|    148|    if (std::string(to) != "Exif.GPSInfo.GPSTimeStamp") {
  ------------------
  |  Branch (926:9): [True: 60, False: 88]
  ------------------
  927|     60|      SXMPUtils::ConvertToLocalTime(&datetime);
  928|       |
  929|     60|      (*exifData_)[to] = stringFormat("{:4}:{:02}:{:02} {:02}:{:02}:{:02}", datetime.year, datetime.month, datetime.day,
  ------------------
  |  |   18|     60|#define stringFormat std::format
  ------------------
  930|     60|                                      datetime.hour, datetime.minute, datetime.second);
  931|       |
  932|     60|      if (datetime.nanoSecond) {
  ------------------
  |  Branch (932:11): [True: 8, False: 52]
  ------------------
  933|      8|        const char* subsecTag = nullptr;
  934|      8|        if (std::string(to) == "Exif.Image.DateTime") {
  ------------------
  |  Branch (934:13): [True: 0, False: 8]
  ------------------
  935|      0|          subsecTag = "Exif.Photo.SubSecTime";
  936|      8|        } else if (std::string(to) == "Exif.Photo.DateTimeOriginal") {
  ------------------
  |  Branch (936:20): [True: 0, False: 8]
  ------------------
  937|      0|          subsecTag = "Exif.Photo.SubSecTimeOriginal";
  938|      8|        } else if (std::string(to) == "Exif.Photo.DateTimeDigitized") {
  ------------------
  |  Branch (938:20): [True: 8, False: 0]
  ------------------
  939|      8|          subsecTag = "Exif.Photo.SubSecTimeDigitized";
  940|      8|        }
  941|      8|        if (subsecTag) {
  ------------------
  |  Branch (941:13): [True: 8, False: 0]
  ------------------
  942|      8|          prepareExifTarget(subsecTag, true);
  943|      8|          (*exifData_)[subsecTag] = std::to_string(datetime.nanoSecond);
  944|      8|        }
  945|      8|      }
  946|     88|    } else {  // "Exif.GPSInfo.GPSTimeStamp"
  947|       |      // Ignore the time zone, assuming the time is in UTC as it should be
  948|       |
  949|     88|      URational rhour(datetime.hour, 1);
  950|     88|      URational rmin(datetime.minute, 1);
  951|     88|      URational rsec(datetime.second, 1);
  952|     88|      if (datetime.nanoSecond != 0) {
  ------------------
  |  Branch (952:11): [True: 0, False: 88]
  ------------------
  953|      0|        if (datetime.second != 0) {
  ------------------
  |  Branch (953:13): [True: 0, False: 0]
  ------------------
  954|       |          // Add the seconds to rmin so that the ns fit into rsec
  955|      0|          rmin.second = 60;
  956|      0|          rmin.first *= 60;
  957|      0|          rmin.first += datetime.second;
  958|      0|        }
  959|      0|        rsec.second = 1000000000;
  960|      0|        rsec.first = datetime.nanoSecond;
  961|      0|      }
  962|       |
  963|     88|      std::ostringstream array;
  964|     88|      array << rhour << " " << rmin << " " << rsec;
  965|     88|      (*exifData_)[to] = array.str();
  966|       |
  967|     88|      prepareExifTarget("Exif.GPSInfo.GPSDateStamp", true);
  968|     88|      (*exifData_)["Exif.GPSInfo.GPSDateStamp"] =
  969|     88|          stringFormat("{:4}:{:02}:{:02}", datetime.year, datetime.month, datetime.day);
  ------------------
  |  |   18|     88|#define stringFormat std::format
  ------------------
  970|     88|    }
  971|    148|  }
  972|    148|#ifndef SUPPRESS_WARNINGS
  973|    148|  catch (const XMP_Error& e) {
  974|     88|    EXV_WARNING << "Failed to convert " << from << " to " << to << " (" << e.GetErrMsg() << ")\n";
  ------------------
  |  |  138|     88|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 88]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     88|  LogMsg(LogMsg::warn).os()
  ------------------
  975|     88|    return;
  976|     88|  }
  977|       |#else
  978|       |  catch (const XMP_Error&) {
  979|       |    return;
  980|       |  }
  981|       |#endif  // SUPPRESS_WARNINGS
  982|       |
  983|     60|  if (erase_)
  ------------------
  |  Branch (983:7): [True: 0, False: 60]
  ------------------
  984|      0|    xmpData_->erase(pos);
  985|       |#else
  986|       |#ifndef SUPPRESS_WARNINGS
  987|       |  EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  988|       |#endif
  989|       |#endif  // !EXV_HAVE_XMP_TOOLKIT
  990|     60|}
_ZN5Exiv29Converter13cnvXmpVersionEPKcS2_:
  992|  1.27k|void Converter::cnvXmpVersion(const char* from, const char* to) {
  993|  1.27k|  auto pos = xmpData_->findKey(XmpKey(from));
  994|  1.27k|  if (pos == xmpData_->end())
  ------------------
  |  Branch (994:7): [True: 1.27k, False: 0]
  ------------------
  995|  1.27k|    return;
  996|      0|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (996:7): [True: 0, False: 0]
  ------------------
  997|      0|    return;
  998|      0|  std::string value = pos->toString();
  999|      0|  if (!pos->value().ok() || value.length() < 4) {
  ------------------
  |  Branch (999:7): [True: 0, False: 0]
  |  Branch (999:29): [True: 0, False: 0]
  ------------------
 1000|      0|#ifndef SUPPRESS_WARNINGS
 1001|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1002|      0|#endif
 1003|      0|    return;
 1004|      0|  }
 1005|       |
 1006|      0|  (*exifData_)[to] = stringFormat("{} {} {} {}", static_cast<int>(value[0]), static_cast<int>(value[1]),
  ------------------
  |  |   18|      0|#define stringFormat std::format
  ------------------
 1007|      0|                                  static_cast<int>(value[2]), static_cast<int>(value[3]));
 1008|      0|  if (erase_)
  ------------------
  |  Branch (1008:7): [True: 0, False: 0]
  ------------------
 1009|      0|    xmpData_->erase(pos);
 1010|      0|}
_ZN5Exiv29Converter16cnvXmpGPSVersionEPKcS2_:
 1012|    635|void Converter::cnvXmpGPSVersion(const char* from, const char* to) {
 1013|    635|  auto pos = xmpData_->findKey(XmpKey(from));
 1014|    635|  if (pos == xmpData_->end())
  ------------------
  |  Branch (1014:7): [True: 635, False: 0]
  ------------------
 1015|    635|    return;
 1016|      0|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (1016:7): [True: 0, False: 0]
  ------------------
 1017|      0|    return;
 1018|      0|  std::string value = pos->toString();
 1019|      0|  if (!pos->value().ok()) {
  ------------------
  |  Branch (1019:7): [True: 0, False: 0]
  ------------------
 1020|      0|#ifndef SUPPRESS_WARNINGS
 1021|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1022|      0|#endif
 1023|      0|    return;
 1024|      0|  }
 1025|       |
 1026|      0|  std::replace(value.begin(), value.end(), '.', ' ');
 1027|      0|  (*exifData_)[to] = value;
 1028|      0|  if (erase_)
  ------------------
  |  Branch (1028:7): [True: 0, False: 0]
  ------------------
 1029|      0|    xmpData_->erase(pos);
 1030|      0|}
_ZN5Exiv29Converter11cnvXmpFlashEPKcS2_:
 1032|    635|void Converter::cnvXmpFlash(const char* from, const char* to) {
 1033|    635|  auto pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Fired"));
 1034|    635|  if (pos == xmpData_->end())
  ------------------
  |  Branch (1034:7): [True: 635, False: 0]
  ------------------
 1035|    635|    return;
 1036|      0|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (1036:7): [True: 0, False: 0]
  ------------------
 1037|      0|    return;
 1038|      0|  unsigned short value = 0;
 1039|       |
 1040|      0|  if (pos != xmpData_->end() && pos->count() > 0) {
  ------------------
  |  Branch (1040:7): [True: 0, False: 0]
  |  Branch (1040:7): [True: 0, False: 0]
  |  Branch (1040:33): [True: 0, False: 0]
  ------------------
 1041|      0|    auto fired = pos->toUint32();
 1042|      0|    if (pos->value().ok())
  ------------------
  |  Branch (1042:9): [True: 0, False: 0]
  ------------------
 1043|      0|      value |= fired & 1;
 1044|      0|#ifndef SUPPRESS_WARNINGS
 1045|      0|    else
 1046|      0|      EXV_WARNING << "Failed to convert " << std::string(from) << "/exif:Fired"
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1047|      0|                  << " to " << to << "\n";
 1048|      0|#endif
 1049|      0|  }
 1050|      0|  pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Return"));
 1051|      0|  if (pos != xmpData_->end() && pos->count() > 0) {
  ------------------
  |  Branch (1051:7): [True: 0, False: 0]
  |  Branch (1051:7): [True: 0, False: 0]
  |  Branch (1051:33): [True: 0, False: 0]
  ------------------
 1052|      0|    auto ret = pos->toUint32();
 1053|      0|    if (pos->value().ok())
  ------------------
  |  Branch (1053:9): [True: 0, False: 0]
  ------------------
 1054|      0|      value |= (ret & 3) << 1;
 1055|      0|#ifndef SUPPRESS_WARNINGS
 1056|      0|    else
 1057|      0|      EXV_WARNING << "Failed to convert " << std::string(from) << "/exif:Return"
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1058|      0|                  << " to " << to << "\n";
 1059|      0|#endif
 1060|      0|  }
 1061|      0|  pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Mode"));
 1062|      0|  if (pos != xmpData_->end() && pos->count() > 0) {
  ------------------
  |  Branch (1062:7): [True: 0, False: 0]
  |  Branch (1062:7): [True: 0, False: 0]
  |  Branch (1062:33): [True: 0, False: 0]
  ------------------
 1063|      0|    auto mode = pos->toUint32();
 1064|      0|    if (pos->value().ok())
  ------------------
  |  Branch (1064:9): [True: 0, False: 0]
  ------------------
 1065|      0|      value |= (mode & 3) << 3;
 1066|      0|#ifndef SUPPRESS_WARNINGS
 1067|      0|    else
 1068|      0|      EXV_WARNING << "Failed to convert " << std::string(from) << "/exif:Mode"
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1069|      0|                  << " to " << to << "\n";
 1070|      0|#endif
 1071|      0|  }
 1072|      0|  pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Function"));
 1073|      0|  if (pos != xmpData_->end() && pos->count() > 0) {
  ------------------
  |  Branch (1073:7): [True: 0, False: 0]
  |  Branch (1073:7): [True: 0, False: 0]
  |  Branch (1073:33): [True: 0, False: 0]
  ------------------
 1074|      0|    auto function = pos->toUint32();
 1075|      0|    if (pos->value().ok())
  ------------------
  |  Branch (1075:9): [True: 0, False: 0]
  ------------------
 1076|      0|      value |= (function & 1) << 5;
 1077|      0|#ifndef SUPPRESS_WARNINGS
 1078|      0|    else
 1079|      0|      EXV_WARNING << "Failed to convert " << std::string(from) << "/exif:Function"
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1080|      0|                  << " to " << to << "\n";
 1081|      0|#endif
 1082|      0|  }
 1083|      0|  pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:RedEyeMode"));
 1084|      0|  if (pos != xmpData_->end()) {
  ------------------
  |  Branch (1084:7): [True: 0, False: 0]
  ------------------
 1085|      0|    if (pos->count() > 0) {
  ------------------
  |  Branch (1085:9): [True: 0, False: 0]
  ------------------
 1086|      0|      auto red = pos->toUint32();
 1087|      0|      if (pos->value().ok())
  ------------------
  |  Branch (1087:11): [True: 0, False: 0]
  ------------------
 1088|      0|        value |= (red & 1) << 6;
 1089|      0|#ifndef SUPPRESS_WARNINGS
 1090|      0|      else
 1091|      0|        EXV_WARNING << "Failed to convert " << std::string(from) << "/exif:RedEyeMode"
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1092|      0|                    << " to " << to << "\n";
 1093|      0|#endif
 1094|      0|    }
 1095|      0|    if (erase_)
  ------------------
  |  Branch (1095:9): [True: 0, False: 0]
  ------------------
 1096|      0|      xmpData_->erase(pos);
 1097|      0|  }
 1098|       |
 1099|      0|  (*exifData_)[to] = value;
 1100|      0|}
_ZN5Exiv29Converter14cnvXmpGPSCoordEPKcS2_:
 1102|  2.54k|void Converter::cnvXmpGPSCoord(const char* from, const char* to) {
 1103|  2.54k|  auto pos = xmpData_->findKey(XmpKey(from));
 1104|  2.54k|  if (pos == xmpData_->end())
  ------------------
  |  Branch (1104:7): [True: 2.54k, False: 0]
  ------------------
 1105|  2.54k|    return;
 1106|      0|  if (!prepareExifTarget(to))
  ------------------
  |  Branch (1106:7): [True: 0, False: 0]
  ------------------
 1107|      0|    return;
 1108|      0|  std::string value = pos->toString();
 1109|      0|  if (!pos->value().ok()) {
  ------------------
  |  Branch (1109:7): [True: 0, False: 0]
  ------------------
 1110|      0|#ifndef SUPPRESS_WARNINGS
 1111|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1112|      0|#endif
 1113|      0|    return;
 1114|      0|  }
 1115|      0|  if (value.empty()) {
  ------------------
  |  Branch (1115:7): [True: 0, False: 0]
  ------------------
 1116|      0|#ifndef SUPPRESS_WARNINGS
 1117|      0|    EXV_WARNING << from << " is empty\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1118|      0|#endif
 1119|      0|    return;
 1120|      0|  }
 1121|       |
 1122|      0|  double deg = 0.0;
 1123|      0|  double min = 0.0;
 1124|      0|  double sec = 0.0;
 1125|      0|  char ref = value.back();
 1126|      0|  char sep1 = '\0';
 1127|      0|  char sep2 = '\0';
 1128|       |
 1129|      0|  value.pop_back();
 1130|       |
 1131|      0|  std::istringstream in(value);
 1132|       |
 1133|      0|  in >> deg >> sep1 >> min >> sep2;
 1134|       |
 1135|      0|  if (sep2 == ',') {
  ------------------
  |  Branch (1135:7): [True: 0, False: 0]
  ------------------
 1136|      0|    in >> sec;
 1137|      0|  } else {
 1138|      0|    sec = (min - static_cast<int>(min)) * 60.0;
 1139|      0|    min = static_cast<double>(static_cast<int>(min));
 1140|      0|  }
 1141|       |
 1142|      0|  if (in.bad() || (ref != 'N' && ref != 'S' && ref != 'E' && ref != 'W') || sep1 != ',' || !in.eof()) {
  ------------------
  |  Branch (1142:7): [True: 0, False: 0]
  |  Branch (1142:20): [True: 0, False: 0]
  |  Branch (1142:34): [True: 0, False: 0]
  |  Branch (1142:48): [True: 0, False: 0]
  |  Branch (1142:62): [True: 0, False: 0]
  |  Branch (1142:77): [True: 0, False: 0]
  |  Branch (1142:92): [True: 0, False: 0]
  ------------------
 1143|      0|#ifndef SUPPRESS_WARNINGS
 1144|      0|    EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1145|      0|#endif
 1146|      0|    return;
 1147|      0|  }
 1148|       |
 1149|      0|  Rational rdeg = floatToRationalCast(static_cast<float>(deg));
 1150|      0|  Rational rmin = floatToRationalCast(static_cast<float>(min));
 1151|      0|  Rational rsec = floatToRationalCast(static_cast<float>(sec));
 1152|       |
 1153|      0|  std::ostringstream array;
 1154|      0|  array << rdeg << " " << rmin << " " << rsec;
 1155|      0|  (*exifData_)[to] = array.str();
 1156|       |
 1157|      0|  prepareExifTarget((std::string(to) + "Ref").c_str(), true);
 1158|      0|  char ref_str[2] = {ref, 0};
 1159|      0|  (*exifData_)[std::string(to) + "Ref"] = ref_str;
 1160|       |
 1161|      0|  if (erase_)
  ------------------
  |  Branch (1161:7): [True: 0, False: 0]
  ------------------
 1162|      0|    xmpData_->erase(pos);
 1163|      0|}
_ZN5Exiv29Converter17cnvXmpValueToIptcEPKcS2_:
 1193|  13.9k|void Converter::cnvXmpValueToIptc(const char* from, const char* to) {
 1194|  13.9k|  auto pos = xmpData_->findKey(XmpKey(from));
 1195|  13.9k|  if (pos == xmpData_->end())
  ------------------
  |  Branch (1195:7): [True: 13.8k, False: 148]
  ------------------
 1196|  13.8k|    return;
 1197|    148|  if (!prepareIptcTarget(to))
  ------------------
  |  Branch (1197:7): [True: 0, False: 148]
  ------------------
 1198|      0|    return;
 1199|       |
 1200|    148|  if (pos->typeId() == langAlt || pos->typeId() == xmpText) {
  ------------------
  |  Branch (1200:7): [True: 0, False: 148]
  |  Branch (1200:35): [True: 148, False: 0]
  ------------------
 1201|    148|    std::string value;
 1202|    148|    if (!getTextValue(value, pos)) {
  ------------------
  |  Branch (1202:9): [True: 0, False: 148]
  ------------------
 1203|      0|#ifndef SUPPRESS_WARNINGS
 1204|      0|      EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1205|      0|#endif
 1206|      0|      return;
 1207|      0|    }
 1208|    148|    (*iptcData_)[to] = value;
 1209|    148|    (*iptcData_)["Iptc.Envelope.CharacterSet"] = "\033%G";  // indicate UTF-8 encoding
 1210|    148|    if (erase_)
  ------------------
  |  Branch (1210:9): [True: 0, False: 148]
  ------------------
 1211|      0|      xmpData_->erase(pos);
 1212|    148|    return;
 1213|    148|  }
 1214|       |
 1215|      0|  size_t count = pos->count();
 1216|      0|  bool added = false;
 1217|      0|  for (size_t i = 0; i < count; ++i) {
  ------------------
  |  Branch (1217:22): [True: 0, False: 0]
  ------------------
 1218|      0|    std::string value = pos->toString(i);
 1219|      0|    if (!pos->value().ok()) {
  ------------------
  |  Branch (1219:9): [True: 0, False: 0]
  ------------------
 1220|      0|#ifndef SUPPRESS_WARNINGS
 1221|      0|      EXV_WARNING << "Failed to convert " << from << " to " << to << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1222|      0|#endif
 1223|      0|      continue;
 1224|      0|    }
 1225|      0|    IptcKey key(to);
 1226|      0|    Iptcdatum id(key);
 1227|      0|    id.setValue(value);
 1228|      0|    iptcData_->add(id);
 1229|      0|    added = true;
 1230|      0|  }
 1231|      0|  if (added)
  ------------------
  |  Branch (1231:7): [True: 0, False: 0]
  ------------------
 1232|      0|    (*iptcData_)["Iptc.Envelope.CharacterSet"] = "\033%G";  // indicate UTF-8 encoding
 1233|      0|  if (erase_)
  ------------------
  |  Branch (1233:7): [True: 0, False: 0]
  ------------------
 1234|      0|    xmpData_->erase(pos);
 1235|      0|}
_ZN5Exiv213copyXmpToExifERKNS_7XmpDataERNS_8ExifDataE:
 1330|    635|void copyXmpToExif(const XmpData& xmpData, ExifData& exifData) {
 1331|    635|  Converter converter(exifData, const_cast<XmpData&>(xmpData));
 1332|    635|  converter.cnvFromXmp();
 1333|    635|}
_ZN5Exiv213copyXmpToIptcERKNS_7XmpDataERNS_8IptcDataE:
 1368|    635|void copyXmpToIptc(const XmpData& xmpData, IptcData& iptcData) {
 1369|    635|  Converter converter(iptcData, const_cast<XmpData&>(xmpData));
 1370|    635|  converter.cnvFromXmp();
 1371|    635|}
_ZN5Exiv220convertStringCharsetERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPKcS9_:
 1380|  4.37k|bool convertStringCharset([[maybe_unused]] std::string& str, const char* from, const char* to) {
 1381|  4.37k|  if (0 == strcmp(from, to))
  ------------------
  |  Branch (1381:7): [True: 112, False: 4.26k]
  ------------------
 1382|    112|    return true;  // nothing to do
 1383|  4.26k|#ifdef EXV_HAVE_ICONV
 1384|  4.26k|  return convertStringCharsetIconv(str, from, to);
 1385|       |#elif defined _WIN32
 1386|       |  return convertStringCharsetWindows(str, from, to);
 1387|       |#else
 1388|       |#ifndef SUPPRESS_WARNINGS
 1389|       |  EXV_WARNING << "Charset conversion required but no character mapping functionality available.\n";
 1390|       |#endif
 1391|       |  return false;
 1392|       |#endif
 1393|  4.37k|}
convert.cpp:_ZN12_GLOBAL__N_125convertStringCharsetIconvERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS0_17basic_string_viewIcS3_EES9_:
 1402|  4.26k|bool convertStringCharsetIconv(std::string& str, std::string_view from, std::string_view to) {
 1403|  4.26k|  if (from == to)
  ------------------
  |  Branch (1403:7): [True: 0, False: 4.26k]
  ------------------
 1404|      0|    return true;  // nothing to do
 1405|       |
 1406|  4.26k|  bool ret = true;
 1407|  4.26k|  auto cd = iconv_open(to.data(), from.data());
 1408|  4.26k|  if (cd == iconv_t(-1)) {
  ------------------
  |  Branch (1408:7): [True: 0, False: 4.26k]
  ------------------
 1409|      0|#ifndef SUPPRESS_WARNINGS
 1410|      0|    EXV_WARNING << "iconv_open: " << strError() << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1411|      0|#endif
 1412|      0|    return false;
 1413|      0|  }
 1414|  4.26k|  std::string outstr;
 1415|       |#ifdef WINICONV_CONST
 1416|       |  auto inptr = (WINICONV_CONST char*)(str.c_str());
 1417|       |#else
 1418|  4.26k|  auto inptr = (EXV_ICONV_CONST char*)(str.c_str());
 1419|  4.26k|#endif
 1420|  4.26k|  size_t inbytesleft = str.length();
 1421|  13.9k|  while (inbytesleft) {
  ------------------
  |  Branch (1421:10): [True: 12.0k, False: 1.89k]
  ------------------
 1422|  12.0k|    char outbuf[256];
 1423|  12.0k|    char* outptr = outbuf;
 1424|  12.0k|    size_t outbytesleft = sizeof(outbuf);
 1425|  12.0k|    size_t rc = iconv(cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
 1426|  12.0k|    const size_t outbytesProduced = sizeof(outbuf) - outbytesleft;
 1427|  12.0k|    if (rc == std::numeric_limits<size_t>::max() && errno != E2BIG) {
  ------------------
  |  Branch (1427:9): [True: 10.6k, False: 1.32k]
  |  Branch (1427:53): [True: 2.37k, False: 8.32k]
  ------------------
 1428|  2.37k|#ifndef SUPPRESS_WARNINGS
 1429|  2.37k|      EXV_WARNING << "iconv: " << strError() << " inbytesleft = " << inbytesleft << "\n";
  ------------------
  |  |  138|  2.37k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 2.37k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  2.37k|  LogMsg(LogMsg::warn).os()
  ------------------
 1430|  2.37k|#endif
 1431|  2.37k|      ret = false;
 1432|  2.37k|      break;
 1433|  2.37k|    }
 1434|  9.65k|    outstr.append(std::string(outbuf, outbytesProduced));
 1435|  9.65k|  }
 1436|       |
 1437|  4.26k|  if (cd)
  ------------------
  |  Branch (1437:7): [True: 4.26k, False: 0]
  ------------------
 1438|  4.26k|    iconv_close(cd);
 1439|       |
 1440|  4.26k|  if (ret)
  ------------------
  |  Branch (1440:7): [True: 1.89k, False: 2.37k]
  ------------------
 1441|  1.89k|    str = std::move(outstr);
 1442|  4.26k|  return ret;
 1443|  4.26k|}
convert.cpp:_ZN12_GLOBAL__N_112getTextValueERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS0_11__wrap_iterIPN5Exiv28XmpdatumEEE:
 1592|    156|bool getTextValue(std::string& value, XmpData::iterator pos) {
 1593|    156|  if (pos->typeId() == langAlt) {
  ------------------
  |  Branch (1593:7): [True: 0, False: 156]
  ------------------
 1594|       |    // get the default language entry without x-default qualifier
 1595|      0|    value = pos->toString(0);
 1596|      0|    if (!pos->value().ok() && pos->count() == 1) {
  ------------------
  |  Branch (1596:9): [True: 0, False: 0]
  |  Branch (1596:31): [True: 0, False: 0]
  ------------------
 1597|       |      // If there is no default but exactly one entry, take that
 1598|       |      // without the qualifier
 1599|      0|      value = pos->toString();
 1600|      0|      if (pos->value().ok() && value.starts_with("lang=")) {
  ------------------
  |  Branch (1600:11): [True: 0, False: 0]
  |  Branch (1600:32): [True: 0, False: 0]
  ------------------
 1601|      0|        const std::string::size_type first_space_pos = value.find_first_of(' ');
 1602|      0|        if (first_space_pos != std::string::npos) {
  ------------------
  |  Branch (1602:13): [True: 0, False: 0]
  ------------------
 1603|      0|          value = value.substr(first_space_pos + 1);
 1604|      0|        } else {
 1605|      0|          value.clear();
 1606|      0|        }
 1607|      0|      }
 1608|      0|    }
 1609|    156|  } else {
 1610|    156|    value = pos->toString();
 1611|    156|  }
 1612|    156|  return pos->value().ok();
 1613|    156|}

_ZN5Exiv28Internal9Cr2HeaderC2ENS_9ByteOrderE:
   14|  32.9k|Cr2Header::Cr2Header(ByteOrder byteOrder) : TiffHeaderBase(42, 16, byteOrder, 0x00000010) {
   15|  32.9k|}
_ZN5Exiv28Internal9Cr2Header4readEPKhm:
   17|  32.9k|bool Cr2Header::read(const byte* pData, size_t size) {
   18|  32.9k|  if (!pData || size < 16) {
  ------------------
  |  Branch (18:7): [True: 0, False: 32.9k]
  |  Branch (18:17): [True: 0, False: 32.9k]
  ------------------
   19|      0|    return false;
   20|      0|  }
   21|       |
   22|  32.9k|  if (pData[0] == 'I' && pData[0] == pData[1]) {
  ------------------
  |  Branch (22:7): [True: 1.74k, False: 31.2k]
  |  Branch (22:26): [True: 1.72k, False: 20]
  ------------------
   23|  1.72k|    setByteOrder(littleEndian);
   24|  31.2k|  } else if (pData[0] == 'M' && pData[0] == pData[1]) {
  ------------------
  |  Branch (24:14): [True: 17.5k, False: 13.7k]
  |  Branch (24:33): [True: 17.5k, False: 18]
  ------------------
   25|  17.5k|    setByteOrder(bigEndian);
   26|  17.5k|  } else {
   27|  13.7k|    return false;
   28|  13.7k|  }
   29|  19.2k|  if (tag() != getUShort(pData + 2, byteOrder()))
  ------------------
  |  Branch (29:7): [True: 2.65k, False: 16.5k]
  ------------------
   30|  2.65k|    return false;
   31|  16.5k|  setOffset(getULong(pData + 4, byteOrder()));
   32|  16.5k|  if (!std::equal(cr2sig_, cr2sig_ + 4, pData + 8))
  ------------------
  |  Branch (32:7): [True: 13.6k, False: 2.91k]
  ------------------
   33|  13.6k|    return false;
   34|  2.91k|  offset2_ = getULong(pData + 12, byteOrder());
   35|       |
   36|  2.91k|  return true;
   37|  16.5k|}

_ZN5Exiv28Cr2ImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   24|    728|    Image(ImageType::cr2, mdExif | mdIptc | mdXmp, std::move(io), params) {
   25|    728|}  // Cr2Image::Cr2Image
_ZNK5Exiv28Cr2Image10pixelWidthEv:
   31|     10|uint32_t Cr2Image::pixelWidth() const {
   32|     10|  auto imageWidth = exifData_.findKey(Exiv2::ExifKey("Exif.Photo.PixelXDimension"));
   33|     10|  if (imageWidth != exifData_.end() && imageWidth->count() > 0) {
  ------------------
  |  Branch (33:7): [True: 0, False: 10]
  |  Branch (33:7): [True: 0, False: 10]
  |  Branch (33:40): [True: 0, False: 0]
  ------------------
   34|      0|    return imageWidth->toUint32();
   35|      0|  }
   36|     10|  return 0;
   37|     10|}
_ZNK5Exiv28Cr2Image11pixelHeightEv:
   39|     10|uint32_t Cr2Image::pixelHeight() const {
   40|     10|  auto imageHeight = exifData_.findKey(Exiv2::ExifKey("Exif.Photo.PixelYDimension"));
   41|     10|  if (imageHeight != exifData_.end() && imageHeight->count() > 0) {
  ------------------
  |  Branch (41:7): [True: 0, False: 10]
  |  Branch (41:7): [True: 0, False: 10]
  |  Branch (41:41): [True: 0, False: 0]
  ------------------
   42|      0|    return imageHeight->toUint32();
   43|      0|  }
   44|     10|  return 0;
   45|     10|}
_ZN5Exiv28Cr2Image14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
   47|  1.38k|void Cr2Image::printStructure(std::ostream& out, Exiv2::PrintStructureOption option, size_t depth) {
   48|  1.38k|  if (io_->open() != 0)
  ------------------
  |  Branch (48:7): [True: 0, False: 1.38k]
  ------------------
   49|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   50|  1.38k|  io_->seek(0, BasicIo::beg);
   51|  1.38k|  printTiffStructure(io(), out, option, depth);
   52|  1.38k|}
_ZN5Exiv28Cr2Image12readMetadataEv:
   59|    728|void Cr2Image::readMetadata() {
   60|       |#ifdef EXIV2_DEBUG_MESSAGES
   61|       |  std::cerr << "Reading CR2 file " << io_->path() << "\n";
   62|       |#endif
   63|    728|  if (io_->open() != 0) {
  ------------------
  |  Branch (63:7): [True: 0, False: 728]
  ------------------
   64|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   65|      0|  }
   66|    728|  IoCloser closer(*io_);
   67|       |  // Ensure that this is the correct image type
   68|    728|  if (!isCr2Type(*io_, false)) {
  ------------------
  |  Branch (68:7): [True: 0, False: 728]
  ------------------
   69|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (69:9): [True: 0, False: 0]
  |  Branch (69:25): [True: 0, False: 0]
  ------------------
   70|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   71|      0|    throw Error(ErrorCode::kerNotAnImage, "CR2");
   72|      0|  }
   73|    728|  clearMetadata();
   74|    728|  const DecodeParams dp(max_recursion_depth_);
   75|    728|  ByteOrder bo = Cr2Parser::decode(exifData_, iptcData_, xmpData_, io_->mmap(), io_->size(), dp);
   76|    728|  setByteOrder(bo);
   77|    728|}  // Cr2Image::readMetadata
_ZN5Exiv29Cr2Parser6decodeERNS_8ExifDataERNS_8IptcDataERNS_7XmpDataEPKhmRKNS_12DecodeParamsE:
  104|    728|                            const DecodeParams& dp) {
  105|    728|  Internal::Cr2Header cr2Header;
  106|    728|  return Internal::TiffParserWorker::decode(exifData, iptcData, xmpData, pData, size, Internal::Tag::root,
  107|    728|                                            Internal::TiffMapping::findDecoder, dp, &cr2Header);
  108|    728|}
_ZN5Exiv214newCr2InstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  133|    728|Image::UniquePtr newCr2Instance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  134|    728|  auto image = std::make_unique<Cr2Image>(std::move(io), params);
  135|    728|  if (!image->good()) {
  ------------------
  |  Branch (135:7): [True: 0, False: 728]
  ------------------
  136|      0|    return nullptr;
  137|      0|  }
  138|    728|  return image;
  139|    728|}
_ZN5Exiv29isCr2TypeERNS_7BasicIoEb:
  141|  32.3k|bool isCr2Type(BasicIo& iIo, bool advance) {
  142|  32.3k|  const int32_t len = 16;
  143|  32.3k|  byte buf[len];
  144|  32.3k|  iIo.read(buf, len);
  145|  32.3k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (145:7): [True: 0, False: 32.3k]
  |  Branch (145:22): [True: 91, False: 32.2k]
  ------------------
  146|     91|    return false;
  147|     91|  }
  148|  32.2k|  Internal::Cr2Header header;
  149|  32.2k|  bool rc = header.read(buf, len);
  150|  32.2k|  if (!advance || !rc) {
  ------------------
  |  Branch (150:7): [True: 32.2k, False: 0]
  |  Branch (150:19): [True: 0, False: 0]
  ------------------
  151|  32.2k|    iIo.seek(-len, BasicIo::cur);
  152|  32.2k|  }
  153|  32.2k|  return rc;
  154|  32.3k|}

_ZN5Exiv28CrwImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   27|    228|    Image(ImageType::crw, mdExif | mdComment, std::move(io), params) {
   28|    228|}  // CrwImage::CrwImage
_ZNK5Exiv28CrwImage10pixelWidthEv:
   34|     16|uint32_t CrwImage::pixelWidth() const {
   35|     16|  auto widthIter = exifData_.findKey(Exiv2::ExifKey("Exif.Photo.PixelXDimension"));
   36|     16|  if (widthIter != exifData_.end() && widthIter->count() > 0) {
  ------------------
  |  Branch (36:7): [True: 0, False: 16]
  |  Branch (36:7): [True: 0, False: 16]
  |  Branch (36:39): [True: 0, False: 0]
  ------------------
   37|      0|    return widthIter->toUint32();
   38|      0|  }
   39|     16|  return 0;
   40|     16|}
_ZNK5Exiv28CrwImage11pixelHeightEv:
   42|     16|uint32_t CrwImage::pixelHeight() const {
   43|     16|  auto heightIter = exifData_.findKey(Exiv2::ExifKey("Exif.Photo.PixelYDimension"));
   44|     16|  if (heightIter != exifData_.end() && heightIter->count() > 0) {
  ------------------
  |  Branch (44:7): [True: 0, False: 16]
  |  Branch (44:7): [True: 0, False: 16]
  |  Branch (44:40): [True: 0, False: 0]
  ------------------
   45|      0|    return heightIter->toUint32();
   46|      0|  }
   47|     16|  return 0;
   48|     16|}
_ZN5Exiv28CrwImage12readMetadataEv:
   55|    228|void CrwImage::readMetadata() {
   56|       |#ifdef EXIV2_DEBUG_MESSAGES
   57|       |  std::cerr << "Reading CRW file " << io_->path() << "\n";
   58|       |#endif
   59|    228|  if (io_->open()) {
  ------------------
  |  Branch (59:7): [True: 0, False: 228]
  ------------------
   60|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   61|      0|  }
   62|    228|  IoCloser closer(*io_);
   63|       |  // Ensure that this is the correct image type
   64|    228|  if (!isCrwType(*io_, false)) {
  ------------------
  |  Branch (64:7): [True: 0, False: 228]
  ------------------
   65|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (65:9): [True: 0, False: 0]
  |  Branch (65:25): [True: 0, False: 0]
  ------------------
   66|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   67|      0|    throw Error(ErrorCode::kerNotACrwImage);
   68|      0|  }
   69|    228|  clearMetadata();
   70|    228|  DataBuf file(io().size());
   71|    228|  io_->read(file.data(), file.size());
   72|       |
   73|    228|  CrwParser::decode(this, io_->mmap(), io_->size());
   74|       |
   75|    228|}  // CrwImage::readMetadata
_ZN5Exiv29CrwParser6decodeEPNS_8CrwImageEPKhm:
  107|    228|void CrwParser::decode(CrwImage* pCrwImage, const byte* pData, size_t size) {
  108|       |  // Parse the image, starting with a CIFF header component
  109|    228|  Internal::CiffHeader header;
  110|    228|  header.read(pData, size);
  111|    228|  header.decode(*pCrwImage);
  112|       |
  113|       |  // a hack to get absolute offset of preview image inside CRW structure
  114|    228|  if (auto preview = header.findComponent(0x2007, 0x0000)) {
  ------------------
  |  Branch (114:12): [True: 2, False: 226]
  ------------------
  115|      2|    (pCrwImage->exifData())["Exif.Image2.JPEGInterchangeFormat"] = static_cast<uint32_t>(preview->pData() - pData);
  116|      2|    (pCrwImage->exifData())["Exif.Image2.JPEGInterchangeFormatLength"] = static_cast<uint32_t>(preview->size());
  117|      2|  }
  118|    228|}  // CrwParser::decode
_ZN5Exiv214newCrwInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  135|    228|Image::UniquePtr newCrwInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  136|    228|  auto image = std::make_unique<CrwImage>(std::move(io), params);
  137|    228|  if (!image->good()) {
  ------------------
  |  Branch (137:7): [True: 0, False: 228]
  ------------------
  138|      0|    return nullptr;
  139|      0|  }
  140|    228|  return image;
  141|    228|}
_ZN5Exiv29isCrwTypeERNS_7BasicIoEb:
  143|  30.6k|bool isCrwType(BasicIo& iIo, bool advance) {
  144|  30.6k|  bool result = true;
  145|  30.6k|  byte tmpBuf[14];
  146|  30.6k|  iIo.read(tmpBuf, 14);
  147|  30.6k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (147:7): [True: 0, False: 30.6k]
  |  Branch (147:22): [True: 91, False: 30.5k]
  ------------------
  148|     91|    return false;
  149|     91|  }
  150|  30.5k|  if (('I' != tmpBuf[0] || 'I' != tmpBuf[1]) && ('M' != tmpBuf[0] || 'M' != tmpBuf[1])) {
  ------------------
  |  Branch (150:8): [True: 29.1k, False: 1.38k]
  |  Branch (150:28): [True: 20, False: 1.36k]
  |  Branch (150:50): [True: 13.7k, False: 15.4k]
  |  Branch (150:70): [True: 18, False: 15.4k]
  ------------------
  151|  13.7k|    result = false;
  152|  13.7k|  }
  153|  30.5k|  if (result && std::memcmp(tmpBuf + 6, Internal::CiffHeader::signature(), 8) != 0) {
  ------------------
  |  Branch (153:7): [True: 16.7k, False: 13.7k]
  |  Branch (153:17): [True: 16.0k, False: 684]
  ------------------
  154|  16.0k|    result = false;
  155|  16.0k|  }
  156|  30.5k|  if (!advance || !result)
  ------------------
  |  Branch (156:7): [True: 30.5k, False: 0]
  |  Branch (156:19): [True: 0, False: 0]
  ------------------
  157|  30.5k|    iIo.seek(-14, BasicIo::cur);
  158|  30.5k|  return result;
  159|  30.6k|}

_ZN5Exiv28Internal13CiffComponent3addENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE:
  127|    686|const CiffComponent::UniquePtr& CiffComponent::add(UniquePtr component) {
  128|    686|  return doAdd(std::move(component));
  129|    686|}
_ZN5Exiv28Internal13CiffDirectory5doAddENSt3__110unique_ptrINS0_13CiffComponentENS2_14default_deleteIS4_EEEE:
  135|    686|const CiffComponent::UniquePtr& CiffDirectory::doAdd(UniquePtr component) {
  136|    686|  return components_.emplace_back(std::move(component));
  137|    686|}  // CiffDirectory::doAdd
_ZN5Exiv28Internal10CiffHeader4readEPKhm:
  141|    228|void CiffHeader::read(const byte* pData, size_t size) {
  142|    228|  if (size < 14)
  ------------------
  |  Branch (142:7): [True: 0, False: 228]
  ------------------
  143|      0|    throw Error(ErrorCode::kerNotACrwImage);
  144|       |
  145|    228|  if (pData[0] == 'I' && pData[0] == pData[1]) {
  ------------------
  |  Branch (145:7): [True: 88, False: 140]
  |  Branch (145:26): [True: 88, False: 0]
  ------------------
  146|     88|    byteOrder_ = littleEndian;
  147|    140|  } else if (pData[0] == 'M' && pData[0] == pData[1]) {
  ------------------
  |  Branch (147:14): [True: 140, False: 0]
  |  Branch (147:33): [True: 140, False: 0]
  ------------------
  148|    140|    byteOrder_ = bigEndian;
  149|    140|  } else {
  150|      0|    throw Error(ErrorCode::kerNotACrwImage);
  151|      0|  }
  152|    228|  offset_ = getULong(pData + 2, byteOrder_);
  153|    228|  if (offset_ < 14 || offset_ > size)
  ------------------
  |  Branch (153:7): [True: 1, False: 227]
  |  Branch (153:23): [True: 28, False: 199]
  ------------------
  154|     29|    throw Error(ErrorCode::kerNotACrwImage);
  155|    199|  if (std::memcmp(pData + 6, signature(), 8) != 0) {
  ------------------
  |  Branch (155:7): [True: 0, False: 199]
  ------------------
  156|      0|    throw Error(ErrorCode::kerNotACrwImage);
  157|      0|  }
  158|       |
  159|    199|  pPadding_.clear();
  160|    199|  if (offset_ > 14) {
  ------------------
  |  Branch (160:7): [True: 161, False: 38]
  ------------------
  161|    161|    pPadding_.resize(offset_ - 14);
  162|    161|    padded_ = offset_ - 14;
  163|    161|    std::copy_n(pData + 14, padded_, pPadding_.begin());
  164|    161|  }
  165|       |
  166|    199|  pRootDir_ = std::make_unique<CiffDirectory>();
  167|    199|  pRootDir_->readDirectory(pData + offset_, size - offset_, byteOrder_);
  168|    199|}  // CiffHeader::read
_ZN5Exiv28Internal13CiffComponent4readEPKhmjNS_9ByteOrderE:
  170|    785|void CiffComponent::read(const byte* pData, size_t size, uint32_t start, ByteOrder byteOrder) {
  171|    785|  doRead(pData, size, start, byteOrder);
  172|    785|}
_ZN5Exiv28Internal13CiffComponent6doReadEPKhmjNS_9ByteOrderE:
  174|    785|void CiffComponent::doRead(const byte* pData, size_t size, uint32_t start, ByteOrder byteOrder) {
  175|       |  // We're going read 10 bytes. Make sure they won't be out-of-bounds.
  176|    785|  enforce(size >= 10 && start <= size - 10, ErrorCode::kerNotACrwImage);
  ------------------
  |  Branch (176:11): [True: 785, False: 0]
  |  Branch (176:25): [True: 785, False: 0]
  ------------------
  177|    785|  tag_ = getUShort(pData + start, byteOrder);
  178|       |
  179|    785|  DataLocId dl = dataLocation();
  180|       |
  181|    785|  if (dl == DataLocId::valueData) {
  ------------------
  |  Branch (181:7): [True: 397, False: 388]
  ------------------
  182|    397|    size_ = getULong(pData + start + 2, byteOrder);
  183|    397|    offset_ = getULong(pData + start + 6, byteOrder);
  184|       |
  185|       |    // Make sure that the sub-region does not overlap with the 10 bytes
  186|       |    // that we just read. (Otherwise a malicious file could cause an
  187|       |    // infinite recursion.) There are two cases two consider because
  188|       |    // the sub-region is allowed to be either before or after the 10
  189|       |    // bytes in memory.
  190|    397|    if (offset_ < start) {
  ------------------
  |  Branch (190:9): [True: 238, False: 159]
  ------------------
  191|       |      // Sub-region is before in memory.
  192|    238|      enforce(size_ <= start - offset_, ErrorCode::kerOffsetOutOfRange);
  193|    238|    } else {
  194|       |      // Sub-region is after in memory.
  195|    159|      enforce(offset_ >= start + 10, ErrorCode::kerOffsetOutOfRange);
  196|    159|      enforce(offset_ <= size, ErrorCode::kerOffsetOutOfRange);
  197|    159|      enforce(size_ <= size - offset_, ErrorCode::kerOffsetOutOfRange);
  198|    159|    }
  199|    397|  }
  200|    785|  if (dl == DataLocId::directoryData) {
  ------------------
  |  Branch (200:7): [True: 378, False: 407]
  ------------------
  201|    378|    size_ = 8;
  202|    378|    offset_ = start + 2;
  203|    378|  }
  204|    785|  pData_ = pData + offset_;
  205|       |#ifdef EXIV2_DEBUG_MESSAGES
  206|       |  std::cout << "  Entry for tag 0x" << std::hex << tagId() << " (0x" << tag() << "), " << std::dec << size_
  207|       |            << " Bytes, Offset is " << offset_ << "\n";
  208|       |#endif
  209|       |
  210|    785|}  // CiffComponent::doRead
_ZN5Exiv28Internal13CiffDirectory6doReadEPKhmjNS_9ByteOrderE:
  212|    141|void CiffDirectory::doRead(const byte* pData, size_t size, uint32_t start, ByteOrder byteOrder) {
  213|    141|  CiffComponent::doRead(pData, size, start, byteOrder);
  214|       |#ifdef EXIV2_DEBUG_MESSAGES
  215|       |  std::cout << "Reading directory 0x" << std::hex << tag() << "\n";
  216|       |#endif
  217|    141|  if (this->offset() + this->size() > size)
  ------------------
  |  Branch (217:7): [True: 0, False: 141]
  ------------------
  218|      0|    throw Error(ErrorCode::kerOffsetOutOfRange);
  219|       |
  220|    141|  readDirectory(pData + offset(), this->size(), byteOrder);
  221|       |#ifdef EXIV2_DEBUG_MESSAGES
  222|       |  std::cout << "<---- 0x" << std::hex << tag() << "\n";
  223|       |#endif
  224|    141|}  // CiffDirectory::doRead
_ZN5Exiv28Internal13CiffDirectory13readDirectoryEPKhmNS_9ByteOrderE:
  226|    323|void CiffDirectory::readDirectory(const byte* pData, size_t size, ByteOrder byteOrder) {
  227|    323|  if (size < 4)
  ------------------
  |  Branch (227:7): [True: 8, False: 315]
  ------------------
  228|      8|    throw Error(ErrorCode::kerCorruptedMetadata);
  229|    315|  uint32_t o = getULong(pData + size - 4, byteOrder);
  230|    315|  if (o > size - 2)
  ------------------
  |  Branch (230:7): [True: 9, False: 306]
  ------------------
  231|      9|    throw Error(ErrorCode::kerCorruptedMetadata);
  232|    306|  uint16_t count = getUShort(pData + o, byteOrder);
  233|       |#ifdef EXIV2_DEBUG_MESSAGES
  234|       |  std::cout << "Directory at offset " << std::dec << o << ", " << count << " entries \n";
  235|       |#endif
  236|    306|  o += 2;
  237|    306|  if (count * 10u > size - o)
  ------------------
  |  Branch (237:7): [True: 10, False: 296]
  ------------------
  238|     10|    throw Error(ErrorCode::kerCorruptedMetadata);
  239|       |
  240|  1.08k|  for (uint16_t i = 0; i < count; ++i) {
  ------------------
  |  Branch (240:24): [True: 785, False: 296]
  ------------------
  241|    785|    uint16_t tag = getUShort(pData + o, byteOrder);
  242|    785|    auto m = [this, tag]() -> UniquePtr {
  243|    785|      if (this->typeId(tag) == TypeId::directory)
  244|    785|        return std::make_unique<CiffDirectory>();
  245|    785|      return std::make_unique<CiffEntry>();
  246|    785|    }();
  247|    785|    m->setDir(this->tag());
  248|    785|    m->read(pData, size, o, byteOrder);
  249|    785|    add(std::move(m));
  250|    785|    o += 10;
  251|    785|  }
  252|    296|}  // CiffDirectory::readDirectory
_ZNK5Exiv28Internal10CiffHeader6decodeERNS_5ImageE:
  254|     87|void CiffHeader::decode(Image& image) const {
  255|       |  // Nothing to decode from the header itself, just add correct byte order
  256|     87|  if (pRootDir_)
  ------------------
  |  Branch (256:7): [True: 87, False: 0]
  ------------------
  257|     87|    pRootDir_->decode(image, byteOrder_);
  258|     87|}
_ZNK5Exiv28Internal13CiffComponent6decodeERNS_5ImageENS_9ByteOrderE:
  260|    386|void CiffComponent::decode(Image& image, ByteOrder byteOrder) const {
  261|    386|  doDecode(image, byteOrder);
  262|    386|}
_ZNK5Exiv28Internal9CiffEntry8doDecodeERNS_5ImageENS_9ByteOrderE:
  264|    226|void CiffEntry::doDecode(Image& image, ByteOrder byteOrder) const {
  265|    226|  CrwMap::decode(*this, image, byteOrder);
  266|    226|}  // CiffEntry::doDecode
_ZNK5Exiv28Internal13CiffDirectory8doDecodeERNS_5ImageENS_9ByteOrderE:
  268|    160|void CiffDirectory::doDecode(Image& image, ByteOrder byteOrder) const {
  269|    299|  for (auto&& component : components_) {
  ------------------
  |  Branch (269:25): [True: 299, False: 160]
  ------------------
  270|    299|    component->decode(image, byteOrder);
  271|    299|  }
  272|    160|}  // CiffDirectory::doDecode
_ZN5Exiv28Internal13CiffComponent6typeIdEt:
  436|    911|TypeId CiffComponent::typeId(uint16_t tag) {
  437|    911|  switch (tag & 0x3800) {
  ------------------
  |  Branch (437:11): [True: 885, False: 26]
  ------------------
  438|    424|    case 0x0000:
  ------------------
  |  Branch (438:5): [True: 424, False: 487]
  ------------------
  439|    424|      return unsignedByte;
  440|    108|    case 0x0800:
  ------------------
  |  Branch (440:5): [True: 108, False: 803]
  ------------------
  441|    108|      return asciiString;
  442|    122|    case 0x1000:
  ------------------
  |  Branch (442:5): [True: 122, False: 789]
  ------------------
  443|    122|      return unsignedShort;
  444|     22|    case 0x1800:
  ------------------
  |  Branch (444:5): [True: 22, False: 889]
  ------------------
  445|     22|      return unsignedLong;
  446|     68|    case 0x2000:
  ------------------
  |  Branch (446:5): [True: 68, False: 843]
  ------------------
  447|     68|      return undefined;
  448|     93|    case 0x2800:
  ------------------
  |  Branch (448:5): [True: 93, False: 818]
  ------------------
  449|    141|    case 0x3000:
  ------------------
  |  Branch (449:5): [True: 48, False: 863]
  ------------------
  450|    141|      return directory;
  451|    911|  }
  452|     26|  return invalidTypeId;
  453|    911|}  // CiffComponent::typeId
_ZN5Exiv28Internal13CiffComponent12dataLocationEt:
  455|    785|DataLocId CiffComponent::dataLocation(uint16_t tag) {
  456|    785|  switch (tag & 0xc000) {
  457|    397|    case 0x0000:
  ------------------
  |  Branch (457:5): [True: 397, False: 388]
  ------------------
  458|    397|      return DataLocId::valueData;
  459|    378|    case 0x4000:
  ------------------
  |  Branch (459:5): [True: 378, False: 407]
  ------------------
  460|    378|      return DataLocId::directoryData;
  461|     10|    default:
  ------------------
  |  Branch (461:5): [True: 10, False: 775]
  ------------------
  462|     10|      throw Error(ErrorCode::kerCorruptedMetadata);
  463|    785|  }
  464|    785|}  // CiffComponent::dataLocation
_ZNK5Exiv28Internal10CiffHeader13findComponentEtt:
  471|     84|CiffComponent* CiffHeader::findComponent(uint16_t crwTagId, uint16_t crwDir) const {
  472|     84|  if (!pRootDir_)
  ------------------
  |  Branch (472:7): [True: 0, False: 84]
  ------------------
  473|      0|    return nullptr;
  474|     84|  return pRootDir_->findComponent(crwTagId, crwDir);
  475|     84|}  // CiffHeader::findComponent
_ZN5Exiv28Internal13CiffComponent13findComponentEtt:
  477|    373|CiffComponent* CiffComponent::findComponent(uint16_t crwTagId, uint16_t crwDir) {
  478|    373|  return doFindComponent(crwTagId, crwDir);
  479|    373|}  // CiffComponent::findComponent
_ZN5Exiv28Internal13CiffComponent15doFindComponentEtt:
  481|    219|CiffComponent* CiffComponent::doFindComponent(uint16_t crwTagId, uint16_t crwDir) {
  482|    219|  if (tagId() == crwTagId && dir() == crwDir) {
  ------------------
  |  Branch (482:7): [True: 2, False: 217]
  |  Branch (482:30): [True: 2, False: 0]
  ------------------
  483|      2|    return this;
  484|      2|  }
  485|    217|  return nullptr;
  486|    219|}  // CiffComponent::doFindComponent
_ZN5Exiv28Internal13CiffDirectory15doFindComponentEtt:
  488|    154|CiffComponent* CiffDirectory::doFindComponent(uint16_t crwTagId, uint16_t crwDir) {
  489|    289|  for (auto&& component : components_) {
  ------------------
  |  Branch (489:25): [True: 289, False: 152]
  ------------------
  490|    289|    if (auto cc = component->findComponent(crwTagId, crwDir))
  ------------------
  |  Branch (490:14): [True: 2, False: 287]
  ------------------
  491|      2|      return cc;
  492|    289|  }
  493|    152|  return nullptr;
  494|    154|}  // CiffDirectory::doFindComponent
_ZN5Exiv28Internal6CrwMap6decodeERKNS0_13CiffComponentERNS_5ImageENS_9ByteOrderE:
  605|    226|void CrwMap::decode(const CiffComponent& ciffComponent, Image& image, ByteOrder byteOrder) {
  606|    226|  const CrwMapping* cmi = crwMapping(ciffComponent.dir(), ciffComponent.tagId());
  607|    226|  if (cmi && cmi->toExif_) {
  ------------------
  |  Branch (607:7): [True: 60, False: 166]
  |  Branch (607:14): [True: 60, False: 0]
  ------------------
  608|     60|    cmi->toExif_(ciffComponent, cmi, image, byteOrder);
  609|     60|  }
  610|    226|}  // CrwMap::decode
_ZN5Exiv28Internal6CrwMap10crwMappingEtt:
  612|    226|const CrwMapping* CrwMap::crwMapping(uint16_t crwDir, uint16_t crwTagId) {
  613|  4.20k|  for (auto&& crw : crwMapping_) {
  ------------------
  |  Branch (613:19): [True: 4.20k, False: 166]
  ------------------
  614|  4.20k|    if (crw.crwDir_ == crwDir && crw.crwTagId_ == crwTagId) {
  ------------------
  |  Branch (614:9): [True: 508, False: 3.69k]
  |  Branch (614:34): [True: 60, False: 448]
  ------------------
  615|     60|      return &crw;
  616|     60|    }
  617|  4.20k|  }
  618|    166|  return nullptr;
  619|    226|}  // CrwMap::crwMapping
_ZN5Exiv28Internal6CrwMap12decode0x0805ERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderE:
  622|      3|                          ByteOrder /*byteOrder*/) {
  623|      3|  auto s = std::string(reinterpret_cast<const char*>(ciffComponent.pData()), ciffComponent.size());
  624|      3|  image.setComment(s);
  625|      3|}  // CrwMap::decode0x0805
_ZN5Exiv28Internal6CrwMap12decode0x080aERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderE:
  628|     12|                          ByteOrder byteOrder) {
  629|     12|  if (ciffComponent.typeId() != asciiString)
  ------------------
  |  Branch (629:7): [True: 0, False: 12]
  ------------------
  630|      0|    return;
  631|       |
  632|       |  // Make
  633|     12|  ExifKey key1("Exif.Image.Make");
  634|     12|  auto value1 = Value::create(ciffComponent.typeId());
  635|     12|  uint32_t i = 0;
  636|     29|  while (i < ciffComponent.size()) {
  ------------------
  |  Branch (636:10): [True: 26, False: 3]
  ------------------
  637|     26|    ++i;
  638|     26|    if (ciffComponent.pData()[i - 1] == '\0') {
  ------------------
  |  Branch (638:9): [True: 9, False: 17]
  ------------------
  639|      9|      break;
  640|      9|    }
  641|     26|  }
  642|     12|  value1->read(ciffComponent.pData(), i, byteOrder);
  643|     12|  image.exifData().add(key1, value1.get());
  644|       |
  645|       |  // Model
  646|     12|  ExifKey key2("Exif.Image.Model");
  647|     12|  auto value2 = Value::create(ciffComponent.typeId());
  648|     12|  uint32_t j = i;
  649|     31|  while (i < ciffComponent.size()) {
  ------------------
  |  Branch (649:10): [True: 26, False: 5]
  ------------------
  650|     26|    ++i;
  651|     26|    if (ciffComponent.pData()[i - 1] == '\0') {
  ------------------
  |  Branch (651:9): [True: 7, False: 19]
  ------------------
  652|      7|      break;
  653|      7|    }
  654|     26|  }
  655|     12|  value2->read(ciffComponent.pData() + j, i - j, byteOrder);
  656|     12|  image.exifData().add(key2, value2.get());
  657|     12|}  // CrwMap::decode0x080a
_ZN5Exiv28Internal6CrwMap11decodeArrayERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderE:
  660|     11|                         ByteOrder byteOrder) {
  661|     11|  if (ciffComponent.typeId() != unsignedShort) {
  ------------------
  |  Branch (661:7): [True: 0, False: 11]
  ------------------
  662|      0|    decodeBasic(ciffComponent, pCrwMapping, image, byteOrder);
  663|      0|    return;
  664|      0|  }
  665|       |
  666|     11|  int64_t aperture = 0;
  667|     11|  int64_t shutterSpeed = 0;
  668|       |
  669|     11|  auto ifdId = [pCrwMapping] {
  670|     11|    if (pCrwMapping->tag_ == 0x0001)
  671|     11|      return IfdId::canonCsId;
  672|     11|    if (pCrwMapping->tag_ == 0x0004)
  673|     11|      return IfdId::canonSiId;
  674|     11|    if (pCrwMapping->tag_ == 0x000f)
  675|     11|      return IfdId::canonCfId;
  676|     11|    if (pCrwMapping->tag_ == 0x0012)
  677|     11|      return IfdId::canonPiId;
  678|     11|    return IfdId::ifdIdNotSet;
  679|     11|  }();
  680|       |
  681|     11|  std::string groupName(Internal::groupName(ifdId));
  682|     11|  const size_t component_size = ciffComponent.size();
  683|     11|  enforce(component_size % 2 == 0, ErrorCode::kerCorruptedMetadata);
  684|     11|  enforce(component_size / 2 <= static_cast<size_t>(std::numeric_limits<uint16_t>::max()),
  685|     11|          ErrorCode::kerCorruptedMetadata);
  686|     11|  const auto num_components = static_cast<uint16_t>(component_size / 2);
  687|     11|  uint16_t c = 1;
  688|     32|  while (c < num_components) {
  ------------------
  |  Branch (688:10): [True: 21, False: 11]
  ------------------
  689|     21|    uint16_t n = 1;
  690|     21|    ExifKey key(c, groupName);
  691|     21|    UShortValue value;
  692|     21|    if (ifdId == IfdId::canonCsId && c == 23 && component_size >= 52)
  ------------------
  |  Branch (692:9): [True: 9, False: 12]
  |  Branch (692:38): [True: 0, False: 9]
  |  Branch (692:49): [True: 0, False: 0]
  ------------------
  693|      0|      n = 3;
  694|     21|    value.read(ciffComponent.pData() + (c * 2), n * 2, byteOrder);
  695|     21|    image.exifData().add(key, &value);
  696|     21|    if (ifdId == IfdId::canonSiId && c == 21)
  ------------------
  |  Branch (696:9): [True: 9, False: 12]
  |  Branch (696:38): [True: 0, False: 9]
  ------------------
  697|      0|      aperture = value.toInt64();
  698|     21|    if (ifdId == IfdId::canonSiId && c == 22)
  ------------------
  |  Branch (698:9): [True: 9, False: 12]
  |  Branch (698:38): [True: 0, False: 9]
  ------------------
  699|      0|      shutterSpeed = value.toInt64();
  700|     21|    c += n;
  701|     21|  }
  702|       |
  703|     11|  if (ifdId == IfdId::canonSiId) {
  ------------------
  |  Branch (703:7): [True: 3, False: 8]
  ------------------
  704|       |    // Exif.Photo.FNumber
  705|      3|    float f = fnumber(canonEv(aperture));
  706|      3|    auto [r, s] = floatToRationalCast(f);
  707|      3|    auto ur = URational(r, s);
  708|      3|    URationalValue fn;
  709|      3|    fn.value_.push_back(ur);
  710|      3|    image.exifData().add(ExifKey("Exif.Photo.FNumber"), &fn);
  711|       |
  712|       |    // Exif.Photo.ExposureTime
  713|      3|    ur = exposureTime(canonEv(shutterSpeed));
  714|      3|    URationalValue et;
  715|      3|    et.value_.push_back(ur);
  716|      3|    image.exifData().add(ExifKey("Exif.Photo.ExposureTime"), &et);
  717|      3|  }
  718|     11|}  // CrwMap::decodeArray
_ZN5Exiv28Internal6CrwMap12decode0x180eERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderE:
  721|      1|                          ByteOrder byteOrder) {
  722|      1|  if (ciffComponent.size() < 8 || ciffComponent.typeId() != unsignedLong) {
  ------------------
  |  Branch (722:7): [True: 1, False: 0]
  |  Branch (722:35): [True: 0, False: 0]
  ------------------
  723|      1|    decodeBasic(ciffComponent, pCrwMapping, image, byteOrder);
  724|      1|    return;
  725|      1|  }
  726|      0|  ULongValue v;
  727|      0|  v.read(ciffComponent.pData(), 8, byteOrder);
  728|      0|  time_t t = v.value_.at(0);
  729|      0|  std::tm r;
  730|       |#ifdef _WIN32
  731|       |  auto tm = localtime_s(&r, &t) ? nullptr : &r;
  732|       |#else
  733|      0|  auto tm = localtime_r(&t, &r);
  734|      0|#endif
  735|      0|  if (!tm)
  ------------------
  |  Branch (735:7): [True: 0, False: 0]
  ------------------
  736|      0|    return;
  737|      0|  const size_t m = 20;
  738|      0|  char s[m];
  739|      0|  std::strftime(s, m, "%Y:%m:%d %T", tm);
  740|       |
  741|      0|  ExifKey key(pCrwMapping->tag_, Internal::groupName(pCrwMapping->ifdId_));
  742|      0|  AsciiValue value;
  743|      0|  value.read(s);
  744|      0|  image.exifData().add(key, &value);
  745|      0|}  // CrwMap::decode0x180e
_ZN5Exiv28Internal6CrwMap12decode0x2008ERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderE:
  771|      7|                          ByteOrder /*byteOrder*/) {
  772|      7|  ExifThumb exifThumb(image.exifData());
  773|      7|  exifThumb.setJpegThumbnail(ciffComponent.pData(), ciffComponent.size());
  774|      7|}  // CrwMap::decode0x2008
_ZN5Exiv28Internal6CrwMap11decodeBasicERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderE:
  777|     27|                         ByteOrder byteOrder) {
  778|       |  // create a key and value pair
  779|     27|  ExifKey key(pCrwMapping->tag_, Internal::groupName(pCrwMapping->ifdId_));
  780|     27|  Value::UniquePtr value;
  781|     27|  if (ciffComponent.typeId() != directory) {
  ------------------
  |  Branch (781:7): [True: 27, False: 0]
  ------------------
  782|     27|    value = Value::create(ciffComponent.typeId());
  783|     27|    size_t size = 0;
  784|     27|    if (pCrwMapping->size_ != 0) {
  ------------------
  |  Branch (784:9): [True: 2, False: 25]
  ------------------
  785|      2|      size = pCrwMapping->size_;  // size in the mapping table overrides all
  786|     25|    } else if (ciffComponent.typeId() == asciiString) {
  ------------------
  |  Branch (786:16): [True: 8, False: 17]
  ------------------
  787|       |      // determine size from the data, by looking for the first 0
  788|      8|      uint32_t i = 0;
  789|     29|      while (i < ciffComponent.size()) {
  ------------------
  |  Branch (789:14): [True: 28, False: 1]
  ------------------
  790|     28|        ++i;
  791|     28|        if (ciffComponent.pData()[i - 1] == '\0') {
  ------------------
  |  Branch (791:13): [True: 7, False: 21]
  ------------------
  792|      7|          break;
  793|      7|        }
  794|     28|      }
  795|      8|      size = i;
  796|     17|    } else {
  797|       |      // by default, use the size from the directory entry
  798|     17|      size = ciffComponent.size();
  799|     17|    }
  800|     27|    enforce(size <= ciffComponent.size(), ErrorCode::kerCorruptedMetadata);
  801|     27|    value->read(ciffComponent.pData(), size, byteOrder);
  802|     27|  }
  803|       |  // Add metadatum to exif data
  804|     27|  image.exifData().add(key, value.get());
  805|     27|}  // CrwMap::decodeBasic
crwimage_int.cpp:_ZZN5Exiv28Internal13CiffDirectory13readDirectoryEPKhmNS_9ByteOrderEENK3$_0clEv:
  242|    785|    auto m = [this, tag]() -> UniquePtr {
  243|    785|      if (this->typeId(tag) == TypeId::directory)
  ------------------
  |  Branch (243:11): [True: 141, False: 644]
  ------------------
  244|    141|        return std::make_unique<CiffDirectory>();
  245|    644|      return std::make_unique<CiffEntry>();
  246|    785|    }();
crwimage_int.cpp:_ZZN5Exiv28Internal6CrwMap11decodeArrayERKNS0_13CiffComponentEPKNS0_10CrwMappingERNS_5ImageENS_9ByteOrderEENK3$_0clEv:
  669|     11|  auto ifdId = [pCrwMapping] {
  670|     11|    if (pCrwMapping->tag_ == 0x0001)
  ------------------
  |  Branch (670:9): [True: 3, False: 8]
  ------------------
  671|      3|      return IfdId::canonCsId;
  672|      8|    if (pCrwMapping->tag_ == 0x0004)
  ------------------
  |  Branch (672:9): [True: 3, False: 5]
  ------------------
  673|      3|      return IfdId::canonSiId;
  674|      5|    if (pCrwMapping->tag_ == 0x000f)
  ------------------
  |  Branch (674:9): [True: 2, False: 3]
  ------------------
  675|      2|      return IfdId::canonCfId;
  676|      3|    if (pCrwMapping->tag_ == 0x0012)
  ------------------
  |  Branch (676:9): [True: 3, False: 0]
  ------------------
  677|      3|      return IfdId::canonPiId;
  678|      0|    return IfdId::ifdIdNotSet;
  679|      3|  }();

_ZNK5Exiv28Internal13CiffComponent5pDataEv:
  213|    162|  [[nodiscard]] const byte* pData() const {
  214|    162|    return pData_;
  215|    162|  }
_ZNK5Exiv28Internal13CiffComponent4sizeEv:
  203|    405|  [[nodiscard]] size_t size() const {
  204|    405|    return size_;
  205|    405|  }
_ZN5Exiv28Internal10CiffHeader9signatureEv:
  418|  16.9k|  static auto signature() {
  419|  16.9k|    return signature_;
  420|  16.9k|  }
_ZN5Exiv28Internal13CiffComponent6setDirEt:
  146|    785|  void setDir(uint16_t dir) {
  147|    785|    dir_ = dir;
  148|    785|  }
_ZNK5Exiv28Internal13CiffComponent3dirEv:
  183|    228|  [[nodiscard]] uint16_t dir() const {
  184|    228|    return dir_;
  185|    228|  }
_ZNK5Exiv28Internal13CiffComponent3tagEv:
  188|    785|  [[nodiscard]] uint16_t tag() const {
  189|    785|    return tag_;
  190|    785|  }
_ZNK5Exiv28Internal13CiffComponent6offsetEv:
  208|    248|  [[nodiscard]] size_t offset() const {
  209|    248|    return offset_;
  210|    248|  }
_ZNK5Exiv28Internal13CiffComponent5tagIdEv:
  218|    445|  [[nodiscard]] uint16_t tagId() const {
  219|    445|    return tag_ & 0x3fff;
  220|    445|  }
_ZNK5Exiv28Internal13CiffComponent6typeIdEv:
  223|    126|  [[nodiscard]] TypeId typeId() const {
  224|    126|    return typeId(tag_);
  225|    126|  }
_ZNK5Exiv28Internal13CiffComponent12dataLocationEv:
  228|    785|  [[nodiscard]] DataLocId dataLocation() const {
  229|    785|    return dataLocation(tag_);
  230|    785|  }
_ZN5Exiv28Internal13CiffComponentC2Ev:
   71|    984|  CiffComponent() = default;
_ZN5Exiv28Internal13CiffComponentD2Ev:
   75|    984|  virtual ~CiffComponent() = default;

_ZN5Exiv212IptcDataSets10dataSetIdxEtt:
  377|   134k|int IptcDataSets::dataSetIdx(uint16_t number, uint16_t recordId) {
  378|   134k|  if (recordId != envelope && recordId != application2)
  ------------------
  |  Branch (378:7): [True: 112k, False: 22.1k]
  |  Branch (378:31): [True: 96.4k, False: 16.1k]
  ------------------
  379|  96.4k|    return -1;
  380|  38.3k|  const DataSet* dataSet = records_[recordId];
  381|  38.3k|  int idx;
  382|   724k|  for (idx = 0; dataSet[idx].number_ != number; ++idx) {
  ------------------
  |  Branch (382:17): [True: 705k, False: 18.9k]
  ------------------
  383|   705k|    if (dataSet[idx].number_ == 0xffff)
  ------------------
  |  Branch (383:9): [True: 19.4k, False: 685k]
  ------------------
  384|  19.4k|      return -1;
  385|   705k|  }
  386|  18.9k|  return idx;
  387|  38.3k|}
_ZN5Exiv212IptcDataSets10dataSetIdxERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEt:
  389|    444|int IptcDataSets::dataSetIdx(const std::string& dataSetName, uint16_t recordId) {
  390|    444|  if (recordId != envelope && recordId != application2)
  ------------------
  |  Branch (390:7): [True: 296, False: 148]
  |  Branch (390:31): [True: 0, False: 296]
  ------------------
  391|      0|    return -1;
  392|    444|  const DataSet* dataSet = records_[recordId];
  393|    444|  int idx;
  394|  9.32k|  for (idx = 0; dataSet[idx].name_ != dataSetName; ++idx) {
  ------------------
  |  Branch (394:17): [True: 8.88k, False: 444]
  ------------------
  395|  8.88k|    if (dataSet[idx].number_ == 0xffff)
  ------------------
  |  Branch (395:9): [True: 0, False: 8.88k]
  ------------------
  396|      0|      return -1;
  397|  8.88k|  }
  398|    444|  return idx;
  399|    444|}
_ZN5Exiv212IptcDataSets11dataSetTypeEtt:
  401|  43.5k|TypeId IptcDataSets::dataSetType(uint16_t number, uint16_t recordId) {
  402|  43.5k|  int idx = dataSetIdx(number, recordId);
  403|  43.5k|  if (idx == -1)
  ------------------
  |  Branch (403:7): [True: 37.9k, False: 5.65k]
  ------------------
  404|  37.9k|    return unknownDataSet.type_;
  405|  5.65k|  return records_[recordId][idx].type_;
  406|  43.5k|}
_ZN5Exiv212IptcDataSets11dataSetNameEtt:
  408|  47.9k|std::string IptcDataSets::dataSetName(uint16_t number, uint16_t recordId) {
  409|  47.9k|  if (int idx = dataSetIdx(number, recordId); idx != -1)
  ------------------
  |  Branch (409:47): [True: 7.88k, False: 40.0k]
  ------------------
  410|  7.88k|    return records_[recordId][idx].name_;
  411|       |
  412|  40.0k|  return stringFormat("0x{:04x}", number);
  ------------------
  |  |   18|  40.0k|#define stringFormat std::format
  ------------------
  413|  47.9k|}
_ZN5Exiv212IptcDataSets17dataSetRepeatableEtt:
  436|  43.2k|bool IptcDataSets::dataSetRepeatable(uint16_t number, uint16_t recordId) {
  437|  43.2k|  int idx = dataSetIdx(number, recordId);
  438|  43.2k|  if (idx == -1)
  ------------------
  |  Branch (438:7): [True: 37.9k, False: 5.36k]
  ------------------
  439|  37.9k|    return unknownDataSet.repeatable_;
  440|  5.36k|  return records_[recordId][idx].repeatable_;
  441|  43.2k|}
_ZN5Exiv212IptcDataSets7dataSetERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEt:
  443|    444|uint16_t IptcDataSets::dataSet(const std::string& dataSetName, uint16_t recordId) {
  444|    444|  if (int idx = dataSetIdx(dataSetName, recordId); idx != -1) {
  ------------------
  |  Branch (444:52): [True: 444, False: 0]
  ------------------
  445|       |    // dataSetIdx checks the range of recordId
  446|    444|    return records_[recordId][idx].number_;
  447|    444|  }
  448|      0|  if (!isHex(dataSetName, 4, "0x"))
  ------------------
  |  Branch (448:7): [True: 0, False: 0]
  ------------------
  449|      0|    throw Error(ErrorCode::kerInvalidDataset, dataSetName);
  450|      0|  return static_cast<uint16_t>(std::stoi(dataSetName, nullptr, 16));
  451|      0|}
_ZN5Exiv212IptcDataSets10recordNameEt:
  453|  43.7k|std::string IptcDataSets::recordName(uint16_t recordId) {
  454|  43.7k|  if (recordId == envelope || recordId == application2) {
  ------------------
  |  Branch (454:7): [True: 7.32k, False: 36.3k]
  |  Branch (454:31): [True: 4.87k, False: 31.5k]
  ------------------
  455|  12.2k|    return recordInfo_[recordId].name_;
  456|  12.2k|  }
  457|       |
  458|  31.5k|  return stringFormat("0x{:04x}", recordId);
  ------------------
  |  |   18|  31.5k|#define stringFormat std::format
  ------------------
  459|  43.7k|}
_ZN5Exiv212IptcDataSets8recordIdERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  468|    444|uint16_t IptcDataSets::recordId(const std::string& recordName) {
  469|    444|  uint16_t i;
  470|    592|  for (i = IptcDataSets::application2; i > 0; --i) {
  ------------------
  |  Branch (470:40): [True: 592, False: 0]
  ------------------
  471|    592|    if (recordInfo_[i].name_ == recordName)
  ------------------
  |  Branch (471:9): [True: 444, False: 148]
  ------------------
  472|    444|      break;
  473|    592|  }
  474|    444|  if (i == 0) {
  ------------------
  |  Branch (474:7): [True: 0, False: 444]
  ------------------
  475|      0|    if (!isHex(recordName, 4, "0x"))
  ------------------
  |  Branch (475:9): [True: 0, False: 0]
  ------------------
  476|      0|      throw Error(ErrorCode::kerInvalidRecord, recordName);
  477|      0|    i = static_cast<uint16_t>(std::stoi(recordName, nullptr, 16));
  478|      0|  }
  479|    444|  return i;
  480|    444|}
_ZN5Exiv27IptcKeyC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  490|    444|IptcKey::IptcKey(std::string key) : tag_(0), record_(0), key_(std::move(key)) {
  491|    444|  decomposeKey();
  492|    444|}
_ZN5Exiv27IptcKeyC2Ett:
  494|  43.2k|IptcKey::IptcKey(uint16_t tag, uint16_t record) : tag_(tag), record_(record) {
  495|  43.2k|  makeKey();
  496|  43.2k|}
_ZNK5Exiv27IptcKey7tagNameEv:
  510|  2.99k|std::string IptcKey::tagName() const {
  511|  2.99k|  return IptcDataSets::dataSetName(tag_, record_);
  512|  2.99k|}
_ZNK5Exiv27IptcKey3tagEv:
  522|  96.7k|uint16_t IptcKey::tag() const {
  523|  96.7k|  return tag_;
  524|  96.7k|}
_ZNK5Exiv27IptcKey6recordEv:
  530|   792k|uint16_t IptcKey::record() const {
  531|   792k|  return record_;
  532|   792k|}
_ZNK5Exiv27IptcKey5cloneEv:
  534|   584k|IptcKey::UniquePtr IptcKey::clone() const {
  535|   584k|  return UniquePtr(clone_());
  536|   584k|}
_ZNK5Exiv27IptcKey6clone_Ev:
  538|   584k|IptcKey* IptcKey::clone_() const {
  539|   584k|  return new IptcKey(*this);
  540|   584k|}
_ZN5Exiv27IptcKey12decomposeKeyEv:
  542|    444|void IptcKey::decomposeKey() {
  543|       |  // Check that the key has the expected format with RE
  544|    444|  auto posDot1 = key_.find('.');
  545|    444|  auto posDot2 = key_.find('.', posDot1 + 1);
  546|       |
  547|    444|  if (posDot1 == std::string::npos || posDot2 == std::string::npos) {
  ------------------
  |  Branch (547:7): [True: 0, False: 444]
  |  Branch (547:39): [True: 0, False: 444]
  ------------------
  548|      0|    throw Error(ErrorCode::kerInvalidKey, key_);
  549|      0|  }
  550|       |
  551|       |  // Get the family name, record name and dataSet name parts of the key
  552|    444|  const std::string familyName = key_.substr(0, posDot1);
  553|    444|  if (familyName != familyName_)
  ------------------
  |  Branch (553:7): [True: 0, False: 444]
  ------------------
  554|      0|    throw Error(ErrorCode::kerInvalidKey, key_);
  555|       |
  556|    444|  std::string recordName = key_.substr(posDot1 + 1, posDot2 - posDot1 - 1);
  557|    444|  std::string dataSetName = key_.substr(posDot2 + 1);
  558|       |
  559|       |  // Use the parts of the key to find dataSet and recordId
  560|    444|  uint16_t recId = IptcDataSets::recordId(recordName);
  561|    444|  uint16_t dataSet = IptcDataSets::dataSet(dataSetName, recId);
  562|       |
  563|       |  // Possibly translate hex name parts (0xabcd) to real names
  564|    444|  recordName = IptcDataSets::recordName(recId);
  565|    444|  dataSetName = IptcDataSets::dataSetName(dataSet, recId);
  566|       |
  567|    444|  tag_ = dataSet;
  568|    444|  record_ = recId;
  569|    444|  key_ = familyName + "." + recordName + "." + dataSetName;
  570|    444|}
_ZN5Exiv27IptcKey7makeKeyEv:
  572|  43.2k|void IptcKey::makeKey() {
  573|  43.2k|  key_ = std::string(familyName_) + "." + IptcDataSets::recordName(record_) + "." +
  574|  43.2k|         IptcDataSets::dataSetName(tag_, record_);
  575|  43.2k|}

_ZN5Exiv28Internal7enforceIJEEEvbNS_9ErrorCodeEDpOT_:
   46|  28.2M|constexpr void enforce(bool condition, Exiv2::ErrorCode err_code, T&&... args) {
   47|  28.2M|  enforce<Exiv2::Error>(condition, err_code, std::forward<T>(args)...);
   48|  28.2M|}
_ZN5Exiv28Internal7enforceINS_5ErrorEJRNS_9ErrorCodeEEEEvbDpOT0_:
   35|  28.2M|constexpr void enforce(bool condition, T&&... args) {
   36|  28.2M|  if (!condition) {
  ------------------
  |  Branch (36:7): [True: 4.76k, False: 28.2M]
  ------------------
   37|  4.76k|    throw exception_t(std::forward<T>(args)...);
   38|  4.76k|  }
   39|  28.2M|}
_ZN5Exiv28Internal7enforceISt12out_of_rangeJRA47_KcEEEvbDpOT0_:
   35|  2.91k|constexpr void enforce(bool condition, T&&... args) {
   36|  2.91k|  if (!condition) {
  ------------------
  |  Branch (36:7): [True: 1, False: 2.91k]
  ------------------
   37|      1|    throw exception_t(std::forward<T>(args)...);
   38|      1|  }
   39|  2.91k|}
_ZN5Exiv28Internal7enforceISt16invalid_argumentJRA59_KcEEEvbDpOT0_:
   35|  52.1k|constexpr void enforce(bool condition, T&&... args) {
   36|  52.1k|  if (!condition) {
  ------------------
  |  Branch (36:7): [True: 0, False: 52.1k]
  ------------------
   37|      0|    throw exception_t(std::forward<T>(args)...);
   38|      0|  }
   39|  52.1k|}
_ZN5Exiv28Internal7enforceISt12out_of_rangeJRA31_KcEEEvbDpOT0_:
   35|  52.1k|constexpr void enforce(bool condition, T&&... args) {
   36|  52.1k|  if (!condition) {
  ------------------
  |  Branch (36:7): [True: 0, False: 52.1k]
  ------------------
   37|      0|    throw exception_t(std::forward<T>(args)...);
   38|      0|  }
   39|  52.1k|}
_ZN5Exiv28Internal7enforceISt14overflow_errorJRA22_KcEEEvbDpOT0_:
   35|    396|constexpr void enforce(bool condition, T&&... args) {
   36|    396|  if (!condition) {
  ------------------
  |  Branch (36:7): [True: 0, False: 396]
  ------------------
   37|      0|    throw exception_t(std::forward<T>(args)...);
   38|      0|  }
   39|    396|}

_ZN5Exiv28EpsImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
 1027|  1.32k|    Image(ImageType::eps, mdXmp, std::move(io), params) {
 1028|       |  // LogMsg::setLevel(LogMsg::debug);
 1029|  1.32k|  if (params.create() && io_->open() == 0) {
  ------------------
  |  Branch (1029:7): [True: 0, False: 1.32k]
  |  Branch (1029:26): [True: 0, False: 0]
  ------------------
 1030|       |#ifdef DEBUG
 1031|       |    EXV_DEBUG << "Exiv2::EpsImage:: Creating blank EPS image\n";
 1032|       |#endif
 1033|      0|    IoCloser closer(*io_);
 1034|      0|    if (io_->write(reinterpret_cast<const byte*>(epsBlank.data()), epsBlank.size()) != epsBlank.size()) {
  ------------------
  |  Branch (1034:9): [True: 0, False: 0]
  ------------------
 1035|      0|#ifndef SUPPRESS_WARNINGS
 1036|      0|      EXV_WARNING << "Failed to write blank EPS image.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1037|      0|#endif
 1038|      0|      throw Error(ErrorCode::kerImageWriteFailed);
 1039|      0|    }
 1040|      0|  }
 1041|  1.32k|}
_ZN5Exiv28EpsImage12readMetadataEv:
 1051|  1.32k|void EpsImage::readMetadata() {
 1052|       |#ifdef DEBUG
 1053|       |  EXV_DEBUG << "Exiv2::EpsImage::readMetadata: Reading EPS file " << io_->path() << "\n";
 1054|       |#endif
 1055|       |
 1056|       |  // read metadata
 1057|  1.32k|  readWriteEpsMetadata(*io_, xmpPacket_, nativePreviews_, /* write = */ false);
 1058|       |
 1059|       |  // decode XMP metadata
 1060|  1.32k|  const DecodeParams dp(max_recursion_depth_);
 1061|  1.32k|  if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_, dp) > 1) {
  ------------------
  |  Branch (1061:7): [True: 11, False: 1.31k]
  |  Branch (1061:30): [True: 11, False: 0]
  ------------------
 1062|     11|#ifndef SUPPRESS_WARNINGS
 1063|     11|    EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|     11|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 11]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     11|  LogMsg(LogMsg::warn).os()
  ------------------
 1064|     11|#endif
 1065|     11|    throw Error(ErrorCode::kerFailedToReadImageData);
 1066|     11|  }
 1067|       |
 1068|       |#ifdef DEBUG
 1069|       |  EXV_DEBUG << "Exiv2::EpsImage::readMetadata: Finished reading EPS file " << io_->path() << "\n";
 1070|       |#endif
 1071|  1.32k|}
_ZN5Exiv214newEpsInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
 1096|  1.32k|Image::UniquePtr newEpsInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
 1097|  1.32k|  auto image = std::make_unique<EpsImage>(std::move(io), params);
 1098|  1.32k|  if (!image->good()) {
  ------------------
  |  Branch (1098:7): [True: 0, False: 1.32k]
  ------------------
 1099|      0|    return nullptr;
 1100|      0|  }
 1101|  1.32k|  return image;
 1102|  1.32k|}
_ZN5Exiv29isEpsTypeERNS_7BasicIoEb:
 1104|  13.6k|bool isEpsType(BasicIo& iIo, bool advance) {
 1105|       |  // read as many bytes as needed for the longest (DOS) EPS signature
 1106|  13.6k|  constexpr auto bufSize = [] {
 1107|  13.6k|    auto f = [](const auto& a, const auto& b) { return a.size() < b.size(); };
 1108|  13.6k|    return std::max_element(epsFirstLine.begin(), epsFirstLine.end(), f)->size();
 1109|  13.6k|  }();
 1110|  13.6k|  const size_t restore = iIo.tell();  // save
 1111|  13.6k|  DataBuf buf = iIo.read(bufSize);
 1112|  13.6k|  if (iIo.error() || buf.size() != bufSize) {
  ------------------
  |  Branch (1112:7): [True: 0, False: 13.6k]
  |  Branch (1112:22): [True: 0, False: 13.6k]
  ------------------
 1113|      0|    iIo.seek(restore, BasicIo::beg);
 1114|      0|    return false;
 1115|      0|  }
 1116|       |  // check for all possible (DOS) EPS signatures
 1117|  13.6k|  bool matched = (buf.cmpBytes(0, dosEpsSignature.data(), dosEpsSignature.size()) == 0);
 1118|  13.6k|  if (!matched) {
  ------------------
  |  Branch (1118:7): [True: 13.2k, False: 470]
  ------------------
 1119|  38.1k|    for (auto&& eps : epsFirstLine) {
  ------------------
  |  Branch (1119:21): [True: 38.1k, False: 11.0k]
  ------------------
 1120|  38.1k|      if (buf.cmpBytes(0, eps.data(), eps.size()) == 0) {
  ------------------
  |  Branch (1120:11): [True: 2.17k, False: 35.9k]
  ------------------
 1121|  2.17k|        matched = true;
 1122|  2.17k|        break;
 1123|  2.17k|      }
 1124|  38.1k|    }
 1125|  13.2k|  }
 1126|       |  // seek back if possible and requested
 1127|  13.6k|  if (!advance || !matched) {
  ------------------
  |  Branch (1127:7): [True: 13.6k, False: 0]
  |  Branch (1127:19): [True: 0, False: 0]
  ------------------
 1128|  13.6k|    iIo.seek(restore, BasicIo::beg);
 1129|  13.6k|  }
 1130|  13.6k|  return matched;
 1131|  13.6k|}
epsimage.cpp:_ZN12_GLOBAL__N_120readWriteEpsMetadataERN5Exiv27BasicIoERNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERNS3_6vectorINS0_13NativePreviewENS7_ISC_EEEEb:
  224|  1.32k|void readWriteEpsMetadata(BasicIo& io, std::string& xmpPacket, NativePreviewList& nativePreviews, bool write) {
  225|       |  // open input file
  226|  1.32k|  if (io.open() != 0) {
  ------------------
  |  Branch (226:7): [True: 0, False: 1.32k]
  ------------------
  227|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io.path(), strError());
  228|      0|  }
  229|  1.32k|  IoCloser closer(io);
  230|       |
  231|       |  // read from input file via memory map
  232|  1.32k|  const byte* data = io.mmap();
  233|       |
  234|       |  // default positions and sizes
  235|  1.32k|  const size_t size = io.size();
  236|  1.32k|  size_t posEps = 0;
  237|  1.32k|  size_t posEndEps = size;
  238|  1.32k|  uint32_t posWmf = 0;
  239|  1.32k|  uint32_t sizeWmf = 0;
  240|  1.32k|  uint32_t posTiff = 0;
  241|  1.32k|  uint32_t sizeTiff = 0;
  242|       |
  243|  1.32k|  ErrorCode errcode = write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData;
  ------------------
  |  Branch (243:23): [True: 0, False: 1.32k]
  ------------------
  244|       |
  245|       |  // check for DOS EPS
  246|  1.32k|  const bool dosEps =
  247|  1.32k|      (size >= dosEpsSignature.size() && memcmp(data, dosEpsSignature.data(), dosEpsSignature.size()) == 0);
  ------------------
  |  Branch (247:8): [True: 1.32k, False: 0]
  |  Branch (247:42): [True: 235, False: 1.08k]
  ------------------
  248|  1.32k|  if (dosEps) {
  ------------------
  |  Branch (248:7): [True: 235, False: 1.08k]
  ------------------
  249|       |#ifdef DEBUG
  250|       |    EXV_DEBUG << "readWriteEpsMetadata: Found DOS EPS signature\n";
  251|       |#endif
  252|       |
  253|    235|    enforce(size >= 30, errcode);
  254|    235|    posEps = getULong(data + 4, littleEndian);
  255|    235|    posEndEps = getULong(data + 8, littleEndian) + posEps;
  256|    235|    posWmf = getULong(data + 12, littleEndian);
  257|    235|    sizeWmf = getULong(data + 16, littleEndian);
  258|    235|    posTiff = getULong(data + 20, littleEndian);
  259|    235|    sizeTiff = getULong(data + 24, littleEndian);
  260|       |#ifdef DEBUG
  261|       |    EXV_DEBUG << "readWriteEpsMetadata: EPS section at position " << posEps << ", size " << (posEndEps - posEps)
  262|       |              << "\n";
  263|       |    EXV_DEBUG << "readWriteEpsMetadata: WMF section at position " << posWmf << ", size " << sizeWmf << "\n";
  264|       |    EXV_DEBUG << "readWriteEpsMetadata: TIFF section at position " << posTiff << ", size " << sizeTiff << "\n";
  265|       |#endif
  266|    235|    if (uint16_t checksum = getUShort(data + 28, littleEndian); checksum != 0xFFFF) {
  ------------------
  |  Branch (266:65): [True: 215, False: 20]
  ------------------
  267|       |#ifdef DEBUG
  268|       |      EXV_DEBUG << "readWriteEpsMetadata: DOS EPS checksum is not FFFF\n";
  269|       |#endif
  270|    215|    }
  271|    235|    if ((posWmf != 0 || sizeWmf != 0) && (posTiff != 0 || sizeTiff != 0)) {
  ------------------
  |  Branch (271:10): [True: 175, False: 60]
  |  Branch (271:25): [True: 37, False: 23]
  |  Branch (271:43): [True: 151, False: 60]
  |  Branch (271:59): [True: 46, False: 14]
  ------------------
  272|    197|#ifndef SUPPRESS_WARNINGS
  273|    197|      EXV_WARNING << "DOS EPS file has both WMF and TIFF section. Only one of those is allowed.\n";
  ------------------
  |  |  138|    197|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 197]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    197|  LogMsg(LogMsg::warn).os()
  ------------------
  274|    197|#endif
  275|    197|      if (write)
  ------------------
  |  Branch (275:11): [True: 0, False: 197]
  ------------------
  276|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  277|    197|    }
  278|    235|    if (sizeWmf == 0 && sizeTiff == 0) {
  ------------------
  |  Branch (278:9): [True: 78, False: 157]
  |  Branch (278:25): [True: 26, False: 52]
  ------------------
  279|     26|#ifndef SUPPRESS_WARNINGS
  280|     26|      EXV_WARNING << "DOS EPS file has neither WMF nor TIFF section. Exactly one of those is required.\n";
  ------------------
  |  |  138|     26|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 26]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     26|  LogMsg(LogMsg::warn).os()
  ------------------
  281|     26|#endif
  282|     26|      if (write)
  ------------------
  |  Branch (282:11): [True: 0, False: 26]
  ------------------
  283|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  284|     26|    }
  285|    235|    enforce(30 <= posEps, errcode);
  286|    235|    enforce(sizeWmf == 0 || 30 <= posWmf, errcode);
  ------------------
  |  Branch (286:13): [True: 91, False: 144]
  |  Branch (286:29): [True: 110, False: 34]
  ------------------
  287|    235|    enforce(sizeTiff == 0 || 30 <= posTiff, errcode);
  ------------------
  |  Branch (287:13): [True: 81, False: 154]
  |  Branch (287:30): [True: 116, False: 38]
  ------------------
  288|       |
  289|    235|    enforce(posEps <= posEndEps && posEndEps <= size, errcode);
  ------------------
  |  Branch (289:13): [True: 143, False: 92]
  |  Branch (289:36): [True: 47, False: 96]
  ------------------
  290|    235|    enforce(posWmf <= size && sizeWmf <= size - posWmf, errcode);
  ------------------
  |  Branch (290:13): [True: 35, False: 200]
  |  Branch (290:31): [True: 24, False: 11]
  ------------------
  291|    235|    enforce(posTiff <= size && sizeTiff <= size - posTiff, errcode);
  ------------------
  |  Branch (291:13): [True: 13, False: 222]
  |  Branch (291:32): [True: 12, False: 1]
  ------------------
  292|    235|  }
  293|       |
  294|       |  // check first line
  295|  1.32k|  std::string firstLine;
  296|  1.32k|  const size_t posSecondLine = readLine(firstLine, data, posEps, posEndEps);
  297|       |#ifdef DEBUG
  298|       |  EXV_DEBUG << "readWriteEpsMetadata: First line: " << firstLine << "\n";
  299|       |#endif
  300|  1.32k|  auto it = std::find(epsFirstLine.begin(), epsFirstLine.end(), firstLine);
  301|  1.32k|  if (it == epsFirstLine.end()) {
  ------------------
  |  Branch (301:7): [True: 45, False: 1.27k]
  ------------------
  302|     45|    throw Error(ErrorCode::kerNotAnImage, "EPS");
  303|     45|  }
  304|       |
  305|       |  // determine line ending style of the first line
  306|  1.27k|  if (posSecondLine >= posEndEps) {
  ------------------
  |  Branch (306:7): [True: 3, False: 1.27k]
  ------------------
  307|      3|#ifndef SUPPRESS_WARNINGS
  308|      3|    EXV_WARNING << "Premature end of file after first line.\n";
  ------------------
  |  |  138|      3|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 3]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      3|  LogMsg(LogMsg::warn).os()
  ------------------
  309|      3|#endif
  310|      3|    throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (310:17): [True: 0, False: 3]
  ------------------
  311|      3|  }
  312|  1.27k|  const std::string lineEnding(reinterpret_cast<const char*>(data + posEps + firstLine.size()),
  313|  1.27k|                               posSecondLine - (posEps + firstLine.size()));
  314|       |#ifdef DEBUG
  315|       |  if (lineEnding == "\n") {
  316|       |    EXV_DEBUG << "readWriteEpsMetadata: Line ending style: Unix (LF)\n";
  317|       |  } else if (lineEnding == "\r") {
  318|       |    EXV_DEBUG << "readWriteEpsMetadata: Line ending style: Mac (CR)\n";
  319|       |  } else if (lineEnding == "\r\n") {
  320|       |    EXV_DEBUG << "readWriteEpsMetadata: Line ending style: DOS (CR LF)\n";
  321|       |  } else {
  322|       |    EXV_DEBUG << "readWriteEpsMetadata: Line ending style: (unknown)\n";
  323|       |  }
  324|       |#endif
  325|       |
  326|       |  // scan comments
  327|  1.27k|  size_t posLanguageLevel = posEndEps;
  328|  1.27k|  size_t posContainsXmp = posEndEps;
  329|  1.27k|  size_t posPages = posEndEps;
  330|  1.27k|  size_t posExiv2Version = posEndEps;
  331|  1.27k|  size_t posExiv2Website = posEndEps;
  332|  1.27k|  size_t posEndComments = posEndEps;
  333|  1.27k|  size_t posAi7Thumbnail = posEndEps;
  334|  1.27k|  size_t posAi7ThumbnailEndData = posEndEps;
  335|  1.27k|  size_t posBeginPhotoshop = posEndEps;
  336|  1.27k|  size_t posEndPhotoshop = posEndEps;
  337|  1.27k|  size_t posPage = posEndEps;
  338|  1.27k|  size_t posBeginPageSetup = posEndEps;
  339|  1.27k|  size_t posEndPageSetup = posEndEps;
  340|  1.27k|  size_t posPageTrailer = posEndEps;
  341|  1.27k|  size_t posEof = posEndEps;
  342|  1.27k|  std::vector<std::pair<size_t, size_t>> removableEmbeddings;
  343|  1.27k|  size_t depth = 0;
  344|  1.27k|  const size_t maxDepth = std::numeric_limits<size_t>::max();
  345|  1.27k|  bool illustrator8 = false;
  346|  1.27k|  bool corelDraw = false;
  347|  1.27k|  bool implicitPage = false;
  348|  1.27k|  bool implicitPageSetup = false;
  349|  1.27k|  bool implicitPageTrailer = false;
  350|  1.27k|  bool inDefaultsPreviewPrologSetup = false;
  351|  1.27k|  bool inRemovableEmbedding = false;
  352|  1.27k|  std::string removableEmbeddingEndLine;
  353|  1.27k|  size_t removableEmbeddingsWithUnmarkedTrailer = 0;
  354|   235k|  for (size_t pos = posEps; pos < posEof;) {
  ------------------
  |  Branch (354:29): [True: 233k, False: 1.22k]
  ------------------
  355|   233k|    const size_t startPos = pos;
  356|   233k|    std::string line;
  357|   233k|    pos = readLine(line, data, startPos, posEndEps);
  358|       |#ifdef DEBUG
  359|       |    bool significantLine = true;
  360|       |#endif
  361|       |    // nested documents
  362|   233k|    if (posPage == posEndEps && (line.starts_with("%%IncludeDocument:") || line.starts_with("%%BeginDocument:"))) {
  ------------------
  |  Branch (362:9): [True: 162k, False: 71.2k]
  |  Branch (362:34): [True: 3, False: 162k]
  |  Branch (362:76): [True: 11, False: 162k]
  ------------------
  363|     14|#ifndef SUPPRESS_WARNINGS
  364|     14|      EXV_WARNING << "Nested document at invalid position: " << startPos << "\n";
  ------------------
  |  |  138|     14|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 14]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     14|  LogMsg(LogMsg::warn).os()
  ------------------
  365|     14|#endif
  366|     14|      throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (366:19): [True: 0, False: 14]
  ------------------
  367|     14|    }
  368|   233k|    if (line.starts_with("%%BeginDocument:")) {
  ------------------
  |  Branch (368:9): [True: 277, False: 233k]
  ------------------
  369|    277|      if (depth == maxDepth) {
  ------------------
  |  Branch (369:11): [True: 0, False: 277]
  ------------------
  370|      0|#ifndef SUPPRESS_WARNINGS
  371|      0|        EXV_WARNING << "Document too deeply nested at position: " << startPos << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  372|      0|#endif
  373|      0|        throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (373:21): [True: 0, False: 0]
  ------------------
  374|      0|      }
  375|    277|      depth++;
  376|   233k|    } else if (line.starts_with("%%EndDocument")) {
  ------------------
  |  Branch (376:16): [True: 80, False: 233k]
  ------------------
  377|     80|      if (depth == 0) {
  ------------------
  |  Branch (377:11): [True: 10, False: 70]
  ------------------
  378|     10|#ifndef SUPPRESS_WARNINGS
  379|     10|        EXV_WARNING << "Unmatched EndDocument at position: " << startPos << "\n";
  ------------------
  |  |  138|     10|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 10]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     10|  LogMsg(LogMsg::warn).os()
  ------------------
  380|     10|#endif
  381|     10|        throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (381:21): [True: 0, False: 10]
  ------------------
  382|     10|      }
  383|     70|      depth--;
  384|   233k|    } else {
  385|       |#ifdef DEBUG
  386|       |      significantLine = false;
  387|       |#endif
  388|   233k|    }
  389|       |#ifdef DEBUG
  390|       |    if (significantLine) {
  391|       |      EXV_DEBUG << "readWriteEpsMetadata: Found significant line \"" << line << "\" at position: " << startPos << "\n";
  392|       |    }
  393|       |    significantLine = true;
  394|       |#endif
  395|   233k|    if (depth != 0)
  ------------------
  |  Branch (395:9): [True: 1.36k, False: 232k]
  ------------------
  396|  1.36k|      continue;
  397|       |    // explicit "Begin" comments
  398|   232k|    if (line.starts_with("%%BeginPreview:")) {
  ------------------
  |  Branch (398:9): [True: 563, False: 231k]
  ------------------
  399|    563|      inDefaultsPreviewPrologSetup = true;
  400|   231k|    } else if (line == "%%BeginDefaults") {
  ------------------
  |  Branch (400:16): [True: 107, False: 231k]
  ------------------
  401|    107|      inDefaultsPreviewPrologSetup = true;
  402|   231k|    } else if (line == "%%BeginProlog") {
  ------------------
  |  Branch (402:16): [True: 223, False: 231k]
  ------------------
  403|    223|      inDefaultsPreviewPrologSetup = true;
  404|   231k|    } else if (line == "%%BeginSetup") {
  ------------------
  |  Branch (404:16): [True: 526, False: 230k]
  ------------------
  405|    526|      inDefaultsPreviewPrologSetup = true;
  406|   230k|    } else if (posPage == posEndEps && line.starts_with("%%Page:")) {
  ------------------
  |  Branch (406:16): [True: 161k, False: 69.4k]
  |  Branch (406:40): [True: 71, False: 161k]
  ------------------
  407|     71|      posPage = startPos;
  408|   230k|    } else if (posPage != posEndEps && line.starts_with("%%Page:")) {
  ------------------
  |  Branch (408:16): [True: 69.4k, False: 161k]
  |  Branch (408:40): [True: 23, False: 69.4k]
  ------------------
  409|     23|      if (implicitPage) {
  ------------------
  |  Branch (409:11): [True: 14, False: 9]
  ------------------
  410|     14|#ifndef SUPPRESS_WARNINGS
  411|     14|        EXV_WARNING << "Page at position " << startPos << " conflicts with implicit page at position: " << posPage
  ------------------
  |  |  138|     14|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 14]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     14|  LogMsg(LogMsg::warn).os()
  ------------------
  412|      0|                    << "\n";
  413|     14|#endif
  414|     14|        throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (414:21): [True: 0, False: 14]
  ------------------
  415|     14|      }
  416|      9|#ifndef SUPPRESS_WARNINGS
  417|      9|      EXV_WARNING << "Unable to handle multiple PostScript pages. Found second page at position: " << startPos << "\n";
  ------------------
  |  |  138|      9|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 9]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      9|  LogMsg(LogMsg::warn).os()
  ------------------
  418|      9|#endif
  419|      9|      throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (419:19): [True: 0, False: 9]
  ------------------
  420|   230k|    } else if (line == "%%BeginPageSetup") {
  ------------------
  |  Branch (420:16): [True: 503, False: 230k]
  ------------------
  421|    503|      posBeginPageSetup = startPos;
  422|   230k|    } else if (!inRemovableEmbedding && line == "%Exiv2BeginXMP: Before %%EndPageSetup") {
  ------------------
  |  Branch (422:16): [True: 83.3k, False: 147k]
  |  Branch (422:41): [True: 544, False: 82.7k]
  ------------------
  423|    544|      inRemovableEmbedding = true;
  424|    544|      removableEmbeddings.emplace_back(startPos, startPos);
  425|    544|      removableEmbeddingEndLine = "%Exiv2EndXMP";
  426|   229k|    } else if (!inRemovableEmbedding && line == "%Exiv2BeginXMP: After %%PageTrailer") {
  ------------------
  |  Branch (426:16): [True: 82.7k, False: 147k]
  |  Branch (426:41): [True: 432, False: 82.3k]
  ------------------
  427|    432|      inRemovableEmbedding = true;
  428|    432|      removableEmbeddings.emplace_back(startPos, startPos);
  429|    432|      removableEmbeddingEndLine = "%Exiv2EndXMP";
  430|   229k|    } else if (!inRemovableEmbedding && line == "%ADOBeginClientInjection: PageSetup End \"AI11EPS\"") {
  ------------------
  |  Branch (430:16): [True: 82.3k, False: 147k]
  |  Branch (430:41): [True: 752, False: 81.5k]
  ------------------
  431|    752|      inRemovableEmbedding = true;
  432|    752|      removableEmbeddings.emplace_back(startPos, startPos);
  433|    752|      removableEmbeddingEndLine = "%ADOEndClientInjection: PageSetup End \"AI11EPS\"";
  434|   228k|    } else if (!inRemovableEmbedding && line == "%ADOBeginClientInjection: PageTrailer Start \"AI11EPS\"") {
  ------------------
  |  Branch (434:16): [True: 81.5k, False: 147k]
  |  Branch (434:41): [True: 340, False: 81.2k]
  ------------------
  435|    340|      inRemovableEmbedding = true;
  436|    340|      removableEmbeddings.emplace_back(startPos, startPos);
  437|    340|      removableEmbeddingEndLine = "%ADOEndClientInjection: PageTrailer Start \"AI11EPS\"";
  438|   228k|    } else if (!inRemovableEmbedding && line == "%begin_xml_code") {
  ------------------
  |  Branch (438:16): [True: 81.2k, False: 147k]
  |  Branch (438:41): [True: 776, False: 80.4k]
  ------------------
  439|    776|      inRemovableEmbedding = true;
  440|    776|      removableEmbeddings.emplace_back(startPos, startPos);
  441|    776|      removableEmbeddingEndLine = "%end_xml_code";
  442|    776|      removableEmbeddingsWithUnmarkedTrailer++;
  443|   227k|    } else {
  444|       |#ifdef DEBUG
  445|       |      significantLine = false;
  446|       |#endif
  447|   227k|    }
  448|       |#ifdef DEBUG
  449|       |    if (significantLine) {
  450|       |      EXV_DEBUG << "readWriteEpsMetadata: Found significant line \"" << line << "\" at position: " << startPos << "\n";
  451|       |    }
  452|       |    significantLine = true;
  453|       |#endif
  454|       |    // implicit comments
  455|   232k|    if (line == "%%EOF" || line == "%begin_xml_code" || line.size() < 2 || line.front() != '%' || '\x21' > line[1] ||
  ------------------
  |  Branch (455:9): [True: 12, False: 232k]
  |  Branch (455:28): [True: 1.18k, False: 231k]
  |  Branch (455:57): [True: 103k, False: 127k]
  |  Branch (455:76): [True: 61.8k, False: 65.3k]
  |  Branch (455:99): [True: 4.85k, False: 60.5k]
  ------------------
  456|   171k|        line[1] > '\x7e') {
  ------------------
  |  Branch (456:9): [True: 94, False: 60.4k]
  ------------------
  457|   171k|      if (posEndComments == posEndEps) {
  ------------------
  |  Branch (457:11): [True: 704, False: 171k]
  ------------------
  458|    704|        posEndComments = startPos;
  459|       |#ifdef DEBUG
  460|       |        EXV_DEBUG << "readWriteEpsMetadata: Found implicit EndComments at position: " << startPos << "\n";
  461|       |#endif
  462|    704|      }
  463|   171k|    }
  464|   232k|    if (posPage == posEndEps && posEndComments != posEndEps && !inDefaultsPreviewPrologSetup && !inRemovableEmbedding &&
  ------------------
  |  Branch (464:9): [True: 162k, False: 69.9k]
  |  Branch (464:33): [True: 152k, False: 10.3k]
  |  Branch (464:64): [True: 4.14k, False: 147k]
  |  Branch (464:97): [True: 1.93k, False: 2.20k]
  ------------------
  465|  1.93k|        !onlyWhitespaces(line)) {
  ------------------
  |  Branch (465:9): [True: 524, False: 1.41k]
  ------------------
  466|    524|      posPage = startPos;
  467|    524|      implicitPage = true;
  468|       |#ifdef DEBUG
  469|       |      EXV_DEBUG << "readWriteEpsMetadata: Found implicit Page at position: " << startPos << "\n";
  470|       |#endif
  471|    524|    }
  472|   232k|    if (posBeginPageSetup == posEndEps &&
  ------------------
  |  Branch (472:9): [True: 115k, False: 117k]
  ------------------
  473|   115k|        (implicitPage || (posPage != posEndEps && !inRemovableEmbedding && !line.empty() && line.front() != '%'))) {
  ------------------
  |  Branch (473:10): [True: 518, False: 114k]
  |  Branch (473:27): [True: 1.65k, False: 112k]
  |  Branch (473:51): [True: 1.27k, False: 380]
  |  Branch (473:76): [True: 839, False: 437]
  |  Branch (473:93): [True: 18, False: 821]
  ------------------
  474|    536|      posBeginPageSetup = startPos;
  475|    536|      implicitPageSetup = true;
  476|       |#ifdef DEBUG
  477|       |      EXV_DEBUG << "readWriteEpsMetadata: Found implicit BeginPageSetup at position: " << startPos << "\n";
  478|       |#endif
  479|    536|    }
  480|   232k|    if (posEndPageSetup == posEndEps && implicitPageSetup && !inRemovableEmbedding && !line.empty() &&
  ------------------
  |  Branch (480:9): [True: 137k, False: 94.7k]
  |  Branch (480:41): [True: 3.20k, False: 134k]
  |  Branch (480:62): [True: 2.58k, False: 626]
  |  Branch (480:87): [True: 1.97k, False: 603]
  ------------------
  481|  1.97k|        line.front() != '%') {
  ------------------
  |  Branch (481:9): [True: 425, False: 1.55k]
  ------------------
  482|    425|      posEndPageSetup = startPos;
  483|       |#ifdef DEBUG
  484|       |      EXV_DEBUG << "readWriteEpsMetadata: Found implicit EndPageSetup at position: " << startPos << "\n";
  485|       |#endif
  486|    425|    }
  487|   232k|    if (!line.empty() && line.front() != '%')
  ------------------
  |  Branch (487:9): [True: 144k, False: 87.9k]
  |  Branch (487:26): [True: 77.5k, False: 66.8k]
  ------------------
  488|  77.5k|      continue;  // performance optimization
  489|   154k|    if (line == "%%EOF" || line == "%%Trailer" || line == "%%PageTrailer") {
  ------------------
  |  Branch (489:9): [True: 12, False: 154k]
  |  Branch (489:28): [True: 387, False: 154k]
  |  Branch (489:51): [True: 130, False: 154k]
  ------------------
  490|    529|      if (posBeginPageSetup == posEndEps) {
  ------------------
  |  Branch (490:11): [True: 26, False: 503]
  ------------------
  491|     26|        posBeginPageSetup = startPos;
  492|     26|        implicitPageSetup = true;
  493|       |#ifdef DEBUG
  494|       |        EXV_DEBUG << "readWriteEpsMetadata: Found implicit BeginPageSetup at position: " << startPos << "\n";
  495|       |#endif
  496|     26|      }
  497|    529|      if (posEndPageSetup == posEndEps) {
  ------------------
  |  Branch (497:11): [True: 40, False: 489]
  ------------------
  498|     40|        posEndPageSetup = startPos;
  499|     40|        implicitPageSetup = true;
  500|       |#ifdef DEBUG
  501|       |        EXV_DEBUG << "readWriteEpsMetadata: Found implicit EndPageSetup at position: " << startPos << "\n";
  502|       |#endif
  503|     40|      }
  504|    529|    }
  505|   154k|    if ((line == "%%EOF" || line == "%%Trailer") && posPageTrailer == posEndEps) {
  ------------------
  |  Branch (505:10): [True: 12, False: 154k]
  |  Branch (505:29): [True: 387, False: 154k]
  |  Branch (505:53): [True: 43, False: 356]
  ------------------
  506|     43|      posPageTrailer = startPos;
  507|     43|      implicitPageTrailer = true;
  508|       |#ifdef DEBUG
  509|       |      EXV_DEBUG << "readWriteEpsMetadata: Found implicit PageTrailer at position: " << startPos << "\n";
  510|       |#endif
  511|     43|    }
  512|       |    // remaining explicit comments
  513|   154k|    if (posEndComments == posEndEps && posLanguageLevel == posEndEps && line.starts_with("%%LanguageLevel:")) {
  ------------------
  |  Branch (513:9): [True: 10.9k, False: 143k]
  |  Branch (513:40): [True: 10.5k, False: 381]
  |  Branch (513:73): [True: 19, False: 10.5k]
  ------------------
  514|     19|      posLanguageLevel = startPos;
  515|   154k|    } else if (posEndComments == posEndEps && posContainsXmp == posEndEps && line.starts_with("%ADO_ContainsXMP:")) {
  ------------------
  |  Branch (515:16): [True: 10.9k, False: 143k]
  |  Branch (515:47): [True: 10.4k, False: 456]
  |  Branch (515:78): [True: 84, False: 10.3k]
  ------------------
  516|     84|      posContainsXmp = startPos;
  517|   154k|    } else if (posEndComments == posEndEps && posPages == posEndEps && line.starts_with("%%Pages:")) {
  ------------------
  |  Branch (517:16): [True: 10.8k, False: 143k]
  |  Branch (517:47): [True: 9.87k, False: 958]
  |  Branch (517:72): [True: 29, False: 9.84k]
  ------------------
  518|     29|      posPages = startPos;
  519|   154k|    } else if (posEndComments == posEndEps && posExiv2Version == posEndEps && line.starts_with("%Exiv2Version:")) {
  ------------------
  |  Branch (519:16): [True: 10.8k, False: 143k]
  |  Branch (519:47): [True: 9.44k, False: 1.36k]
  |  Branch (519:79): [True: 19, False: 9.42k]
  ------------------
  520|     19|      posExiv2Version = startPos;
  521|   154k|    } else if (posEndComments == posEndEps && posExiv2Website == posEndEps && line.starts_with("%Exiv2Website:")) {
  ------------------
  |  Branch (521:16): [True: 10.7k, False: 143k]
  |  Branch (521:47): [True: 10.5k, False: 235]
  |  Branch (521:79): [True: 26, False: 10.5k]
  ------------------
  522|     26|      posExiv2Website = startPos;
  523|   154k|    } else if (posEndComments == posEndEps && line.starts_with("%%Creator: Adobe Illustrator") &&
  ------------------
  |  Branch (523:16): [True: 10.7k, False: 143k]
  |  Branch (523:47): [True: 675, False: 10.0k]
  ------------------
  524|    675|               firstLine == "%!PS-Adobe-3.0 EPSF-3.0") {
  ------------------
  |  Branch (524:16): [True: 295, False: 380]
  ------------------
  525|    295|      illustrator8 = true;
  526|   154k|    } else if (posEndComments == posEndEps && line.starts_with("%AI7_Thumbnail:")) {
  ------------------
  |  Branch (526:16): [True: 10.4k, False: 143k]
  |  Branch (526:47): [True: 557, False: 9.90k]
  ------------------
  527|    557|      posAi7Thumbnail = startPos;
  528|   153k|    } else if (posEndComments == posEndEps && posAi7Thumbnail != posEndEps && posAi7ThumbnailEndData == posEndEps &&
  ------------------
  |  Branch (528:16): [True: 9.90k, False: 143k]
  |  Branch (528:47): [True: 1.89k, False: 8.01k]
  |  Branch (528:79): [True: 1.54k, False: 348]
  ------------------
  529|  1.54k|               line == "%%EndData") {
  ------------------
  |  Branch (529:16): [True: 79, False: 1.47k]
  ------------------
  530|     79|      posAi7ThumbnailEndData = startPos;
  531|   153k|    } else if (posEndComments == posEndEps && line == "%%EndComments") {
  ------------------
  |  Branch (531:16): [True: 9.82k, False: 143k]
  |  Branch (531:47): [True: 1, False: 9.82k]
  ------------------
  532|      1|      posEndComments = startPos;
  533|   153k|    } else if (inDefaultsPreviewPrologSetup && line.starts_with("%%BeginResource: procset wCorel")) {
  ------------------
  |  Branch (533:16): [True: 104k, False: 48.9k]
  |  Branch (533:48): [True: 98, False: 104k]
  ------------------
  534|     98|      corelDraw = true;
  535|   153k|    } else if (line == "%%EndPreview") {
  ------------------
  |  Branch (535:16): [True: 501, False: 153k]
  ------------------
  536|    501|      inDefaultsPreviewPrologSetup = false;
  537|   153k|    } else if (line == "%%EndDefaults") {
  ------------------
  |  Branch (537:16): [True: 66, False: 153k]
  ------------------
  538|     66|      inDefaultsPreviewPrologSetup = false;
  539|   153k|    } else if (line == "%%EndProlog") {
  ------------------
  |  Branch (539:16): [True: 295, False: 152k]
  ------------------
  540|    295|      inDefaultsPreviewPrologSetup = false;
  541|   152k|    } else if (line == "%%EndSetup") {
  ------------------
  |  Branch (541:16): [True: 402, False: 152k]
  ------------------
  542|    402|      inDefaultsPreviewPrologSetup = false;
  543|   152k|    } else if (posEndPageSetup == posEndEps && line == "%%EndPageSetup") {
  ------------------
  |  Branch (543:16): [True: 90.4k, False: 61.8k]
  |  Branch (543:48): [True: 11, False: 90.4k]
  ------------------
  544|     11|      posEndPageSetup = startPos;
  545|   152k|    } else if (posPageTrailer == posEndEps && line == "%%PageTrailer") {
  ------------------
  |  Branch (545:16): [True: 117k, False: 34.6k]
  |  Branch (545:47): [True: 19, False: 117k]
  ------------------
  546|     19|      posPageTrailer = startPos;
  547|   152k|    } else if (posBeginPhotoshop == posEndEps && line.starts_with("%BeginPhotoshop:")) {
  ------------------
  |  Branch (547:16): [True: 151k, False: 812]
  |  Branch (547:50): [True: 44, False: 151k]
  ------------------
  548|     44|      posBeginPhotoshop = pos;
  549|   152k|    } else if (posBeginPhotoshop != posEndEps && posEndPhotoshop == posEndEps && line == "%EndPhotoshop") {
  ------------------
  |  Branch (549:16): [True: 812, False: 151k]
  |  Branch (549:50): [True: 674, False: 138]
  |  Branch (549:82): [True: 17, False: 657]
  ------------------
  550|     17|      posEndPhotoshop = startPos;
  551|   152k|    } else if (inRemovableEmbedding && line == removableEmbeddingEndLine) {
  ------------------
  |  Branch (551:16): [True: 94.7k, False: 57.4k]
  |  Branch (551:40): [True: 2.64k, False: 92.1k]
  ------------------
  552|  2.64k|      inRemovableEmbedding = false;
  553|  2.64k|      removableEmbeddings.back().second = pos;
  554|   149k|    } else if (line == "%%EOF") {
  ------------------
  |  Branch (554:16): [True: 12, False: 149k]
  ------------------
  555|     12|      posEof = startPos;
  556|   149k|    } else {
  557|       |#ifdef DEBUG
  558|       |      significantLine = false;
  559|       |#endif
  560|   149k|    }
  561|       |#ifdef DEBUG
  562|       |    if (significantLine) {
  563|       |      EXV_DEBUG << "readWriteEpsMetadata: Found significant line \"" << line << "\" at position: " << startPos << "\n";
  564|       |    }
  565|       |#endif
  566|   154k|  }
  567|       |
  568|       |  // check for unfinished nested documents
  569|  1.22k|  if (depth != 0) {
  ------------------
  |  Branch (569:7): [True: 21, False: 1.20k]
  ------------------
  570|     21|#ifndef SUPPRESS_WARNINGS
  571|     21|    EXV_WARNING << "Unmatched BeginDocument (" << depth << "x)\n";
  ------------------
  |  |  138|     21|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 21]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     21|  LogMsg(LogMsg::warn).os()
  ------------------
  572|     21|#endif
  573|     21|    throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (573:17): [True: 0, False: 21]
  ------------------
  574|     21|  }
  575|       |
  576|       |  // look for the unmarked trailers of some removable XMP embeddings
  577|  1.20k|  size_t posXmpTrailerEnd = posEof;
  578|  1.21k|  for (size_t i = 0; i < removableEmbeddingsWithUnmarkedTrailer; i++) {
  ------------------
  |  Branch (578:22): [True: 139, False: 1.07k]
  ------------------
  579|    139|    std::string line1;
  580|    139|    const size_t posLine1 = readPrevLine(line1, data, posXmpTrailerEnd, posEndEps);
  581|    139|    std::string line2;
  582|    139|    const size_t posLine2 = readPrevLine(line2, data, posLine1, posEndEps);
  583|    139|    size_t posXmpTrailer;
  584|    139|    if (line1 == "[/EMC pdfmark") {  // Exiftool style
  ------------------
  |  Branch (584:9): [True: 3, False: 136]
  ------------------
  585|      3|      posXmpTrailer = posLine1;
  586|    136|    } else if (line1 == "[/NamespacePop pdfmark" &&
  ------------------
  |  Branch (586:16): [True: 20, False: 116]
  ------------------
  587|     20|               line2 ==
  ------------------
  |  Branch (587:16): [True: 0, False: 20]
  ------------------
  588|     20|                   "[{nextImage} 1 dict begin /Metadata {photoshop_metadata_stream} def currentdict end /PUT "
  589|     20|                   "pdfmark") {  // Photoshop style
  590|      0|      posXmpTrailer = posLine2;
  591|    136|    } else {
  592|    136|#ifndef SUPPRESS_WARNINGS
  593|    136|      EXV_WARNING << "Unable to find XMP embedding trailer ending at position: " << posXmpTrailerEnd << "\n";
  ------------------
  |  |  138|    136|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 136]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    136|  LogMsg(LogMsg::warn).os()
  ------------------
  594|    136|#endif
  595|    136|      if (write)
  ------------------
  |  Branch (595:11): [True: 0, False: 136]
  ------------------
  596|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  597|    136|      break;
  598|    136|    }
  599|      3|    removableEmbeddings.emplace_back(posXmpTrailer, posXmpTrailerEnd);
  600|       |#ifdef DEBUG
  601|       |    auto [r, s] = removableEmbeddings.back();
  602|       |    EXV_DEBUG << "readWriteEpsMetadata: Recognized unmarked trailer of removable XMP embedding at [" << r << "," << s
  603|       |              << ")\n";
  604|       |#endif
  605|      3|    posXmpTrailerEnd = posXmpTrailer;
  606|      3|  }
  607|       |
  608|       |  // interpret comment "%ADO_ContainsXMP:"
  609|  1.20k|  std::string line;
  610|  1.20k|  readLine(line, data, posContainsXmp, posEndEps);
  611|  1.20k|  bool containsXmp;
  612|  1.20k|  if (line == "%ADO_ContainsXMP: MainFirst" || line == "%ADO_ContainsXMP:MainFirst") {
  ------------------
  |  Branch (612:7): [True: 225, False: 982]
  |  Branch (612:48): [True: 28, False: 954]
  ------------------
  613|     30|    containsXmp = true;
  614|  1.17k|  } else if (line.empty() || line == "%ADO_ContainsXMP: NoMain" || line == "%ADO_ContainsXMP:NoMain") {
  ------------------
  |  Branch (614:14): [True: 1.12k, False: 52]
  |  Branch (614:30): [True: 0, False: 52]
  |  Branch (614:68): [True: 1, False: 51]
  ------------------
  615|    903|    containsXmp = false;
  616|    903|  } else {
  617|    274|#ifndef SUPPRESS_WARNINGS
  618|    274|    EXV_WARNING << "Invalid line \"" << line << "\" at position: " << posContainsXmp << "\n";
  ------------------
  |  |  138|    274|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 274]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    274|  LogMsg(LogMsg::warn).os()
  ------------------
  619|    274|#endif
  620|    274|    throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (620:17): [True: 0, False: 274]
  ------------------
  621|    274|  }
  622|       |
  623|    933|  const bool deleteXmp = (write && xmpPacket.empty());
  ------------------
  |  Branch (623:27): [True: 0, False: 933]
  |  Branch (623:36): [True: 0, False: 0]
  ------------------
  624|    933|  bool fixBeginXmlPacket = false;
  625|    933|  bool useFlexibleEmbedding = false;
  626|    933|  size_t xmpPos = posEndEps;
  627|    933|  size_t xmpSize = 0;
  628|    933|  if (containsXmp) {
  ------------------
  |  Branch (628:7): [True: 30, False: 903]
  ------------------
  629|       |    // search for XMP metadata
  630|     30|    findXmp(xmpPos, xmpSize, data, posEps, posEndEps, write);
  631|     30|    if (xmpPos == posEndEps) {
  ------------------
  |  Branch (631:9): [True: 9, False: 21]
  ------------------
  632|      9|#ifndef SUPPRESS_WARNINGS
  633|      9|      EXV_WARNING << "Unable to find XMP metadata as announced at position: " << posContainsXmp << "\n";
  ------------------
  |  |  138|      9|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 9]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      9|  LogMsg(LogMsg::warn).os()
  ------------------
  634|      9|#endif
  635|      9|    }
  636|       |    // check embedding of XMP metadata
  637|     30|    const size_t posLineAfterXmp = readLine(line, data, xmpPos + xmpSize, posEndEps);
  638|     30|    if (!line.empty()) {
  ------------------
  |  Branch (638:9): [True: 7, False: 23]
  ------------------
  639|      7|#ifndef SUPPRESS_WARNINGS
  640|      7|      EXV_WARNING << "Unexpected " << line.size() << " bytes of data after XMP at position: " << (xmpPos + xmpSize)
  ------------------
  |  |  138|      7|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 7]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      7|  LogMsg(LogMsg::warn).os()
  ------------------
  641|      0|                  << "\n";
  642|      7|#endif
  643|     23|    } else if (!deleteXmp) {
  ------------------
  |  Branch (643:16): [True: 14, False: 9]
  ------------------
  644|     14|      readLine(line, data, posLineAfterXmp, posEndEps);
  645|     14|      if (line == "% &&end XMP packet marker&&" || line == "%  &&end XMP packet marker&&") {
  ------------------
  |  Branch (645:11): [True: 2, False: 12]
  |  Branch (645:52): [True: 0, False: 12]
  ------------------
  646|      2|        useFlexibleEmbedding = true;
  647|      2|      }
  648|     14|    }
  649|     30|  }
  650|    933|  if (useFlexibleEmbedding) {
  ------------------
  |  Branch (650:7): [True: 2, False: 931]
  ------------------
  651|       |#ifdef DEBUG
  652|       |    EXV_DEBUG << "readWriteEpsMetadata: Using flexible XMP embedding\n";
  653|       |#endif
  654|      2|    const size_t posBeginXmlPacket = readPrevLine(line, data, xmpPos, posEndEps);
  655|      2|    if (line.starts_with("%begin_xml_packet:")) {
  ------------------
  |  Branch (655:9): [True: 0, False: 2]
  ------------------
  656|       |#ifdef DEBUG
  657|       |      EXV_DEBUG << "readWriteEpsMetadata: XMP embedding contains %begin_xml_packet\n";
  658|       |#endif
  659|      0|      if (write) {
  ------------------
  |  Branch (659:11): [True: 0, False: 0]
  ------------------
  660|      0|        fixBeginXmlPacket = true;
  661|      0|        xmpSize += (xmpPos - posBeginXmlPacket);
  662|      0|        xmpPos = posBeginXmlPacket;
  663|      0|      }
  664|      2|    } else if (posBeginPhotoshop != posEndEps) {
  ------------------
  |  Branch (664:16): [True: 1, False: 1]
  ------------------
  665|      1|#ifndef SUPPRESS_WARNINGS
  666|      1|      EXV_WARNING << "Missing %begin_xml_packet in Photoshop EPS at position: " << xmpPos << "\n";
  ------------------
  |  |  138|      1|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      1|  LogMsg(LogMsg::warn).os()
  ------------------
  667|      1|#endif
  668|      1|      if (write)
  ------------------
  |  Branch (668:11): [True: 0, False: 1]
  ------------------
  669|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  670|      1|    }
  671|      2|  }
  672|    933|  if (!useFlexibleEmbedding) {
  ------------------
  |  Branch (672:7): [True: 922, False: 11]
  ------------------
  673|       |    // check if there are irremovable XMP metadata blocks before EndPageSetup
  674|    922|    size_t posOtherXmp = containsXmp ? xmpPos : posEps;
  ------------------
  |  Branch (674:26): [True: 19, False: 903]
  ------------------
  675|    922|    size_t sizeOtherXmp = 0;
  676|  2.48k|    for (;;) {
  677|  2.48k|      findXmp(posOtherXmp, sizeOtherXmp, data, posOtherXmp + sizeOtherXmp, posEndPageSetup, write);
  678|  2.48k|      if (posOtherXmp >= posEndPageSetup)
  ------------------
  |  Branch (678:11): [True: 792, False: 1.68k]
  ------------------
  679|    792|        break;
  680|  1.68k|      bool isRemovableEmbedding = false;
  681|  64.8k|      for (const auto& [r, s] : removableEmbeddings) {
  ------------------
  |  Branch (681:31): [True: 64.8k, False: 130]
  ------------------
  682|  64.8k|        if (r <= posOtherXmp && posOtherXmp < s) {
  ------------------
  |  Branch (682:13): [True: 64.7k, False: 40]
  |  Branch (682:33): [True: 1.55k, False: 63.2k]
  ------------------
  683|  1.55k|          isRemovableEmbedding = true;
  684|  1.55k|          break;
  685|  1.55k|        }
  686|  64.8k|      }
  687|  1.68k|      if (!isRemovableEmbedding) {
  ------------------
  |  Branch (687:11): [True: 33, False: 1.65k]
  ------------------
  688|     33|#ifndef SUPPRESS_WARNINGS
  689|     33|        EXV_WARNING << "XMP metadata block is not removable at position: " << posOtherXmp << "\n";
  ------------------
  |  |  138|     33|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 33]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     33|  LogMsg(LogMsg::warn).os()
  ------------------
  690|     33|#endif
  691|     33|        if (write)
  ------------------
  |  Branch (691:13): [True: 0, False: 33]
  ------------------
  692|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  693|     33|        break;
  694|     33|      }
  695|  1.68k|    }
  696|    922|  }
  697|       |
  698|    933|  if (!write) {
  ------------------
  |  Branch (698:7): [True: 827, False: 106]
  ------------------
  699|       |    // copy XMP metadata
  700|    827|    xmpPacket.assign(reinterpret_cast<const char*>(data + xmpPos), xmpSize);
  701|       |
  702|       |    // native previews
  703|    827|    nativePreviews.clear();
  704|    827|    if (posAi7ThumbnailEndData != posEndEps) {
  ------------------
  |  Branch (704:9): [True: 65, False: 762]
  ------------------
  705|     65|      NativePreview nativePreview;
  706|     65|      std::string dummy;
  707|     65|      std::string lineAi7Thumbnail;
  708|     65|      const size_t posBeginData = readLine(lineAi7Thumbnail, data, posAi7Thumbnail, posEndEps);
  709|     65|      std::istringstream lineStreamAi7Thumbnail(lineAi7Thumbnail);
  710|     65|      lineStreamAi7Thumbnail >> dummy;
  711|     65|      lineStreamAi7Thumbnail >> nativePreview.width_;
  712|     65|      lineStreamAi7Thumbnail >> nativePreview.height_;
  713|     65|      std::string depthStr;
  714|     65|      lineStreamAi7Thumbnail >> depthStr;
  715|     65|      std::string lineBeginData;
  716|     65|      const size_t posAfterBeginData = readLine(lineBeginData, data, posBeginData, posEndEps);
  717|     65|      std::istringstream lineStreamBeginData(lineBeginData);
  718|     65|      std::string beginData;
  719|     65|      lineStreamBeginData >> beginData;
  720|     65|      lineStreamBeginData >> dummy;
  721|     65|      std::string type;
  722|     65|      lineStreamBeginData >> type;
  723|     65|      nativePreview.position_ = static_cast<long>(posAfterBeginData);
  724|     65|      nativePreview.size_ = static_cast<uint32_t>(posAi7ThumbnailEndData - posAfterBeginData);
  725|     65|      nativePreview.filter_ = "hex-ai7thumbnail-pnm";
  726|     65|      nativePreview.mimeType_ = "image/x-portable-anymap";
  727|     65|      if (depthStr != "8") {
  ------------------
  |  Branch (727:11): [True: 65, False: 0]
  ------------------
  728|     65|#ifndef SUPPRESS_WARNINGS
  729|     65|        EXV_WARNING << "Unable to handle Illustrator thumbnail depth: " << depthStr << "\n";
  ------------------
  |  |  138|     65|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 65]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     65|  LogMsg(LogMsg::warn).os()
  ------------------
  730|     65|#endif
  731|     65|      } else if (beginData != "%%BeginData:") {
  ------------------
  |  Branch (731:18): [True: 0, False: 0]
  ------------------
  732|      0|#ifndef SUPPRESS_WARNINGS
  733|      0|        EXV_WARNING << "Unable to handle Illustrator thumbnail data section: " << lineBeginData << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  734|      0|#endif
  735|      0|      } else if (type != "Hex") {
  ------------------
  |  Branch (735:18): [True: 0, False: 0]
  ------------------
  736|      0|#ifndef SUPPRESS_WARNINGS
  737|      0|        EXV_WARNING << "Unable to handle Illustrator thumbnail data type: " << type << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  738|      0|#endif
  739|      0|      } else {
  740|      0|        nativePreviews.push_back(std::move(nativePreview));
  741|      0|      }
  742|     65|    }
  743|    827|    if (posEndPhotoshop != posEndEps) {
  ------------------
  |  Branch (743:9): [True: 17, False: 810]
  ------------------
  744|     17|      auto sizePhotoshop = posEndPhotoshop - posBeginPhotoshop;
  745|     17|      NativePreview nativePreview{posBeginPhotoshop, sizePhotoshop, 0, 0, "hex-irb", "image/jpeg"};
  746|     17|      nativePreviews.push_back(std::move(nativePreview));
  747|     17|    }
  748|    827|    if (sizeWmf != 0) {
  ------------------
  |  Branch (748:9): [True: 0, False: 827]
  ------------------
  749|      0|      NativePreview nativePreview{posWmf, sizeWmf, 0, 0, "", "image/x-wmf"};
  750|      0|      nativePreviews.push_back(std::move(nativePreview));
  751|      0|    }
  752|    827|    if (sizeTiff != 0) {
  ------------------
  |  Branch (752:9): [True: 0, False: 827]
  ------------------
  753|      0|      NativePreview nativePreview{posTiff, sizeTiff, 0, 0, "", "image/tiff"};
  754|      0|      nativePreviews.push_back(std::move(nativePreview));
  755|      0|    }
  756|    827|  } else {
  757|       |    // check for Adobe Illustrator 8.0 or older
  758|    106|    if (illustrator8) {
  ------------------
  |  Branch (758:9): [True: 0, False: 106]
  ------------------
  759|      0|#ifndef SUPPRESS_WARNINGS
  760|      0|      EXV_WARNING << "Unable to write to EPS files created by Adobe Illustrator 8.0 or older.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  761|      0|#endif
  762|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  763|      0|    }
  764|       |
  765|       |    // create temporary output file
  766|    106|    MemIo tempIo;
  767|    106|    if (!tempIo.isopen()) {
  ------------------
  |  Branch (767:9): [True: 0, False: 106]
  ------------------
  768|      0|#ifndef SUPPRESS_WARNINGS
  769|      0|      EXV_WARNING << "Unable to create temporary file for writing.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  770|      0|#endif
  771|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  772|      0|    }
  773|       |#ifdef DEBUG
  774|       |    EXV_DEBUG << "readWriteEpsMetadata: Created temporary file " << tempIo.path() << "\n";
  775|       |#endif
  776|       |
  777|       |    // sort all positions
  778|    106|    std::vector<size_t> positions;
  779|    106|    positions.push_back(posLanguageLevel);
  780|    106|    positions.push_back(posContainsXmp);
  781|    106|    positions.push_back(posPages);
  782|    106|    positions.push_back(posExiv2Version);
  783|    106|    positions.push_back(posExiv2Website);
  784|    106|    positions.push_back(posEndComments);
  785|    106|    positions.push_back(posPage);
  786|    106|    positions.push_back(posBeginPageSetup);
  787|    106|    positions.push_back(posEndPageSetup);
  788|    106|    positions.push_back(posPageTrailer);
  789|    106|    positions.push_back(posEof);
  790|    106|    positions.push_back(posEndEps);
  791|    106|    if (useFlexibleEmbedding) {
  ------------------
  |  Branch (791:9): [True: 0, False: 106]
  ------------------
  792|      0|      positions.push_back(xmpPos);
  793|      0|    }
  794|    106|    for (const auto& [r, s] : removableEmbeddings) {
  ------------------
  |  Branch (794:29): [True: 0, False: 106]
  ------------------
  795|      0|      positions.push_back(r);
  796|      0|    }
  797|    106|    std::sort(positions.begin(), positions.end());
  798|       |
  799|       |    // assemble result EPS document
  800|    106|    if (dosEps) {
  ------------------
  |  Branch (800:9): [True: 0, False: 106]
  ------------------
  801|       |      // DOS EPS header will be written afterwards
  802|      0|      writeTemp(tempIo, std::string(30, '\x00'));
  803|      0|    }
  804|    106|    const std::string containsXmpLine = deleteXmp ? "%ADO_ContainsXMP: NoMain" : "%ADO_ContainsXMP: MainFirst";
  ------------------
  |  Branch (804:41): [True: 0, False: 106]
  ------------------
  805|    106|    const uint32_t posEpsNew = posTemp(tempIo);
  806|    106|    size_t prevPos = posEps;
  807|    106|    size_t prevSkipPos = prevPos;
  808|    106|    for (const auto& pos : positions) {
  ------------------
  |  Branch (808:26): [True: 0, False: 106]
  ------------------
  809|      0|      if (pos == prevPos)
  ------------------
  |  Branch (809:11): [True: 0, False: 0]
  ------------------
  810|      0|        continue;
  811|       |#ifdef DEBUG
  812|       |      EXV_DEBUG << "readWriteEpsMetadata: Writing at " << pos << "\n";
  813|       |#endif
  814|      0|      if (pos < prevSkipPos) {
  ------------------
  |  Branch (814:11): [True: 0, False: 0]
  ------------------
  815|      0|#ifndef SUPPRESS_WARNINGS
  816|      0|        EXV_WARNING << "Internal error while assembling the result EPS document: "
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  817|      0|                       "Unable to continue at position "
  818|      0|                    << pos << " after skipping to position " << prevSkipPos << "\n";
  819|      0|#endif
  820|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  821|      0|      }
  822|      0|      writeTemp(tempIo, data + prevSkipPos, pos - prevSkipPos);
  823|      0|      const size_t posLineEnd = readLine(line, data, pos, posEndEps);
  824|      0|      size_t skipPos = pos;
  825|       |      // add last line ending if necessary
  826|      0|      if (pos == posEndEps && pos >= 1 && data[pos - 1] != '\r' && data[pos - 1] != '\n') {
  ------------------
  |  Branch (826:11): [True: 0, False: 0]
  |  Branch (826:31): [True: 0, False: 0]
  |  Branch (826:43): [True: 0, False: 0]
  |  Branch (826:68): [True: 0, False: 0]
  ------------------
  827|      0|        writeTemp(tempIo, lineEnding);
  828|       |#ifdef DEBUG
  829|       |        EXV_DEBUG << "readWriteEpsMetadata: Added missing line ending of last line\n";
  830|       |#endif
  831|      0|      }
  832|       |      // update and complement DSC comments
  833|      0|      if (pos == posLanguageLevel && posLanguageLevel != posEndEps && !deleteXmp && !useFlexibleEmbedding &&
  ------------------
  |  Branch (833:11): [True: 0, False: 0]
  |  Branch (833:38): [True: 0, False: 0]
  |  Branch (833:71): [True: 0, False: 0]
  |  Branch (833:85): [True: 0, False: 0]
  ------------------
  834|      0|          (line == "%%LanguageLevel:1" || line == "%%LanguageLevel: 1")) {
  ------------------
  |  Branch (834:12): [True: 0, False: 0]
  |  Branch (834:43): [True: 0, False: 0]
  ------------------
  835|      0|        writeTemp(tempIo, "%%LanguageLevel: 2" + lineEnding);
  836|      0|        skipPos = posLineEnd;
  837|       |#ifdef DEBUG
  838|       |        EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__ << "\n";
  839|       |#endif
  840|      0|      }
  841|      0|      if (pos == posContainsXmp && posContainsXmp != posEndEps && line != containsXmpLine) {
  ------------------
  |  Branch (841:11): [True: 0, False: 0]
  |  Branch (841:36): [True: 0, False: 0]
  |  Branch (841:67): [True: 0, False: 0]
  ------------------
  842|      0|        writeTemp(tempIo, containsXmpLine + lineEnding);
  843|      0|        skipPos = posLineEnd;
  844|       |#ifdef DEBUG
  845|       |        EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__ << "\n";
  846|       |#endif
  847|      0|      }
  848|      0|      if (pos == posExiv2Version && posExiv2Version != posEndEps) {
  ------------------
  |  Branch (848:11): [True: 0, False: 0]
  |  Branch (848:37): [True: 0, False: 0]
  ------------------
  849|      0|        writeTemp(tempIo, "%Exiv2Version: " + versionNumberHexString() + lineEnding);
  850|      0|        skipPos = posLineEnd;
  851|       |#ifdef DEBUG
  852|       |        EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__ << "\n";
  853|       |#endif
  854|      0|      }
  855|      0|      if (pos == posExiv2Website && posExiv2Website != posEndEps) {
  ------------------
  |  Branch (855:11): [True: 0, False: 0]
  |  Branch (855:37): [True: 0, False: 0]
  ------------------
  856|      0|        writeTemp(tempIo, "%Exiv2Website: http://www.exiv2.org/" + lineEnding);
  857|      0|        skipPos = posLineEnd;
  858|       |#ifdef DEBUG
  859|       |        EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__ << "\n";
  860|       |#endif
  861|      0|      }
  862|      0|      if (pos == posEndComments) {
  ------------------
  |  Branch (862:11): [True: 0, False: 0]
  ------------------
  863|      0|        if (posLanguageLevel == posEndEps && !deleteXmp && !useFlexibleEmbedding) {
  ------------------
  |  Branch (863:13): [True: 0, False: 0]
  |  Branch (863:46): [True: 0, False: 0]
  |  Branch (863:60): [True: 0, False: 0]
  ------------------
  864|      0|          writeTemp(tempIo, "%%LanguageLevel: 2" + lineEnding);
  865|      0|        }
  866|      0|        if (posContainsXmp == posEndEps) {
  ------------------
  |  Branch (866:13): [True: 0, False: 0]
  ------------------
  867|      0|          writeTemp(tempIo, containsXmpLine + lineEnding);
  868|      0|        }
  869|      0|        if (posPages == posEndEps) {
  ------------------
  |  Branch (869:13): [True: 0, False: 0]
  ------------------
  870|      0|          writeTemp(tempIo, "%%Pages: 1" + lineEnding);
  871|      0|        }
  872|      0|        if (posExiv2Version == posEndEps) {
  ------------------
  |  Branch (872:13): [True: 0, False: 0]
  ------------------
  873|      0|          writeTemp(tempIo, "%Exiv2Version: " + versionNumberHexString() + lineEnding);
  874|      0|        }
  875|      0|        if (posExiv2Website == posEndEps) {
  ------------------
  |  Branch (875:13): [True: 0, False: 0]
  ------------------
  876|      0|          writeTemp(tempIo, "%Exiv2Website: http://www.exiv2.org/" + lineEnding);
  877|      0|        }
  878|      0|        readLine(line, data, posEndComments, posEndEps);
  879|      0|        if (line != "%%EndComments") {
  ------------------
  |  Branch (879:13): [True: 0, False: 0]
  ------------------
  880|      0|          writeTemp(tempIo, "%%EndComments" + lineEnding);
  881|      0|        }
  882|      0|      }
  883|      0|      if (pos == posPage && !line.starts_with("%%Page:")) {
  ------------------
  |  Branch (883:11): [True: 0, False: 0]
  |  Branch (883:29): [True: 0, False: 0]
  ------------------
  884|      0|        writeTemp(tempIo, "%%Page: 1 1" + lineEnding);
  885|      0|        writeTemp(tempIo, "%%EndPageComments" + lineEnding);
  886|      0|      }
  887|      0|      if (pos == posBeginPageSetup && line != "%%BeginPageSetup") {
  ------------------
  |  Branch (887:11): [True: 0, False: 0]
  |  Branch (887:39): [True: 0, False: 0]
  ------------------
  888|      0|        writeTemp(tempIo, "%%BeginPageSetup" + lineEnding);
  889|      0|      }
  890|       |      // insert XMP metadata into existing flexible embedding
  891|      0|      if (useFlexibleEmbedding && pos == xmpPos) {
  ------------------
  |  Branch (891:11): [True: 0, False: 0]
  |  Branch (891:35): [True: 0, False: 0]
  ------------------
  892|      0|        if (fixBeginXmlPacket) {
  ------------------
  |  Branch (892:13): [True: 0, False: 0]
  ------------------
  893|      0|          writeTemp(tempIo, "%begin_xml_packet: " + toString(xmpPacket.size()) + lineEnding);
  894|      0|        }
  895|      0|        writeTemp(tempIo, xmpPacket);
  896|      0|        skipPos += xmpSize;
  897|       |#ifdef DEBUG
  898|       |        EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__ << "\n";
  899|       |#endif
  900|      0|      }
  901|      0|      if (!useFlexibleEmbedding) {
  ------------------
  |  Branch (901:11): [True: 0, False: 0]
  ------------------
  902|       |        // remove preceding embedding(s)
  903|      0|        for (const auto& [p, s] : removableEmbeddings) {
  ------------------
  |  Branch (903:33): [True: 0, False: 0]
  ------------------
  904|      0|          if (pos == p) {
  ------------------
  |  Branch (904:15): [True: 0, False: 0]
  ------------------
  905|      0|            skipPos = s;
  906|       |#ifdef DEBUG
  907|       |            EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__
  908|       |                      << "\n";
  909|       |#endif
  910|      0|            break;
  911|      0|          }
  912|      0|        }
  913|       |        // insert XMP metadata with new flexible embedding, if necessary
  914|      0|        if (pos == posEndPageSetup && !deleteXmp) {
  ------------------
  |  Branch (914:13): [True: 0, False: 0]
  |  Branch (914:39): [True: 0, False: 0]
  ------------------
  915|      0|          writeTemp(tempIo, "%Exiv2BeginXMP: Before %%EndPageSetup" + lineEnding);
  916|      0|          if (corelDraw) {
  ------------------
  |  Branch (916:15): [True: 0, False: 0]
  ------------------
  917|      0|            writeTemp(tempIo, "%Exiv2Notice: The following line is needed by CorelDRAW." + lineEnding);
  918|      0|            writeTemp(tempIo, "@rs" + lineEnding);
  919|      0|          }
  920|      0|          if (posBeginPhotoshop != posEndEps) {
  ------------------
  |  Branch (920:15): [True: 0, False: 0]
  ------------------
  921|      0|            writeTemp(tempIo, "%Exiv2Notice: The following line is needed by Photoshop." + lineEnding);
  922|      0|            writeTemp(tempIo, "%begin_xml_code" + lineEnding);
  923|      0|          }
  924|      0|          writeTemp(tempIo, "/currentdistillerparams where" + lineEnding);
  925|      0|          writeTemp(tempIo, "{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse" + lineEnding);
  926|      0|          writeTemp(tempIo, "{userdict /Exiv2_pdfmark /cleartomark load put" + lineEnding);
  927|      0|          writeTemp(tempIo, "    userdict /Exiv2_metafile_pdfmark {flushfile cleartomark} bind put}" + lineEnding);
  928|      0|          writeTemp(tempIo, "{userdict /Exiv2_pdfmark /pdfmark load put" + lineEnding);
  929|      0|          writeTemp(tempIo, "    userdict /Exiv2_metafile_pdfmark {/PUT pdfmark} bind put} ifelse" + lineEnding);
  930|      0|          writeTemp(tempIo, "[/NamespacePush Exiv2_pdfmark" + lineEnding);
  931|      0|          writeTemp(tempIo, "[/_objdef {Exiv2_metadata_stream} /type /stream /OBJ Exiv2_pdfmark" + lineEnding);
  932|      0|          writeTemp(tempIo, "[{Exiv2_metadata_stream} 2 dict begin" + lineEnding);
  933|      0|          writeTemp(tempIo,
  934|      0|                    "    /Type /Metadata def /Subtype /XML def currentdict end /PUT Exiv2_pdfmark" + lineEnding);
  935|      0|          writeTemp(tempIo, "[{Exiv2_metadata_stream}" + lineEnding);
  936|      0|          writeTemp(tempIo, "    currentfile 0 (% &&end XMP packet marker&&)" + lineEnding);
  937|      0|          writeTemp(tempIo, "    /SubFileDecode filter Exiv2_metafile_pdfmark" + lineEnding);
  938|      0|          if (posBeginPhotoshop != posEndEps) {
  ------------------
  |  Branch (938:15): [True: 0, False: 0]
  ------------------
  939|      0|            writeTemp(tempIo,
  940|      0|                      "%Exiv2Notice: The following line is needed by Photoshop. "
  941|      0|                      "Parameter must be exact size of XMP metadata." +
  942|      0|                          lineEnding);
  943|      0|            writeTemp(tempIo, "%begin_xml_packet: " + toString(xmpPacket.size()) + lineEnding);
  944|      0|          }
  945|      0|          writeTemp(tempIo, xmpPacket);
  946|      0|          writeTemp(tempIo, lineEnding);
  947|      0|          writeTemp(tempIo, "% &&end XMP packet marker&&" + lineEnding);
  948|      0|          writeTemp(tempIo, "[/Document 1 dict begin" + lineEnding);
  949|      0|          writeTemp(tempIo,
  950|      0|                    "    /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark" + lineEnding);
  951|      0|          if (posBeginPhotoshop != posEndEps) {
  ------------------
  |  Branch (951:15): [True: 0, False: 0]
  ------------------
  952|      0|            writeTemp(tempIo, "%Exiv2Notice: The following line is needed by Photoshop." + lineEnding);
  953|      0|            writeTemp(tempIo, "%end_xml_code" + lineEnding);
  954|      0|          }
  955|      0|          if (corelDraw) {
  ------------------
  |  Branch (955:15): [True: 0, False: 0]
  ------------------
  956|      0|            writeTemp(tempIo, "%Exiv2Notice: The following line is needed by CorelDRAW." + lineEnding);
  957|      0|            writeTemp(tempIo, "@sv" + lineEnding);
  958|      0|          }
  959|      0|          writeTemp(tempIo, "%Exiv2EndXMP" + lineEnding);
  960|      0|        }
  961|      0|      }
  962|      0|      if (pos == posEndPageSetup && line != "%%EndPageSetup") {
  ------------------
  |  Branch (962:11): [True: 0, False: 0]
  |  Branch (962:37): [True: 0, False: 0]
  ------------------
  963|      0|        writeTemp(tempIo, "%%EndPageSetup" + lineEnding);
  964|      0|      }
  965|      0|      if (!useFlexibleEmbedding && pos == posPageTrailer && !deleteXmp) {
  ------------------
  |  Branch (965:11): [True: 0, False: 0]
  |  Branch (965:36): [True: 0, False: 0]
  |  Branch (965:61): [True: 0, False: 0]
  ------------------
  966|      0|        if (!implicitPageTrailer) {
  ------------------
  |  Branch (966:13): [True: 0, False: 0]
  ------------------
  967|      0|          skipPos = posLineEnd;
  968|       |#ifdef DEBUG
  969|       |          EXV_DEBUG << "readWriteEpsMetadata: Skipping to " << skipPos << " at " << __FILE__ << ":" << __LINE__ << "\n";
  970|       |#endif
  971|      0|        }
  972|      0|        writeTemp(tempIo, "%%PageTrailer" + lineEnding);
  973|      0|        writeTemp(tempIo, "%Exiv2BeginXMP: After %%PageTrailer" + lineEnding);
  974|      0|        writeTemp(tempIo, "[/EMC Exiv2_pdfmark" + lineEnding);
  975|      0|        writeTemp(tempIo, "[/NamespacePop Exiv2_pdfmark" + lineEnding);
  976|      0|        writeTemp(tempIo, "%Exiv2EndXMP" + lineEnding);
  977|      0|      }
  978|       |      // add EOF comment if necessary
  979|      0|      if (pos == posEndEps && posEof == posEndEps) {
  ------------------
  |  Branch (979:11): [True: 0, False: 0]
  |  Branch (979:31): [True: 0, False: 0]
  ------------------
  980|      0|        writeTemp(tempIo, "%%EOF" + lineEnding);
  981|      0|      }
  982|      0|      prevPos = pos;
  983|      0|      prevSkipPos = skipPos;
  984|      0|    }
  985|    106|    const uint32_t posEndEpsNew = posTemp(tempIo);
  986|       |#ifdef DEBUG
  987|       |    EXV_DEBUG << "readWriteEpsMetadata: New EPS size: " << (posEndEpsNew - posEpsNew) << "\n";
  988|       |#endif
  989|    106|    if (dosEps) {
  ------------------
  |  Branch (989:9): [True: 0, False: 106]
  ------------------
  990|       |      // write WMF and/or TIFF section if present
  991|      0|      writeTemp(tempIo, data + posWmf, sizeWmf);
  992|      0|      writeTemp(tempIo, data + posTiff, sizeTiff);
  993|       |#ifdef DEBUG
  994|       |      EXV_DEBUG << "readWriteEpsMetadata: New DOS EPS total size: " << posTemp(tempIo) << "\n";
  995|       |#endif
  996|       |      // write DOS EPS header
  997|      0|      if (tempIo.seek(0, BasicIo::beg) != 0) {
  ------------------
  |  Branch (997:11): [True: 0, False: 0]
  ------------------
  998|      0|#ifndef SUPPRESS_WARNINGS
  999|      0|        EXV_WARNING << "Internal error while seeking in temporary file.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 1000|      0|#endif
 1001|      0|        throw Error(ErrorCode::kerImageWriteFailed);
 1002|      0|      }
 1003|      0|      byte dosEpsHeader[30];
 1004|      0|      dosEpsSignature.copy(reinterpret_cast<char*>(dosEpsHeader), dosEpsSignature.size());
 1005|      0|      ul2Data(dosEpsHeader + 4, posEpsNew, littleEndian);
 1006|      0|      ul2Data(dosEpsHeader + 8, posEndEpsNew - posEpsNew, littleEndian);
 1007|      0|      ul2Data(dosEpsHeader + 12, sizeWmf == 0 ? 0 : posEndEpsNew, littleEndian);
  ------------------
  |  Branch (1007:34): [True: 0, False: 0]
  ------------------
 1008|      0|      ul2Data(dosEpsHeader + 16, sizeWmf, littleEndian);
 1009|      0|      ul2Data(dosEpsHeader + 20, sizeTiff == 0 ? 0 : posEndEpsNew + sizeWmf, littleEndian);
  ------------------
  |  Branch (1009:34): [True: 0, False: 0]
  ------------------
 1010|      0|      ul2Data(dosEpsHeader + 24, sizeTiff, littleEndian);
 1011|      0|      us2Data(dosEpsHeader + 28, 0xFFFF, littleEndian);
 1012|      0|      writeTemp(tempIo, dosEpsHeader, sizeof(dosEpsHeader));
 1013|      0|    }
 1014|       |
 1015|       |    // copy temporary file to real output file
 1016|    106|    io.close();
 1017|    106|    io.transfer(tempIo);
 1018|    106|  }
 1019|    933|}
epsimage.cpp:_ZN12_GLOBAL__N_18readLineERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPKhmm:
  117|   236k|size_t readLine(std::string& line, const byte* data, size_t startPos, size_t size) {
  118|   236k|  line.clear();
  119|   236k|  size_t pos = startPos;
  120|       |  // step through line
  121|  9.13M|  while (pos < size && data[pos] != '\r' && data[pos] != '\n') {
  ------------------
  |  Branch (121:10): [True: 9.13M, False: 1.92k]
  |  Branch (121:24): [True: 9.03M, False: 99.1k]
  |  Branch (121:45): [True: 8.90M, False: 134k]
  ------------------
  122|  8.90M|    line += data[pos];
  123|  8.90M|    pos++;
  124|  8.90M|  }
  125|       |  // skip line ending, if present
  126|   236k|  if (pos >= size)
  ------------------
  |  Branch (126:7): [True: 1.92k, False: 234k]
  ------------------
  127|  1.92k|    return pos;
  128|   234k|  pos++;
  129|   234k|  if (pos >= size)
  ------------------
  |  Branch (129:7): [True: 82, False: 234k]
  ------------------
  130|     82|    return pos;
  131|   234k|  if (data[pos - 1] == '\r' && data[pos] == '\n')
  ------------------
  |  Branch (131:7): [True: 99.1k, False: 134k]
  |  Branch (131:32): [True: 1.22k, False: 97.9k]
  ------------------
  132|  1.22k|    pos++;
  133|   234k|  return pos;
  134|   234k|}
epsimage.cpp:_ZN12_GLOBAL__N_115onlyWhitespacesERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  110|  1.93k|bool onlyWhitespaces(const std::string& s) {
  111|       |  // According to the DSC 3.0 specification, 4.4 Parsing Rules,
  112|       |  // only spaces and tabs are considered to be white space characters.
  113|  1.93k|  return s.find_first_not_of(" \t") == std::string::npos;
  114|  1.93k|}
epsimage.cpp:_ZN12_GLOBAL__N_112readPrevLineERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPKhmm:
  137|    280|size_t readPrevLine(std::string& line, const byte* data, size_t startPos, size_t size) {
  138|    280|  line.clear();
  139|    280|  size_t pos = startPos;
  140|    280|  if (pos > size)
  ------------------
  |  Branch (140:7): [True: 0, False: 280]
  ------------------
  141|      0|    return pos;
  142|       |  // skip line ending of previous line, if present
  143|    280|  if (pos <= 0)
  ------------------
  |  Branch (143:7): [True: 0, False: 280]
  ------------------
  144|      0|    return pos;
  145|    280|  if (data[pos - 1] == '\r' || data[pos - 1] == '\n') {
  ------------------
  |  Branch (145:7): [True: 70, False: 210]
  |  Branch (145:32): [True: 99, False: 111]
  ------------------
  146|    169|    pos--;
  147|    169|    if (pos <= 0)
  ------------------
  |  Branch (147:9): [True: 0, False: 169]
  ------------------
  148|      0|      return pos;
  149|    169|    if (data[pos - 1] == '\r' && data[pos] == '\n') {
  ------------------
  |  Branch (149:9): [True: 20, False: 149]
  |  Branch (149:34): [True: 11, False: 9]
  ------------------
  150|     11|      pos--;
  151|     11|      if (pos <= 0)
  ------------------
  |  Branch (151:11): [True: 0, False: 11]
  ------------------
  152|      0|        return pos;
  153|     11|    }
  154|    169|  }
  155|       |  // step through previous line
  156|  1.05M|  while (pos >= 1 && data[pos - 1] != '\r' && data[pos - 1] != '\n') {
  ------------------
  |  Branch (156:10): [True: 1.05M, False: 1]
  |  Branch (156:22): [True: 1.05M, False: 114]
  |  Branch (156:47): [True: 1.05M, False: 165]
  ------------------
  157|  1.05M|    pos--;
  158|  1.05M|    line += data[pos];
  159|  1.05M|  }
  160|    280|  std::reverse(line.begin(), line.end());
  161|    280|  return pos;
  162|    280|}
epsimage.cpp:_ZN12_GLOBAL__N_17findXmpERmS0_PKhmmb:
  165|  2.51k|void findXmp(size_t& xmpPos, size_t& xmpSize, const byte* data, size_t startPos, size_t size, bool write) {
  166|       |  // search for valid XMP header
  167|  2.51k|  xmpSize = 0;
  168|  1.71M|  for (xmpPos = startPos; xmpPos < size; xmpPos++) {
  ------------------
  |  Branch (168:27): [True: 1.71M, False: 801]
  ------------------
  169|  1.71M|    if (data[xmpPos] != '\x00' && data[xmpPos] != '<')
  ------------------
  |  Branch (169:9): [True: 1.45M, False: 252k]
  |  Branch (169:35): [True: 1.44M, False: 15.5k]
  ------------------
  170|  1.44M|      continue;
  171|  2.13M|    for (auto&& header : xmpHeaders) {
  ------------------
  |  Branch (171:24): [True: 2.13M, False: 266k]
  ------------------
  172|  2.13M|      if (xmpPos + header.size() > size)
  ------------------
  |  Branch (172:11): [True: 25.8k, False: 2.11M]
  ------------------
  173|  25.8k|        continue;
  174|  2.11M|      if (memcmp(data + xmpPos, header.data(), header.size()) != 0)
  ------------------
  |  Branch (174:11): [True: 2.10M, False: 1.70k]
  ------------------
  175|  2.10M|        continue;
  176|       |#ifdef DEBUG
  177|       |      EXV_DEBUG << "findXmp: Found XMP header at position: " << xmpPos << "\n";
  178|       |#endif
  179|       |
  180|       |      // search for valid XMP trailer
  181|  1.89M|      for (size_t trailerPos = xmpPos + header.size(); trailerPos < size; trailerPos++) {
  ------------------
  |  Branch (181:56): [True: 1.89M, False: 69]
  ------------------
  182|  1.89M|        if (data[trailerPos] != '\x00' && data[trailerPos] != '<')
  ------------------
  |  Branch (182:13): [True: 1.43M, False: 464k]
  |  Branch (182:43): [True: 1.41M, False: 14.9k]
  ------------------
  183|  1.41M|          continue;
  184|  1.91M|        for (const auto& [trailer, readOnly] : xmpTrailers) {
  ------------------
  |  Branch (184:46): [True: 1.91M, False: 477k]
  ------------------
  185|  1.91M|          if (trailerPos + trailer.size() > size)
  ------------------
  |  Branch (185:15): [True: 772, False: 1.91M]
  ------------------
  186|    772|            continue;
  187|  1.91M|          if (memcmp(data + trailerPos, trailer.data(), trailer.size()) != 0)
  ------------------
  |  Branch (187:15): [True: 1.91M, False: 1.64k]
  ------------------
  188|  1.91M|            continue;
  189|       |#ifdef DEBUG
  190|       |          EXV_DEBUG << "findXmp: Found XMP trailer at position: " << trailerPos << "\n";
  191|       |#endif
  192|       |
  193|  1.64k|          if (readOnly) {
  ------------------
  |  Branch (193:15): [True: 16, False: 1.62k]
  ------------------
  194|     16|#ifndef SUPPRESS_WARNINGS
  195|     16|            EXV_WARNING << "Unable to handle read-only XMP metadata yet. Please provide your "
  ------------------
  |  |  138|     16|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 16]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     16|  LogMsg(LogMsg::warn).os()
  ------------------
  196|      0|                           "sample EPS file to the Exiv2 project: http://dev.exiv2.org/projects/exiv2\n";
  197|     16|#endif
  198|     16|            throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (198:25): [True: 0, False: 16]
  ------------------
  199|     16|          }
  200|       |
  201|       |          // search for end of XMP trailer
  202|   565k|          for (size_t trailerEndPos = trailerPos + trailer.size(); trailerEndPos + xmpTrailerEnd.size() <= size;
  ------------------
  |  Branch (202:68): [True: 565k, False: 21]
  ------------------
  203|   565k|               trailerEndPos++) {
  204|   565k|            if (memcmp(data + trailerEndPos, xmpTrailerEnd.data(), xmpTrailerEnd.size()) == 0) {
  ------------------
  |  Branch (204:17): [True: 1.60k, False: 563k]
  ------------------
  205|  1.60k|              xmpSize = (trailerEndPos + xmpTrailerEnd.size()) - xmpPos;
  206|  1.60k|              return;
  207|  1.60k|            }
  208|   565k|          }
  209|     21|#ifndef SUPPRESS_WARNINGS
  210|     21|          EXV_WARNING << "Found XMP header but incomplete XMP trailer.\n";
  ------------------
  |  |  138|     21|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 21]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     21|  LogMsg(LogMsg::warn).os()
  ------------------
  211|     21|#endif
  212|     21|          throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (212:23): [True: 0, False: 21]
  ------------------
  213|  1.62k|        }
  214|   479k|      }
  215|     69|#ifndef SUPPRESS_WARNINGS
  216|     69|      EXV_WARNING << "Found XMP header but no XMP trailer.\n";
  ------------------
  |  |  138|     69|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 69]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     69|  LogMsg(LogMsg::warn).os()
  ------------------
  217|     69|#endif
  218|     69|      throw Error(write ? ErrorCode::kerImageWriteFailed : ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (218:19): [True: 0, False: 69]
  ------------------
  219|  1.70k|    }
  220|   267k|  }
  221|  2.51k|}

_ZN5Exiv26LogMsg8setLevelENS0_5LevelE:
  119|  29.4k|void LogMsg::setLevel(LogMsg::Level level) {
  120|  29.4k|  level_ = level;
  121|  29.4k|}
_ZN5Exiv26LogMsg5levelEv:
  127|  10.0M|LogMsg::Level LogMsg::level() {
  128|  10.0M|  return level_;
  129|  10.0M|}
_ZN5Exiv25ErrorC2ENS_9ErrorCodeE:
  155|  22.4k|Error::Error(ErrorCode code) : code_(code) {
  156|  22.4k|  setMsg(0);
  157|  22.4k|}
_ZNK5Exiv25Error4codeEv:
  159|      8|ErrorCode Error::code() const noexcept {
  160|      8|  return code_;
  161|      8|}
_ZN5Exiv25Error6setMsgEi:
  167|  29.8k|void Error::setMsg(int count) {
  168|  29.8k|  std::string msg{_(errList.at(static_cast<size_t>(code_)))};
  ------------------
  |  |   40|  29.8k|#define _(String) (String)
  ------------------
  169|  29.8k|  auto pos = msg.find("%0");
  170|  29.8k|  if (pos != std::string::npos) {
  ------------------
  |  Branch (170:7): [True: 0, False: 29.8k]
  ------------------
  171|      0|    msg.replace(pos, 2, std::to_string(static_cast<int>(code_)));
  172|      0|  }
  173|  29.8k|  if (count > 0) {
  ------------------
  |  Branch (173:7): [True: 7.32k, False: 22.4k]
  ------------------
  174|  7.32k|    pos = msg.find("%1");
  175|  7.32k|    if (pos != std::string::npos) {
  ------------------
  |  Branch (175:9): [True: 7.32k, False: 0]
  ------------------
  176|  7.32k|      msg.replace(pos, 2, arg1_);
  177|  7.32k|    }
  178|  7.32k|  }
  179|  29.8k|  if (count > 1) {
  ------------------
  |  Branch (179:7): [True: 15, False: 29.7k]
  ------------------
  180|     15|    pos = msg.find("%2");
  181|     15|    if (pos != std::string::npos) {
  ------------------
  |  Branch (181:9): [True: 15, False: 0]
  ------------------
  182|     15|      msg.replace(pos, 2, arg2_);
  183|     15|    }
  184|     15|  }
  185|  29.8k|  if (count > 2) {
  ------------------
  |  Branch (185:7): [True: 0, False: 29.8k]
  ------------------
  186|      0|    pos = msg.find("%3");
  187|      0|    if (pos != std::string::npos) {
  ------------------
  |  Branch (187:9): [True: 0, False: 0]
  ------------------
  188|      0|      msg.replace(pos, 2, arg3_);
  189|      0|    }
  190|      0|  }
  191|  29.8k|  msg_ = std::move(msg);
  192|  29.8k|}

_ZN5Exiv29ExifdatumC2ERKNS_7ExifKeyEPKNS_5ValueE:
  157|  21.2M|Exifdatum::Exifdatum(const ExifKey& key, const Value* pValue) : key_(key.clone()) {
  158|  21.2M|  if (pValue)
  ------------------
  |  Branch (158:7): [True: 21.2M, False: 27.9k]
  ------------------
  159|  21.2M|    value_ = pValue->clone();
  160|  21.2M|}
_ZN5Exiv29ExifdatumC2ERKS0_:
  162|  23.6M|Exifdatum::Exifdatum(const Exifdatum& rhs) {
  163|  23.6M|  if (rhs.key_)
  ------------------
  |  Branch (163:7): [True: 23.6M, False: 0]
  ------------------
  164|  23.6M|    key_ = rhs.key_->clone();  // deep copy
  165|  23.6M|  if (rhs.value_)
  ------------------
  |  Branch (165:7): [True: 23.6M, False: 0]
  ------------------
  166|  23.6M|    value_ = rhs.value_->clone();  // deep copy
  167|  23.6M|}
_ZN5Exiv29ExifdatumD2Ev:
  169|  44.8M|Exifdatum::~Exifdatum() = default;
_ZNK5Exiv29Exifdatum5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKNS_8ExifDataE:
  171|  1.15M|std::ostream& Exifdatum::write(std::ostream& os, const ExifData* pMetadata) const {
  172|  1.15M|  if (value().count() == 0)
  ------------------
  |  Branch (172:7): [True: 492k, False: 667k]
  ------------------
  173|   492k|    return os;
  174|       |
  175|   667k|  PrintFct fct = printValue;
  176|       |  // be careful with comments (User.Photo.UserComment, GPSAreaInfo etc).
  177|   667k|  if (auto ti = Internal::tagInfo(tag(), ifdId())) {
  ------------------
  |  Branch (177:12): [True: 667k, False: 0]
  ------------------
  178|   667k|    fct = ti->printFct_;
  179|   667k|    if (ti->typeId_ == comment) {
  ------------------
  |  Branch (179:9): [True: 1.63k, False: 665k]
  ------------------
  180|  1.63k|      os << value().toString();
  181|  1.63k|      fct = nullptr;
  182|  1.63k|    }
  183|   667k|  }
  184|   667k|  if (fct) {
  ------------------
  |  Branch (184:7): [True: 665k, False: 1.63k]
  ------------------
  185|       |    // https://github.com/Exiv2/exiv2/issues/1706
  186|       |    // Sometimes the type of the value doesn't match what the
  187|       |    // print function expects. (The expected types are stored
  188|       |    // in the TagInfo tables, but they are not enforced when the
  189|       |    // metadata is parsed.) These type mismatches can sometimes
  190|       |    // cause a std::out_of_range exception to be thrown.
  191|   665k|    try {
  192|   665k|      fct(os, value(), pMetadata);
  193|   665k|    } catch (const std::out_of_range&) {
  194|    674|      os << "Bad value";
  195|       |#ifdef EXIV2_DEBUG_MESSAGES
  196|       |      std::cerr << "Caught std::out_of_range exception in Exifdatum::write().\n";
  197|       |#endif
  198|    674|    }
  199|   665k|  }
  200|   667k|  return os;
  201|   667k|}
_ZNK5Exiv29Exifdatum5valueEv:
  203|  1.93M|const Value& Exifdatum::value() const {
  204|  1.93M|  if (!value_)
  ------------------
  |  Branch (204:7): [True: 0, False: 1.93M]
  ------------------
  205|      0|    throw Error(ErrorCode::kerValueNotSet, key());
  206|  1.93M|  return *value_;
  207|  1.93M|}
_ZN5Exiv29ExifdatumaSERKS0_:
  209|  7.48k|Exifdatum& Exifdatum::operator=(const Exifdatum& rhs) {
  210|  7.48k|  if (this == &rhs)
  ------------------
  |  Branch (210:7): [True: 0, False: 7.48k]
  ------------------
  211|      0|    return *this;
  212|       |
  213|  7.48k|  key_.reset();
  214|  7.48k|  if (rhs.key_)
  ------------------
  |  Branch (214:7): [True: 7.48k, False: 0]
  ------------------
  215|  7.48k|    key_ = rhs.key_->clone();  // deep copy
  216|       |
  217|  7.48k|  value_.reset();
  218|  7.48k|  if (rhs.value_)
  ------------------
  |  Branch (218:7): [True: 7.48k, False: 0]
  ------------------
  219|  7.48k|    value_ = rhs.value_->clone();  // deep copy
  220|       |
  221|  7.48k|  return *this;
  222|  7.48k|}  // Exifdatum::operator=
_ZN5Exiv29ExifdatumaSERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  224|  28.4k|Exifdatum& Exifdatum::operator=(const std::string& value) {
  225|  28.4k|  setValue(value);
  226|  28.4k|  return *this;
  227|  28.4k|}
_ZN5Exiv29ExifdatumaSERKt:
  229|      7|Exifdatum& Exifdatum::operator=(const uint16_t& value) {
  230|      7|  return Exiv2::setValue(*this, value);
  231|      7|}
_ZN5Exiv29ExifdatumaSERKj:
  233|  28.6k|Exifdatum& Exifdatum::operator=(const uint32_t& value) {
  234|  28.6k|  return Exiv2::setValue(*this, value);
  235|  28.6k|}
_ZN5Exiv29ExifdatumaSERKNS_5ValueE:
  253|  4.84k|Exifdatum& Exifdatum::operator=(const Value& value) {
  254|  4.84k|  setValue(&value);
  255|  4.84k|  return *this;
  256|  4.84k|}
_ZN5Exiv29Exifdatum8setValueEPKNS_5ValueE:
  258|  4.84k|void Exifdatum::setValue(const Value* pValue) {
  259|  4.84k|  value_.reset();
  260|  4.84k|  if (pValue)
  ------------------
  |  Branch (260:7): [True: 4.84k, False: 0]
  ------------------
  261|  4.84k|    value_ = pValue->clone();
  262|  4.84k|}
_ZN5Exiv29Exifdatum8setValueERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  264|  28.5k|int Exifdatum::setValue(const std::string& value) {
  265|  28.5k|  if (!value_) {
  ------------------
  |  Branch (265:7): [True: 13.6k, False: 14.8k]
  ------------------
  266|  13.6k|    TypeId type = key_->defaultTypeId();
  267|  13.6k|    value_ = Value::create(type);
  268|  13.6k|  }
  269|  28.5k|  return value_->read(value);
  270|  28.5k|}
_ZNK5Exiv29Exifdatum11setDataAreaEPKhm:
  272|      7|int Exifdatum::setDataArea(const byte* buf, size_t len) const {
  273|      7|  return value_ ? value_->setDataArea(buf, len) : -1;
  ------------------
  |  Branch (273:10): [True: 7, False: 0]
  ------------------
  274|      7|}
_ZNK5Exiv29Exifdatum3keyEv:
  276|   142M|std::string Exifdatum::key() const {
  277|   142M|  return key_ ? key_->key() : "";
  ------------------
  |  Branch (277:10): [True: 142M, False: 0]
  ------------------
  278|   142M|}
_ZNK5Exiv29Exifdatum9groupNameEv:
  284|  2.89M|std::string Exifdatum::groupName() const {
  285|  2.89M|  return key_ ? key_->groupName() : "";
  ------------------
  |  Branch (285:10): [True: 2.89M, False: 0]
  ------------------
  286|  2.89M|}
_ZNK5Exiv29Exifdatum7tagNameEv:
  288|  20.0M|std::string Exifdatum::tagName() const {
  289|  20.0M|  return key_ ? key_->tagName() : "";
  ------------------
  |  Branch (289:10): [True: 20.0M, False: 0]
  ------------------
  290|  20.0M|}
_ZNK5Exiv29Exifdatum3tagEv:
  300|  7.64M|uint16_t Exifdatum::tag() const {
  301|  7.64M|  return key_ ? key_->tag() : 0xffff;
  ------------------
  |  Branch (301:10): [True: 7.64M, False: 0]
  ------------------
  302|  7.64M|}
_ZNK5Exiv29Exifdatum5ifdIdEv:
  304|  16.2M|IfdId Exifdatum::ifdId() const {
  305|  16.2M|  return key_ ? key_->ifdId() : IfdId::ifdIdNotSet;
  ------------------
  |  Branch (305:10): [True: 16.2M, False: 0]
  ------------------
  306|  16.2M|}
_ZNK5Exiv29Exifdatum3idxEv:
  312|  2.35M|int Exifdatum::idx() const {
  313|  2.35M|  return key_ ? key_->idx() : 0;
  ------------------
  |  Branch (313:10): [True: 2.35M, False: 0]
  ------------------
  314|  2.35M|}
_ZNK5Exiv29Exifdatum4copyEPhNS_9ByteOrderE:
  316|     50|size_t Exifdatum::copy(byte* buf, ByteOrder byteOrder) const {
  317|     50|  return value_ ? value_->copy(buf, byteOrder) : 0;
  ------------------
  |  Branch (317:10): [True: 50, False: 0]
  ------------------
  318|     50|}
_ZNK5Exiv29Exifdatum6typeIdEv:
  320|  16.8k|TypeId Exifdatum::typeId() const {
  321|  16.8k|  return value_ ? value_->typeId() : invalidTypeId;
  ------------------
  |  Branch (321:10): [True: 16.8k, False: 0]
  ------------------
  322|  16.8k|}
_ZNK5Exiv29Exifdatum8typeSizeEv:
  328|     48|size_t Exifdatum::typeSize() const {
  329|     48|  return TypeInfo::typeSize(typeId());
  330|     48|}
_ZNK5Exiv29Exifdatum5countEv:
  332|  33.2k|size_t Exifdatum::count() const {
  333|  33.2k|  return value_ ? value_->count() : 0;
  ------------------
  |  Branch (333:10): [True: 33.2k, False: 0]
  ------------------
  334|  33.2k|}
_ZNK5Exiv29Exifdatum4sizeEv:
  336|  4.32M|size_t Exifdatum::size() const {
  337|  4.32M|  return value_ ? value_->size() : 0;
  ------------------
  |  Branch (337:10): [True: 4.32M, False: 0]
  ------------------
  338|  4.32M|}
_ZNK5Exiv29Exifdatum8toStringEv:
  340|  19.1k|std::string Exifdatum::toString() const {
  341|  19.1k|  return value_ ? value_->toString() : "";
  ------------------
  |  Branch (341:10): [True: 19.1k, False: 0]
  ------------------
  342|  19.1k|}
_ZNK5Exiv29Exifdatum8toStringEm:
  344|  5.01k|std::string Exifdatum::toString(size_t n) const {
  345|  5.01k|  return value_ ? value_->toString(n) : "";
  ------------------
  |  Branch (345:10): [True: 5.01k, False: 0]
  ------------------
  346|  5.01k|}
_ZNK5Exiv29Exifdatum7toInt64Em:
  348|  34.7k|int64_t Exifdatum::toInt64(size_t n) const {
  349|  34.7k|  return value_ ? value_->toInt64(n) : -1;
  ------------------
  |  Branch (349:10): [True: 34.7k, False: 0]
  ------------------
  350|  34.7k|}
_ZNK5Exiv29Exifdatum7toFloatEm:
  352|    385|float Exifdatum::toFloat(size_t n) const {
  353|    385|  return value_ ? value_->toFloat(n) : -1;
  ------------------
  |  Branch (353:10): [True: 385, False: 0]
  ------------------
  354|    385|}
_ZNK5Exiv29Exifdatum8getValueEv:
  360|  2.26M|Value::UniquePtr Exifdatum::getValue() const {
  361|  2.26M|  return value_ ? value_->clone() : nullptr;
  ------------------
  |  Branch (361:10): [True: 2.26M, False: 0]
  ------------------
  362|  2.26M|}
_ZNK5Exiv29Exifdatum12sizeDataAreaEv:
  364|     29|size_t Exifdatum::sizeDataArea() const {
  365|     29|  return value_ ? value_->sizeDataArea() : 0;
  ------------------
  |  Branch (365:10): [True: 29, False: 0]
  ------------------
  366|     29|}
_ZNK5Exiv29Exifdatum8dataAreaEv:
  368|     24|DataBuf Exifdatum::dataArea() const {
  369|     24|  return value_ ? value_->dataArea() : DataBuf(nullptr, 0);
  ------------------
  |  Branch (369:10): [True: 24, False: 0]
  ------------------
  370|     24|}
_ZN5Exiv210ExifThumbCC2ERKNS_8ExifDataE:
  372|      7|ExifThumbC::ExifThumbC(const ExifData& exifData) : exifData_(exifData) {
  373|      7|}
_ZN5Exiv29ExifThumbC2ERNS_8ExifDataE:
  411|      7|ExifThumb::ExifThumb(ExifData& exifData) : ExifThumbC(exifData), exifData_(exifData) {
  412|      7|}
_ZN5Exiv29ExifThumb16setJpegThumbnailEPKhm:
  435|      7|void ExifThumb::setJpegThumbnail(const byte* buf, size_t size) {
  436|      7|  exifData_["Exif.Thumbnail.Compression"] = std::uint16_t{6};
  437|      7|  Exifdatum& format = exifData_["Exif.Thumbnail.JPEGInterchangeFormat"];
  438|      7|  format = 0U;
  439|      7|  format.setDataArea(buf, size);
  440|      7|  exifData_["Exif.Thumbnail.JPEGInterchangeFormatLength"] = static_cast<uint32_t>(size);
  441|      7|}
_ZN5Exiv28ExifDataixERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  447|  66.6k|Exifdatum& ExifData::operator[](const std::string& key) {
  448|  66.6k|  ExifKey exifKey(key);
  449|  66.6k|  auto pos = findKey(exifKey);
  450|  66.6k|  if (pos == end()) {
  ------------------
  |  Branch (450:7): [True: 27.9k, False: 38.6k]
  ------------------
  451|  27.9k|    return exifMetadata_.emplace_back(exifKey);
  452|  27.9k|  }
  453|  38.6k|  return *pos;
  454|  66.6k|}
_ZN5Exiv28ExifData3addERKNS_7ExifKeyEPKNS_5ValueE:
  456|  21.2M|void ExifData::add(const ExifKey& key, const Value* pValue) {
  457|  21.2M|  add(Exifdatum(key, pValue));
  458|  21.2M|}
_ZN5Exiv28ExifData3addERKNS_9ExifdatumE:
  460|  21.2M|void ExifData::add(const Exifdatum& exifdatum) {
  461|       |  // allow duplicates
  462|  21.2M|  exifMetadata_.push_back(exifdatum);
  463|  21.2M|}
_ZNK5Exiv28ExifData7findKeyERKNS_7ExifKeyE:
  465|   144k|ExifData::const_iterator ExifData::findKey(const ExifKey& key) const {
  466|   144k|  return std::find_if(exifMetadata_.begin(), exifMetadata_.end(), FindExifdatumByKey(key.key()));
  467|   144k|}
_ZN5Exiv28ExifData7findKeyERKNS_7ExifKeyE:
  469|   340k|ExifData::iterator ExifData::findKey(const ExifKey& key) {
  470|   340k|  return std::find_if(exifMetadata_.begin(), exifMetadata_.end(), FindExifdatumByKey(key.key()));
  471|   340k|}
_ZN5Exiv28ExifData5clearEv:
  473|  30.7k|void ExifData::clear() {
  474|  30.7k|  exifMetadata_.clear();
  475|  30.7k|}
_ZN5Exiv28ExifData5eraseENSt3__115__list_iteratorINS_9ExifdatumEPvEES5_:
  485|  48.8k|ExifData::iterator ExifData::erase(ExifData::iterator beg, ExifData::iterator end) {
  486|  48.8k|  return exifMetadata_.erase(beg, end);
  487|  48.8k|}
_ZN5Exiv28ExifData5eraseENSt3__115__list_iteratorINS_9ExifdatumEPvEE:
  489|  12.8k|ExifData::iterator ExifData::erase(ExifData::iterator pos) {
  490|  12.8k|  return exifMetadata_.erase(pos);
  491|  12.8k|}
_ZN5Exiv212DecodeParamsC2Em:
  493|  44.7k|DecodeParams::DecodeParams(size_t max_recursion_depth) : max_recursion_depth_(max_recursion_depth) {
  494|  44.7k|}
_ZN5Exiv210ExifParser6decodeERNS_8ExifDataEPKhmRKNS_12DecodeParamsE:
  496|    714|ByteOrder ExifParser::decode(ExifData& exifData, const byte* pData, size_t size, const DecodeParams& dp) {
  497|    714|  IptcData iptcData;
  498|    714|  XmpData xmpData;
  499|    714|  ByteOrder bo = TiffParser::decode(exifData, iptcData, xmpData, pData, size, dp);
  500|    714|#ifndef SUPPRESS_WARNINGS
  501|    714|  if (!iptcData.empty()) {
  ------------------
  |  Branch (501:7): [True: 3, False: 711]
  ------------------
  502|      3|    EXV_WARNING << "Ignoring IPTC information encoded in the Exif data.\n";
  ------------------
  |  |  138|      3|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 3]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      3|  LogMsg(LogMsg::warn).os()
  ------------------
  503|      3|  }
  504|    714|  if (!xmpData.empty()) {
  ------------------
  |  Branch (504:7): [True: 0, False: 714]
  ------------------
  505|      0|    EXV_WARNING << "Ignoring XMP information encoded in the Exif data.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  506|      0|  }
  507|    714|#endif
  508|    714|  return bo;
  509|    714|}
_ZN5Exiv210ExifParser6encodeERNSt3__16vectorIhNS1_9allocatorIhEEEEPKhmNS_9ByteOrderERNS_8ExifDataE:
  515|  3.43k|WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData) {
  516|       |  // Delete IFD0 tags that are "not recorded" in compressed images
  517|       |  // Reference: Exif 2.2 specs, 4.6.8 Tag Support Levels, section A
  518|  3.43k|  static constexpr auto filteredIfd0Tags = std::array{
  519|  3.43k|      "Exif.Image.PhotometricInterpretation",
  520|  3.43k|      "Exif.Image.StripOffsets",
  521|  3.43k|      "Exif.Image.RowsPerStrip",
  522|  3.43k|      "Exif.Image.StripByteCounts",
  523|  3.43k|      "Exif.Image.JPEGInterchangeFormat",
  524|  3.43k|      "Exif.Image.JPEGInterchangeFormatLength",
  525|  3.43k|      "Exif.Image.SubIFDs",
  526|       |      // Issue 981.  Never allow manufactured data to be written
  527|  3.43k|      "Exif.Canon.AFInfoSize",
  528|  3.43k|      "Exif.Canon.AFAreaMode",
  529|  3.43k|      "Exif.Canon.AFNumPoints",
  530|  3.43k|      "Exif.Canon.AFValidPoints",
  531|  3.43k|      "Exif.Canon.AFCanonImageWidth",
  532|  3.43k|      "Exif.Canon.AFCanonImageHeight",
  533|  3.43k|      "Exif.Canon.AFImageWidth",
  534|  3.43k|      "Exif.Canon.AFImageHeight",
  535|  3.43k|      "Exif.Canon.AFAreaWidths",
  536|  3.43k|      "Exif.Canon.AFAreaHeights",
  537|  3.43k|      "Exif.Canon.AFXPositions",
  538|  3.43k|      "Exif.Canon.AFYPositions",
  539|  3.43k|      "Exif.Canon.AFPointsInFocus",
  540|  3.43k|      "Exif.Canon.AFPointsSelected",
  541|  3.43k|      "Exif.Canon.AFPointsUnusable",
  542|  3.43k|      "Exif.Canon.AFFineRotation",
  543|  3.43k|  };
  544|  78.9k|  for (auto&& filteredIfd0Tag : filteredIfd0Tags) {
  ------------------
  |  Branch (544:31): [True: 78.9k, False: 3.43k]
  ------------------
  545|  78.9k|    auto pos = exifData.findKey(ExifKey(filteredIfd0Tag));
  546|  78.9k|    if (pos != exifData.end()) {
  ------------------
  |  Branch (546:9): [True: 979, False: 77.9k]
  ------------------
  547|       |#ifdef EXIV2_DEBUG_MESSAGES
  548|       |      std::cerr << "Warning: Exif tag " << pos->key() << " not encoded\n";
  549|       |#endif
  550|    979|      exifData.erase(pos);
  551|    979|    }
  552|  78.9k|  }
  553|       |
  554|       |  // Delete IFDs which do not occur in JPEGs
  555|  3.43k|  static constexpr auto filteredIfds = std::array{
  556|  3.43k|      IfdId::subImage1Id, IfdId::subImage2Id, IfdId::subImage3Id, IfdId::subImage4Id, IfdId::subImage5Id,
  557|  3.43k|      IfdId::subImage6Id, IfdId::subImage7Id, IfdId::subImage8Id, IfdId::subImage9Id, IfdId::subThumb1Id,
  558|  3.43k|      IfdId::panaRawId,   IfdId::ifd2Id,      IfdId::ifd3Id,
  559|  3.43k|  };
  560|  44.6k|  for (auto&& filteredIfd : filteredIfds) {
  ------------------
  |  Branch (560:27): [True: 44.6k, False: 3.43k]
  ------------------
  561|       |#ifdef EXIV2_DEBUG_MESSAGES
  562|       |    std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
  563|       |#endif
  564|  44.6k|    eraseIfd(exifData, filteredIfd);
  565|  44.6k|  }
  566|       |
  567|       |  // IPTC and XMP are stored elsewhere, not in the Exif APP1 segment.
  568|  3.43k|  IptcData emptyIptc;
  569|  3.43k|  XmpData emptyXmp;
  570|       |
  571|       |  // Encode and check if the result fits into a JPEG Exif APP1 segment
  572|  3.43k|  MemIo mio1;
  573|  3.43k|  TiffHeader header(byteOrder, 0x00000008, false);
  574|  3.43k|  WriteMethod wm = TiffParserWorker::encode(mio1, pData, size, exifData, emptyIptc, emptyXmp, Tag::root,
  575|  3.43k|                                            TiffMapping::findEncoder, &header, nullptr);
  576|  3.43k|  if (mio1.size() <= 65527) {
  ------------------
  |  Branch (576:7): [True: 1.40k, False: 2.03k]
  ------------------
  577|  1.40k|    append(blob, mio1.mmap(), mio1.size());
  578|  1.40k|    return wm;
  579|  1.40k|  }
  580|       |
  581|       |  // If it doesn't fit, remove additional tags
  582|       |
  583|       |  // Delete preview tags if the preview is larger than 32kB.
  584|       |  // Todo: Enhance preview classes to be able to write and delete previews and use that instead.
  585|       |  // Table must be sorted by preview, the first tag in each group is the size
  586|  2.03k|  static constexpr auto filteredPvTags = std::array{
  587|  2.03k|      std::pair(pttLen, "Exif.Minolta.ThumbnailLength"),
  588|  2.03k|      std::pair(pttTag, "Exif.Minolta.ThumbnailOffset"),
  589|  2.03k|      std::pair(pttLen, "Exif.Minolta.Thumbnail"),
  590|  2.03k|      std::pair(pttLen, "Exif.NikonPreview.JPEGInterchangeFormatLength"),
  591|  2.03k|      std::pair(pttIfd, "NikonPreview"),
  592|  2.03k|      std::pair(pttLen, "Exif.Olympus.ThumbnailLength"),
  593|  2.03k|      std::pair(pttTag, "Exif.Olympus.ThumbnailOffset"),
  594|  2.03k|      std::pair(pttLen, "Exif.Olympus.ThumbnailImage"),
  595|  2.03k|      std::pair(pttLen, "Exif.Olympus.Thumbnail"),
  596|  2.03k|      std::pair(pttLen, "Exif.Olympus2.ThumbnailLength"),
  597|  2.03k|      std::pair(pttTag, "Exif.Olympus2.ThumbnailOffset"),
  598|  2.03k|      std::pair(pttLen, "Exif.Olympus2.ThumbnailImage"),
  599|  2.03k|      std::pair(pttLen, "Exif.Olympus2.Thumbnail"),
  600|  2.03k|      std::pair(pttLen, "Exif.OlympusCs.PreviewImageLength"),
  601|  2.03k|      std::pair(pttTag, "Exif.OlympusCs.PreviewImageStart"),
  602|  2.03k|      std::pair(pttTag, "Exif.OlympusCs.PreviewImageValid"),
  603|  2.03k|      std::pair(pttLen, "Exif.Pentax.PreviewLength"),
  604|  2.03k|      std::pair(pttTag, "Exif.Pentax.PreviewOffset"),
  605|  2.03k|      std::pair(pttTag, "Exif.Pentax.PreviewResolution"),
  606|  2.03k|      std::pair(pttLen, "Exif.PentaxDng.PreviewLength"),
  607|  2.03k|      std::pair(pttTag, "Exif.PentaxDng.PreviewOffset"),
  608|  2.03k|      std::pair(pttTag, "Exif.PentaxDng.PreviewResolution"),
  609|  2.03k|      std::pair(pttLen, "Exif.SamsungPreview.JPEGInterchangeFormatLength"),
  610|  2.03k|      std::pair(pttIfd, "SamsungPreview"),
  611|  2.03k|      std::pair(pttLen, "Exif.Thumbnail.StripByteCounts"),
  612|  2.03k|      std::pair(pttIfd, "Thumbnail"),
  613|  2.03k|      std::pair(pttLen, "Exif.Thumbnail.JPEGInterchangeFormatLength"),
  614|  2.03k|      std::pair(pttIfd, "Thumbnail"),
  615|  2.03k|  };
  616|  2.03k|  bool delTags = false;
  617|  54.7k|  for (auto&& [ptt, key] : filteredPvTags) {
  ------------------
  |  Branch (617:26): [True: 54.7k, False: 2.02k]
  ------------------
  618|  54.7k|    switch (ptt) {
  ------------------
  |  Branch (618:13): [True: 54.7k, False: 0]
  ------------------
  619|  29.3k|      case pttLen: {
  ------------------
  |  Branch (619:7): [True: 29.3k, False: 25.4k]
  ------------------
  620|  29.3k|        delTags = false;
  621|  29.3k|        if (auto pos = exifData.findKey(ExifKey(key)); pos != exifData.end() && sumToLong(*pos) > 32768) {
  ------------------
  |  Branch (621:56): [True: 1.69k, False: 27.6k]
  |  Branch (621:56): [True: 13, False: 29.3k]
  |  Branch (621:81): [True: 13, False: 1.67k]
  ------------------
  622|     13|          delTags = true;
  623|     13|#ifndef SUPPRESS_WARNINGS
  624|     13|          EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n";
  ------------------
  |  |  138|     13|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 13]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     13|  LogMsg(LogMsg::warn).os()
  ------------------
  625|     13|#endif
  626|     13|          exifData.erase(pos);
  627|     13|        }
  628|  29.3k|        break;
  629|      0|      }
  630|  17.6k|      case pttTag: {
  ------------------
  |  Branch (630:7): [True: 17.6k, False: 37.1k]
  ------------------
  631|  17.6k|        if (delTags) {
  ------------------
  |  Branch (631:13): [True: 22, False: 17.5k]
  ------------------
  632|     22|          if (auto pos = exifData.findKey(ExifKey(key)); pos != exifData.end()) {
  ------------------
  |  Branch (632:58): [True: 11, False: 11]
  ------------------
  633|     11|#ifndef SUPPRESS_WARNINGS
  634|     11|            EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n";
  ------------------
  |  |  138|     11|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 11]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     11|  LogMsg(LogMsg::warn).os()
  ------------------
  635|     11|#endif
  636|     11|            exifData.erase(pos);
  637|     11|          }
  638|     22|        }
  639|  17.6k|        break;
  640|      0|      }
  641|  7.82k|      case pttIfd:
  ------------------
  |  Branch (641:7): [True: 7.82k, False: 46.9k]
  ------------------
  642|  7.82k|        if (delTags) {
  ------------------
  |  Branch (642:13): [True: 1, False: 7.82k]
  ------------------
  643|      1|#ifndef SUPPRESS_WARNINGS
  644|      1|          EXV_WARNING << "Exif IFD " << key << " not encoded\n";
  ------------------
  |  |  138|      1|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      1|  LogMsg(LogMsg::warn).os()
  ------------------
  645|      1|#endif
  646|      1|          eraseIfd(exifData, Internal::groupId(key));
  647|      1|        }
  648|  7.82k|        break;
  649|  54.7k|    }
  650|  54.7k|  }
  651|       |
  652|       |  // Delete unknown tags larger than 4kB and known tags larger than 20kB.
  653|  2.02k|  auto f = [](const auto& tag) { return (tag.size() > 4096 && tag.tagName().starts_with("0x")) || tag.size() > 20480; };
  654|  2.02k|  exifData.erase(std::remove_if(exifData.begin(), exifData.end(), f), exifData.end());
  655|       |
  656|       |  // Encode the remaining Exif tags again, don't care if it fits this time
  657|  2.02k|  MemIo mio2;
  658|  2.02k|  wm = TiffParserWorker::encode(mio2, pData, size, exifData, emptyIptc, emptyXmp, Tag::root, TiffMapping::findEncoder,
  659|  2.02k|                                &header, nullptr);
  660|  2.02k|  append(blob, mio2.mmap(), mio2.size());
  661|       |#ifdef EXIV2_DEBUG_MESSAGES
  662|       |  if (wm == wmIntrusive) {
  663|       |    std::cerr << "SIZE OF EXIF DATA IS " << std::dec << mio2.size() << " BYTES\n";
  664|       |  } else {
  665|       |    std::cerr << "SIZE DOESN'T MATTER, NON-INTRUSIVE WRITING USED\n";
  666|       |  }
  667|       |#endif
  668|  2.02k|  return wm;
  669|       |
  670|  2.03k|}  // ExifParser::encode
exif.cpp:_ZNK12_GLOBAL__N_118FindExifdatumByKeyclERKN5Exiv29ExifdatumE:
   45|   142M|  bool operator()(const Exiv2::Exifdatum& exifdatum) const {
   46|   142M|    return key_ == exifdatum.key();
   47|   142M|  }
exif.cpp:_ZN12_GLOBAL__N_118FindExifdatumByKeyC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   39|   484k|  explicit FindExifdatumByKey(std::string key) : key_(std::move(key)) {
   40|   484k|  }
exif.cpp:_ZZN5Exiv210ExifParser6encodeERNSt3__16vectorIhNS1_9allocatorIhEEEEPKhmNS_9ByteOrderERNS_8ExifDataEENK3$_0clINS_9ExifdatumEEEDaRKT_:
  653|  1.01M|  auto f = [](const auto& tag) { return (tag.size() > 4096 && tag.tagName().starts_with("0x")) || tag.size() > 20480; };
  ------------------
  |  Branch (653:42): [True: 181, False: 1.01M]
  |  Branch (653:63): [True: 91, False: 90]
  |  Branch (653:99): [True: 16, False: 1.01M]
  ------------------
exif.cpp:_ZN12_GLOBAL__N_19sumToLongERKN5Exiv29ExifdatumE:
  737|  1.69k|int64_t sumToLong(const Exiv2::Exifdatum& md) {
  738|  1.69k|  int64_t sum = 0;
  739|  14.2k|  for (size_t i = 0; i < md.count(); ++i) {
  ------------------
  |  Branch (739:22): [True: 12.5k, False: 1.69k]
  ------------------
  740|  12.5k|    sum = Safe::add(sum, md.toInt64(i));
  741|  12.5k|  }
  742|  1.69k|  return sum;
  743|  1.69k|}
exif.cpp:_ZN12_GLOBAL__N_18eraseIfdERN5Exiv28ExifDataENS0_5IfdIdE:
  745|  44.6k|void eraseIfd(Exiv2::ExifData& ed, Exiv2::IfdId ifdId) {
  746|  44.6k|  ed.erase(std::remove_if(ed.begin(), ed.end(), Exiv2::FindExifdatum(ifdId)), ed.end());
  747|  44.6k|}
_ZN5Exiv28setValueItEERNS_9ExifdatumES2_RKT_:
  150|      7|Exiv2::Exifdatum& setValue(Exiv2::Exifdatum& exifDatum, const T& value) {
  151|      7|  auto v = std::make_unique<Exiv2::ValueType<T>>();
  152|      7|  v->value_.push_back(value);
  153|      7|  exifDatum.value_ = std::move(v);
  154|      7|  return exifDatum;
  155|      7|}
_ZN5Exiv28setValueIjEERNS_9ExifdatumES2_RKT_:
  150|  28.6k|Exiv2::Exifdatum& setValue(Exiv2::Exifdatum& exifDatum, const T& value) {
  151|  28.6k|  auto v = std::make_unique<Exiv2::ValueType<T>>();
  152|  28.6k|  v->value_.push_back(value);
  153|  28.6k|  exifDatum.value_ = std::move(v);
  154|  28.6k|  return exifDatum;
  155|  28.6k|}

fujimn_int.cpp:_ZN5Exiv28InternalL29printFujiWhiteBalanceFineTuneERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
   97|    214|static std::ostream& printFujiWhiteBalanceFineTune(std::ostream& os, const Value& value, const ExifData*) {
   98|    214|  if (value.typeId() == signedLong && value.size() == 8) {
  ------------------
  |  Branch (98:7): [True: 180, False: 34]
  |  Branch (98:39): [True: 106, False: 74]
  ------------------
   99|    106|    if (auto longValue = dynamic_cast<const LongValue*>(&value)) {
  ------------------
  |  Branch (99:14): [True: 106, False: 0]
  ------------------
  100|    106|      if (longValue->toInt64(0) % 20 == 0 && longValue->toInt64(1) % 20 == 0) {
  ------------------
  |  Branch (100:11): [True: 58, False: 48]
  |  Branch (100:46): [True: 22, False: 36]
  ------------------
  101|     22|        auto redShift = longValue->toInt64(0) / 20;
  102|     22|        auto blueShift = longValue->toInt64(1) / 20;
  103|     22|        os << "R: " << redShift << " B: " << blueShift;
  104|     22|        return os;
  105|     22|      }
  106|    106|    }
  107|    106|  }
  108|    192|  os << "(" << value << ")";
  109|    192|  return os;
  110|    214|}
fujimn_int.cpp:_ZN5Exiv28InternalL20printFujiDigitalZoomERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  229|    108|static std::ostream& printFujiDigitalZoom(std::ostream& os, const Value& value, const ExifData*) {
  230|    108|  if (value.typeId() == unsignedLong && value.size() == 4) {
  ------------------
  |  Branch (230:7): [True: 44, False: 64]
  |  Branch (230:41): [True: 28, False: 16]
  ------------------
  231|     28|    os << (value.toFloat() / 8);
  232|     28|  }
  233|    108|  os << "(" << value << ")";
  234|    108|  return os;
  235|    108|}
fujimn_int.cpp:_ZN5Exiv28InternalL27printFujiMonochromaticColorERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  255|     44|static std::ostream& printFujiMonochromaticColor(std::ostream& os, const Value& value, const ExifData*) {
  256|     44|  if (value.size() == 1) {
  ------------------
  |  Branch (256:7): [True: 28, False: 16]
  ------------------
  257|     28|    auto v = static_cast<std::int8_t>(value.toInt64());
  258|     28|    os << (v > 0 ? "+" : "") << static_cast<int>(v);
  ------------------
  |  Branch (258:12): [True: 20, False: 8]
  ------------------
  259|     28|  } else {
  260|     16|    os << "(" << value << ")";
  261|     16|  }
  262|     44|  return os;
  263|     44|}
fujimn_int.cpp:_ZN5Exiv28InternalL21printFujiDriveSettingERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  289|    238|static std::ostream& printFujiDriveSetting(std::ostream& os, const Value& value, const ExifData*) {
  290|    238|  auto valint = value.toUint32();
  291|    238|  auto byte1 = static_cast<byte>(valint);
  292|    238|  auto byte2 = static_cast<byte>(valint >> 8);
  293|    238|  auto byte3 = static_cast<byte>(valint >> 16);
  294|    238|  auto fps = valint >> 24;
  295|       |
  296|    238|  if (auto setting = Exiv2::find(fujiDriveSettingByte1, byte1)) {
  ------------------
  |  Branch (296:12): [True: 128, False: 110]
  ------------------
  297|    128|    os << _(setting->label_);
  ------------------
  |  |   40|    128|#define _(String) (String)
  ------------------
  298|    128|  } else {
  299|    110|    os << "(" << +byte1 << ")";
  300|    110|  }
  301|       |
  302|    238|  if (fps != 0) {
  ------------------
  |  Branch (302:7): [True: 56, False: 182]
  ------------------
  303|     56|    os << ", " << fps << " fps";
  304|     56|  }
  305|       |
  306|    238|  if (byte1 != 0) {
  ------------------
  |  Branch (306:7): [True: 154, False: 84]
  ------------------
  307|    154|    os << ", (" << +byte2 << ", " << +byte3 << ")";  // unknown values
  308|    154|  }
  309|    238|  return os;
  310|    238|}
fujimn_int.cpp:_ZN5Exiv28InternalL25printFujiFaceElementTypesERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  420|    178|static std::ostream& printFujiFaceElementTypes(std::ostream& os, const Value& value, const ExifData*) {
  421|    178|  if (value.typeId() == asciiString || value.typeId() == unsignedShort) {
  ------------------
  |  Branch (421:7): [True: 70, False: 108]
  |  Branch (421:40): [True: 34, False: 74]
  ------------------
  422|    104|    auto elements = value.count();
  423|       |
  424|    104|    if (value.typeId() == asciiString && elements > 0) {
  ------------------
  |  Branch (424:9): [True: 70, False: 34]
  |  Branch (424:42): [True: 70, False: 0]
  ------------------
  425|     70|      elements -= 1;  // null escaped
  426|     70|    }
  427|       |
  428|  10.5k|    for (size_t n = 0; n < elements; n++) {
  ------------------
  |  Branch (428:24): [True: 10.4k, False: 104]
  ------------------
  429|  10.4k|      auto longValue = value.toInt64(n);
  430|       |
  431|  10.4k|      if (value.typeId() == asciiString) {
  ------------------
  |  Branch (431:11): [True: 2.27k, False: 8.17k]
  ------------------
  432|  2.27k|        longValue -= '0';
  433|  2.27k|      }
  434|       |
  435|  10.4k|      if (n != 0) {
  ------------------
  |  Branch (435:11): [True: 10.3k, False: 96]
  ------------------
  436|  10.3k|        os << " ";
  437|  10.3k|      }
  438|  10.4k|      if (auto td = Exiv2::find(fujiFaceElementType, longValue)) {
  ------------------
  |  Branch (438:16): [True: 366, False: 10.0k]
  ------------------
  439|    366|        os << _(td->label_);
  ------------------
  |  |   40|    366|#define _(String) (String)
  ------------------
  440|  10.0k|      } else {
  441|  10.0k|        os << "(" << value.toInt64(n) << ")";
  442|  10.0k|      }
  443|  10.4k|    }
  444|    104|  } else {
  445|     74|    os << "(" << value << ")";
  446|     74|  }
  447|    178|  return os;
  448|    178|}

_ZN5Exiv28Internal13FujiMakerNote7tagListEv:
   19|  43.7k|  static constexpr auto tagList() {
   20|  43.7k|    return tagInfo_;
   21|  43.7k|  }

_ZN5Exiv28GifImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   20|     18|    Image(ImageType::gif, mdNone, std::move(io), params) {
   21|     18|}
_ZN5Exiv28GifImage12readMetadataEv:
   42|     15|void GifImage::readMetadata() {
   43|       |#ifdef EXIV2_DEBUG_MESSAGES
   44|       |  std::cerr << "Exiv2::GifImage::readMetadata: Reading GIF file " << io_->path() << "\n";
   45|       |#endif
   46|     15|  if (io_->open() != 0) {
  ------------------
  |  Branch (46:7): [True: 0, False: 15]
  ------------------
   47|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   48|      0|  }
   49|     15|  IoCloser closer(*io_);
   50|       |  // Ensure that this is the correct image type
   51|     15|  if (!isGifType(*io_, true)) {
  ------------------
  |  Branch (51:7): [True: 0, False: 15]
  ------------------
   52|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (52:9): [True: 0, False: 0]
  |  Branch (52:25): [True: 0, False: 0]
  ------------------
   53|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   54|      0|    throw Error(ErrorCode::kerNotAnImage, "GIF");
   55|      0|  }
   56|     15|  clearMetadata();
   57|       |
   58|     15|  byte buf[4];
   59|     15|  if (io_->read(buf, sizeof(buf)) == sizeof(buf)) {
  ------------------
  |  Branch (59:7): [True: 15, False: 0]
  ------------------
   60|     15|    pixelWidth_ = getShort(buf, littleEndian);
   61|     15|    pixelHeight_ = getShort(buf + 2, littleEndian);
   62|     15|  }
   63|     15|}  // GifImage::readMetadata
_ZN5Exiv214newGifInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
   72|     18|Image::UniquePtr newGifInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
   73|     18|  auto image = std::make_unique<GifImage>(std::move(io), params);
   74|     18|  if (!image->good()) {
  ------------------
  |  Branch (74:7): [True: 3, False: 15]
  ------------------
   75|      3|    return nullptr;
   76|      3|  }
   77|     15|  return image;
   78|     18|}
_ZN5Exiv29isGifTypeERNS_7BasicIoEb:
   80|  10.4k|bool isGifType(BasicIo& iIo, bool advance) {
   81|  10.4k|  const int32_t len = 6;
   82|  10.4k|  const std::array<byte, len> Gif87aId{'G', 'I', 'F', '8', '7', 'a'};
   83|  10.4k|  const std::array<byte, len> Gif89aId{'G', 'I', 'F', '8', '9', 'a'};
   84|  10.4k|  std::array<byte, len> buf;
   85|  10.4k|  iIo.read(buf.data(), len);
   86|  10.4k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (86:7): [True: 0, False: 10.4k]
  |  Branch (86:22): [True: 149, False: 10.2k]
  ------------------
   87|    149|    return false;
   88|    149|  }
   89|  10.2k|  bool matched = buf == Gif87aId || buf == Gif89aId;
  ------------------
  |  Branch (89:18): [True: 28, False: 10.2k]
  |  Branch (89:37): [True: 20, False: 10.2k]
  ------------------
   90|  10.2k|  if (!advance || !matched) {
  ------------------
  |  Branch (90:7): [True: 10.2k, False: 15]
  |  Branch (90:19): [True: 0, False: 15]
  ------------------
   91|  10.2k|    iIo.seek(-len, BasicIo::cur);
   92|  10.2k|  }
   93|  10.2k|  return matched;
   94|  10.4k|}

_Z24string_from_unterminatedPKcm:
   13|  80.3k|std::string string_from_unterminated(const char* data, size_t data_length) {
   14|  80.3k|  if (data_length == 0) {
  ------------------
  |  Branch (14:7): [True: 1.48k, False: 78.8k]
  ------------------
   15|  1.48k|    return {};
   16|  1.48k|  }
   17|  78.8k|  const size_t StringLength = strnlen(data, data_length);
   18|  78.8k|  return {data, StringLength};
   19|  80.3k|}
_ZN5Exiv212readQWORDTagERKNSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEE:
   22|  2.64k|uint64_t readQWORDTag(const BasicIo::UniquePtr& io) {
   23|  2.64k|  Internal::enforce(QWORD <= io->size() - io->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
   24|  2.64k|  auto FieldBuf = io->read(QWORD);
   25|  2.64k|  return FieldBuf.read_uint64(0, littleEndian);
   26|  2.64k|}
_ZN5Exiv212readDWORDTagERKNSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEE:
   28|  34.1k|uint32_t readDWORDTag(const BasicIo::UniquePtr& io) {
   29|  34.1k|  Internal::enforce(DWORD <= io->size() - io->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
   30|  34.1k|  DataBuf FieldBuf = io->read(DWORD);
   31|  34.1k|  return FieldBuf.read_uint32(0, littleEndian);
   32|  34.1k|}
_ZN5Exiv211readWORDTagERKNSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEE:
   34|   272k|uint16_t readWORDTag(const BasicIo::UniquePtr& io) {
   35|   272k|  Internal::enforce(WORD <= io->size() - io->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
   36|   272k|  DataBuf FieldBuf = io->read(WORD);
   37|   272k|  return FieldBuf.read_uint16(0, littleEndian);
   38|   272k|}
_ZN5Exiv218readStringWcharTagERKNSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEEm:
   40|  2.37k|std::string readStringWcharTag(const BasicIo::UniquePtr& io, size_t length) {
   41|  2.37k|  Internal::enforce(length >= 2 && length <= io->size() - io->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (41:21): [True: 2.37k, False: 2]
  |  Branch (41:36): [True: 2.29k, False: 73]
  ------------------
   42|  2.37k|  DataBuf FieldBuf(length + 1);
   43|  2.37k|  io->readOrThrow(FieldBuf.data(), length, ErrorCode::kerFailedToReadImageData);
   44|  2.37k|  std::string wst(FieldBuf.begin(), FieldBuf.end() - 3);
   45|  2.37k|  if (wst.size() % 2 != 0)
  ------------------
  |  Branch (45:7): [True: 1.09k, False: 1.28k]
  ------------------
   46|  1.09k|    Exiv2::convertStringCharset(wst, "UCS-2LE", "UTF-8");
   47|  2.37k|  Exiv2::convertStringCharset(wst, "UCS-2LE", "UTF-8");
   48|  2.37k|  return wst;
   49|  2.37k|}
_ZN5Exiv213readStringTagERKNSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEEm:
   51|  31.7k|std::string readStringTag(const BasicIo::UniquePtr& io, size_t length) {
   52|  31.7k|  Internal::enforce(length <= io->size() - io->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
   53|  31.7k|  DataBuf FieldBuf(length + 1);
   54|  31.7k|  io->readOrThrow(FieldBuf.data(), length, ErrorCode::kerFailedToReadImageData);
   55|  31.7k|  return Exiv2::toString(FieldBuf.data()).substr(0, length);
   56|  31.7k|}
_ZN5Exiv214getAspectRatioEmm:
   58|  1.17k|std::string getAspectRatio(uint64_t width, uint64_t height) {
   59|  1.17k|  if (height == 0 || width == 0)
  ------------------
  |  Branch (59:7): [True: 18, False: 1.15k]
  |  Branch (59:22): [True: 5, False: 1.14k]
  ------------------
   60|     23|    return std::to_string(width) + ":" + std::to_string(height);
   61|       |
   62|  1.14k|  auto ratioWidth = width / std::gcd(width, height);
   63|  1.14k|  auto ratioHeight = height / std::gcd(width, height);
   64|  1.14k|  return std::to_string(ratioWidth) + ":" + std::to_string(ratioHeight);
   65|  1.17k|}

_ZN5Exiv215ImageCtorParamsC2Ebm:
  141|  32.1k|    create_(create), max_recursion_depth_(max_recursion_depth) {
  142|  32.1k|}
_ZN5Exiv25ImageC2ENS_9ImageTypeEtNSt3__110unique_ptrINS_7BasicIoENS2_14default_deleteIS4_EEEERKNS_15ImageCtorParamsE:
  145|  32.1k|    io_(std::move(io)),
  146|  32.1k|    max_recursion_depth_(params.max_recursion_depth()),
  147|  32.1k|    imageType_(type),
  148|  32.1k|    supportedMetadata_(supportedMetadata) {
  149|  32.1k|}
_ZN5Exiv25ImageD2Ev:
  151|  32.1k|Image::~Image() = default;
_ZN5Exiv25Image14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  153|  2.35k|void Image::printStructure(std::ostream&, PrintStructureOption, size_t /*depth*/) {
  154|  2.35k|  throw Error(ErrorCode::kerUnsupportedImageType, io_->path());
  155|  2.35k|}
_ZN5Exiv25Image12isStringTypeEt:
  157|  28.5k|bool Image::isStringType(uint16_t type) {
  158|  28.5k|  return type == Exiv2::asciiString || type == Exiv2::unsignedByte || type == Exiv2::signedByte ||
  ------------------
  |  Branch (158:10): [True: 727, False: 27.8k]
  |  Branch (158:40): [True: 209, False: 27.6k]
  |  Branch (158:71): [True: 1.47k, False: 26.1k]
  ------------------
  159|  26.1k|         type == Exiv2::undefined;
  ------------------
  |  Branch (159:10): [True: 3.12k, False: 23.0k]
  ------------------
  160|  28.5k|}
_ZN5Exiv25Image11isShortTypeEt:
  161|  15.9k|bool Image::isShortType(uint16_t type) {
  162|  15.9k|  return type == Exiv2::unsignedShort || type == Exiv2::signedShort;
  ------------------
  |  Branch (162:10): [True: 1.46k, False: 14.4k]
  |  Branch (162:42): [True: 2.29k, False: 12.1k]
  ------------------
  163|  15.9k|}
_ZN5Exiv25Image10isLongTypeEt:
  164|  12.1k|bool Image::isLongType(uint16_t type) {
  165|  12.1k|  return type == Exiv2::unsignedLong || type == Exiv2::signedLong;
  ------------------
  |  Branch (165:10): [True: 4.12k, False: 8.05k]
  |  Branch (165:41): [True: 1.85k, False: 6.19k]
  ------------------
  166|  12.1k|}
_ZN5Exiv25Image14isLongLongTypeEt:
  167|     17|bool Image::isLongLongType(uint16_t type) {
  168|     17|  return type == Exiv2::unsignedLongLong || type == Exiv2::signedLongLong;
  ------------------
  |  Branch (168:10): [True: 0, False: 17]
  |  Branch (168:45): [True: 0, False: 17]
  ------------------
  169|     17|}
_ZN5Exiv25Image14isRationalTypeEt:
  170|  5.12k|bool Image::isRationalType(uint16_t type) {
  171|  5.12k|  return type == Exiv2::unsignedRational || type == Exiv2::signedRational;
  ------------------
  |  Branch (171:10): [True: 952, False: 4.16k]
  |  Branch (171:45): [True: 1.71k, False: 2.45k]
  ------------------
  172|  5.12k|}
_ZN5Exiv25Image11is2ByteTypeEt:
  173|  7.31k|bool Image::is2ByteType(uint16_t type) {
  174|  7.31k|  return isShortType(type);
  175|  7.31k|}
_ZN5Exiv25Image11is4ByteTypeEt:
  176|  5.42k|bool Image::is4ByteType(uint16_t type) {
  177|  5.42k|  return isLongType(type) || type == Exiv2::tiffFloat || type == Exiv2::tiffIfd;
  ------------------
  |  Branch (177:10): [True: 2.99k, False: 2.43k]
  |  Branch (177:30): [True: 316, False: 2.11k]
  |  Branch (177:58): [True: 761, False: 1.35k]
  ------------------
  178|  5.42k|}
_ZN5Exiv25Image11is8ByteTypeEt:
  179|  1.35k|bool Image::is8ByteType(uint16_t type) {
  180|  1.35k|  return isRationalType(type) || isLongLongType(type) || type == Exiv2::tiffIfd8 || type == Exiv2::tiffDouble;
  ------------------
  |  Branch (180:10): [True: 1.33k, False: 17]
  |  Branch (180:34): [True: 0, False: 17]
  |  Branch (180:58): [True: 0, False: 17]
  |  Branch (180:85): [True: 17, False: 0]
  ------------------
  181|  1.35k|}
_ZN5Exiv25Image10isPrintXMPEtNS_20PrintStructureOptionE:
  182|  17.3k|bool Image::isPrintXMP(uint16_t type, Exiv2::PrintStructureOption option) {
  183|  17.3k|  return type == 700 && option == kpsXMP;
  ------------------
  |  Branch (183:10): [True: 1, False: 17.3k]
  |  Branch (183:25): [True: 0, False: 1]
  ------------------
  184|  17.3k|}
_ZN5Exiv25Image10isPrintICCEtNS_20PrintStructureOptionE:
  185|  17.3k|bool Image::isPrintICC(uint16_t type, Exiv2::PrintStructureOption option) {
  186|  17.3k|  return type == 0x8773 && option == kpsIccProfile;
  ------------------
  |  Branch (186:10): [True: 1, False: 17.3k]
  |  Branch (186:28): [True: 0, False: 1]
  ------------------
  187|  17.3k|}
_ZN5Exiv25Image19isBigEndianPlatformEv:
  189|  4.73k|bool Image::isBigEndianPlatform() {
  190|  4.73k|  return std::endian::native == std::endian::big;
  191|  4.73k|}
_ZN5Exiv25Image22isLittleEndianPlatformEv:
  192|  15.4k|bool Image::isLittleEndianPlatform() {
  193|  15.4k|  return std::endian::native == std::endian::little;
  194|  15.4k|}
_ZN5Exiv25Image8byteSwapEjb:
  213|  51.0k|uint32_t Image::byteSwap(uint32_t value, bool bSwap) {
  214|       |#ifdef __cpp_lib_byteswap
  215|       |  return bSwap ? std::byteswap(value) : value;
  216|       |#elif defined(_MSC_VER)
  217|       |  return bSwap ? _byteswap_ulong(value) : value;
  218|       |#else
  219|  51.0k|  uint32_t result = 0;
  220|  51.0k|  result |= (value & 0x000000FFU) << 24;
  221|  51.0k|  result |= (value & 0x0000FF00U) << 8;
  222|  51.0k|  result |= (value & 0x00FF0000U) >> 8;
  223|  51.0k|  result |= (value & 0xFF000000U) >> 24;
  224|  51.0k|  return bSwap ? result : value;
  ------------------
  |  Branch (224:10): [True: 30.8k, False: 20.1k]
  ------------------
  225|  51.0k|#endif
  226|  51.0k|}
_ZN5Exiv25Image8byteSwapEtb:
  228|  41.3k|uint16_t Image::byteSwap(uint16_t value, bool bSwap) {
  229|       |#ifdef __cpp_lib_byteswap
  230|       |  return bSwap ? std::byteswap(value) : value;
  231|       |#elif defined(_MSC_VER)
  232|       |  return bSwap ? _byteswap_ushort(value) : value;
  233|       |#else
  234|  41.3k|  uint16_t result = 0;
  235|  41.3k|  result |= (value & 0x00FFU) << 8;
  236|  41.3k|  result |= (value & 0xFF00U) >> 8;
  237|  41.3k|  return bSwap ? result : value;
  ------------------
  |  Branch (237:10): [True: 26.3k, False: 14.9k]
  ------------------
  238|  41.3k|#endif
  239|  41.3k|}
_ZN5Exiv25Image9byteSwap2ERKNS_7DataBufEmb:
  241|  41.3k|uint16_t Image::byteSwap2(const DataBuf& buf, size_t offset, bool bSwap) {
  242|  41.3k|  uint16_t v = 0;
  243|  41.3k|  auto p = reinterpret_cast<char*>(&v);
  244|  41.3k|  p[0] = buf.read_uint8(offset);
  245|  41.3k|  p[1] = buf.read_uint8(offset + 1);
  246|  41.3k|  return Image::byteSwap(v, bSwap);
  247|  41.3k|}
_ZN5Exiv25Image9byteSwap4ERKNS_7DataBufEmb:
  249|  50.5k|uint32_t Image::byteSwap4(const DataBuf& buf, size_t offset, bool bSwap) {
  250|  50.5k|  uint32_t v = 0;
  251|  50.5k|  auto p = reinterpret_cast<char*>(&v);
  252|  50.5k|  p[0] = buf.read_uint8(offset);
  253|  50.5k|  p[1] = buf.read_uint8(offset + 1);
  254|  50.5k|  p[2] = buf.read_uint8(offset + 2);
  255|  50.5k|  p[3] = buf.read_uint8(offset + 3);
  256|  50.5k|  return Image::byteSwap(v, bSwap);
  257|  50.5k|}
_ZN5Exiv25Image8typeNameEt:
  270|  8.62k|const char* Image::typeName(uint16_t tag) {
  271|       |  //! List of TIFF image tags
  272|  8.62k|  const char* result = nullptr;
  273|  8.62k|  switch (tag) {
  274|     50|    case Exiv2::unsignedByte:
  ------------------
  |  Branch (274:5): [True: 50, False: 8.57k]
  ------------------
  275|     50|      result = "BYTE";
  276|     50|      break;
  277|    157|    case Exiv2::asciiString:
  ------------------
  |  Branch (277:5): [True: 157, False: 8.46k]
  ------------------
  278|    157|      result = "ASCII";
  279|    157|      break;
  280|    728|    case Exiv2::unsignedShort:
  ------------------
  |  Branch (280:5): [True: 728, False: 7.89k]
  ------------------
  281|    728|      result = "SHORT";
  282|    728|      break;
  283|  2.06k|    case Exiv2::unsignedLong:
  ------------------
  |  Branch (283:5): [True: 2.06k, False: 6.56k]
  ------------------
  284|  2.06k|      result = "LONG";
  285|  2.06k|      break;
  286|    472|    case Exiv2::unsignedRational:
  ------------------
  |  Branch (286:5): [True: 472, False: 8.15k]
  ------------------
  287|    472|      result = "RATIONAL";
  288|    472|      break;
  289|    368|    case Exiv2::signedByte:
  ------------------
  |  Branch (289:5): [True: 368, False: 8.25k]
  ------------------
  290|    368|      result = "SBYTE";
  291|    368|      break;
  292|    778|    case Exiv2::undefined:
  ------------------
  |  Branch (292:5): [True: 778, False: 7.84k]
  ------------------
  293|    778|      result = "UNDEFINED";
  294|    778|      break;
  295|  1.14k|    case Exiv2::signedShort:
  ------------------
  |  Branch (295:5): [True: 1.14k, False: 7.48k]
  ------------------
  296|  1.14k|      result = "SSHORT";
  297|  1.14k|      break;
  298|    926|    case Exiv2::signedLong:
  ------------------
  |  Branch (298:5): [True: 926, False: 7.69k]
  ------------------
  299|    926|      result = "SLONG";
  300|    926|      break;
  301|    857|    case Exiv2::signedRational:
  ------------------
  |  Branch (301:5): [True: 857, False: 7.76k]
  ------------------
  302|    857|      result = "SRATIONAL";
  303|    857|      break;
  304|    312|    case Exiv2::tiffFloat:
  ------------------
  |  Branch (304:5): [True: 312, False: 8.31k]
  ------------------
  305|    312|      result = "FLOAT";
  306|    312|      break;
  307|     13|    case Exiv2::tiffDouble:
  ------------------
  |  Branch (307:5): [True: 13, False: 8.61k]
  ------------------
  308|     13|      result = "DOUBLE";
  309|     13|      break;
  310|    758|    case Exiv2::tiffIfd:
  ------------------
  |  Branch (310:5): [True: 758, False: 7.86k]
  ------------------
  311|    758|      result = "IFD";
  312|    758|      break;
  313|      0|    default:
  ------------------
  |  Branch (313:5): [True: 0, False: 8.62k]
  ------------------
  314|      0|      result = "unknown";
  315|      0|      break;
  316|  8.62k|  }
  317|  8.62k|  return result;
  318|  8.62k|}
_ZN5Exiv25Image17printIFDStructureERNS_7BasicIoERNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEENS_20PrintStructureOptionEmbcm:
  327|  20.0k|                              bool bSwap, char c, size_t depth) {
  328|  20.0k|  if (depth == 1)
  ------------------
  |  Branch (328:7): [True: 4.35k, False: 15.7k]
  ------------------
  329|  4.35k|    visits.clear();
  330|  20.0k|  bool bFirst = true;
  331|       |
  332|       |  // buffer
  333|  20.0k|  const size_t dirSize = 32;
  334|  20.0k|  DataBuf dir(dirSize);
  335|  20.0k|  const bool bPrint = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (335:23): [True: 15.6k, False: 4.36k]
  |  Branch (335:45): [True: 4.36k, False: 1]
  ------------------
  336|       |
  337|  20.0k|  do {
  338|       |    // Read top of directory
  339|  20.0k|    io.seekOrThrow(start, BasicIo::beg, ErrorCode::kerCorruptedMetadata);
  340|  20.0k|    io.readOrThrow(dir.data(), 2, ErrorCode::kerCorruptedMetadata);
  341|  20.0k|    const uint16_t dirLength = byteSwap2(dir, 0, bSwap);
  342|       |    // Prevent infinite loops. (GHSA-m479-7frc-gqqg)
  343|  20.0k|    Internal::enforce(dirLength > 0, ErrorCode::kerCorruptedMetadata);
  344|       |
  345|  20.0k|    if (dirLength > 500)  // tooBig
  ------------------
  |  Branch (345:9): [True: 11, False: 20.0k]
  ------------------
  346|     11|      throw Error(ErrorCode::kerTiffDirectoryTooLarge);
  347|       |
  348|  20.0k|    if (bFirst && bPrint) {
  ------------------
  |  Branch (348:9): [True: 19.9k, False: 154]
  |  Branch (348:19): [True: 19.9k, False: 1]
  ------------------
  349|  19.9k|      out << Internal::indent(depth) << stringFormat("STRUCTURE OF TIFF FILE ({}{}): {}\n", c, c, io.path());
  ------------------
  |  |   18|  19.9k|#define stringFormat std::format
  ------------------
  350|  19.9k|    }
  351|       |
  352|       |    // Read the dictionary
  353|  28.7k|    for (int i = 0; i < dirLength; i++) {
  ------------------
  |  Branch (353:21): [True: 24.2k, False: 4.49k]
  ------------------
  354|  24.2k|      if (visits.contains(io.tell())) {  // #547
  ------------------
  |  Branch (354:11): [True: 15.2k, False: 8.95k]
  ------------------
  355|  15.2k|        throw Error(ErrorCode::kerCorruptedMetadata);
  356|  15.2k|      }
  357|  8.95k|      visits.insert(io.tell());
  358|       |
  359|  8.95k|      if (bFirst && bPrint) {
  ------------------
  |  Branch (359:11): [True: 4.64k, False: 4.31k]
  |  Branch (359:21): [True: 4.64k, False: 0]
  ------------------
  360|  4.64k|        out << Internal::indent(depth) << " address |    tag                              |     "
  361|  4.64k|            << " type |    count |    offset | value\n";
  362|  4.64k|      }
  363|  8.95k|      bFirst = false;
  364|       |
  365|  8.95k|      io.readOrThrow(dir.data(), 12, ErrorCode::kerCorruptedMetadata);
  366|  8.95k|      const uint16_t tag = byteSwap2(dir, 0, bSwap);
  367|  8.95k|      const uint16_t type = byteSwap2(dir, 2, bSwap);
  368|  8.95k|      const uint32_t count = byteSwap4(dir, 4, bSwap);
  369|  8.95k|      const uint32_t offset = byteSwap4(dir, 8, bSwap);
  370|       |
  371|       |      // Break for unknown tag types else we may segfault.
  372|  8.95k|      if (!typeValid(type)) {
  ------------------
  |  Branch (372:11): [True: 224, False: 8.73k]
  ------------------
  373|    224|        EXV_ERROR << "invalid type in tiff structure" << type << '\n';
  ------------------
  |  |  142|    224|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 224]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    224|  LogMsg(LogMsg::error).os()
  ------------------
  374|    224|        throw Error(ErrorCode::kerInvalidTypeValue);
  375|    224|      }
  376|       |
  377|       |      // prepare to print the value
  378|  8.73k|      const uint32_t kount = [=] {
  379|       |        // haul in all the data
  380|  8.73k|        if (isPrintXMP(tag, option))
  381|  8.73k|          return count;
  382|       |        // ditto
  383|  8.73k|        if (isPrintICC(tag, option))
  384|  8.73k|          return count;
  385|       |        // restrict long arrays
  386|  8.73k|        if (isStringType(type)) {
  387|  8.73k|          return std::min(count, 32u);
  388|  8.73k|        }
  389|  8.73k|        return std::min(count, 5u);
  390|  8.73k|      }();
  391|  8.73k|      const uint32_t pad = isStringType(type) ? 1 : 0;
  ------------------
  |  Branch (391:28): [True: 1.39k, False: 7.34k]
  ------------------
  392|  8.73k|      const uint32_t size = [=] {
  393|  8.73k|        if (isStringType(type))
  394|  8.73k|          return 1;
  395|  8.73k|        if (is2ByteType(type))
  396|  8.73k|          return 2;
  397|  8.73k|        if (is4ByteType(type))
  398|  8.73k|          return 4;
  399|  8.73k|        if (is8ByteType(type))
  400|  8.73k|          return 8;
  401|  8.73k|        return 1;
  402|  8.73k|      }();
  403|       |
  404|       |      // if ( offset > io.size() ) offset = 0; // Denial of service?
  405|       |
  406|       |      // #55 and #56 memory allocation crash test/data/POC8
  407|  8.73k|      const uint64_t allocate64 = (size * static_cast<uint64_t>(count)) + pad + 20;
  408|  8.73k|      if (allocate64 > io.size()) {
  ------------------
  |  Branch (408:11): [True: 75, False: 8.65k]
  ------------------
  409|     75|        throw Error(ErrorCode::kerInvalidMalloc);
  410|     75|      }
  411|  8.65k|      DataBuf buf(allocate64);                       // allocate a buffer
  412|  8.65k|      std::copy_n(dir.begin() + 8, 4, buf.begin());  // copy dir[8:11] into buffer (short strings)
  413|       |
  414|       |      // We have already checked that this multiplication cannot overflow.
  415|  8.65k|      const size_t count_x_size = static_cast<size_t>(count) * size;
  416|  8.65k|      const bool bOffsetIsPointer = count_x_size > 4;
  417|       |
  418|  8.65k|      if (bOffsetIsPointer) {                                                       // read into buffer
  ------------------
  |  Branch (418:11): [True: 4.23k, False: 4.42k]
  ------------------
  419|  4.23k|        const size_t restore = io.tell();                                           // save
  420|  4.23k|        io.seekOrThrow(offset, BasicIo::beg, ErrorCode::kerCorruptedMetadata);      // position
  421|  4.23k|        io.readOrThrow(buf.data(), count_x_size, ErrorCode::kerCorruptedMetadata);  // read
  422|  4.23k|        io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata);     // restore
  423|  4.23k|      }
  424|       |
  425|  8.65k|      if (bPrint) {
  ------------------
  |  Branch (425:11): [True: 8.62k, False: 34]
  ------------------
  426|  8.62k|        const size_t address = start + 2 + (i * 12);
  427|  8.62k|        const std::string offsetString = bOffsetIsPointer ? stringFormat("{:9}", offset) : "";
  ------------------
  |  |   18|  4.22k|#define stringFormat std::format
  ------------------
  |  Branch (427:42): [True: 4.22k, False: 4.40k]
  ------------------
  428|  8.62k|        std::string sp;  // output spacer
  429|       |
  430|  8.62k|        out << Internal::indent(depth)
  431|  8.62k|            << stringFormat("{:8} | {:#06x} {:<28} | {:>9} | {:>8} | {:9} | ", address, tag, tagName(tag),
  ------------------
  |  |   18|  8.62k|#define stringFormat std::format
  ------------------
  432|  8.62k|                            typeName(type), count, offsetString);
  433|  8.62k|        if (isShortType(type)) {
  ------------------
  |  Branch (433:13): [True: 1.87k, False: 6.75k]
  ------------------
  434|  5.29k|          for (size_t k = 0; k < kount; k++) {
  ------------------
  |  Branch (434:30): [True: 3.42k, False: 1.87k]
  ------------------
  435|  3.42k|            out << sp << byteSwap2(buf, k * size, bSwap);
  436|  3.42k|            sp = " ";
  437|  3.42k|          }
  438|  6.75k|        } else if (isLongType(type)) {
  ------------------
  |  Branch (438:20): [True: 2.98k, False: 3.76k]
  ------------------
  439|  8.90k|          for (size_t k = 0; k < kount; k++) {
  ------------------
  |  Branch (439:30): [True: 5.91k, False: 2.98k]
  ------------------
  440|  5.91k|            out << sp << byteSwap4(buf, k * size, bSwap);
  441|  5.91k|            sp = " ";
  442|  5.91k|          }
  443|       |
  444|  3.76k|        } else if (isRationalType(type)) {
  ------------------
  |  Branch (444:20): [True: 1.32k, False: 2.43k]
  ------------------
  445|  2.55k|          for (size_t k = 0; k < kount; k++) {
  ------------------
  |  Branch (445:30): [True: 1.22k, False: 1.32k]
  ------------------
  446|  1.22k|            const uint32_t a = byteSwap4(buf, (k * size) + 0, bSwap);
  447|  1.22k|            const uint32_t b = byteSwap4(buf, (k * size) + 4, bSwap);
  448|  1.22k|            out << sp << a << "/" << b;
  449|  1.22k|            sp = " ";
  450|  1.22k|          }
  451|  2.43k|        } else if (isStringType(type)) {
  ------------------
  |  Branch (451:20): [True: 1.35k, False: 1.08k]
  ------------------
  452|  1.35k|          out << sp << Internal::binaryToString(makeSlice(buf, 0, kount));
  453|  1.35k|        }
  454|       |
  455|  8.62k|        sp = kount == count ? "" : " ...";
  ------------------
  |  Branch (455:14): [True: 7.01k, False: 1.61k]
  ------------------
  456|  8.62k|        out << sp << '\n';
  457|       |
  458|  8.62k|        if (option == kpsRecursive && (tag == 0x8769 /* ExifTag */ || tag == 0x014a /*SubIFDs*/ || type == tiffIfd)) {
  ------------------
  |  Branch (458:13): [True: 8.33k, False: 291]
  |  Branch (458:40): [True: 19, False: 8.31k]
  |  Branch (458:71): [True: 575, False: 7.74k]
  |  Branch (458:100): [True: 741, False: 6.99k]
  ------------------
  459|  1.34k|          for (size_t k = 0; k < count; k++) {
  ------------------
  |  Branch (459:30): [True: 10, False: 1.33k]
  ------------------
  460|     10|            const size_t restore = io.tell();
  461|     10|            const uint32_t offset_inner = byteSwap4(buf, k * size, bSwap);
  462|     10|            printIFDStructure(io, out, option, offset_inner, bSwap, c, depth + 1);
  463|     10|            io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata);
  464|     10|          }
  465|  7.29k|        } else if (option == kpsRecursive && tag == 0x83bb /* IPTCNAA */) {
  ------------------
  |  Branch (465:20): [True: 6.99k, False: 291]
  |  Branch (465:46): [True: 2.59k, False: 4.40k]
  ------------------
  466|  2.59k|          if (count > 0) {
  ------------------
  |  Branch (466:15): [True: 1.64k, False: 945]
  ------------------
  467|  1.64k|            if (static_cast<size_t>(Safe::add(count, offset)) > io.size()) {
  ------------------
  |  Branch (467:17): [True: 2, False: 1.64k]
  ------------------
  468|      2|              throw Error(ErrorCode::kerCorruptedMetadata);
  469|      2|            }
  470|       |
  471|  1.64k|            const size_t restore = io.tell();
  472|  1.64k|            io.seekOrThrow(offset, BasicIo::beg, ErrorCode::kerCorruptedMetadata);  // position
  473|  1.64k|            auto bytes = std::make_unique<byte[]>(count);                           // allocate memory
  474|  1.64k|            io.readOrThrow(bytes.get(), count, ErrorCode::kerCorruptedMetadata);
  475|  1.64k|            io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata);
  476|  1.64k|            IptcData::printStructure(out, makeSliceUntil(bytes.get(), count), depth);
  477|  1.64k|          }
  478|  4.70k|        } else if (option == kpsRecursive && tag == 0x927c /* MakerNote */ && count > 10) {
  ------------------
  |  Branch (478:20): [True: 4.40k, False: 291]
  |  Branch (478:46): [True: 732, False: 3.67k]
  |  Branch (478:79): [True: 0, False: 732]
  ------------------
  479|      0|          const size_t restore = io.tell();  // save
  480|       |
  481|      0|          const uint32_t jump = 10;
  482|      0|          byte bytes[20];
  483|      0|          const auto chars = reinterpret_cast<const char*>(&bytes[0]);
  484|      0|          io.seekOrThrow(offset, BasicIo::beg, ErrorCode::kerCorruptedMetadata);  // position
  485|      0|          io.readOrThrow(bytes, jump, ErrorCode::kerCorruptedMetadata);           // read
  486|      0|          bytes[jump] = 0;
  487|       |
  488|      0|          bool bNikon = ::strcmp("Nikon", chars) == 0;
  489|      0|          bool bSony = ::strcmp("SONY DSC ", chars) == 0;
  490|       |
  491|      0|          if (bNikon) {
  ------------------
  |  Branch (491:15): [True: 0, False: 0]
  ------------------
  492|       |            // tag is an embedded tiff
  493|      0|            const uint32_t byteslen = count - jump;
  494|      0|            auto b = DataBuf(byteslen);                                           // allocate a buffer
  495|      0|            io.readOrThrow(b.data(), byteslen, ErrorCode::kerCorruptedMetadata);  // read
  496|      0|            MemIo memIo(b.c_data(), byteslen);                                    // create a file
  497|      0|            printTiffStructure(memIo, out, option, depth + 1);
  498|      0|          } else {
  499|       |            // tag is an IFD
  500|      0|            const uint32_t punt = bSony ? 12 : 0;
  ------------------
  |  Branch (500:35): [True: 0, False: 0]
  ------------------
  501|      0|            io.seekOrThrow(0, BasicIo::beg, ErrorCode::kerCorruptedMetadata);  // position
  502|      0|            printIFDStructure(io, out, option, offset + punt, bSwap, c, depth + 1);
  503|      0|          }
  504|       |
  505|      0|          io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata);  // restore
  506|      0|        }
  507|  8.62k|      }
  508|       |
  509|  8.65k|      if (isPrintXMP(tag, option)) {
  ------------------
  |  Branch (509:11): [True: 0, False: 8.65k]
  ------------------
  510|      0|        buf.write_uint8(count, 0);
  511|      0|        out << buf.c_str();
  512|      0|      }
  513|  8.65k|      if (isPrintICC(tag, option)) {
  ------------------
  |  Branch (513:11): [True: 0, False: 8.65k]
  ------------------
  514|      0|        out.write(buf.c_str(), count);
  515|      0|      }
  516|  8.65k|    }
  517|  4.49k|    if (start) {
  ------------------
  |  Branch (517:9): [True: 4.30k, False: 190]
  ------------------
  518|  4.30k|      io.readOrThrow(dir.data(), 4, ErrorCode::kerCorruptedMetadata);
  519|  4.30k|      start = byteSwap4(dir, 0, bSwap);
  520|  4.30k|    }
  521|  4.49k|  } while (start);
  ------------------
  |  Branch (521:12): [True: 13, False: 4.48k]
  ------------------
  522|       |
  523|  4.48k|  if (bPrint) {
  ------------------
  |  Branch (523:7): [True: 4.29k, False: 192]
  ------------------
  524|  4.29k|    out << Internal::indent(depth) << "END " << io.path() << '\n';
  525|  4.29k|  }
  526|  4.48k|  out.flush();
  527|  4.48k|}
_ZN5Exiv25Image18printTiffStructureERNS_7BasicIoERNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEENS_20PrintStructureOptionEmm:
  530|  35.7k|                               size_t offset /*=0*/) {
  531|  35.7k|  if (option == kpsBasic || option == kpsXMP || option == kpsRecursive || option == kpsIccProfile) {
  ------------------
  |  Branch (531:7): [True: 15.6k, False: 20.0k]
  |  Branch (531:29): [True: 1, False: 20.0k]
  |  Branch (531:49): [True: 4.37k, False: 15.6k]
  |  Branch (531:75): [True: 0, False: 15.6k]
  ------------------
  532|       |    // buffer
  533|  20.0k|    const size_t dirSize = 32;
  534|  20.0k|    DataBuf dir(dirSize);
  535|       |
  536|       |    // read header (we already know for certain that we have a Tiff file)
  537|  20.0k|    io.readOrThrow(dir.data(), 8, ErrorCode::kerCorruptedMetadata);
  538|  20.0k|    auto c = dir.read_uint8(0);
  539|  20.0k|    bool bSwap = (c == 'M' && isLittleEndianPlatform()) || (c == 'I' && isBigEndianPlatform());
  ------------------
  |  Branch (539:19): [True: 15.4k, False: 4.63k]
  |  Branch (539:31): [True: 15.4k, False: 0]
  |  Branch (539:61): [True: 4.59k, False: 16]
  |  Branch (539:73): [True: 0, False: 4.59k]
  ------------------
  540|  20.0k|    size_t start = byteSwap4(dir, 4, bSwap);
  541|  20.0k|    printIFDStructure(io, out, option, start + offset, bSwap, c, depth);
  542|  20.0k|  }
  543|  35.7k|}
_ZN5Exiv25Image13clearMetadataEv:
  545|  30.6k|void Image::clearMetadata() {
  546|  30.6k|  clearExifData();
  547|  30.6k|  clearIptcData();
  548|  30.6k|  clearXmpPacket();
  549|  30.6k|  clearXmpData();
  550|  30.6k|  clearComment();
  551|  30.6k|  clearIccProfile();
  552|  30.6k|}
_ZN5Exiv25Image8exifDataEv:
  554|   633k|ExifData& Image::exifData() {
  555|   633k|  return exifData_;
  556|   633k|}
_ZN5Exiv25Image8iptcDataEv:
  558|  46.9k|IptcData& Image::iptcData() {
  559|  46.9k|  return iptcData_;
  560|  46.9k|}
_ZN5Exiv25Image7xmpDataEv:
  562|  55.7k|XmpData& Image::xmpData() {
  563|  55.7k|  return xmpData_;
  564|  55.7k|}
_ZN5Exiv25Image9xmpPacketEv:
  566|    104|std::string& Image::xmpPacket() {
  567|       |  // Serialize the current XMP
  568|    104|  if (!xmpData_.empty() && !writeXmpFromPacket()) {
  ------------------
  |  Branch (568:7): [True: 0, False: 104]
  |  Branch (568:28): [True: 0, False: 0]
  ------------------
  569|      0|    XmpParser::encode(xmpPacket_, xmpData_, XmpParser::useCompactFormat | XmpParser::omitAllFormatting);
  570|      0|  }
  571|    104|  return xmpPacket_;
  572|    104|}
_ZN5Exiv25Image13clearExifDataEv:
  594|  30.6k|void Image::clearExifData() {
  595|  30.6k|  exifData_.clear();
  596|  30.6k|}
_ZN5Exiv25Image13clearIptcDataEv:
  602|  30.6k|void Image::clearIptcData() {
  603|  30.6k|  iptcData_.clear();
  604|  30.6k|}
_ZN5Exiv25Image14clearXmpPacketEv:
  610|  30.6k|void Image::clearXmpPacket() {
  611|  30.6k|  xmpPacket_.clear();
  612|       |  // Also clear the packet cached inside xmpData_. Some formats (e.g. TIFF, where
  613|       |  // XMP is stored in the Exif.Image.XMLPacket tag) write XMP from xmpData_'s
  614|       |  // packet when writeXmpFromPacket() is set. Without this, a stale packet would
  615|       |  // survive and the XMP would not be erased (e.g. "exiv2 -dx" on a TIFF).
  616|  30.6k|  xmpData_.setPacket(std::string());
  617|  30.6k|  writeXmpFromPacket(true);
  618|  30.6k|}
_ZN5Exiv25Image12clearXmpDataEv:
  628|  30.6k|void Image::clearXmpData() {
  629|  30.6k|  xmpData_.clear();
  630|  30.6k|  writeXmpFromPacket(false);
  631|  30.6k|}
_ZN5Exiv25Image18writeXmpFromPacketEb:
  639|  61.3k|void Image::writeXmpFromPacket(bool flag) {
  640|  61.3k|  writeXmpFromPacket_ = flag;
  641|  61.3k|}
_ZN5Exiv25Image12clearCommentEv:
  647|  30.6k|void Image::clearComment() {
  648|  30.6k|  comment_.erase();
  649|  30.6k|}
_ZN5Exiv25Image10setCommentERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  651|     63|void Image::setComment(const std::string& comment) {
  652|     63|  comment_ = comment;
  653|     63|}
_ZN5Exiv25Image13setIccProfileEONS_7DataBufEb:
  655|    179|void Image::setIccProfile(Exiv2::DataBuf&& iccProfile, bool bTestValid) {
  656|    179|  iccProfile_ = std::move(iccProfile);
  657|    179|  if (bTestValid) {
  ------------------
  |  Branch (657:7): [True: 179, False: 0]
  ------------------
  658|    179|    checkIccProfile();
  659|    179|  }
  660|    179|}
_ZN5Exiv25Image16appendIccProfileEPKhmb:
  662|  2.61k|void Image::appendIccProfile(const uint8_t* bytes, size_t size, bool bTestValid) {
  663|  2.61k|  if (size == 0) {
  ------------------
  |  Branch (663:7): [True: 193, False: 2.42k]
  ------------------
  664|    193|    return;
  665|    193|  }
  666|  2.42k|  const size_t start = iccProfile_.size();
  667|  2.42k|  iccProfile_.resize(Safe::add(start, size));
  668|  2.42k|  memcpy(iccProfile_.data(start), bytes, size);
  669|  2.42k|  if (bTestValid) {
  ------------------
  |  Branch (669:7): [True: 21, False: 2.40k]
  ------------------
  670|     21|    checkIccProfile();
  671|     21|  }
  672|  2.42k|}
_ZNK5Exiv25Image15checkIccProfileEv:
  674|    200|void Image::checkIccProfile() const {
  675|    200|  if (iccProfile_.size() < sizeof(long)) {
  ------------------
  |  Branch (675:7): [True: 3, False: 197]
  ------------------
  676|      3|    throw Error(ErrorCode::kerInvalidIccProfile);
  677|      3|  }
  678|    197|  const size_t size = iccProfile_.read_uint32(0, bigEndian);
  679|    197|  if (size != iccProfile_.size()) {
  ------------------
  |  Branch (679:7): [True: 9, False: 188]
  ------------------
  680|      9|    throw Error(ErrorCode::kerInvalidIccProfile);
  681|      9|  }
  682|    197|}
_ZN5Exiv25Image15clearIccProfileEv:
  684|  30.6k|void Image::clearIccProfile() {
  685|  30.6k|  iccProfile_.reset();
  686|  30.6k|}
_ZN5Exiv25Image12setByteOrderENS_9ByteOrderE:
  688|  17.9k|void Image::setByteOrder(ByteOrder byteOrder) {
  689|  17.9k|  byteOrder_ = byteOrder;
  690|  17.9k|}
_ZNK5Exiv25Image9byteOrderEv:
  692|  1.25k|ByteOrder Image::byteOrder() const {
  693|  1.25k|  return byteOrder_;
  694|  1.25k|}
_ZNK5Exiv25Image10pixelWidthEv:
  696|    440|uint32_t Image::pixelWidth() const {
  697|    440|  return pixelWidth_;
  698|    440|}
_ZNK5Exiv25Image11pixelHeightEv:
  700|    440|uint32_t Image::pixelHeight() const {
  701|    440|  return pixelHeight_;
  702|    440|}
_ZNK5Exiv25Image8exifDataEv:
  704|  90.6k|const ExifData& Image::exifData() const {
  705|  90.6k|  return exifData_;
  706|  90.6k|}
_ZNK5Exiv25Image7xmpDataEv:
  712|  2.21k|const XmpData& Image::xmpData() const {
  713|  2.21k|  return xmpData_;
  714|  2.21k|}
_ZNK5Exiv25Image7commentEv:
  716|    176|std::string Image::comment() const {
  717|    176|  return comment_;
  718|    176|}
_ZNK5Exiv25Image2ioEv:
  724|  40.8k|BasicIo& Image::io() const {
  725|  40.8k|  return *io_;
  726|  40.8k|}
_ZNK5Exiv25Image18writeXmpFromPacketEv:
  728|  7.48k|bool Image::writeXmpFromPacket() const {
  729|  7.48k|  return writeXmpFromPacket_;
  730|  7.48k|}
_ZNK5Exiv25Image14nativePreviewsEv:
  732|  9.07k|const NativePreviewList& Image::nativePreviews() const {
  733|  9.07k|  return nativePreviews_;
  734|  9.07k|}
_ZNK5Exiv25Image4goodEv:
  736|  32.0k|bool Image::good() const {
  737|  32.0k|  if (io_->open() != 0)
  ------------------
  |  Branch (737:7): [True: 0, False: 32.0k]
  ------------------
  738|      0|    return false;
  739|  32.0k|  IoCloser closer(*io_);
  740|  32.0k|  return ImageFactory::checkType(imageType_, *io_, false);
  741|  32.0k|}
_ZN5Exiv25Image7tagNameEt:
  752|  8.62k|const std::string& Image::tagName(uint16_t tag) {
  753|  8.62k|  if (init_) {
  ------------------
  |  Branch (753:7): [True: 214, False: 8.41k]
  ------------------
  754|    214|    int idx;
  755|    214|    const TagInfo* ti;
  756|    642|    for (ti = Internal::mnTagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (756:47): [True: 428, False: 214]
  ------------------
  757|    428|      tags_[ti[idx].tag_] = ti[idx].name_;
  758|  1.28k|    for (ti = Internal::iopTagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (758:48): [True: 1.07k, False: 214]
  ------------------
  759|  1.07k|      tags_[ti[idx].tag_] = ti[idx].name_;
  760|  7.06k|    for (ti = Internal::gpsTagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (760:48): [True: 6.84k, False: 214]
  ------------------
  761|  6.84k|      tags_[ti[idx].tag_] = ti[idx].name_;
  762|  54.9k|    for (ti = Internal::ifdTagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (762:48): [True: 54.7k, False: 214]
  ------------------
  763|  54.7k|      tags_[ti[idx].tag_] = ti[idx].name_;
  764|  20.7k|    for (ti = Internal::exifTagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (764:49): [True: 20.5k, False: 214]
  ------------------
  765|  20.5k|      tags_[ti[idx].tag_] = ti[idx].name_;
  766|  4.28k|    for (ti = Internal::mpfTagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (766:48): [True: 4.06k, False: 214]
  ------------------
  767|  4.06k|      tags_[ti[idx].tag_] = ti[idx].name_;
  768|  3.63k|    for (ti = Internal::Nikon1MakerNote::tagList(), idx = 0; ti[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (768:62): [True: 3.42k, False: 214]
  ------------------
  769|  3.42k|      tags_[ti[idx].tag_] = ti[idx].name_;
  770|    214|  }
  771|  8.62k|  init_ = false;
  772|       |
  773|  8.62k|  return tags_[tag];
  774|  8.62k|}
_ZN5Exiv212ImageFactory9checkTypeENS_9ImageTypeERNS_7BasicIoEb:
  791|  32.0k|bool ImageFactory::checkType(ImageType type, BasicIo& io, bool advance) {
  792|  32.0k|  if (auto r = Exiv2::find(registry, type))
  ------------------
  |  Branch (792:12): [True: 32.0k, False: 0]
  ------------------
  793|  32.0k|    return r->isThisType_(io, advance);
  794|      0|  return false;
  795|  32.0k|}
_ZN5Exiv212ImageFactory4openEPKhm:
  877|  32.5k|Image::UniquePtr ImageFactory::open(const byte* data, size_t size) {
  878|  32.5k|  auto image = open(std::make_unique<MemIo>(data, size));  // may throw
  879|  32.5k|  if (!image)
  ------------------
  |  Branch (879:7): [True: 398, False: 32.1k]
  ------------------
  880|    398|    throw Error(ErrorCode::kerMemoryContainsUnknownImageType);
  881|  32.1k|  return image;
  882|  32.5k|}
_ZN5Exiv212ImageFactory4openENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEE:
  884|  32.5k|Image::UniquePtr ImageFactory::open(BasicIo::UniquePtr io) {
  885|  32.5k|  if (io->open() != 0) {
  ------------------
  |  Branch (885:7): [True: 0, False: 32.5k]
  ------------------
  886|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io->path(), strError());
  887|      0|  }
  888|   470k|  for (const auto& r : registry) {
  ------------------
  |  Branch (888:22): [True: 470k, False: 511]
  ------------------
  889|   470k|    if (r.isThisType_(*io, false)) {
  ------------------
  |  Branch (889:9): [True: 32.0k, False: 438k]
  ------------------
  890|  32.0k|      return r.newInstance_(std::move(io), ImageCtorParams(false, 1000));
  891|  32.0k|    }
  892|   470k|  }
  893|    511|  return nullptr;
  894|  32.5k|}
_ZN5Exiv26appendERNSt3__16vectorIhNS0_9allocatorIhEEEEPKhm:
  932|  65.9k|void append(Blob& blob, const byte* buf, size_t len) {
  933|  65.9k|  if (len != 0) {
  ------------------
  |  Branch (933:7): [True: 64.7k, False: 1.19k]
  ------------------
  934|  64.7k|    Blob::size_type size = blob.size();
  935|  64.7k|    if (blob.capacity() - size < len) {
  ------------------
  |  Branch (935:9): [True: 4.19k, False: 60.5k]
  ------------------
  936|  4.19k|      blob.reserve(size + 65536);
  937|  4.19k|    }
  938|  64.7k|    blob.resize(size + len);
  939|  64.7k|    std::copy_n(buf, len, blob.begin() + size);
  940|  64.7k|  }
  941|  65.9k|}  // append
image.cpp:_ZN5Exiv2L9typeValidEt:
  320|  8.93k|static bool typeValid(uint16_t type) {
  321|  8.93k|  return type >= 1 && type <= 13;
  ------------------
  |  Branch (321:10): [True: 8.88k, False: 54]
  |  Branch (321:23): [True: 8.71k, False: 170]
  ------------------
  322|  8.93k|}
image.cpp:_ZZN5Exiv25Image17printIFDStructureERNS_7BasicIoERNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEENS_20PrintStructureOptionEmbcmENK3$_0clEv:
  378|  8.71k|      const uint32_t kount = [=] {
  379|       |        // haul in all the data
  380|  8.71k|        if (isPrintXMP(tag, option))
  ------------------
  |  Branch (380:13): [True: 0, False: 8.71k]
  ------------------
  381|      0|          return count;
  382|       |        // ditto
  383|  8.71k|        if (isPrintICC(tag, option))
  ------------------
  |  Branch (383:13): [True: 0, False: 8.71k]
  ------------------
  384|      0|          return count;
  385|       |        // restrict long arrays
  386|  8.71k|        if (isStringType(type)) {
  ------------------
  |  Branch (386:13): [True: 1.39k, False: 7.31k]
  ------------------
  387|  1.39k|          return std::min(count, 32u);
  388|  1.39k|        }
  389|  7.31k|        return std::min(count, 5u);
  390|  8.71k|      }();
image.cpp:_ZZN5Exiv25Image17printIFDStructureERNS_7BasicIoERNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEENS_20PrintStructureOptionEmbcmENK3$_1clEv:
  392|  8.71k|      const uint32_t size = [=] {
  393|  8.71k|        if (isStringType(type))
  ------------------
  |  Branch (393:13): [True: 1.39k, False: 7.31k]
  ------------------
  394|  1.39k|          return 1;
  395|  7.31k|        if (is2ByteType(type))
  ------------------
  |  Branch (395:13): [True: 1.89k, False: 5.42k]
  ------------------
  396|  1.89k|          return 2;
  397|  5.42k|        if (is4ByteType(type))
  ------------------
  |  Branch (397:13): [True: 4.07k, False: 1.35k]
  ------------------
  398|  4.07k|          return 4;
  399|  1.35k|        if (is8ByteType(type))
  ------------------
  |  Branch (399:13): [True: 1.35k, False: 0]
  ------------------
  400|  1.35k|          return 8;
  401|      0|        return 1;
  402|  1.35k|      }();
image.cpp:_ZNK12_GLOBAL__N_18RegistryeqERKN5Exiv29ImageTypeE:
   66|   457k|  bool operator==(const ImageType& imageType) const {
   67|   457k|    return imageType == imageType_;
   68|   457k|  }

_ZN5Exiv28Internal6indentEm:
    9|  93.3k|[[nodiscard]] std::string indent(size_t i) {
   10|  93.3k|  return std::string(2 * i, ' ');
   11|  93.3k|}

_ZN5Exiv28Internal14binaryToStringIPhEEDaONS_5SliceIT_EE:
   95|  48.9k|constexpr auto binaryToString(Slice<T>&& sl) noexcept {
   96|  48.9k|  return binaryToStringHelper<T>(std::move(sl));
   97|  48.9k|}
_ZN5Exiv28Internal20binaryToStringHelperIPhEC2EONS_5SliceIS2_EE:
   64|  48.9k|  explicit constexpr binaryToStringHelper(Slice<T>&& myBuf) noexcept : buf_(std::move(myBuf)) {
   65|  48.9k|  }
_ZN5Exiv28InternallsIPhEERNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEES8_RKNS0_20binaryToStringHelperIT_EE:
   49|  48.9k|std::ostream& operator<<(std::ostream& stream, const binaryToStringHelper<T>& binToStr) noexcept {
   50|  1.13M|  for (size_t i = 0; i < binToStr.buf_.size(); ++i) {
  ------------------
  |  Branch (50:22): [True: 1.08M, False: 48.9k]
  ------------------
   51|  1.08M|    auto c = static_cast<unsigned char>(binToStr.buf_.at(i));
   52|  1.08M|    if (c != 0 || i != binToStr.buf_.size() - 1) {
  ------------------
  |  Branch (52:9): [True: 810k, False: 277k]
  |  Branch (52:19): [True: 252k, False: 24.6k]
  ------------------
   53|  1.06M|      if (c < 32 || c > 126)
  ------------------
  |  Branch (53:11): [True: 342k, False: 720k]
  |  Branch (53:21): [True: 125k, False: 594k]
  ------------------
   54|   468k|        stream.put('.');
   55|   594k|      else
   56|   594k|        stream.put(static_cast<char>(c));
   57|  1.06M|    }
   58|  1.08M|  }
   59|  48.9k|  return stream;
   60|  48.9k|}
_ZN5Exiv28Internal14binaryToStringIKNS_5SliceIPhEEEEDaONS2_IT_EE:
   95|  1.25k|constexpr auto binaryToString(Slice<T>&& sl) noexcept {
   96|  1.25k|  return binaryToStringHelper<T>(std::move(sl));
   97|  1.25k|}
_ZN5Exiv28Internal20binaryToStringHelperIKNS_5SliceIPhEEEC2EONS2_IS5_EE:
   64|  1.25k|  explicit constexpr binaryToStringHelper(Slice<T>&& myBuf) noexcept : buf_(std::move(myBuf)) {
   65|  1.25k|  }
_ZN5Exiv28InternallsIKNS_5SliceIPhEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS0_20binaryToStringHelperIT_EE:
   49|  1.25k|std::ostream& operator<<(std::ostream& stream, const binaryToStringHelper<T>& binToStr) noexcept {
   50|  8.55k|  for (size_t i = 0; i < binToStr.buf_.size(); ++i) {
  ------------------
  |  Branch (50:22): [True: 7.30k, False: 1.25k]
  ------------------
   51|  7.30k|    auto c = static_cast<unsigned char>(binToStr.buf_.at(i));
   52|  7.30k|    if (c != 0 || i != binToStr.buf_.size() - 1) {
  ------------------
  |  Branch (52:9): [True: 5.07k, False: 2.22k]
  |  Branch (52:19): [True: 1.68k, False: 539]
  ------------------
   53|  6.76k|      if (c < 32 || c > 126)
  ------------------
  |  Branch (53:11): [True: 2.75k, False: 4.00k]
  |  Branch (53:21): [True: 1.05k, False: 2.95k]
  ------------------
   54|  3.81k|        stream.put('.');
   55|  2.95k|      else
   56|  2.95k|        stream.put(static_cast<char>(c));
   57|  6.76k|    }
   58|  7.30k|  }
   59|  1.25k|  return stream;
   60|  1.25k|}

_ZN5Exiv29IptcdatumC2ERKNS_7IptcKeyEPKNS_5ValueE:
   56|  43.5k|Iptcdatum::Iptcdatum(const IptcKey& key, const Value* pValue) : key_(key.clone()) {
   57|  43.5k|  if (pValue)
  ------------------
  |  Branch (57:7): [True: 43.2k, False: 296]
  ------------------
   58|  43.2k|    value_ = pValue->clone();
   59|  43.5k|}
_ZN5Exiv29IptcdatumC2ERKS0_:
   61|   330k|Iptcdatum::Iptcdatum(const Iptcdatum& rhs) {
   62|   330k|  if (rhs.key_)
  ------------------
  |  Branch (62:7): [True: 330k, False: 0]
  ------------------
   63|   330k|    key_ = rhs.key_->clone();  // deep copy
   64|   330k|  if (rhs.value_)
  ------------------
  |  Branch (64:7): [True: 330k, False: 0]
  ------------------
   65|   330k|    value_ = rhs.value_->clone();  // deep copy
   66|   330k|}
_ZN5Exiv29IptcdatumD2Ev:
   68|   374k|Iptcdatum::~Iptcdatum() = default;
_ZNK5Exiv29Iptcdatum5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKNS_8ExifDataE:
   74|  3.87k|std::ostream& Iptcdatum::write(std::ostream& os, const ExifData*) const {
   75|  3.87k|  return os << value();
   76|  3.87k|}
_ZNK5Exiv29Iptcdatum6recordEv:
   86|   792k|uint16_t Iptcdatum::record() const {
   87|   792k|  return key_ ? key_->record() : 0;
  ------------------
  |  Branch (87:10): [True: 792k, False: 0]
  ------------------
   88|   792k|}
_ZNK5Exiv29Iptcdatum7tagNameEv:
   98|  2.99k|std::string Iptcdatum::tagName() const {
   99|  2.99k|  return key_ ? key_->tagName() : "";
  ------------------
  |  Branch (99:10): [True: 2.99k, False: 0]
  ------------------
  100|  2.99k|}
_ZNK5Exiv29Iptcdatum3tagEv:
  110|  96.3k|uint16_t Iptcdatum::tag() const {
  111|  96.3k|  return key_ ? key_->tag() : 0;
  ------------------
  |  Branch (111:10): [True: 96.3k, False: 0]
  ------------------
  112|  96.3k|}
_ZNK5Exiv29Iptcdatum4sizeEv:
  130|  76.5k|size_t Iptcdatum::size() const {
  131|  76.5k|  return value_ ? value_->size() : 0;
  ------------------
  |  Branch (131:10): [True: 76.5k, False: 0]
  ------------------
  132|  76.5k|}
_ZNK5Exiv29Iptcdatum5valueEv:
  158|  42.1k|const Value& Iptcdatum::value() const {
  159|  42.1k|  if (!value_)
  ------------------
  |  Branch (159:7): [True: 0, False: 42.1k]
  ------------------
  160|      0|    throw Error(ErrorCode::kerValueNotSet, key());
  161|  42.1k|  return *value_;
  162|  42.1k|}
_ZN5Exiv29IptcdatumaSERKS0_:
  164|   210k|Iptcdatum& Iptcdatum::operator=(const Iptcdatum& rhs) {
  165|   210k|  if (this == &rhs)
  ------------------
  |  Branch (165:7): [True: 0, False: 210k]
  ------------------
  166|      0|    return *this;
  167|       |
  168|   210k|  key_.reset();
  169|   210k|  if (rhs.key_)
  ------------------
  |  Branch (169:7): [True: 210k, False: 0]
  ------------------
  170|   210k|    key_ = rhs.key_->clone();  // deep copy
  171|       |
  172|   210k|  value_.reset();
  173|   210k|  if (rhs.value_)
  ------------------
  |  Branch (173:7): [True: 210k, False: 0]
  ------------------
  174|   210k|    value_ = rhs.value_->clone();  // deep copy
  175|       |
  176|   210k|  return *this;
  177|   210k|}  // Iptcdatum::operator=
_ZN5Exiv29IptcdatumaSERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  186|    296|Iptcdatum& Iptcdatum::operator=(const std::string& value) {
  187|    296|  setValue(value);
  188|    296|  return *this;
  189|    296|}
_ZN5Exiv29Iptcdatum8setValueERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  202|    296|int Iptcdatum::setValue(const std::string& value) {
  203|    296|  if (!value_) {
  ------------------
  |  Branch (203:7): [True: 296, False: 0]
  ------------------
  204|    296|    TypeId type = IptcDataSets::dataSetType(tag(), record());
  205|    296|    value_ = Value::create(type);
  206|    296|  }
  207|    296|  return value_->read(value);
  208|    296|}
_ZN5Exiv28IptcDataixERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  210|    296|Iptcdatum& IptcData::operator[](const std::string& key) {
  211|    296|  IptcKey iptcKey(key);
  212|    296|  auto pos = findKey(iptcKey);
  213|    296|  if (pos == end()) {
  ------------------
  |  Branch (213:7): [True: 296, False: 0]
  ------------------
  214|    296|    return iptcMetadata_.emplace_back(iptcKey);
  215|    296|  }
  216|      0|  return *pos;
  217|    296|}
_ZNK5Exiv28IptcData4sizeEv:
  219|    389|size_t IptcData::size() const {
  220|    389|  size_t newSize = 0;
  221|  38.2k|  for (auto&& iptc : iptcMetadata_) {
  ------------------
  |  Branch (221:20): [True: 38.2k, False: 389]
  ------------------
  222|       |    // marker, record Id, dataset num, first 2 bytes of size
  223|  38.2k|    newSize += 5;
  224|  38.2k|    size_t dataSize = iptc.size();
  225|  38.2k|    newSize += dataSize;
  226|  38.2k|    if (dataSize > 32767) {
  ------------------
  |  Branch (226:9): [True: 0, False: 38.2k]
  ------------------
  227|       |      // extended dataset (we always use 4 bytes)
  228|      0|      newSize += 4;
  229|      0|    }
  230|  38.2k|  }
  231|    389|  return newSize;
  232|    389|}
_ZN5Exiv28IptcData3addERKNS_7IptcKeyEPKNS_5ValueE:
  234|  43.2k|int IptcData::add(const IptcKey& key, const Value* value) {
  235|  43.2k|  return add(Iptcdatum(key, value));
  236|  43.2k|}
_ZN5Exiv28IptcData3addERKNS_9IptcdatumE:
  238|  43.2k|int IptcData::add(const Iptcdatum& iptcDatum) {
  239|  43.2k|  if (!IptcDataSets::dataSetRepeatable(iptcDatum.tag(), iptcDatum.record()) &&
  ------------------
  |  Branch (239:7): [True: 3.49k, False: 39.7k]
  |  Branch (239:7): [True: 2.63k, False: 40.6k]
  ------------------
  240|  3.49k|      findId(iptcDatum.tag(), iptcDatum.record()) != end()) {
  ------------------
  |  Branch (240:7): [True: 2.63k, False: 862]
  ------------------
  241|  2.63k|    return 6;
  242|  2.63k|  }
  243|       |  // allow duplicates
  244|  40.6k|  iptcMetadata_.push_back(iptcDatum);
  245|  40.6k|  return 0;
  246|  43.2k|}
_ZN5Exiv28IptcData7findKeyERKNS_7IptcKeyE:
  252|    444|IptcData::iterator IptcData::findKey(const IptcKey& key) {
  253|    444|  return std::find_if(iptcMetadata_.begin(), iptcMetadata_.end(), FindIptcdatum(key.tag(), key.record()));
  254|    444|}
_ZN5Exiv28IptcData6findIdEtt:
  260|  3.49k|IptcData::iterator IptcData::findId(uint16_t dataset, uint16_t record) {
  261|  3.49k|  return std::find_if(iptcMetadata_.begin(), iptcMetadata_.end(), FindIptcdatum(dataset, record));
  262|  3.49k|}
_ZN5Exiv28IptcData14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5SliceIPhEEm:
  278|  4.75k|void IptcData::printStructure(std::ostream& out, const Slice<byte*>& bytes, size_t depth) {
  279|  4.75k|  if (bytes.size() < 3) {
  ------------------
  |  Branch (279:7): [True: 431, False: 4.32k]
  ------------------
  280|    431|    return;
  281|    431|  }
  282|  4.32k|  size_t i = 0;
  283|  74.8k|  while (i < bytes.size() - 3 && bytes.at(i) != 0x1c)
  ------------------
  |  Branch (283:10): [True: 71.7k, False: 3.05k]
  |  Branch (283:34): [True: 70.4k, False: 1.26k]
  ------------------
  284|  70.4k|    i++;
  285|  4.32k|  out << Internal::indent(++depth) << "Record | DataSet | Name                     | Length | Data" << '\n';
  286|  5.60k|  while (i < bytes.size() - 3) {
  ------------------
  |  Branch (286:10): [True: 2.07k, False: 3.52k]
  ------------------
  287|  2.07k|    if (bytes.at(i) != 0x1c) {
  ------------------
  |  Branch (287:9): [True: 796, False: 1.28k]
  ------------------
  288|    796|      break;
  289|    796|    }
  290|  1.28k|    uint16_t record = bytes.at(i + 1);
  291|  1.28k|    uint16_t dataset = bytes.at(i + 2);
  292|  1.28k|    Internal::enforce(bytes.size() - i >= 5, ErrorCode::kerCorruptedMetadata);
  293|  1.28k|    uint16_t len = getUShort(bytes.subSlice(i + 3, bytes.size()), bigEndian);
  294|       |
  295|  1.28k|    Internal::enforce(bytes.size() - i >= 5 + static_cast<size_t>(len), ErrorCode::kerCorruptedMetadata);
  296|  1.28k|    out << stringFormat("  {:6} | {:7} | {:<24} | {:6} | ", record, dataset,
  ------------------
  |  |   18|  1.28k|#define stringFormat std::format
  ------------------
  297|  1.28k|                        Exiv2::IptcDataSets::dataSetName(dataset, record), len);
  298|  1.28k|    out << Internal::binaryToString(makeSlice(bytes, i + 5, i + 5 + std::min<uint16_t>(40, len)))
  299|  1.28k|        << (len > 40 ? "...\n" : "\n");
  ------------------
  |  Branch (299:13): [True: 36, False: 1.24k]
  ------------------
  300|  1.28k|    i += 5 + len;
  301|  1.28k|  }
  302|  4.32k|}
_ZN5Exiv210IptcParser6decodeERNS_8IptcDataEPKhm:
  362|    924|int IptcParser::decode(IptcData& iptcData, const byte* pData, size_t size) {
  363|       |#ifdef EXIV2_DEBUG_MESSAGES
  364|       |  std::cerr << "IptcParser::decode, size = " << size << "\n";
  365|       |#endif
  366|    924|  auto pRead = pData;
  367|    924|  const auto pEnd = pData + size;
  368|    924|  iptcData.clear();
  369|       |
  370|    924|  uint16_t record = 0;
  371|    924|  uint16_t dataSet = 0;
  372|    924|  uint32_t sizeData = 0;
  373|    924|  byte extTest = 0;
  374|       |
  375|   835k|  while (6 <= static_cast<size_t>(pEnd - pRead)) {
  ------------------
  |  Branch (375:10): [True: 834k, False: 719]
  ------------------
  376|       |    // First byte should be a marker. If it isn't, scan forward and skip
  377|       |    // the chunk bytes present in some images. This deviates from the
  378|       |    // standard, which advises to treat such cases as errors.
  379|   834k|    if (*pRead++ != marker_)
  ------------------
  |  Branch (379:9): [True: 791k, False: 43.4k]
  ------------------
  380|   791k|      continue;
  381|  43.4k|    record = *pRead++;
  382|  43.4k|    dataSet = *pRead++;
  383|       |
  384|  43.4k|    extTest = *pRead;
  385|  43.4k|    if (extTest & 0x80) {
  ------------------
  |  Branch (385:9): [True: 316, False: 43.1k]
  ------------------
  386|       |      // extended dataset
  387|    316|      uint16_t sizeOfSize = (getUShort(pRead, bigEndian) & 0x7FFF);
  388|    316|      if (sizeOfSize > 4)
  ------------------
  |  Branch (388:11): [True: 38, False: 278]
  ------------------
  389|     38|        return 5;
  390|    278|      pRead += 2;
  391|    278|      if (sizeOfSize > pEnd - pRead)
  ------------------
  |  Branch (391:11): [True: 4, False: 274]
  ------------------
  392|      4|        return 6;
  393|    274|      sizeData = 0;
  394|    755|      for (; sizeOfSize > 0; --sizeOfSize) {
  ------------------
  |  Branch (394:14): [True: 481, False: 274]
  ------------------
  395|    481|        sizeData |= *pRead++ << (8 * (sizeOfSize - 1));
  396|    481|      }
  397|  43.1k|    } else {
  398|       |      // standard dataset
  399|  43.1k|      sizeData = getUShort(pRead, bigEndian);
  400|  43.1k|      pRead += 2;
  401|  43.1k|    }
  402|  43.4k|    if (sizeData <= static_cast<size_t>(pEnd - pRead)) {
  ------------------
  |  Branch (402:9): [True: 43.2k, False: 163]
  ------------------
  403|  43.2k|      int rc = readData(iptcData, dataSet, record, pRead, sizeData);
  404|  43.2k|      if (rc != 0) {
  ------------------
  |  Branch (404:11): [True: 0, False: 43.2k]
  ------------------
  405|      0|#ifndef SUPPRESS_WARNINGS
  406|      0|        EXV_WARNING << "Failed to read IPTC dataset " << IptcKey(dataSet, record) << " (rc = " << rc << "); skipped.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  407|      0|#endif
  408|      0|      }
  409|  43.2k|    } else {
  410|    163|#ifndef SUPPRESS_WARNINGS
  411|    163|      EXV_WARNING << "IPTC dataset " << IptcKey(dataSet, record) << " has invalid size " << sizeData << "; skipped.\n";
  ------------------
  |  |  138|    163|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 163]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    163|  LogMsg(LogMsg::warn).os()
  ------------------
  412|    163|#endif
  413|    163|      return 7;
  414|    163|    }
  415|  43.2k|    pRead += sizeData;
  416|  43.2k|  }
  417|       |
  418|    719|  return 0;
  419|    924|}  // IptcParser::decode
_ZN5Exiv210IptcParser6encodeERKNS_8IptcDataE:
  421|  8.93k|DataBuf IptcParser::encode(const IptcData& iptcData) {
  422|  8.93k|  DataBuf buf;
  423|  8.93k|  if (iptcData.empty())
  ------------------
  |  Branch (423:7): [True: 8.54k, False: 389]
  ------------------
  424|  8.54k|    return buf;
  425|       |
  426|    389|  buf = DataBuf(iptcData.size());
  427|    389|  byte* pWrite = buf.data();
  428|       |
  429|       |  // Copy the iptc data sets and sort them by record but preserve the order of datasets
  430|    389|  IptcMetadata sortedIptcData(iptcData.begin(), iptcData.end());
  431|    389|  std::stable_sort(sortedIptcData.begin(), sortedIptcData.end(),
  432|    389|                   [](const auto& l, const auto& r) { return l.record() < r.record(); });
  433|       |
  434|  38.2k|  for (const auto& iter : sortedIptcData) {
  ------------------
  |  Branch (434:25): [True: 38.2k, False: 389]
  ------------------
  435|       |    // marker, record Id, dataset num
  436|  38.2k|    *pWrite++ = marker_;
  437|  38.2k|    *pWrite++ = static_cast<byte>(iter.record());
  438|  38.2k|    *pWrite++ = static_cast<byte>(iter.tag());
  439|       |
  440|       |    // extended or standard dataset?
  441|  38.2k|    if (size_t dataSize = iter.size(); dataSize > 32767) {
  ------------------
  |  Branch (441:40): [True: 0, False: 38.2k]
  ------------------
  442|       |      // always use 4 bytes for extended length
  443|      0|      uint16_t sizeOfSize = 4 | 0x8000;
  444|      0|      us2Data(pWrite, sizeOfSize, bigEndian);
  445|      0|      pWrite += 2;
  446|      0|      ul2Data(pWrite, static_cast<uint32_t>(dataSize), bigEndian);
  447|      0|      pWrite += 4;
  448|  38.2k|    } else {
  449|  38.2k|      us2Data(pWrite, static_cast<uint16_t>(dataSize), bigEndian);
  450|  38.2k|      pWrite += 2;
  451|  38.2k|    }
  452|  38.2k|    pWrite += iter.value().copy(pWrite, bigEndian);
  453|  38.2k|  }
  454|       |
  455|    389|  return buf;
  456|  8.93k|}  // IptcParser::encode
iptc.cpp:_ZNK12_GLOBAL__N_113FindIptcdatumclERKN5Exiv29IptcdatumE:
   41|  11.0k|  bool operator()(const Exiv2::Iptcdatum& iptcdatum) const {
   42|  11.0k|    return dataset_ == iptcdatum.tag() && record_ == iptcdatum.record();
  ------------------
  |  Branch (42:12): [True: 3.93k, False: 7.07k]
  |  Branch (42:43): [True: 2.63k, False: 1.30k]
  ------------------
   43|  11.0k|  }
iptc.cpp:_ZN12_GLOBAL__N_113FindIptcdatumC2Ett:
   35|  3.93k|  FindIptcdatum(uint16_t dataset, uint16_t record) : dataset_(dataset), record_(record) {
   36|  3.93k|  }
iptc.cpp:_ZN12_GLOBAL__N_18readDataERN5Exiv28IptcDataEttPKhj:
  463|  43.2k|int readData(Exiv2::IptcData& iptcData, uint16_t dataSet, uint16_t record, const Exiv2::byte* data, uint32_t sizeData) {
  464|  43.2k|  Exiv2::TypeId type = Exiv2::IptcDataSets::dataSetType(dataSet, record);
  465|  43.2k|  auto value = Exiv2::Value::create(type);
  466|  43.2k|  int rc = value->read(data, sizeData, Exiv2::bigEndian);
  467|  43.2k|  if (0 == rc) {
  ------------------
  |  Branch (467:7): [True: 39.3k, False: 3.90k]
  ------------------
  468|  39.3k|    Exiv2::IptcKey key(dataSet, record);
  469|  39.3k|    iptcData.add(key, value.get());
  470|  39.3k|  } else if (1 == rc) {
  ------------------
  |  Branch (470:14): [True: 3.90k, False: 0]
  ------------------
  471|       |    // If the first attempt failed, try with a string value
  472|  3.90k|    value = Exiv2::Value::create(Exiv2::string);
  473|  3.90k|    rc = value->read(data, sizeData, Exiv2::bigEndian);
  474|  3.90k|    if (0 == rc) {
  ------------------
  |  Branch (474:9): [True: 3.90k, False: 0]
  ------------------
  475|  3.90k|      Exiv2::IptcKey key(dataSet, record);
  476|  3.90k|      iptcData.add(key, value.get());
  477|  3.90k|    }
  478|  3.90k|  }
  479|  43.2k|  return rc;
  480|  43.2k|}
iptc.cpp:_ZZN5Exiv210IptcParser6encodeERKNS_8IptcDataEENK3$_0clINS_9IptcdatumES6_EEDaRKT_RKT0_:
  432|   351k|                   [](const auto& l, const auto& r) { return l.record() < r.record(); });

_ZN5Exiv28Jp2ImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  101|    844|    Image(ImageType::jp2, mdExif | mdIptc | mdXmp, std::move(io), params) {
  102|    844|  if (params.create() && io_->open() == 0) {
  ------------------
  |  Branch (102:7): [True: 0, False: 844]
  |  Branch (102:26): [True: 0, False: 0]
  ------------------
  103|       |#ifdef EXIV2_DEBUG_MESSAGES
  104|       |    std::cerr << "Exiv2::Jp2Image:: Creating JPEG2000 image to memory" << '\n';
  105|       |#endif
  106|      0|    IoCloser closer(*io_);
  107|      0|    if (io_->write(Jp2Blank.data(), Jp2Blank.size()) != Jp2Blank.size()) {
  ------------------
  |  Branch (107:9): [True: 0, False: 0]
  ------------------
  108|       |#ifdef EXIV2_DEBUG_MESSAGES
  109|       |      std::cerr << "Exiv2::Jp2Image:: Failed to create JPEG2000 image on memory" << '\n';
  110|       |#endif
  111|      0|    }
  112|      0|  }
  113|    844|}
_ZN5Exiv28Jp2Image7toAsciiEj:
  116|  18.6k|std::string Jp2Image::toAscii(uint32_t n) {
  117|  18.6k|  std::string result(sizeof(uint32_t), '\0');
  118|  93.2k|  for (size_t i = 0; i < result.size(); ++i) {
  ------------------
  |  Branch (118:22): [True: 74.6k, False: 18.6k]
  ------------------
  119|  74.6k|    auto c = static_cast<unsigned char>(n >> (8 * (3 - i)));
  120|  74.6k|    result[i] = static_cast<char>(c);
  121|  74.6k|  }
  122|  18.6k|  return result;
  123|  18.6k|}
_ZN5Exiv28Jp2Image12readMetadataEv:
  135|    844|void Jp2Image::readMetadata() {
  136|       |#ifdef EXIV2_DEBUG_MESSAGES
  137|       |  std::cerr << "Exiv2::Jp2Image::readMetadata: Reading JPEG-2000 file " << io_->path() << '\n';
  138|       |#endif
  139|    844|  if (io_->open() != 0) {
  ------------------
  |  Branch (139:7): [True: 0, False: 844]
  ------------------
  140|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  141|      0|  }
  142|    844|  IoCloser closer(*io_);
  143|    844|  if (!isJp2Type(*io_, false)) {
  ------------------
  |  Branch (143:7): [True: 0, False: 844]
  ------------------
  144|      0|    throw Error(ErrorCode::kerNotAnImage, "JPEG-2000");
  145|      0|  }
  146|       |
  147|    844|  Internal::Jp2BoxHeader box = {0, 0};
  148|    844|  Internal::Jp2BoxHeader subBox = {0, 0};
  149|    844|  Internal::Jp2ImageHeaderBox ihdr = {0, 0, 0, 0, 0, 0, 0};
  150|    844|  Internal::Jp2UuidBox uuid = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
  151|    844|  size_t boxesCount = 0;
  152|    844|  const size_t boxem = 1000;  // boxes max
  153|    844|  uint32_t lastBoxTypeRead = 0;
  154|    844|  bool boxSignatureFound = false;
  155|    844|  bool boxFileTypeFound = false;
  156|       |
  157|  10.3k|  while (io_->read(reinterpret_cast<byte*>(&box), boxHSize) == boxHSize) {
  ------------------
  |  Branch (157:10): [True: 10.1k, False: 291]
  ------------------
  158|  10.1k|    boxes_check(boxesCount++, boxem);
  159|  10.1k|    const size_t position = io_->tell();
  160|  10.1k|    box.length = getULong(reinterpret_cast<byte*>(&box.length), bigEndian);
  161|  10.1k|    box.type = getULong(reinterpret_cast<byte*>(&box.type), bigEndian);
  162|       |#ifdef EXIV2_DEBUG_MESSAGES
  163|       |    std::cout << "Exiv2::Jp2Image::readMetadata: Position: " << position << " box type: " << toAscii(box.type)
  164|       |              << " length: " << box.length << '\n';
  165|       |#endif
  166|  10.1k|    Internal::enforce(box.length <= boxHSize + io_->size() - io_->tell(), ErrorCode::kerCorruptedMetadata);
  167|       |
  168|  10.1k|    if (box.length == 0)
  ------------------
  |  Branch (168:9): [True: 412, False: 9.69k]
  ------------------
  169|    412|      return;
  170|       |
  171|  9.69k|    if (box.length == 1) {
  ------------------
  |  Branch (171:9): [True: 3, False: 9.68k]
  ------------------
  172|       |      /// \todo In this case, the real box size is given in XLBox (bytes 8-15)
  173|      3|    }
  174|       |
  175|  9.69k|    switch (box.type) {
  176|    851|      case kJp2BoxType::Signature: {
  ------------------
  |  Branch (176:7): [True: 851, False: 8.84k]
  ------------------
  177|    851|        if (boxSignatureFound)  // Only one is allowed
  ------------------
  |  Branch (177:13): [True: 7, False: 844]
  ------------------
  178|      7|          throw Error(ErrorCode::kerCorruptedMetadata);
  179|    844|        boxSignatureFound = true;
  180|    844|        break;
  181|    851|      }
  182|     55|      case kJp2BoxType::FileTypeBox: {
  ------------------
  |  Branch (182:7): [True: 55, False: 9.63k]
  ------------------
  183|       |        // This box shall immediately follow the JPEG 2000 Signature box
  184|     55|        if (boxFileTypeFound || lastBoxTypeRead != kJp2BoxType::Signature) {  // Only one is allowed
  ------------------
  |  Branch (184:13): [True: 0, False: 55]
  |  Branch (184:33): [True: 3, False: 52]
  ------------------
  185|      3|          throw Error(ErrorCode::kerCorruptedMetadata);
  186|      3|        }
  187|     52|        boxFileTypeFound = true;
  188|     52|        Internal::enforce(box.length >= boxHSize, ErrorCode::kerCorruptedMetadata);
  189|     52|        Blob boxData(box.length - boxHSize);
  190|     52|        io_->readOrThrow(boxData.data(), boxData.size(), ErrorCode::kerCorruptedMetadata);
  191|     52|        if (!Internal::isValidBoxFileType(boxData))
  ------------------
  |  Branch (191:13): [True: 27, False: 25]
  ------------------
  192|     27|          throw Error(ErrorCode::kerCorruptedMetadata);
  193|     25|        brand_ = getULong(boxData.data(), bigEndian);
  194|     25|        break;
  195|     52|      }
  196|  3.49k|      case kJp2BoxType::Header: {
  ------------------
  |  Branch (196:7): [True: 3.49k, False: 6.19k]
  ------------------
  197|       |#ifdef EXIV2_DEBUG_MESSAGES
  198|       |        std::cout << "Exiv2::Jp2Image::readMetadata: JP2Header box found\n";
  199|       |#endif
  200|  3.49k|        size_t restore = io_->tell();
  201|       |
  202|  50.5k|        while (io_->read(reinterpret_cast<byte*>(&subBox), boxHSize) == boxHSize && subBox.length) {
  ------------------
  |  Branch (202:16): [True: 49.3k, False: 1.15k]
  |  Branch (202:85): [True: 47.0k, False: 2.31k]
  ------------------
  203|  47.0k|          boxes_check(boxesCount++, boxem);
  204|  47.0k|          subBox.length = getULong(reinterpret_cast<byte*>(&subBox.length), bigEndian);
  205|  47.0k|          subBox.type = getULong(reinterpret_cast<byte*>(&subBox.type), bigEndian);
  206|  47.0k|          if (subBox.length > io_->size()) {
  ------------------
  |  Branch (206:15): [True: 19, False: 47.0k]
  ------------------
  207|     19|            throw Error(ErrorCode::kerCorruptedMetadata);
  208|     19|          }
  209|       |#ifdef EXIV2_DEBUG_MESSAGES
  210|       |          std::cout << "Exiv2::Jp2Image::readMetadata: "
  211|       |                    << "subBox = " << toAscii(subBox.type) << " length = " << subBox.length << '\n';
  212|       |#endif
  213|  47.0k|          if (subBox.type == kJp2BoxType::ColorSpec && subBox.length != 15) {
  ------------------
  |  Branch (213:15): [True: 139, False: 46.8k]
  |  Branch (213:56): [True: 93, False: 46]
  ------------------
  214|       |#ifdef EXIV2_DEBUG_MESSAGES
  215|       |            std::cout << "Exiv2::Jp2Image::readMetadata: "
  216|       |                      << "Color data found" << '\n';
  217|       |#endif
  218|       |
  219|     93|            const size_t pad = 3;  // 3 padding bytes 2 0 0
  220|     93|            const size_t data_length = Safe::add(subBox.length, 8u);
  221|       |            // data_length makes no sense if it is larger than the rest of the file
  222|     93|            if (data_length > io_->size() - io_->tell()) {
  ------------------
  |  Branch (222:17): [True: 1, False: 92]
  ------------------
  223|      1|              throw Error(ErrorCode::kerCorruptedMetadata);
  224|      1|            }
  225|     92|            DataBuf data(data_length);
  226|     92|            io_->read(data.data(), data.size());
  227|     92|            const size_t iccLength = data.read_uint32(pad, bigEndian);
  228|       |            // subtracting pad from data.size() is safe:
  229|       |            // data.size() is at least 8 and pad = 3
  230|     92|            if (iccLength > data.size() - pad) {
  ------------------
  |  Branch (230:17): [True: 2, False: 90]
  ------------------
  231|      2|              throw Error(ErrorCode::kerCorruptedMetadata);
  232|      2|            }
  233|     90|            DataBuf icc(iccLength);
  234|     90|            std::copy_n(data.begin() + pad, icc.size(), icc.begin());
  235|       |#ifdef EXIV2_DEBUG_MESSAGES
  236|       |            const char* iccPath = "/tmp/libexiv2_jp2.icc";
  237|       |            if (auto f = std::ofstream(iccPath, std::ios::binary)) {
  238|       |              f.write(reinterpret_cast<const char*>(icc.c_data()), static_cast<std::streamsize>(icc.size()));
  239|       |              f.close();
  240|       |              std::cout << "Exiv2::Jp2Image::readMetadata: wrote iccProfile " << icc.size() << " bytes to " << iccPath
  241|       |                        << '\n';
  242|       |            }
  243|       |#endif
  244|     90|            setIccProfile(std::move(icc));
  245|     90|          }
  246|       |
  247|  47.0k|          if (subBox.type == kJp2BoxType::ImageHeader) {
  ------------------
  |  Branch (247:15): [True: 62, False: 46.9k]
  ------------------
  248|     62|            io_->read(reinterpret_cast<byte*>(&ihdr), sizeof(ihdr));
  249|       |#ifdef EXIV2_DEBUG_MESSAGES
  250|       |            std::cout << "Exiv2::Jp2Image::readMetadata: Ihdr data found" << '\n';
  251|       |#endif
  252|     62|            ihdr.imageHeight = getULong(reinterpret_cast<byte*>(&ihdr.imageHeight), bigEndian);
  253|     62|            ihdr.imageWidth = getULong(reinterpret_cast<byte*>(&ihdr.imageWidth), bigEndian);
  254|     62|            ihdr.componentCount = getShort(reinterpret_cast<byte*>(&ihdr.componentCount), bigEndian);
  255|     62|            Internal::enforce(ihdr.c == 7, ErrorCode::kerCorruptedMetadata);
  256|       |
  257|     62|            pixelWidth_ = ihdr.imageWidth;
  258|     62|            pixelHeight_ = ihdr.imageHeight;
  259|     62|          }
  260|       |
  261|  47.0k|          io_->seek(restore, BasicIo::beg);
  262|  47.0k|          if (io_->seek(subBox.length, BasicIo::cur) != 0) {
  ------------------
  |  Branch (262:15): [True: 3, False: 47.0k]
  ------------------
  263|      3|            throw Error(ErrorCode::kerCorruptedMetadata);
  264|      3|          }
  265|  47.0k|          restore = io_->tell();
  266|  47.0k|        }
  267|  3.47k|        break;
  268|  3.49k|      }
  269|       |
  270|  3.47k|      case kJp2BoxType::Uuid: {
  ------------------
  |  Branch (270:7): [True: 1.07k, False: 8.61k]
  ------------------
  271|       |#ifdef EXIV2_DEBUG_MESSAGES
  272|       |        std::cout << "Exiv2::Jp2Image::readMetadata: UUID box found" << '\n';
  273|       |#endif
  274|       |
  275|  1.07k|        if (io_->read(reinterpret_cast<byte*>(&uuid), sizeof(uuid)) == sizeof(uuid)) {
  ------------------
  |  Branch (275:13): [True: 1.07k, False: 1]
  ------------------
  276|  1.07k|          DataBuf rawData;
  277|  1.07k|          size_t bufRead;
  278|  1.07k|          bool bIsExif = uuid.uuid == kJp2UuidExif;
  279|  1.07k|          bool bIsIPTC = uuid.uuid == kJp2UuidIptc;
  280|  1.07k|          bool bIsXMP = uuid.uuid == kJp2UuidXmp;
  281|       |
  282|  1.07k|          if (bIsExif) {
  ------------------
  |  Branch (282:15): [True: 536, False: 538]
  ------------------
  283|       |#ifdef EXIV2_DEBUG_MESSAGES
  284|       |            std::cout << "Exiv2::Jp2Image::readMetadata: Exif data found" << '\n';
  285|       |#endif
  286|    536|            Internal::enforce(box.length >= boxHSize + sizeof(uuid), ErrorCode::kerCorruptedMetadata);
  287|    536|            rawData.alloc(box.length - (boxHSize + sizeof(uuid)));
  288|    536|            bufRead = io_->read(rawData.data(), rawData.size());
  289|    536|            if (io_->error())
  ------------------
  |  Branch (289:17): [True: 0, False: 536]
  ------------------
  290|      0|              throw Error(ErrorCode::kerFailedToReadImageData);
  291|    536|            if (bufRead != rawData.size())
  ------------------
  |  Branch (291:17): [True: 0, False: 536]
  ------------------
  292|      0|              throw Error(ErrorCode::kerInputDataReadFailed);
  293|       |
  294|    536|            if (rawData.size() > 8)  // "II*\0long"
  ------------------
  |  Branch (294:17): [True: 517, False: 19]
  ------------------
  295|    517|            {
  296|       |              // Find the position of Exif header in bytes array.
  297|    517|              const char a = rawData.read_uint8(0);
  298|    517|              const char b = rawData.read_uint8(1);
  299|    517|              const size_t notfound = std::numeric_limits<size_t>::max();
  300|    517|              size_t pos = (a == b && (a == 'I' || a == 'M')) ? 0 : notfound;
  ------------------
  |  Branch (300:29): [True: 389, False: 128]
  |  Branch (300:40): [True: 9, False: 380]
  |  Branch (300:52): [True: 2, False: 378]
  ------------------
  301|       |
  302|       |              // #1242  Forgive having Exif\0\0 in rawData.pData_
  303|    517|              std::array<byte, 6> exifHeader{0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
  304|  71.8k|              for (size_t i = 0; pos == notfound && i < (rawData.size() - exifHeader.size()); i++) {
  ------------------
  |  Branch (304:34): [True: 71.4k, False: 393]
  |  Branch (304:53): [True: 71.2k, False: 124]
  ------------------
  305|  71.2k|                if (rawData.cmpBytes(i, exifHeader.data(), exifHeader.size()) == 0) {
  ------------------
  |  Branch (305:21): [True: 382, False: 70.9k]
  ------------------
  306|    382|                  pos = i + sizeof(exifHeader);
  307|    382|#ifndef SUPPRESS_WARNINGS
  308|    382|                  EXV_WARNING << "Reading non-standard UUID-EXIF_bad box in " << io_->path() << '\n';
  ------------------
  |  |  138|    382|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 382]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    382|  LogMsg(LogMsg::warn).os()
  ------------------
  309|    382|#endif
  310|    382|                }
  311|  71.2k|              }
  312|       |
  313|       |              // If found it, store only these data at from this place.
  314|    517|              if (pos != notfound) {
  ------------------
  |  Branch (314:19): [True: 393, False: 124]
  ------------------
  315|       |#ifdef EXIV2_DEBUG_MESSAGES
  316|       |                std::cout << "Exiv2::Jp2Image::readMetadata: Exif header found at position " << pos << '\n';
  317|       |#endif
  318|    393|                const DecodeParams dp(max_recursion_depth_);
  319|    393|                ByteOrder bo = TiffParser::decode(exifData(), iptcData(), xmpData(), rawData.c_data(pos),
  320|    393|                                                  rawData.size() - pos, dp);
  321|    393|                setByteOrder(bo);
  322|    393|              }
  323|    517|            } else {
  324|     19|#ifndef SUPPRESS_WARNINGS
  325|     19|              EXV_WARNING << "Failed to decode Exif metadata." << '\n';
  ------------------
  |  |  138|     19|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 19]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     19|  LogMsg(LogMsg::warn).os()
  ------------------
  326|     19|#endif
  327|     19|              exifData_.clear();
  328|     19|            }
  329|    536|          }
  330|       |
  331|  1.07k|          if (bIsIPTC) {
  ------------------
  |  Branch (331:15): [True: 260, False: 814]
  ------------------
  332|       |#ifdef EXIV2_DEBUG_MESSAGES
  333|       |            std::cout << "Exiv2::Jp2Image::readMetadata: Iptc data found" << '\n';
  334|       |#endif
  335|    260|            Internal::enforce(box.length >= boxHSize + sizeof(uuid), ErrorCode::kerCorruptedMetadata);
  336|    260|            rawData.alloc(box.length - (boxHSize + sizeof(uuid)));
  337|    260|            bufRead = io_->read(rawData.data(), rawData.size());
  338|    260|            if (io_->error())
  ------------------
  |  Branch (338:17): [True: 0, False: 260]
  ------------------
  339|      0|              throw Error(ErrorCode::kerFailedToReadImageData);
  340|    260|            if (bufRead != rawData.size())
  ------------------
  |  Branch (340:17): [True: 0, False: 260]
  ------------------
  341|      0|              throw Error(ErrorCode::kerInputDataReadFailed);
  342|       |
  343|    260|            if (IptcParser::decode(iptcData_, rawData.c_data(), rawData.size())) {
  ------------------
  |  Branch (343:17): [True: 66, False: 194]
  ------------------
  344|     66|#ifndef SUPPRESS_WARNINGS
  345|     66|              EXV_WARNING << "Failed to decode IPTC metadata." << '\n';
  ------------------
  |  |  138|     66|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 66]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     66|  LogMsg(LogMsg::warn).os()
  ------------------
  346|     66|#endif
  347|     66|              iptcData_.clear();
  348|     66|            }
  349|    260|          }
  350|       |
  351|  1.07k|          if (bIsXMP) {
  ------------------
  |  Branch (351:15): [True: 103, False: 971]
  ------------------
  352|       |#ifdef EXIV2_DEBUG_MESSAGES
  353|       |            std::cout << "Exiv2::Jp2Image::readMetadata: Xmp data found" << '\n';
  354|       |#endif
  355|    103|            Internal::enforce(box.length >= boxHSize + sizeof(uuid), ErrorCode::kerCorruptedMetadata);
  356|    103|            rawData.alloc(box.length - (boxHSize + sizeof(uuid)));
  357|    103|            bufRead = io_->read(rawData.data(), rawData.size());
  358|    103|            if (io_->error())
  ------------------
  |  Branch (358:17): [True: 0, False: 103]
  ------------------
  359|      0|              throw Error(ErrorCode::kerFailedToReadImageData);
  360|    103|            if (bufRead != rawData.size())
  ------------------
  |  Branch (360:17): [True: 0, False: 103]
  ------------------
  361|      0|              throw Error(ErrorCode::kerInputDataReadFailed);
  362|    103|            xmpPacket_.assign(rawData.c_str(), rawData.size());
  363|       |
  364|    103|            if (auto idx = xmpPacket_.find_first_of('<'); idx != std::string::npos && idx > 0) {
  ------------------
  |  Branch (364:59): [True: 82, False: 21]
  |  Branch (364:87): [True: 79, False: 3]
  ------------------
  365|     79|#ifndef SUPPRESS_WARNINGS
  366|     79|              EXV_WARNING << "Removing " << static_cast<uint32_t>(idx)
  ------------------
  |  |  138|     79|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 79]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     79|  LogMsg(LogMsg::warn).os()
  ------------------
  367|      0|                          << " characters from the beginning of the XMP packet" << '\n';
  368|     79|#endif
  369|     79|              xmpPacket_ = xmpPacket_.substr(idx);
  370|     79|            }
  371|       |
  372|    103|            const DecodeParams dp(max_recursion_depth_);
  373|    103|            if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_, dp)) {
  ------------------
  |  Branch (373:17): [True: 85, False: 18]
  |  Branch (373:40): [True: 85, False: 0]
  ------------------
  374|     85|#ifndef SUPPRESS_WARNINGS
  375|     85|              EXV_WARNING << "Failed to decode XMP metadata." << '\n';
  ------------------
  |  |  138|     85|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 85]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     85|  LogMsg(LogMsg::warn).os()
  ------------------
  376|     85|#endif
  377|     85|            }
  378|    103|          }
  379|  1.07k|        }
  380|  1.07k|        break;
  381|  1.07k|      }
  382|       |
  383|  4.14k|      default:
  ------------------
  |  Branch (383:7): [True: 4.14k, False: 5.54k]
  ------------------
  384|  4.14k|        break;
  385|  9.69k|    }
  386|  9.55k|    lastBoxTypeRead = box.type;
  387|       |
  388|       |    // Move to the next box.
  389|  9.55k|    io_->seek(static_cast<int64_t>(position - boxHSize + box.length), BasicIo::beg);
  390|  9.55k|    if (io_->error())
  ------------------
  |  Branch (390:9): [True: 0, False: 9.55k]
  ------------------
  391|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  392|  9.55k|  }
  393|       |
  394|    844|}  // Jp2Image::readMetadata
_ZN5Exiv28Jp2Image14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  396|  3.95k|void Jp2Image::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
  397|  3.95k|  if (io_->open() != 0)
  ------------------
  |  Branch (397:7): [True: 0, False: 3.95k]
  ------------------
  398|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  399|       |
  400|  3.95k|  if (!isJp2Type(*io_, false)) {
  ------------------
  |  Branch (400:7): [True: 0, False: 3.95k]
  ------------------
  401|      0|    throw Error(ErrorCode::kerNotAJpeg);
  402|      0|  }
  403|       |
  404|       |  // According to the JP2 standard: The start of the first box shall be the first byte of the file, and the
  405|       |  // last byte of the last box shall be the last byte of the file.
  406|       |
  407|  3.95k|  bool bPrint = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (407:17): [True: 690, False: 3.26k]
  |  Branch (407:39): [True: 653, False: 2.60k]
  ------------------
  408|  3.95k|  bool bRecursive = option == kpsRecursive;
  409|  3.95k|  bool bICC = option == kpsIccProfile;
  410|  3.95k|  bool bXMP = option == kpsXMP;
  411|  3.95k|  bool bIPTCErase = option == kpsIptcErase;
  412|  3.95k|  bool boxSignatureFound = false;
  413|       |
  414|  3.95k|  if (bPrint) {
  ------------------
  |  Branch (414:7): [True: 1.34k, False: 2.60k]
  ------------------
  415|  1.34k|    out << "STRUCTURE OF JPEG2000 FILE: " << io_->path() << '\n';
  416|  1.34k|    out << " address |   length | box       | data" << '\n';
  417|  1.34k|  }
  418|       |
  419|  3.95k|  if (bPrint || bXMP || bICC || bIPTCErase) {
  ------------------
  |  Branch (419:7): [True: 1.34k, False: 2.60k]
  |  Branch (419:17): [True: 653, False: 1.95k]
  |  Branch (419:25): [True: 632, False: 1.32k]
  |  Branch (419:33): [True: 632, False: 690]
  ------------------
  420|  3.26k|    Internal::Jp2BoxHeader box = {1, 1};
  421|  3.26k|    Internal::Jp2BoxHeader subBox = {1, 1};
  422|  3.26k|    Internal::Jp2UuidBox uuid = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
  423|  3.26k|    bool bLF = false;
  424|       |
  425|  48.8k|    while (box.length && box.type != kJp2BoxType::Close &&
  ------------------
  |  Branch (425:12): [True: 46.9k, False: 1.90k]
  |  Branch (425:26): [True: 46.9k, False: 0]
  ------------------
  426|  46.9k|           io_->read(reinterpret_cast<byte*>(&box), boxHSize) == boxHSize) {
  ------------------
  |  Branch (426:12): [True: 45.6k, False: 1.28k]
  ------------------
  427|  45.6k|      const size_t position = io_->tell();
  428|  45.6k|      box.length = getULong(reinterpret_cast<byte*>(&box.length), bigEndian);
  429|  45.6k|      box.type = getULong(reinterpret_cast<byte*>(&box.type), bigEndian);
  430|  45.6k|      Internal::enforce(box.length <= boxHSize + io_->size() - io_->tell(), ErrorCode::kerCorruptedMetadata);
  431|       |
  432|  45.6k|      if (bPrint) {
  ------------------
  |  Branch (432:11): [True: 18.4k, False: 27.2k]
  ------------------
  433|  18.4k|        out << stringFormat("{:8} | {:8} | {}      | ", position - boxHSize, box.length, toAscii(box.type));
  ------------------
  |  |   18|  18.4k|#define stringFormat std::format
  ------------------
  434|  18.4k|        bLF = true;
  435|  18.4k|        if (box.type == kJp2BoxType::Close)
  ------------------
  |  Branch (435:13): [True: 6, False: 18.4k]
  ------------------
  436|      6|          lf(out, bLF);
  437|  18.4k|      }
  438|  45.6k|      if (box.type == kJp2BoxType::Close)
  ------------------
  |  Branch (438:11): [True: 14, False: 45.6k]
  ------------------
  439|     14|        break;
  440|       |
  441|  45.6k|      switch (box.type) {
  442|  3.26k|        case kJp2BoxType::Signature: {
  ------------------
  |  Branch (442:9): [True: 3.26k, False: 42.3k]
  ------------------
  443|  3.26k|          if (boxSignatureFound)  // Only one is allowed
  ------------------
  |  Branch (443:15): [True: 1, False: 3.26k]
  ------------------
  444|      1|            throw Error(ErrorCode::kerCorruptedMetadata);
  445|  3.26k|          boxSignatureFound = true;
  446|  3.26k|          break;
  447|  3.26k|        }
  448|     68|        case kJp2BoxType::FileTypeBox: {
  ------------------
  |  Branch (448:9): [True: 68, False: 45.5k]
  ------------------
  449|       |          // This box shall immediately follow the JPEG 2000 Signature box
  450|       |          /// \todo  All files shall contain one and only one File Type box.
  451|     68|          Internal::enforce(box.length >= boxHSize, ErrorCode::kerCorruptedMetadata);
  452|     68|          Blob boxData(box.length - boxHSize);
  453|     68|          io_->readOrThrow(boxData.data(), boxData.size(), ErrorCode::kerCorruptedMetadata);
  454|     68|          if (!Internal::isValidBoxFileType(boxData))
  ------------------
  |  Branch (454:15): [True: 0, False: 68]
  ------------------
  455|      0|            throw Error(ErrorCode::kerCorruptedMetadata);
  456|     68|          break;
  457|     68|        }
  458|  16.9k|        case kJp2BoxType::Header: {
  ------------------
  |  Branch (458:9): [True: 16.9k, False: 28.6k]
  ------------------
  459|  16.9k|          lf(out, bLF);
  460|       |          /// \todo  All files shall contain one and only one Header box.
  461|       |
  462|  17.4k|          while (io_->read(reinterpret_cast<byte*>(&subBox), boxHSize) == boxHSize &&
  ------------------
  |  Branch (462:18): [True: 17.2k, False: 226]
  ------------------
  463|  17.2k|                 io_->tell() < position + box.length)  // don't read beyond the box!
  ------------------
  |  Branch (463:18): [True: 526, False: 16.7k]
  ------------------
  464|    526|          {
  465|    526|            const size_t address = io_->tell() - boxHSize;
  466|    526|            subBox.length = getULong(reinterpret_cast<byte*>(&subBox.length), bigEndian);
  467|    526|            subBox.type = getULong(reinterpret_cast<byte*>(&subBox.type), bigEndian);
  468|       |
  469|    526|            if (subBox.length < boxHSize || subBox.length > io_->size() - io_->tell()) {
  ------------------
  |  Branch (469:17): [True: 8, False: 518]
  |  Branch (469:45): [True: 3, False: 515]
  ------------------
  470|     11|              throw Error(ErrorCode::kerCorruptedMetadata);
  471|     11|            }
  472|       |
  473|    515|            DataBuf data(subBox.length - boxHSize);
  474|    515|            io_->read(data.data(), data.size());
  475|    515|            if (bPrint) {
  ------------------
  |  Branch (475:17): [True: 238, False: 277]
  ------------------
  476|    238|              out << stringFormat("{:8} | {:8} |  sub:{} | ", address, subBox.length, toAscii(subBox.type))
  ------------------
  |  |   18|    238|#define stringFormat std::format
  ------------------
  477|    238|                  << Internal::binaryToString(makeSlice(data, 0, std::min<size_t>(30, data.size())));
  478|    238|              bLF = true;
  479|    238|            }
  480|       |
  481|    515|            if (subBox.type == kJp2BoxType::ImageHeader) {
  ------------------
  |  Branch (481:17): [True: 99, False: 416]
  ------------------
  482|     99|              Internal::enforce(subBox.length == 22, ErrorCode::kerCorruptedMetadata);
  483|       |              // height (4), width (4), componentsCount (2), bpc (1)
  484|     99|              auto compressionType = data.read_uint8(11);
  485|     99|              auto unkC = data.read_uint8(12);
  486|     99|              auto ipr = data.read_uint8(13);
  487|     99|              if (compressionType != 7 || unkC > 1 || ipr > 1) {
  ------------------
  |  Branch (487:19): [True: 1, False: 98]
  |  Branch (487:43): [True: 3, False: 95]
  |  Branch (487:55): [True: 0, False: 95]
  ------------------
  488|      3|                throw Error(ErrorCode::kerCorruptedMetadata);
  489|      3|              }
  490|    416|            } else if (subBox.type == kJp2BoxType::ColorSpec) {
  ------------------
  |  Branch (490:24): [True: 62, False: 354]
  ------------------
  491|     62|              const size_t pad = 3;  // don't know why there are 3 padding bytes
  492|       |
  493|       |              // Bounds-check for the `getULong()` below, which reads 4 bytes, starting at `pad`.
  494|     62|              Internal::enforce(data.size() >= pad + 4, ErrorCode::kerCorruptedMetadata);
  495|       |
  496|       |              /// \todo A conforming JP2 reader shall ignore all Colour Specification boxes after the first.
  497|     62|              auto METH = data.read_uint8(0);
  498|       |              // auto PREC = data.read_uint8(1);
  499|       |              // auto APPROX = data.read_uint8(2);
  500|     62|              if (METH == 1) {  // Enumerated Colourspace
  ------------------
  |  Branch (500:19): [True: 27, False: 35]
  ------------------
  501|     27|                auto enumCS = data.read_uint32(3, bigEndian);
  502|     27|                if (enumCS != 16 && enumCS != 17) {
  ------------------
  |  Branch (502:21): [True: 27, False: 0]
  |  Branch (502:37): [True: 2, False: 25]
  ------------------
  503|      2|                  throw Error(ErrorCode::kerCorruptedMetadata);
  504|      2|                }
  505|     35|              } else {  // Restricted ICC Profile
  506|       |                        // see the ICC Profile Format Specification, version ICC.1:1998-09
  507|     35|                const size_t iccLength = data.read_uint32(pad, bigEndian);
  508|     35|                if (bPrint) {
  ------------------
  |  Branch (508:21): [True: 17, False: 18]
  ------------------
  509|     17|                  out << " | iccLength:" << iccLength;
  510|     17|                }
  511|     35|                Internal::enforce(iccLength <= data.size() - pad, ErrorCode::kerCorruptedMetadata);
  512|     35|                if (bICC) {
  ------------------
  |  Branch (512:21): [True: 6, False: 29]
  ------------------
  513|      6|                  out.write(data.c_str(pad), iccLength);
  514|      6|                }
  515|     35|              }
  516|     62|            }
  517|    510|            lf(out, bLF);
  518|    510|          }
  519|  16.9k|        } break;
  520|       |
  521|  16.9k|        case kJp2BoxType::Uuid: {
  ------------------
  |  Branch (521:9): [True: 3.95k, False: 41.7k]
  ------------------
  522|  3.95k|          if (io_->read(reinterpret_cast<byte*>(&uuid), sizeof(uuid)) == sizeof(uuid)) {
  ------------------
  |  Branch (522:15): [True: 3.94k, False: 10]
  ------------------
  523|  3.94k|            bool bIsExif = uuid.uuid == kJp2UuidExif;
  524|  3.94k|            bool bIsIPTC = uuid.uuid == kJp2UuidIptc;
  525|  3.94k|            bool bIsXMP = uuid.uuid == kJp2UuidXmp;
  526|       |
  527|  3.94k|            bool bUnknown = !(bIsExif || bIsIPTC || bIsXMP);
  ------------------
  |  Branch (527:31): [True: 2.27k, False: 1.67k]
  |  Branch (527:42): [True: 860, False: 812]
  |  Branch (527:53): [True: 345, False: 467]
  ------------------
  528|       |
  529|  3.94k|            if (bPrint) {
  ------------------
  |  Branch (529:17): [True: 1.62k, False: 2.32k]
  ------------------
  530|  1.62k|              if (bIsExif)
  ------------------
  |  Branch (530:19): [True: 913, False: 708]
  ------------------
  531|    913|                out << "Exif: ";
  532|  1.62k|              if (bIsIPTC)
  ------------------
  |  Branch (532:19): [True: 360, False: 1.26k]
  ------------------
  533|    360|                out << "IPTC: ";
  534|  1.62k|              if (bIsXMP)
  ------------------
  |  Branch (534:19): [True: 141, False: 1.48k]
  ------------------
  535|    141|                out << "XMP : ";
  536|  1.62k|              if (bUnknown)
  ------------------
  |  Branch (536:19): [True: 207, False: 1.41k]
  ------------------
  537|    207|                out << "????: ";
  538|  1.62k|            }
  539|       |
  540|  3.94k|            DataBuf rawData;
  541|  3.94k|            Internal::enforce(box.length >= sizeof(uuid) + boxHSize, ErrorCode::kerCorruptedMetadata);
  542|  3.94k|            rawData.alloc(box.length - sizeof(uuid) - boxHSize);
  543|  3.94k|            const size_t bufRead = io_->read(rawData.data(), rawData.size());
  544|  3.94k|            if (io_->error())
  ------------------
  |  Branch (544:17): [True: 0, False: 3.94k]
  ------------------
  545|      0|              throw Error(ErrorCode::kerFailedToReadImageData);
  546|  3.94k|            if (bufRead != rawData.size())
  ------------------
  |  Branch (546:17): [True: 0, False: 3.94k]
  ------------------
  547|      0|              throw Error(ErrorCode::kerInputDataReadFailed);
  548|       |
  549|  3.94k|            if (bPrint) {
  ------------------
  |  Branch (549:17): [True: 1.61k, False: 2.32k]
  ------------------
  550|  1.61k|              out << Internal::binaryToString(makeSlice(rawData, 0, std::min<size_t>(40, rawData.size())));
  551|  1.61k|              out.flush();
  552|  1.61k|            }
  553|  3.94k|            lf(out, bLF);
  554|       |
  555|  3.94k|            if (bIsExif && bRecursive && rawData.size() > 8) {  // "II*\0long"
  ------------------
  |  Branch (555:17): [True: 2.26k, False: 1.67k]
  |  Branch (555:28): [True: 455, False: 1.81k]
  |  Branch (555:42): [True: 445, False: 10]
  ------------------
  556|    445|              const char a = rawData.read_uint8(0);
  557|    445|              const char b = rawData.read_uint8(1);
  558|    445|              if (a == b && (a == 'I' || a == 'M')) {
  ------------------
  |  Branch (558:19): [True: 381, False: 64]
  |  Branch (558:30): [True: 4, False: 377]
  |  Branch (558:42): [True: 1, False: 376]
  ------------------
  559|      5|                MemIo p(rawData.c_data(), rawData.size());
  560|      5|                printTiffStructure(p, out, option, depth + 1);
  561|      5|              }
  562|    445|            }
  563|       |
  564|  3.94k|            if (bIsIPTC && bRecursive) {
  ------------------
  |  Branch (564:17): [True: 860, False: 3.08k]
  |  Branch (564:28): [True: 175, False: 685]
  ------------------
  565|    175|              IptcData::printStructure(out, makeSlice(rawData, 0, rawData.size()), depth);
  566|    175|            }
  567|       |
  568|  3.94k|            if (bIsXMP && bXMP) {
  ------------------
  |  Branch (568:17): [True: 342, False: 3.60k]
  |  Branch (568:27): [True: 68, False: 274]
  ------------------
  569|     68|              out.write(rawData.c_str(), rawData.size());
  570|     68|            }
  571|  3.94k|          }
  572|  3.95k|        } break;
  573|       |
  574|  21.3k|        default:
  ------------------
  |  Branch (574:9): [True: 21.3k, False: 24.2k]
  ------------------
  575|  21.3k|          break;
  576|  45.6k|      }
  577|       |
  578|       |      // Move to the next box.
  579|  45.5k|      io_->seek(static_cast<int64_t>(position - boxHSize + box.length), BasicIo::beg);
  580|  45.5k|      if (io_->error())
  ------------------
  |  Branch (580:11): [True: 0, False: 45.5k]
  ------------------
  581|      0|        throw Error(ErrorCode::kerFailedToReadImageData);
  582|  45.5k|      if (bPrint)
  ------------------
  |  Branch (582:11): [True: 18.3k, False: 27.2k]
  ------------------
  583|  18.3k|        lf(out, bLF);
  584|  45.5k|    }
  585|  3.26k|  }
  586|  3.95k|}
_ZN5Exiv28Jp2Image13writeMetadataEv:
  588|    632|void Jp2Image::writeMetadata() {
  589|    632|  if (io_->open() != 0) {
  ------------------
  |  Branch (589:7): [True: 0, False: 632]
  ------------------
  590|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  591|      0|  }
  592|    632|  IoCloser closer(*io_);
  593|    632|  MemIo tempIo;
  594|       |
  595|    632|  doWriteMetadata(tempIo);  // may throw
  596|    632|  io_->close();
  597|    632|  io_->transfer(tempIo);  // may throw
  598|       |
  599|    632|}  // Jp2Image::writeMetadata
_ZN5Exiv28Jp2Image15encodeJp2HeaderERKNS_7DataBufERS1_:
  601|  3.38k|void Jp2Image::encodeJp2Header(const DataBuf& boxBuf, DataBuf& outBuf) {
  602|  3.38k|  DataBuf output(boxBuf.size() + iccProfile_.size() + 100);  // allocate sufficient space
  603|  3.38k|  size_t outlen = boxHSize;                                  // now many bytes have we written to output?
  604|  3.38k|  size_t inlen = boxHSize;                                   // how many bytes have we read from boxBuf?
  605|  3.38k|  Internal::enforce(boxHSize <= output.size(), ErrorCode::kerCorruptedMetadata);
  606|  3.38k|  uint32_t length = getULong(boxBuf.c_data(0), bigEndian);
  607|  3.38k|  Internal::enforce(length <= output.size(), ErrorCode::kerCorruptedMetadata);
  608|  3.38k|  uint32_t count = boxHSize;
  609|  3.38k|  bool bWroteColor = false;
  610|       |
  611|  3.47k|  while (count < length && !bWroteColor) {
  ------------------
  |  Branch (611:10): [True: 94, False: 3.37k]
  |  Branch (611:28): [True: 92, False: 2]
  ------------------
  612|     92|    Internal::enforce(boxHSize <= length - count, ErrorCode::kerCorruptedMetadata);
  613|     92|    Internal::Jp2BoxHeader subBox;
  614|     92|    std::memcpy(&subBox, boxBuf.c_data(count), boxHSize);
  615|     92|    Internal::Jp2BoxHeader newBox = subBox;
  616|       |
  617|     92|    if (count < length) {
  ------------------
  |  Branch (617:9): [True: 90, False: 2]
  ------------------
  618|     90|      subBox.length = getULong(boxBuf.c_data(count), bigEndian);
  619|     90|      subBox.type = getULong(boxBuf.c_data(count + 4), bigEndian);
  620|       |#ifdef EXIV2_DEBUG_MESSAGES
  621|       |      std::cout << "Jp2Image::encodeJp2Header subbox: " << toAscii(subBox.type) << " length = " << subBox.length
  622|       |                << '\n';
  623|       |#endif
  624|     90|      Internal::enforce(subBox.length > 0, ErrorCode::kerCorruptedMetadata);
  625|     90|      Internal::enforce(subBox.length <= length - count, ErrorCode::kerCorruptedMetadata);
  626|     90|      count += subBox.length;
  627|     90|      newBox.type = subBox.type;
  628|     90|    } else {
  629|      2|      subBox.length = 0;
  630|      2|      newBox.type = kJp2BoxType::ColorSpec;
  631|      2|      count = length;
  632|      2|    }
  633|       |
  634|     92|    size_t newlen = subBox.length;
  635|     92|    if (newBox.type == kJp2BoxType::ColorSpec) {
  ------------------
  |  Branch (635:9): [True: 10, False: 82]
  ------------------
  636|     10|      bWroteColor = true;
  637|     10|      if (!iccProfileDefined()) {
  ------------------
  |  Branch (637:11): [True: 8, False: 2]
  ------------------
  638|      8|        const char* pad = "\x01\x00\x00\x00\x00\x00\x10\x00\x00\x05\x1cuuid";
  639|      8|        uint32_t psize = 15;
  640|      8|        Internal::enforce(newlen <= output.size() - outlen, ErrorCode::kerCorruptedMetadata);
  641|      8|        ul2Data(reinterpret_cast<byte*>(&newBox.length), psize, bigEndian);
  642|      8|        ul2Data(reinterpret_cast<byte*>(&newBox.type), newBox.type, bigEndian);
  643|      8|        std::memcpy(output.data(outlen), &newBox, sizeof(newBox));
  644|      8|        std::memcpy(output.data(outlen) + sizeof(newBox), pad, psize);
  645|      8|      } else {
  646|      2|        const char* pad = "\x02\x00\x00";
  647|      2|        uint32_t psize = 3;
  648|      2|        newlen = sizeof(newBox) + psize + iccProfile_.size();
  649|      2|        Internal::enforce(newlen <= output.size() - outlen, ErrorCode::kerCorruptedMetadata);
  650|      2|        ul2Data(reinterpret_cast<byte*>(&newBox.length), static_cast<uint32_t>(newlen), bigEndian);
  651|      2|        ul2Data(reinterpret_cast<byte*>(&newBox.type), newBox.type, bigEndian);
  652|      2|        std::memcpy(output.data(outlen), &newBox, sizeof(newBox));
  653|      2|        std::memcpy(output.data(outlen) + sizeof(newBox), pad, psize);
  654|      2|        std::copy(iccProfile_.begin(), iccProfile_.end(), output.begin() + outlen + sizeof(newBox) + psize);
  655|      2|      }
  656|     82|    } else {
  657|     82|      Internal::enforce(newlen <= output.size() - outlen, ErrorCode::kerCorruptedMetadata);
  658|     82|      std::copy_n(boxBuf.begin() + inlen, subBox.length, output.begin() + outlen);
  659|     82|    }
  660|       |
  661|     92|    outlen += newlen;
  662|     92|    inlen += subBox.length;
  663|     92|  }
  664|       |
  665|       |  // allocate the correct number of bytes, copy the data and update the box header
  666|  3.38k|  outBuf.alloc(outlen);
  667|  3.38k|  std::copy_n(output.begin(), outlen, outBuf.begin());
  668|  3.38k|  ul2Data(outBuf.data(0), static_cast<uint32_t>(outlen), bigEndian);
  669|  3.38k|  ul2Data(outBuf.data(4), kJp2BoxType::Header, bigEndian);
  670|  3.38k|}
_ZN5Exiv28Jp2Image15doWriteMetadataERNS_7BasicIoE:
  672|    632|void Jp2Image::doWriteMetadata(BasicIo& outIo) {
  673|    632|  if (!io_->isopen())
  ------------------
  |  Branch (673:7): [True: 0, False: 632]
  ------------------
  674|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  675|    632|  if (!outIo.isopen())
  ------------------
  |  Branch (675:7): [True: 0, False: 632]
  ------------------
  676|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  677|       |
  678|       |#ifdef EXIV2_DEBUG_MESSAGES
  679|       |  std::cout << "Exiv2::Jp2Image::doWriteMetadata: Writing JPEG-2000 file " << io_->path() << '\n';
  680|       |  std::cout << "Exiv2::Jp2Image::doWriteMetadata: tmp file created " << outIo.path() << '\n';
  681|       |#endif
  682|       |
  683|       |  // Ensure that this is the correct image type
  684|    632|  if (!isJp2Type(*io_, true)) {
  ------------------
  |  Branch (684:7): [True: 0, False: 632]
  ------------------
  685|      0|    throw Error(ErrorCode::kerNoImageInInputData);
  686|      0|  }
  687|       |
  688|       |  // Write JPEG2000 Signature (This is the 1st box)
  689|    632|  if (outIo.write(Jp2Signature.data(), Jp2Signature.size()) != 12)
  ------------------
  |  Branch (689:7): [True: 0, False: 632]
  ------------------
  690|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  691|       |
  692|       |#ifdef EXIV2_DEBUG_MESSAGES
  693|       |  std::cout << "Jp2Image::doWriteMetadata: JPEG 2000 Signature box written" << '\n';
  694|       |#endif
  695|       |
  696|    632|  Internal::Jp2BoxHeader box = {0, 0};
  697|       |
  698|    632|  std::array<byte, 4> boxDataSize;
  699|    632|  std::array<byte, 4> boxUUIDtype;
  700|    632|  DataBuf bheaderBuf(8);
  701|       |
  702|  9.02k|  while (io_->tell() < io_->size()) {
  ------------------
  |  Branch (702:10): [True: 8.61k, False: 412]
  ------------------
  703|       |#ifdef EXIV2_DEBUG_MESSAGES
  704|       |    std::cout << "Exiv2::Jp2Image::doWriteMetadata: Position: " << io_->tell() << " / " << io_->size() << '\n';
  705|       |#endif
  706|       |
  707|       |    // Read chunk header.
  708|  8.61k|    io_->readOrThrow(bheaderBuf.data(), bheaderBuf.size(), ErrorCode::kerInputDataReadFailed);
  709|       |
  710|       |    // Decode box header.
  711|  8.61k|    box.length = bheaderBuf.read_uint32(0, bigEndian);
  712|  8.61k|    box.type = bheaderBuf.read_uint32(4, bigEndian);
  713|       |
  714|       |#ifdef EXIV2_DEBUG_MESSAGES
  715|       |    std::cout << "Exiv2::Jp2Image::doWriteMetadata: box type: " << toAscii(box.type) << " length: " << box.length
  716|       |              << '\n';
  717|       |#endif
  718|       |
  719|  8.61k|    if (box.length == 0) {
  ------------------
  |  Branch (719:9): [True: 373, False: 8.24k]
  ------------------
  720|       |#ifdef EXIV2_DEBUG_MESSAGES
  721|       |      std::cout << "Exiv2::Jp2Image::doWriteMetadata: Null Box size has been found. "
  722|       |                   "This is the last box of file."
  723|       |                << '\n';
  724|       |#endif
  725|    373|      box.length = static_cast<uint32_t>(io_->size() - io_->tell() + 8);
  726|    373|    }
  727|  8.61k|    if (box.length < 8) {
  ------------------
  |  Branch (727:9): [True: 3, False: 8.61k]
  ------------------
  728|       |      // box is broken, so there is nothing we can do here
  729|      3|      throw Error(ErrorCode::kerCorruptedMetadata);
  730|      3|    }
  731|       |
  732|       |    // Prevent a malicious file from causing a large memory allocation.
  733|  8.61k|    Internal::enforce(box.length - 8 <= io_->size() - io_->tell(), ErrorCode::kerCorruptedMetadata);
  734|       |
  735|       |    // Read whole box : Box header + Box data (not fixed size - can be null).
  736|  8.61k|    DataBuf boxBuf(box.length);                                       // Box header (8 bytes) + box data.
  737|  8.61k|    std::copy(bheaderBuf.begin(), bheaderBuf.end(), boxBuf.begin());  // Copy header.
  738|  8.61k|    io_->readOrThrow(boxBuf.data(8), box.length - 8, ErrorCode::kerInputDataReadFailed);  // Extract box data.
  739|       |
  740|  8.61k|    switch (box.type) {
  741|  3.38k|      case kJp2BoxType::Header: {
  ------------------
  |  Branch (741:7): [True: 3.38k, False: 5.23k]
  ------------------
  742|  3.38k|        DataBuf newBuf;
  743|  3.38k|        encodeJp2Header(boxBuf, newBuf);
  744|       |#ifdef EXIV2_DEBUG_MESSAGES
  745|       |        std::cout << "Exiv2::Jp2Image::doWriteMetadata: Write JP2Header box (length: " << box.length << ")\n";
  746|       |#endif
  747|  3.38k|        if (outIo.write(newBuf.data(), newBuf.size()) != newBuf.size())
  ------------------
  |  Branch (747:13): [True: 0, False: 3.38k]
  ------------------
  748|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  749|       |
  750|       |        // Write all updated metadata here, just after JP2Header.
  751|       |
  752|  3.38k|        if (!exifData_.empty()) {
  ------------------
  |  Branch (752:13): [True: 2.84k, False: 531]
  ------------------
  753|       |          // Update Exif data to a new UUID box
  754|       |
  755|  2.84k|          Blob blob;
  756|  2.84k|          ExifParser::encode(blob, littleEndian, exifData_);
  757|  2.84k|          if (!blob.empty()) {
  ------------------
  |  Branch (757:15): [True: 2.83k, False: 12]
  ------------------
  758|  2.83k|            DataBuf rawExif(blob.size());
  759|  2.83k|            std::copy(blob.begin(), blob.end(), rawExif.begin());
  760|       |
  761|  2.83k|            DataBuf boxData(8 + 16 + rawExif.size());
  762|  2.83k|            ul2Data(boxDataSize.data(), static_cast<uint32_t>(boxData.size()), bigEndian);
  763|  2.83k|            ul2Data(boxUUIDtype.data(), kJp2BoxType::Uuid, bigEndian);
  764|  2.83k|            std::copy(boxDataSize.begin(), boxDataSize.end(), boxData.begin());
  765|  2.83k|            std::copy(boxUUIDtype.begin(), boxUUIDtype.end(), boxData.begin() + 4);
  766|  2.83k|            std::copy(kJp2UuidExif.begin(), kJp2UuidExif.end(), boxData.begin() + 8);
  767|  2.83k|            std::copy(rawExif.begin(), rawExif.end(), boxData.begin() + 8 + 16);
  768|       |
  769|       |#ifdef EXIV2_DEBUG_MESSAGES
  770|       |            std::cout << "Exiv2::Jp2Image::doWriteMetadata: Write box with Exif metadata (length: " << boxData.size()
  771|       |                      << '\n';
  772|       |#endif
  773|  2.83k|            if (outIo.write(boxData.c_data(), boxData.size()) != boxData.size())
  ------------------
  |  Branch (773:17): [True: 0, False: 2.83k]
  ------------------
  774|      0|              throw Error(ErrorCode::kerImageWriteFailed);
  775|  2.83k|          }
  776|  2.84k|        }
  777|       |
  778|  3.38k|        if (!iptcData_.empty()) {
  ------------------
  |  Branch (778:13): [True: 353, False: 3.02k]
  ------------------
  779|       |          // Update Iptc data to a new UUID box
  780|       |
  781|    353|          DataBuf rawIptc = IptcParser::encode(iptcData_);
  782|    353|          if (!rawIptc.empty()) {
  ------------------
  |  Branch (782:15): [True: 353, False: 0]
  ------------------
  783|    353|            DataBuf boxData(8 + 16 + rawIptc.size());
  784|    353|            ul2Data(boxDataSize.data(), static_cast<uint32_t>(boxData.size()), bigEndian);
  785|    353|            ul2Data(boxUUIDtype.data(), kJp2BoxType::Uuid, bigEndian);
  786|    353|            std::copy(boxDataSize.begin(), boxDataSize.end(), boxData.begin());
  787|    353|            std::copy(boxUUIDtype.begin(), boxUUIDtype.end(), boxData.begin() + 4);
  788|    353|            std::copy(kJp2UuidIptc.begin(), kJp2UuidIptc.end(), boxData.begin() + 8);
  789|    353|            std::copy(rawIptc.begin(), rawIptc.end(), boxData.begin() + 8 + 16);
  790|       |
  791|       |#ifdef EXIV2_DEBUG_MESSAGES
  792|       |            std::cout << "Exiv2::Jp2Image::doWriteMetadata: Write box with Iptc metadata (length: " << boxData.size()
  793|       |                      << '\n';
  794|       |#endif
  795|    353|            if (outIo.write(boxData.c_data(), boxData.size()) != boxData.size())
  ------------------
  |  Branch (795:17): [True: 0, False: 353]
  ------------------
  796|      0|              throw Error(ErrorCode::kerImageWriteFailed);
  797|    353|          }
  798|    353|        }
  799|       |
  800|  3.38k|        if (!writeXmpFromPacket() && XmpParser::encode(xmpPacket_, xmpData_) > 1) {
  ------------------
  |  Branch (800:13): [True: 3.37k, False: 8]
  |  Branch (800:38): [True: 0, False: 3.37k]
  ------------------
  801|      0|#ifndef SUPPRESS_WARNINGS
  802|      0|          EXV_ERROR << "Failed to encode XMP metadata." << '\n';
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  803|      0|#endif
  804|      0|        }
  805|  3.38k|        if (!xmpPacket_.empty()) {
  ------------------
  |  Branch (805:13): [True: 0, False: 3.38k]
  ------------------
  806|       |          // Update Xmp data to a new UUID box
  807|       |
  808|      0|          DataBuf xmp(reinterpret_cast<const byte*>(xmpPacket_.data()), xmpPacket_.size());
  809|      0|          DataBuf boxData(8 + 16 + xmp.size());
  810|      0|          ul2Data(boxDataSize.data(), static_cast<uint32_t>(boxData.size()), bigEndian);
  811|      0|          ul2Data(boxUUIDtype.data(), kJp2BoxType::Uuid, bigEndian);
  812|      0|          std::copy(boxDataSize.begin(), boxDataSize.end(), boxData.begin());
  813|      0|          std::copy(boxUUIDtype.begin(), boxUUIDtype.end(), boxData.begin() + 4);
  814|      0|          std::copy(kJp2UuidXmp.begin(), kJp2UuidXmp.end(), boxData.begin() + 8);
  815|      0|          std::copy(xmp.begin(), xmp.end(), boxData.begin() + 8 + 16);
  816|       |
  817|       |#ifdef EXIV2_DEBUG_MESSAGES
  818|       |          std::cout << "Exiv2::Jp2Image::doWriteMetadata: Write box with XMP metadata (length: " << boxData.size()
  819|       |                    << ")" << '\n';
  820|       |#endif
  821|      0|          if (outIo.write(boxData.c_data(), boxData.size()) != boxData.size())
  ------------------
  |  Branch (821:15): [True: 0, False: 0]
  ------------------
  822|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  823|      0|        }
  824|       |
  825|  3.38k|        break;
  826|  3.38k|      }
  827|       |
  828|  3.38k|      case kJp2BoxType::Uuid: {
  ------------------
  |  Branch (828:7): [True: 759, False: 7.85k]
  ------------------
  829|    759|        Internal::enforce(boxBuf.size() >= 24, ErrorCode::kerCorruptedMetadata);
  830|    759|        if (boxBuf.cmpBytes(8, kJp2UuidExif.data(), 16) == 0) {
  ------------------
  |  Branch (830:13): [True: 446, False: 313]
  ------------------
  831|       |#ifdef EXIV2_DEBUG_MESSAGES
  832|       |          std::cout << "Exiv2::Jp2Image::doWriteMetadata: strip Exif Uuid box" << '\n';
  833|       |#endif
  834|    446|        } else if (boxBuf.cmpBytes(8, kJp2UuidIptc.data(), 16) == 0) {
  ------------------
  |  Branch (834:20): [True: 158, False: 155]
  ------------------
  835|       |#ifdef EXIV2_DEBUG_MESSAGES
  836|       |          std::cout << "Exiv2::Jp2Image::doWriteMetadata: strip Iptc Uuid box" << '\n';
  837|       |#endif
  838|    158|        } else if (boxBuf.cmpBytes(8, kJp2UuidXmp.data(), 16) == 0) {
  ------------------
  |  Branch (838:20): [True: 68, False: 87]
  ------------------
  839|       |#ifdef EXIV2_DEBUG_MESSAGES
  840|       |          std::cout << "Exiv2::Jp2Image::doWriteMetadata: strip Xmp Uuid box" << '\n';
  841|       |#endif
  842|     87|        } else {
  843|       |#ifdef EXIV2_DEBUG_MESSAGES
  844|       |          std::cout << "Exiv2::Jp2Image::doWriteMetadata: write Uuid box (length: " << box.length << ")" << '\n';
  845|       |#endif
  846|     87|          if (outIo.write(boxBuf.c_data(), boxBuf.size()) != boxBuf.size())
  ------------------
  |  Branch (846:15): [True: 0, False: 87]
  ------------------
  847|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  848|     87|        }
  849|    759|        break;
  850|    759|      }
  851|       |
  852|  4.26k|      default: {
  ------------------
  |  Branch (852:7): [True: 4.26k, False: 4.34k]
  ------------------
  853|       |#ifdef EXIV2_DEBUG_MESSAGES
  854|       |        std::cout << "Exiv2::Jp2Image::doWriteMetadata: write box (length: " << box.length << ")" << '\n';
  855|       |#endif
  856|  4.26k|        if (outIo.write(boxBuf.c_data(), boxBuf.size()) != boxBuf.size())
  ------------------
  |  Branch (856:13): [True: 0, False: 4.26k]
  ------------------
  857|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  858|       |
  859|  4.26k|        break;
  860|  4.26k|      }
  861|  8.61k|    }
  862|  8.61k|  }
  863|       |
  864|       |#ifdef EXIV2_DEBUG_MESSAGES
  865|       |  std::cout << "Exiv2::Jp2Image::doWriteMetadata: EOF" << '\n';
  866|       |#endif
  867|       |
  868|    632|}  // Jp2Image::doWriteMetadata
_ZN5Exiv214newJp2InstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  872|    844|Image::UniquePtr newJp2Instance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  873|    844|  auto image = std::make_unique<Jp2Image>(std::move(io), params);
  874|    844|  if (!image->good()) {
  ------------------
  |  Branch (874:7): [True: 0, False: 844]
  ------------------
  875|      0|    return nullptr;
  876|      0|  }
  877|    844|  return image;
  878|    844|}
_ZN5Exiv29isJp2TypeERNS_7BasicIoEb:
  880|  16.3k|bool isJp2Type(BasicIo& iIo, bool advance) {
  881|  16.3k|  std::array<byte, Jp2Signature.size()> buf;
  882|  16.3k|  const size_t bytesRead = iIo.read(buf.data(), Jp2Signature.size());
  883|  16.3k|  if (iIo.error() || iIo.eof() || bytesRead != Jp2Signature.size()) {
  ------------------
  |  Branch (883:7): [True: 0, False: 16.3k]
  |  Branch (883:22): [True: 147, False: 16.2k]
  |  Branch (883:35): [True: 0, False: 16.2k]
  ------------------
  884|    147|    return false;
  885|    147|  }
  886|  16.2k|  bool matched = buf == Jp2Signature;
  887|  16.2k|  if (!advance || !matched) {
  ------------------
  |  Branch (887:7): [True: 15.6k, False: 632]
  |  Branch (887:19): [True: 0, False: 632]
  ------------------
  888|  15.6k|    iIo.seek(-static_cast<int64_t>(Jp2Signature.size()), BasicIo::cur);  // Return to original position
  889|  15.6k|  }
  890|  16.2k|  return matched;
  891|  16.3k|}
jp2image.cpp:_ZN5Exiv212_GLOBAL__N_111boxes_checkEmm:
   89|  57.1k|void boxes_check(size_t b, size_t m) {
   90|  57.1k|  if (b > m) {
  ------------------
  |  Branch (90:7): [True: 2, False: 57.1k]
  ------------------
   91|       |#ifdef EXIV2_DEBUG_MESSAGES
   92|       |    std::cout << "Exiv2::Jp2Image::readMetadata box maximum exceeded" << '\n';
   93|       |#endif
   94|      2|    throw Error(ErrorCode::kerCorruptedMetadata);
   95|      2|  }
   96|  57.1k|}
jp2image.cpp:_ZN5Exiv212_GLOBAL__N_12lfERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERb:
   81|  39.7k|void lf(std::ostream& out, bool& bLF) {
   82|  39.7k|  if (bLF) {
  ------------------
  |  Branch (82:7): [True: 18.6k, False: 21.1k]
  ------------------
   83|  18.6k|    out << '\n';
   84|  18.6k|    out.flush();
   85|  18.6k|    bLF = false;
   86|  18.6k|  }
   87|  39.7k|}

_ZN5Exiv28Internal18isValidBoxFileTypeERKNSt3__16vectorIhNS1_9allocatorIhEEEE:
   13|    117|bool isValidBoxFileType(const std::vector<uint8_t>& boxData) {
   14|       |  // BR & MinV are obligatory (4 + 4 bytes). Afterwards we have N compatibility lists (of size 4)
   15|    117|  if (boxData.size() < 8 || ((boxData.size() - 8u) % 4u) != 0) {
  ------------------
  |  Branch (15:7): [True: 3, False: 114]
  |  Branch (15:29): [True: 4, False: 110]
  ------------------
   16|      7|    return false;
   17|      7|  }
   18|       |
   19|    110|  const size_t N = (boxData.size() - 8u) / 4u;
   20|    110|  const uint32_t brand = getULong(boxData.data(), bigEndian);
   21|    110|  const uint32_t minorVersion = getULong(boxData.data() + 4, bigEndian);
   22|       |
   23|    110|  bool clWithRightBrand = false;
   24|    319|  for (size_t i = 0; i < N; i++) {
  ------------------
  |  Branch (24:22): [True: 301, False: 18]
  ------------------
   25|    301|    uint32_t compatibilityList = getULong(boxData.data() + 8 + (i * 4), bigEndian);
   26|    301|    if ((brand == brandJp2 && compatibilityList == brandJp2) || (brand == brandJph && compatibilityList == brandJph)) {
  ------------------
  |  Branch (26:10): [True: 176, False: 125]
  |  Branch (26:31): [True: 82, False: 94]
  |  Branch (26:66): [True: 69, False: 150]
  |  Branch (26:87): [True: 10, False: 59]
  ------------------
   27|     92|      clWithRightBrand = true;
   28|     92|      break;
   29|     92|    }
   30|    301|  }
   31|    110|  return (minorVersion == 0 && clWithRightBrand);
  ------------------
  |  Branch (31:11): [True: 95, False: 15]
  |  Branch (31:32): [True: 90, False: 5]
  ------------------
   32|    117|}

_ZN5Exiv28JpegBaseC2ENS_9ImageTypeENSt3__110unique_ptrINS_7BasicIoENS2_14default_deleteIS4_EEEERKNS_15ImageCtorParamsEPKhm:
  117|  1.75k|    Image(type, mdExif | mdIptc | mdXmp | mdComment, std::move(io), params) {
  118|  1.75k|  if (params.create()) {
  ------------------
  |  Branch (118:7): [True: 0, False: 1.75k]
  ------------------
  119|      0|    initImage(initData, dataSize);
  120|      0|  }
  121|  1.75k|}
_ZNK5Exiv28JpegBase15advanceToMarkerENS_9ErrorCodeE:
  134|   298k|byte JpegBase::advanceToMarker(ErrorCode err) const {
  135|   298k|  int c = -1;
  136|       |  // Skips potential padding between markers
  137|  13.0M|  while ((c = io_->getb()) != 0xff) {
  ------------------
  |  Branch (137:10): [True: 12.7M, False: 297k]
  ------------------
  138|  12.7M|    if (c == EOF)
  ------------------
  |  Branch (138:9): [True: 484, False: 12.7M]
  ------------------
  139|    484|      throw Error(err);
  140|  12.7M|  }
  141|       |
  142|       |  // Markers can start with any number of 0xff
  143|   341k|  while ((c = io_->getb()) == 0xff) {
  ------------------
  |  Branch (143:10): [True: 43.7k, False: 297k]
  ------------------
  144|  43.7k|  }
  145|   297k|  if (c == EOF)
  ------------------
  |  Branch (145:7): [True: 36, False: 297k]
  ------------------
  146|     36|    throw Error(err);
  147|       |
  148|   297k|  return static_cast<byte>(c);
  149|   297k|}
_ZN5Exiv28JpegBase12readMetadataEv:
  151|  2.59k|void JpegBase::readMetadata() {
  152|  2.59k|  int rc = 0;  // Todo: this should be the return value
  153|       |
  154|  2.59k|  if (io_->open() != 0)
  ------------------
  |  Branch (154:7): [True: 0, False: 2.59k]
  ------------------
  155|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  156|  2.59k|  IoCloser closer(*io_);
  157|       |  // Ensure that this is the correct image type
  158|  2.59k|  if (!isThisType(*io_, true)) {
  ------------------
  |  Branch (158:7): [True: 108, False: 2.48k]
  ------------------
  159|    108|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (159:9): [True: 0, False: 108]
  |  Branch (159:25): [True: 0, False: 108]
  ------------------
  160|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  161|    108|    throw Error(ErrorCode::kerNotAJpeg);
  162|    108|  }
  163|  2.48k|  clearMetadata();
  164|  2.48k|  int search = 6;  // Exif, ICC, XMP, Comment, IPTC, SOF
  165|  2.48k|  Blob psBlob;
  166|  2.48k|  bool foundCompletePsData = false;
  167|  2.48k|  bool foundExifData = false;
  168|  2.48k|  bool foundXmpData = false;
  169|  2.48k|  bool foundIccData = false;
  170|       |
  171|       |  // Read section marker
  172|  2.48k|  byte marker = advanceToMarker(ErrorCode::kerNotAJpeg);
  173|       |
  174|  73.6k|  while (marker != sos_ && marker != eoi_ && search > 0) {
  ------------------
  |  Branch (174:10): [True: 73.2k, False: 355]
  |  Branch (174:28): [True: 71.6k, False: 1.56k]
  |  Branch (174:46): [True: 71.6k, False: 10]
  ------------------
  175|  71.6k|    const auto [sizebuf, size] = readSegmentSize(marker, *io_);
  176|       |
  177|       |    // Read the rest of the segment.
  178|  71.6k|    DataBuf buf(size);
  179|       |    // check if the segment is not empty
  180|  71.6k|    if (size > 2) {
  ------------------
  |  Branch (180:9): [True: 64.6k, False: 7.00k]
  ------------------
  181|  64.6k|      io_->readOrThrow(buf.data(2), size - 2, ErrorCode::kerFailedToReadImageData);
  182|  64.6k|      std::copy(sizebuf.begin(), sizebuf.end(), buf.begin());
  183|  64.6k|    }
  184|       |
  185|  71.6k|    if (auto itSofMarker = Exiv2::find(jpegProcessMarkerTags, marker)) {
  ------------------
  |  Branch (185:14): [True: 2.21k, False: 69.4k]
  ------------------
  186|  2.21k|      sof_encoding_process_ = itSofMarker->label_;
  187|  2.21k|      if (size >= 7 && buf.c_data(7)) {
  ------------------
  |  Branch (187:11): [True: 1.68k, False: 535]
  |  Branch (187:24): [True: 1.52k, False: 158]
  ------------------
  188|  1.52k|        num_color_components_ = *buf.c_data(7);
  189|  1.52k|      }
  190|  2.21k|    }
  191|       |
  192|  71.6k|    if (!foundExifData && marker == app1_ && size >= 8  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (192:9): [True: 55.7k, False: 15.9k]
  |  Branch (192:27): [True: 3.80k, False: 51.9k]
  |  Branch (192:46): [True: 3.40k, False: 397]
  ------------------
  193|  3.40k|        && buf.cmpBytes(2, exifId_.data(), 6) == 0) {
  ------------------
  |  Branch (193:12): [True: 688, False: 2.71k]
  ------------------
  194|    688|      const DecodeParams dp(max_recursion_depth_);
  195|    688|      ByteOrder bo = ExifParser::decode(exifData_, buf.c_data(8), size - 8, dp);
  196|    688|      setByteOrder(bo);
  197|    688|      if (size > 8 && byteOrder() == invalidByteOrder) {
  ------------------
  |  Branch (197:11): [True: 668, False: 20]
  |  Branch (197:23): [True: 0, False: 668]
  ------------------
  198|      0|#ifndef SUPPRESS_WARNINGS
  199|      0|        EXV_WARNING << "Failed to decode Exif metadata.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  200|      0|#endif
  201|      0|        exifData_.clear();
  202|      0|      }
  203|    688|      --search;
  204|    688|      foundExifData = true;
  205|  70.9k|    } else if (!foundXmpData && marker == app1_ && size >= 31  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (205:16): [True: 59.6k, False: 11.3k]
  |  Branch (205:33): [True: 6.67k, False: 52.9k]
  |  Branch (205:52): [True: 6.19k, False: 484]
  ------------------
  206|  6.19k|               && buf.cmpBytes(2, xmpId_.data(), 29) == 0) {
  ------------------
  |  Branch (206:19): [True: 168, False: 6.02k]
  ------------------
  207|    168|      xmpPacket_.assign(buf.c_str(31), size - 31);
  208|    168|      const DecodeParams dp(max_recursion_depth_);
  209|    168|      if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_, dp)) {
  ------------------
  |  Branch (209:11): [True: 168, False: 0]
  |  Branch (209:34): [True: 73, False: 95]
  ------------------
  210|     73|#ifndef SUPPRESS_WARNINGS
  211|     73|        EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|     73|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 73]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     73|  LogMsg(LogMsg::warn).os()
  ------------------
  212|     73|#endif
  213|     73|      }
  214|    168|      --search;
  215|    168|      foundXmpData = true;
  216|  70.8k|    } else if (!foundCompletePsData && marker == app13_ &&
  ------------------
  |  Branch (216:16): [True: 70.4k, False: 405]
  |  Branch (216:40): [True: 37.7k, False: 32.6k]
  ------------------
  217|  37.7k|               size >= 16  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (217:16): [True: 37.4k, False: 305]
  ------------------
  218|  37.4k|               && buf.cmpBytes(2, Photoshop::ps3Id_, 14) == 0) {
  ------------------
  |  Branch (218:19): [True: 24.7k, False: 12.7k]
  ------------------
  219|       |#ifdef EXIV2_DEBUG_MESSAGES
  220|       |      std::cerr << "Found app13 segment, size = " << size << "\n";
  221|       |#endif
  222|  24.7k|      if (buf.size() > 16) {  // Append to psBlob
  ------------------
  |  Branch (222:11): [True: 22.1k, False: 2.52k]
  ------------------
  223|  22.1k|        append(psBlob, buf.c_data(16), size - 16);
  224|  22.1k|      }
  225|       |      // Check whether psBlob is complete
  226|  24.7k|      if (!psBlob.empty() && Photoshop::valid(psBlob.data(), psBlob.size())) {
  ------------------
  |  Branch (226:11): [True: 23.2k, False: 1.50k]
  |  Branch (226:30): [True: 76, False: 23.1k]
  ------------------
  227|     76|        --search;
  228|     76|        foundCompletePsData = true;
  229|     76|      }
  230|  46.1k|    } else if (marker == com_ && comment_.empty()) {
  ------------------
  |  Branch (230:16): [True: 5.38k, False: 40.7k]
  |  Branch (230:34): [True: 725, False: 4.66k]
  ------------------
  231|       |      // JPEGs can have multiple comments, but for now only read
  232|       |      // the first one (most jpegs only have one anyway). Comments
  233|       |      // are simple single byte ISO-8859-1 strings.
  234|    725|      comment_.assign(buf.c_str(2), size - 2);
  235|  1.94k|      while (!comment_.empty() && comment_.back() == '\0') {
  ------------------
  |  Branch (235:14): [True: 1.72k, False: 222]
  |  Branch (235:35): [True: 1.21k, False: 503]
  ------------------
  236|  1.21k|        comment_.pop_back();
  237|  1.21k|      }
  238|    725|      --search;
  239|  45.3k|    } else if (marker == app2_ && size >= 13  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (239:16): [True: 5.27k, False: 40.1k]
  |  Branch (239:35): [True: 4.73k, False: 532]
  ------------------
  240|  4.73k|               && buf.cmpBytes(2, iccId_, 11) == 0) {
  ------------------
  |  Branch (240:19): [True: 2.63k, False: 2.10k]
  ------------------
  241|  2.63k|      if (size < 2 + 14 + 4) {
  ------------------
  |  Branch (241:11): [True: 12, False: 2.62k]
  ------------------
  242|     12|        rc = 8;
  243|     12|        break;
  244|     12|      }
  245|       |      // ICC profile
  246|  2.62k|      if (!foundIccData) {
  ------------------
  |  Branch (246:11): [True: 84, False: 2.53k]
  ------------------
  247|     84|        foundIccData = true;
  248|     84|        --search;
  249|     84|      }
  250|  2.62k|      auto chunk = static_cast<int>(buf.read_uint8(2 + 12));
  251|  2.62k|      auto chunks = static_cast<int>(buf.read_uint8(2 + 13));
  252|       |      // ICC1v43_2010-12.pdf header is 14 bytes
  253|       |      // header = "ICC_PROFILE\0" (12 bytes)
  254|       |      // chunk/chunks are a single byte
  255|       |      // Spec 7.2 Profile bytes 0-3 size
  256|  2.62k|      uint32_t s = buf.read_uint32(2 + 14, bigEndian);
  257|       |#ifdef EXIV2_DEBUG_MESSAGES
  258|       |      std::cerr << "Found ICC Profile chunk " << chunk << " of " << chunks << (chunk == 1 ? " size: " : "")
  259|       |                << (chunk == 1 ? s : 0) << '\n';
  260|       |#endif
  261|       |      // #1286 profile can be padded
  262|  2.62k|      size_t icc_size = size - 2 - 14;
  263|  2.62k|      if (chunk == 1 && chunks == 1) {
  ------------------
  |  Branch (263:11): [True: 1.29k, False: 1.32k]
  |  Branch (263:25): [True: 214, False: 1.07k]
  ------------------
  264|    214|        enforce(s <= static_cast<uint32_t>(icc_size), ErrorCode::kerInvalidIccProfile);
  265|    214|        icc_size = s;
  266|    214|      }
  267|       |
  268|  2.62k|      appendIccProfile(buf.c_data(2 + 14), icc_size, chunk == chunks);
  269|  42.7k|    } else if (pixelHeight_ == 0 && inRange2(marker, sof0_, sof3_, sof5_, sof15_)) {
  ------------------
  |  Branch (269:16): [True: 29.1k, False: 13.5k]
  |  Branch (269:37): [True: 288, False: 28.8k]
  ------------------
  270|       |      // We hit a SOFn (start-of-frame) marker
  271|    288|      if (size < 8) {
  ------------------
  |  Branch (271:11): [True: 55, False: 233]
  ------------------
  272|     55|        rc = 7;
  273|     55|        break;
  274|     55|      }
  275|    233|      pixelHeight_ = buf.read_uint16(3, bigEndian);
  276|    233|      pixelWidth_ = buf.read_uint16(5, bigEndian);
  277|    233|      if (pixelHeight_ != 0)
  ------------------
  |  Branch (277:11): [True: 80, False: 153]
  ------------------
  278|     80|        --search;
  279|    233|    }
  280|       |
  281|       |    // Read the beginning of the next segment
  282|  71.6k|    try {
  283|  71.6k|      marker = advanceToMarker(ErrorCode::kerFailedToReadImageData);
  284|  71.6k|    } catch (const Error&) {
  285|    271|      rc = 5;
  286|    271|      break;
  287|    271|    }
  288|  71.6k|  }  // while there are segments to process
  289|       |
  290|  2.26k|  if (!psBlob.empty()) {
  ------------------
  |  Branch (290:7): [True: 521, False: 1.74k]
  ------------------
  291|       |    // Find actual IPTC data within the psBlob
  292|    521|    Blob iptcBlob;
  293|    521|    const byte* record = nullptr;
  294|    521|    uint32_t sizeIptc = 0;
  295|    521|    uint32_t sizeHdr = 0;
  296|    521|    const byte* pCur = psBlob.data();
  297|    521|    const byte* pEnd = pCur + psBlob.size();
  298|  19.1k|    while (pCur < pEnd && 0 == Photoshop::locateIptcIrb(pCur, pEnd - pCur, &record, sizeHdr, sizeIptc)) {
  ------------------
  |  Branch (298:12): [True: 19.1k, False: 9]
  |  Branch (298:27): [True: 18.5k, False: 512]
  ------------------
  299|       |#ifdef EXIV2_DEBUG_MESSAGES
  300|       |      std::cerr << "Found IPTC IRB, size = " << sizeIptc << "\n";
  301|       |#endif
  302|  18.5k|      if (sizeIptc) {
  ------------------
  |  Branch (302:11): [True: 18.5k, False: 7]
  ------------------
  303|  18.5k|        append(iptcBlob, record + sizeHdr, sizeIptc);
  304|  18.5k|      }
  305|  18.5k|      pCur = record + sizeHdr + sizeIptc + (sizeIptc & 1);
  306|  18.5k|    }
  307|    521|    if (!iptcBlob.empty() && IptcParser::decode(iptcData_, iptcBlob.data(), iptcBlob.size())) {
  ------------------
  |  Branch (307:9): [True: 61, False: 460]
  |  Branch (307:30): [True: 7, False: 54]
  ------------------
  308|      7|#ifndef SUPPRESS_WARNINGS
  309|      7|      EXV_WARNING << "Failed to decode IPTC metadata.\n";
  ------------------
  |  |  138|      7|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 7]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      7|  LogMsg(LogMsg::warn).os()
  ------------------
  310|      7|#endif
  311|      7|      iptcData_.clear();
  312|      7|    }
  313|    521|  }
  314|       |
  315|  2.26k|  if (rc != 0) {
  ------------------
  |  Branch (315:7): [True: 338, False: 1.92k]
  ------------------
  316|    338|#ifndef SUPPRESS_WARNINGS
  317|    338|    EXV_WARNING << "JPEG format error, rc = " << rc << "\n";
  ------------------
  |  |  138|    338|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 338]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    338|  LogMsg(LogMsg::warn).os()
  ------------------
  318|    338|#endif
  319|    338|  }
  320|  2.26k|}  // JpegBase::readMetadata
_ZN5Exiv28JpegBase14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  326|  7.59k|void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
  327|  7.59k|  if (io_->open() != 0)
  ------------------
  |  Branch (327:7): [True: 0, False: 7.59k]
  ------------------
  328|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  329|       |  // Ensure that this is the correct image type
  330|  7.59k|  if (!isThisType(*io_, false)) {
  ------------------
  |  Branch (330:7): [True: 0, False: 7.59k]
  ------------------
  331|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (331:9): [True: 0, False: 0]
  |  Branch (331:25): [True: 0, False: 0]
  ------------------
  332|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  333|      0|    throw Error(ErrorCode::kerNotAJpeg);
  334|      0|  }
  335|       |
  336|  7.59k|  bool bPrint = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (336:17): [True: 1.42k, False: 6.16k]
  |  Branch (336:39): [True: 1.22k, False: 4.94k]
  ------------------
  337|  7.59k|  std::vector<std::pair<size_t, size_t>> iptcDataSegs;
  338|       |
  339|  7.59k|  if (bPrint || option == kpsXMP || option == kpsIccProfile || option == kpsIptcErase) {
  ------------------
  |  Branch (339:7): [True: 2.64k, False: 4.94k]
  |  Branch (339:17): [True: 1.22k, False: 3.72k]
  |  Branch (339:37): [True: 1.14k, False: 2.57k]
  |  Branch (339:64): [True: 1.14k, False: 1.42k]
  ------------------
  340|       |    // mnemonic for markers
  341|  6.16k|    std::string nm[256];
  342|  6.16k|    nm[0xd8] = "SOI";
  343|  6.16k|    nm[0xd9] = "EOI";
  344|  6.16k|    nm[0xda] = "SOS";
  345|  6.16k|    nm[0xdb] = "DQT";
  346|  6.16k|    nm[0xdd] = "DRI";
  347|  6.16k|    nm[0xfe] = "COM";
  348|       |
  349|       |    // 0xe0 .. 0xef are APPn
  350|       |    // 0xc0 .. 0xcf are SOFn (except 4)
  351|  6.16k|    nm[0xc4] = "DHT";
  352|   104k|    for (int i = 0; i <= 15; i++) {
  ------------------
  |  Branch (352:21): [True: 98.6k, False: 6.16k]
  ------------------
  353|  98.6k|      nm[0xe0 + i] = stringFormat("APP{}", i);
  ------------------
  |  |   18|  98.6k|#define stringFormat std::format
  ------------------
  354|  98.6k|      if (i != 4) {
  ------------------
  |  Branch (354:11): [True: 92.5k, False: 6.16k]
  ------------------
  355|  92.5k|        nm[0xc0 + i] = stringFormat("SOF{}", i);
  ------------------
  |  |   18|  92.5k|#define stringFormat std::format
  ------------------
  356|  92.5k|      }
  357|  98.6k|    }
  358|       |
  359|       |    // Container for the signature
  360|  6.16k|    bool bExtXMP = false;
  361|       |
  362|       |    // Read section marker
  363|  6.16k|    byte marker = advanceToMarker(ErrorCode::kerNotAJpeg);
  364|       |
  365|  6.16k|    bool done = false;
  366|  6.16k|    bool first = true;
  367|   129k|    while (!done) {
  ------------------
  |  Branch (367:12): [True: 122k, False: 6.16k]
  ------------------
  368|       |      // print marker bytes
  369|   122k|      if (first && bPrint) {
  ------------------
  |  Branch (369:11): [True: 6.16k, False: 116k]
  |  Branch (369:20): [True: 2.64k, False: 3.52k]
  ------------------
  370|  2.64k|        out << "STRUCTURE OF JPEG FILE: " << io_->path() << '\n';
  371|  2.64k|        out << " address | marker       |  length | data" << '\n';
  372|  2.64k|        REPORT_MARKER;
  ------------------
  |  |  323|  2.64k|  if ((option == kpsBasic || option == kpsRecursive)) \
  |  |  ------------------
  |  |  |  Branch (323:8): [True: 1.42k, False: 1.22k]
  |  |  |  Branch (323:30): [True: 1.22k, False: 0]
  |  |  ------------------
  |  |  324|  2.64k|  out << stringFormat("{:8} | 0xff{:02x} {:<5}", io_->tell() - 2, marker, nm[marker].c_str())
  |  |  ------------------
  |  |  |  |   18|  2.64k|#define stringFormat std::format
  |  |  ------------------
  ------------------
  373|  2.64k|      }
  374|   122k|      first = false;
  375|   122k|      bool bLF = bPrint;
  376|       |
  377|   122k|      const auto [sizebuf, size] = readSegmentSize(marker, *io_);
  378|       |
  379|       |      // Read the rest of the segment if not empty.
  380|   122k|      DataBuf buf(size);
  381|   122k|      if (size > 2) {
  ------------------
  |  Branch (381:11): [True: 98.1k, False: 24.8k]
  ------------------
  382|  98.1k|        io_->readOrThrow(buf.data(2), size - 2, ErrorCode::kerFailedToReadImageData);
  383|  98.1k|        std::copy(sizebuf.begin(), sizebuf.end(), buf.begin());
  384|  98.1k|      }
  385|       |
  386|   122k|      if (bPrint && markerHasLength(marker))
  ------------------
  |  Branch (386:11): [True: 55.9k, False: 67.0k]
  |  Branch (386:21): [True: 46.7k, False: 9.16k]
  ------------------
  387|  46.7k|        out << stringFormat(" | {:7} ", size);
  ------------------
  |  |   18|  46.7k|#define stringFormat std::format
  ------------------
  388|       |
  389|       |      // print signature for APPn
  390|   122k|      if (marker >= app0_ && marker <= (app0_ | 0x0F)) {
  ------------------
  |  Branch (390:11): [True: 90.7k, False: 32.2k]
  |  Branch (390:30): [True: 79.6k, False: 11.1k]
  ------------------
  391|       |        // http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart3.pdf p75
  392|  79.6k|        const std::string signature = string_from_unterminated(buf.c_str(2), size - 2);
  393|       |
  394|       |        // 728 rmills@rmillsmbp:~/gnu/exiv2/ttt $ exiv2 -pS test/data/exiv2-bug922.jpg
  395|       |        // STRUCTURE OF JPEG FILE: test/data/exiv2-bug922.jpg
  396|       |        // address | marker     | length  | data
  397|       |        //       0 | 0xd8 SOI   |       0
  398|       |        //       2 | 0xe1 APP1  |     911 | Exif..MM.*.......%.........#....
  399|       |        //     915 | 0xe1 APP1  |     870 | http://ns.adobe.com/xap/1.0/.<x:
  400|       |        //    1787 | 0xe1 APP1  |   65460 | http://ns.adobe.com/xmp/extensio
  401|  79.6k|        if (option == kpsXMP && signature.starts_with("http://ns.adobe.com/x")) {
  ------------------
  |  Branch (401:13): [True: 14.6k, False: 65.0k]
  |  Branch (401:33): [True: 184, False: 14.4k]
  ------------------
  402|       |          // extract XMP
  403|    184|          const char* xmp = buf.c_str();
  404|    184|          size_t start = 2;
  405|       |
  406|       |          // http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart3.pdf
  407|       |          // if we find HasExtendedXMP, set the flag and ignore this block
  408|       |          // the first extended block is a copy of the Standard block.
  409|       |          // a robust implementation allows extended blocks to be out of sequence
  410|       |          // we could implement out of sequence with a dictionary of sequence/offset
  411|       |          // and dumping the XMP in a post read operation similar to kpsIptcErase
  412|       |          // for the moment, dumping 'on the fly' is working fine
  413|    184|          if (!bExtXMP) {
  ------------------
  |  Branch (413:15): [True: 106, False: 78]
  ------------------
  414|  6.37k|            while (start < size && xmp[start]) {
  ------------------
  |  Branch (414:20): [True: 6.37k, False: 1]
  |  Branch (414:36): [True: 6.26k, False: 105]
  ------------------
  415|  6.26k|              start++;
  416|  6.26k|            }
  417|    106|            start++;
  418|    106|            if (start < size) {
  ------------------
  |  Branch (418:17): [True: 104, False: 2]
  ------------------
  419|    104|              const std::string xmp_from_start = string_from_unterminated(&xmp[start], size - start);
  420|    104|              if (xmp_from_start.find("HasExtendedXMP", start) != std::string::npos) {
  ------------------
  |  Branch (420:19): [True: 9, False: 95]
  ------------------
  421|      9|                start = size;  // ignore this packet, we'll get on the next time around
  422|      9|                bExtXMP = true;
  423|      9|              }
  424|    104|            }
  425|    106|          } else {
  426|     78|            start = 2 + 35 + 32 + 4 + 4;  // Adobe Spec, p19
  427|     78|          }
  428|       |
  429|    184|          enforce(start <= size, ErrorCode::kerInvalidXmpText);
  430|    184|          out.write(&xmp[start], size - start);
  431|    184|          done = !bExtXMP;
  432|  79.4k|        } else if (option == kpsIccProfile && signature == iccId_) {
  ------------------
  |  Branch (432:20): [True: 14.2k, False: 65.2k]
  |  Branch (432:47): [True: 1.44k, False: 12.7k]
  ------------------
  433|       |          // extract ICCProfile
  434|  1.44k|          if (size >= 16) {
  ------------------
  |  Branch (434:15): [True: 1.44k, False: 0]
  ------------------
  435|  1.44k|            out.write(buf.c_str(16), size - 16);
  436|       |#ifdef EXIV2_DEBUG_MESSAGES
  437|       |            std::cout << "iccProfile size = " << size - 16 << '\n';
  438|       |#endif
  439|  1.44k|          }
  440|  78.0k|        } else if (option == kpsIptcErase && signature == "Photoshop 3.0") {
  ------------------
  |  Branch (440:20): [True: 14.2k, False: 63.7k]
  |  Branch (440:46): [True: 2.90k, False: 11.3k]
  ------------------
  441|       |          // delete IPTC data segment from JPEG
  442|  2.90k|          iptcDataSegs.emplace_back(io_->tell() - size, io_->tell());
  443|  75.1k|        } else if (bPrint) {
  ------------------
  |  Branch (443:20): [True: 36.5k, False: 38.5k]
  ------------------
  444|  36.5k|          const size_t start = 2;
  445|  36.5k|          const auto end = std::min<size_t>(34, size);
  446|  36.5k|          out << "| ";
  447|  36.5k|          if (start < end)
  ------------------
  |  Branch (447:15): [True: 35.8k, False: 694]
  ------------------
  448|  35.8k|            out << Internal::binaryToString(makeSlice(buf, start, end));
  449|  36.5k|          if (signature == iccId_) {
  ------------------
  |  Branch (449:15): [True: 2.91k, False: 33.6k]
  ------------------
  450|       |            // extract the chunk information from the buffer
  451|       |            //
  452|       |            // the buffer looks like this in this branch
  453|       |            // ICC_PROFILE\0AB
  454|       |            // where A & B are bytes (the variables chunk & chunks)
  455|       |            //
  456|       |            // We cannot extract the variables A and B from the signature string, as they are beyond the
  457|       |            // null termination (and signature ends there).
  458|       |            // => Read the chunk info from the DataBuf directly
  459|  2.91k|            enforce<std::out_of_range>(size >= 16, "Buffer too small to extract chunk information.");
  460|  2.91k|            const int chunk = buf.read_uint8(2 + 12);
  461|  2.91k|            const int chunks = buf.read_uint8(2 + 13);
  462|  2.91k|            out << stringFormat(" chunk {}/{}", chunk, chunks);
  ------------------
  |  |   18|  2.91k|#define stringFormat std::format
  ------------------
  463|  2.91k|          }
  464|  36.5k|        }
  465|       |
  466|       |        // for MPF: http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/MPF.html
  467|       |        // for FLIR: http://owl.phy.queensu.ca/~phil/exiftool/TagNames/FLIR.html
  468|  79.6k|        bool bFlir = option == kpsRecursive && marker == (app0_ + 1) && signature == "FLIR";
  ------------------
  |  Branch (468:22): [True: 17.6k, False: 61.9k]
  |  Branch (468:48): [True: 7.16k, False: 10.5k]
  |  Branch (468:73): [True: 1.99k, False: 5.17k]
  ------------------
  469|  79.6k|        bool bExif = option == kpsRecursive && marker == (app0_ + 1) && signature == "Exif";
  ------------------
  |  Branch (469:22): [True: 17.6k, False: 61.9k]
  |  Branch (469:48): [True: 7.16k, False: 10.5k]
  |  Branch (469:73): [True: 2.78k, False: 4.37k]
  ------------------
  470|  79.6k|        bool bMPF = option == kpsRecursive && marker == (app0_ + 2) && signature == "MPF";
  ------------------
  |  Branch (470:21): [True: 17.6k, False: 61.9k]
  |  Branch (470:47): [True: 3.83k, False: 13.8k]
  |  Branch (470:72): [True: 263, False: 3.56k]
  ------------------
  471|  79.6k|        bool bPS = option == kpsRecursive && signature == "Photoshop 3.0";
  ------------------
  |  Branch (471:20): [True: 17.6k, False: 61.9k]
  |  Branch (471:46): [True: 2.92k, False: 14.7k]
  ------------------
  472|  79.6k|        if (bFlir || bExif || bMPF || bPS) {
  ------------------
  |  Branch (472:13): [True: 1.99k, False: 77.6k]
  |  Branch (472:22): [True: 2.78k, False: 74.8k]
  |  Branch (472:31): [True: 263, False: 74.5k]
  |  Branch (472:39): [True: 2.92k, False: 71.6k]
  ------------------
  473|       |          // extract Exif data block which is tiff formatted
  474|  7.96k|          out << '\n';
  475|       |
  476|       |          //                        const byte* exif = buf.c_data();
  477|  7.96k|          uint32_t start = signature == "Exif" ? 8 : 6;
  ------------------
  |  Branch (477:28): [True: 2.78k, False: 5.18k]
  ------------------
  478|  7.96k|          uint32_t max = static_cast<uint32_t>(size) - 1;
  479|       |
  480|       |          // is this an fff block?
  481|  7.96k|          if (bFlir) {
  ------------------
  |  Branch (481:15): [True: 1.99k, False: 5.97k]
  ------------------
  482|  1.99k|            start = 2;
  483|  1.99k|            bFlir = false;
  484|  67.0k|            while (start + 3 <= max) {
  ------------------
  |  Branch (484:20): [True: 67.0k, False: 13]
  ------------------
  485|  67.0k|              if (std::strcmp(buf.c_str(start), "FFF") == 0) {
  ------------------
  |  Branch (485:19): [True: 1.98k, False: 65.0k]
  ------------------
  486|  1.98k|                bFlir = true;
  487|  1.98k|                break;
  488|  1.98k|              }
  489|  65.0k|              start++;
  490|  65.0k|            }
  491|  1.99k|          }
  492|       |
  493|       |          // there is a header in FLIR, followed by a tiff block
  494|       |          // Hunt down the tiff using brute force
  495|  7.96k|          if (bFlir) {
  ------------------
  |  Branch (495:15): [True: 1.98k, False: 5.98k]
  ------------------
  496|       |            // FLIRFILEHEAD* pFFF = (FLIRFILEHEAD*) (exif+start) ;
  497|  94.3k|            while (start < max) {
  ------------------
  |  Branch (497:20): [True: 93.9k, False: 406]
  ------------------
  498|  93.9k|              if (buf.read_uint8(start) == 'I' && buf.read_uint8(start + 1) == 'I')
  ------------------
  |  Branch (498:19): [True: 1.85k, False: 92.0k]
  |  Branch (498:51): [True: 825, False: 1.03k]
  ------------------
  499|    825|                break;
  500|  93.0k|              if (buf.read_uint8(start) == 'M' && buf.read_uint8(start + 1) == 'M')
  ------------------
  |  Branch (500:19): [True: 1.42k, False: 91.6k]
  |  Branch (500:51): [True: 749, False: 671]
  ------------------
  501|    749|                break;
  502|  92.3k|              start++;
  503|  92.3k|            }
  504|       |#ifdef EXIV2_DEBUG_MESSAGES
  505|       |            if (start < max)
  506|       |              std::cout << "  FFF start = " << start << '\n';
  507|       |              // << " index = " << pFFF->dwIndexOff << '\n';
  508|       |#endif
  509|  1.98k|          }
  510|       |
  511|  7.96k|          if (bPS) {
  ------------------
  |  Branch (511:15): [True: 2.92k, False: 5.04k]
  ------------------
  512|  2.92k|            IptcData::printStructure(out, makeSlice(buf, 0, size), depth);
  513|  5.04k|          } else {
  514|  5.04k|            if (start < max) {
  ------------------
  |  Branch (514:17): [True: 4.35k, False: 691]
  ------------------
  515|       |              // create a copy on write memio object with the data, then print the structure
  516|  4.35k|              MemIo p(buf.c_data(start), size - start);
  517|  4.35k|              printTiffStructure(p, out, option, depth + 1);
  518|  4.35k|            }
  519|  5.04k|          }
  520|       |
  521|       |          // restore and clean up
  522|  7.96k|          bLF = false;
  523|  7.96k|        }
  524|  79.6k|      }
  525|       |
  526|       |      // print COM marker
  527|   122k|      if (bPrint && marker == com_) {
  ------------------
  |  Branch (527:11): [True: 55.8k, False: 67.1k]
  |  Branch (527:21): [True: 5.30k, False: 50.5k]
  ------------------
  528|       |        // size includes 2 for the two bytes for size!
  529|  5.30k|        const auto n = std::min<size_t>(32, size - 2);
  530|       |        // start after the two bytes
  531|  5.30k|        out << "| "
  532|  5.30k|            << Internal::binaryToString(makeSlice(buf, 2, n + 2 /* cannot overflow as n is at most size - 2 */));
  533|  5.30k|      }
  534|       |
  535|   122k|      if (bLF)
  ------------------
  |  Branch (535:11): [True: 47.9k, False: 75.0k]
  ------------------
  536|  47.9k|        out << '\n';
  537|       |
  538|   122k|      if (marker != sos_) {
  ------------------
  |  Branch (538:11): [True: 122k, False: 91]
  ------------------
  539|       |        // Read the beginning of the next segment
  540|   122k|        marker = advanceToMarker(ErrorCode::kerNoImageInInputData);
  541|   122k|        REPORT_MARKER;
  ------------------
  |  |  323|   122k|  if ((option == kpsBasic || option == kpsRecursive)) \
  |  |  ------------------
  |  |  |  Branch (323:8): [True: 29.3k, False: 93.5k]
  |  |  |  Branch (323:30): [True: 26.4k, False: 67.0k]
  |  |  ------------------
  |  |  324|   122k|  out << stringFormat("{:8} | 0xff{:02x} {:<5}", io_->tell() - 2, marker, nm[marker].c_str())
  |  |  ------------------
  |  |  |  |   18|  55.6k|#define stringFormat std::format
  |  |  ------------------
  ------------------
  542|   122k|      }
  543|   122k|      done |= marker == eoi_ || marker == sos_;
  ------------------
  |  Branch (543:15): [True: 5.23k, False: 117k]
  |  Branch (543:33): [True: 878, False: 116k]
  ------------------
  544|   122k|      if (done && bPrint)
  ------------------
  |  Branch (544:11): [True: 5.89k, False: 117k]
  |  Branch (544:19): [True: 2.37k, False: 3.52k]
  ------------------
  545|  2.37k|        out << '\n';
  546|   122k|    }
  547|  6.16k|  }
  548|  7.59k|  if (option == kpsIptcErase && !iptcDataSegs.empty()) {
  ------------------
  |  Branch (548:7): [True: 1.14k, False: 6.44k]
  |  Branch (548:33): [True: 843, False: 306]
  ------------------
  549|       |    // Add a sentinel to the end of iptcDataSegs
  550|    843|    iptcDataSegs.emplace_back(io_->size(), 0);
  551|       |
  552|       |    // $ dd bs=1 skip=$((0)) count=$((13164)) if=ETH0138028.jpg of=E1.jpg
  553|       |    // $ dd bs=1 skip=$((49304)) count=2000000  if=ETH0138028.jpg of=E2.jpg
  554|       |    // cat E1.jpg E2.jpg > E.jpg
  555|       |    // exiv2 -pS E.jpg
  556|       |
  557|       |    // binary copy io_ to a temporary file
  558|    843|    MemIo tempIo;
  559|    843|    size_t start = 0;
  560|  3.74k|    for (const auto& [l, s] : iptcDataSegs) {
  ------------------
  |  Branch (560:29): [True: 3.74k, False: 843]
  ------------------
  561|  3.74k|      const size_t length = l - start;
  562|  3.74k|      io_->seekOrThrow(start, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  563|  3.74k|      DataBuf buf(length);
  564|  3.74k|      io_->readOrThrow(buf.data(), buf.size(), ErrorCode::kerFailedToReadImageData);
  565|  3.74k|      tempIo.write(buf.c_data(), buf.size());
  566|  3.74k|      start = s + 2;  // skip the 2 byte marker
  567|  3.74k|    }
  568|       |
  569|    843|    io_->seekOrThrow(0, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  570|    843|    io_->transfer(tempIo);  // may throw
  571|    843|    io_->seekOrThrow(0, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  572|       |
  573|       |    // Check that the result is correctly formatted.
  574|    843|    readMetadata();
  575|    843|  }
  576|  7.59k|}  // JpegBase::printStructure
_ZN5Exiv28JpegBase13writeMetadataEv:
  578|  1.06k|void JpegBase::writeMetadata() {
  579|  1.06k|  if (io_->open() != 0) {
  ------------------
  |  Branch (579:7): [True: 0, False: 1.06k]
  ------------------
  580|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  581|      0|  }
  582|  1.06k|  IoCloser closer(*io_);
  583|  1.06k|  MemIo tempIo;
  584|       |
  585|  1.06k|  doWriteMetadata(tempIo);  // may throw
  586|  1.06k|  io_->close();
  587|  1.06k|  io_->transfer(tempIo);  // may throw
  588|  1.06k|}
_ZN5Exiv28JpegBase15readNextSegmentEh:
  590|  93.8k|DataBuf JpegBase::readNextSegment(byte marker) {
  591|  93.8k|  const auto [sizebuf, size] = readSegmentSize(marker, *io_);
  592|       |
  593|       |  // Read the rest of the segment if not empty.
  594|  93.8k|  DataBuf buf(size);
  595|  93.8k|  if (size > 0) {
  ------------------
  |  Branch (595:7): [True: 87.3k, False: 6.47k]
  ------------------
  596|  87.3k|    std::copy(sizebuf.begin(), sizebuf.end(), buf.begin());
  597|  87.3k|    if (size > 2) {
  ------------------
  |  Branch (597:9): [True: 86.1k, False: 1.18k]
  ------------------
  598|  86.1k|      io_->readOrThrow(buf.data(2), size - 2, ErrorCode::kerFailedToReadImageData);
  599|  86.1k|    }
  600|  87.3k|  }
  601|  93.8k|  return buf;
  602|  93.8k|}
_ZN5Exiv28JpegBase15doWriteMetadataERNS_7BasicIoE:
  604|  1.06k|void JpegBase::doWriteMetadata(BasicIo& outIo) {
  605|  1.06k|  if (!io_->isopen())
  ------------------
  |  Branch (605:7): [True: 0, False: 1.06k]
  ------------------
  606|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  607|  1.06k|  if (!outIo.isopen())
  ------------------
  |  Branch (607:7): [True: 0, False: 1.06k]
  ------------------
  608|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  609|       |
  610|       |  // Ensure that this is the correct image type
  611|  1.06k|  if (!isThisType(*io_, true)) {
  ------------------
  |  Branch (611:7): [True: 0, False: 1.06k]
  ------------------
  612|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (612:9): [True: 0, False: 0]
  |  Branch (612:25): [True: 0, False: 0]
  ------------------
  613|      0|      throw Error(ErrorCode::kerInputDataReadFailed);
  614|      0|    throw Error(ErrorCode::kerNoImageInInputData);
  615|      0|  }
  616|       |
  617|       |  // Used to initialize search variables such as skipCom.
  618|  1.06k|  static const size_t notfound = std::numeric_limits<size_t>::max();
  619|       |
  620|  1.06k|  const size_t seek = io_->tell();
  621|  1.06k|  size_t count = 0;
  622|  1.06k|  size_t search = 0;
  623|  1.06k|  size_t insertPos = 0;
  624|  1.06k|  size_t comPos = 0;
  625|  1.06k|  size_t skipApp1Exif = notfound;
  626|  1.06k|  size_t skipApp1Xmp = notfound;
  627|  1.06k|  bool foundCompletePsData = false;
  628|  1.06k|  bool foundIccData = false;
  629|  1.06k|  std::vector<size_t> skipApp13Ps3;
  630|  1.06k|  std::vector<size_t> skipApp2Icc;
  631|  1.06k|  size_t skipCom = notfound;
  632|  1.06k|  Blob psBlob;
  633|  1.06k|  DataBuf rawExif;
  634|  1.06k|  xmpData().usePacket(writeXmpFromPacket());
  635|       |
  636|       |  // Write image header
  637|  1.06k|  if (writeHeader(outIo))
  ------------------
  |  Branch (637:7): [True: 0, False: 1.06k]
  ------------------
  638|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  639|       |
  640|       |  // Read section marker
  641|  1.06k|  byte marker = advanceToMarker(ErrorCode::kerNoImageInInputData);
  642|       |
  643|       |  // First find segments of interest. Normally app0 is first and we want
  644|       |  // to insert after it. But if app0 comes after com, app1 and app13 then
  645|       |  // don't bother.
  646|  51.3k|  while (marker != sos_ && marker != eoi_ && search < 6) {
  ------------------
  |  Branch (646:10): [True: 51.0k, False: 309]
  |  Branch (646:28): [True: 50.3k, False: 753]
  |  Branch (646:46): [True: 50.3k, False: 0]
  ------------------
  647|  50.3k|    DataBuf buf = readNextSegment(marker);
  648|       |
  649|  50.3k|    if (marker == app0_) {
  ------------------
  |  Branch (649:9): [True: 1.20k, False: 49.0k]
  ------------------
  650|  1.20k|      insertPos = count + 1;
  651|  49.0k|    } else if (skipApp1Exif == notfound && marker == app1_ &&
  ------------------
  |  Branch (651:16): [True: 43.8k, False: 5.24k]
  |  Branch (651:44): [True: 2.37k, False: 41.4k]
  ------------------
  652|  2.37k|               buf.size() >= 8 &&  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (652:16): [True: 2.19k, False: 184]
  ------------------
  653|  2.19k|               buf.cmpBytes(2, exifId_.data(), 6) == 0) {
  ------------------
  |  Branch (653:16): [True: 598, False: 1.59k]
  ------------------
  654|    598|      skipApp1Exif = count;
  655|    598|      ++search;
  656|    598|      if (buf.size() > 8) {
  ------------------
  |  Branch (656:11): [True: 589, False: 9]
  ------------------
  657|    589|        rawExif.alloc(buf.size() - 8);
  658|    589|        std::copy_n(buf.begin() + 8, rawExif.size(), rawExif.begin());
  659|    589|      }
  660|  48.4k|    } else if (skipApp1Xmp == notfound && marker == app1_ &&
  ------------------
  |  Branch (660:16): [True: 44.2k, False: 4.27k]
  |  Branch (660:43): [True: 2.39k, False: 41.8k]
  ------------------
  661|  2.39k|               buf.size() >= 31 &&  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (661:16): [True: 2.14k, False: 255]
  ------------------
  662|  2.14k|               buf.cmpBytes(2, xmpId_.data(), 29) == 0) {
  ------------------
  |  Branch (662:16): [True: 94, False: 2.04k]
  ------------------
  663|     94|      skipApp1Xmp = count;
  664|     94|      ++search;
  665|  48.3k|    } else if (marker == app2_ && buf.size() >= 13 &&  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (665:16): [True: 4.12k, False: 44.2k]
  |  Branch (665:35): [True: 3.69k, False: 428]
  ------------------
  666|  3.69k|               buf.cmpBytes(2, iccId_, 11) == 0) {
  ------------------
  |  Branch (666:16): [True: 2.24k, False: 1.44k]
  ------------------
  667|  2.24k|      skipApp2Icc.push_back(count);
  668|  2.24k|      if (!foundIccData) {
  ------------------
  |  Branch (668:11): [True: 47, False: 2.20k]
  ------------------
  669|     47|        ++search;
  670|     47|        foundIccData = true;
  671|     47|      }
  672|  46.1k|    } else if (!foundCompletePsData && marker == app13_ &&
  ------------------
  |  Branch (672:16): [True: 46.0k, False: 129]
  |  Branch (672:40): [True: 32.1k, False: 13.9k]
  ------------------
  673|  32.1k|               buf.size() >= 16 &&  // prevent out-of-bounds read in memcmp on next line
  ------------------
  |  Branch (673:16): [True: 31.8k, False: 271]
  ------------------
  674|  31.8k|               buf.cmpBytes(2, Photoshop::ps3Id_, 14) == 0) {
  ------------------
  |  Branch (674:16): [True: 21.0k, False: 10.7k]
  ------------------
  675|       |#ifdef EXIV2_DEBUG_MESSAGES
  676|       |      std::cerr << "Found APP13 Photoshop PS3 segment\n";
  677|       |#endif
  678|  21.0k|      skipApp13Ps3.push_back(count);
  679|       |      // Append to psBlob
  680|  21.0k|      append(psBlob, buf.c_data(16), buf.size() - 16);
  681|       |      // Check whether psBlob is complete
  682|  21.0k|      if (!psBlob.empty() && Photoshop::valid(psBlob.data(), psBlob.size())) {
  ------------------
  |  Branch (682:11): [True: 20.6k, False: 386]
  |  Branch (682:30): [True: 51, False: 20.6k]
  ------------------
  683|     51|        foundCompletePsData = true;
  684|     51|      }
  685|  25.1k|    } else if (marker == com_ && skipCom == notfound) {
  ------------------
  |  Branch (685:16): [True: 2.56k, False: 22.5k]
  |  Branch (685:34): [True: 231, False: 2.33k]
  ------------------
  686|       |      // Jpegs can have multiple comments, but for now only handle
  687|       |      // the first one (most jpegs only have one anyway).
  688|    231|      skipCom = count;
  689|    231|      ++search;
  690|    231|    }
  691|       |
  692|       |    // As in jpeg-6b/wrjpgcom.c:
  693|       |    // We will insert the new comment marker just before SOFn.
  694|       |    // This (a) causes the new comment to appear after, rather than before,
  695|       |    // existing comments; and (b) ensures that comments come after any JFIF
  696|       |    // or JFXX markers, as required by the JFIF specification.
  697|  50.3k|    if (comPos == 0 && inRange2(marker, sof0_, sof3_, sof5_, sof15_)) {
  ------------------
  |  Branch (697:9): [True: 43.4k, False: 6.82k]
  |  Branch (697:24): [True: 69, False: 43.4k]
  ------------------
  698|     69|      comPos = count;
  699|     69|      ++search;
  700|     69|    }
  701|  50.3k|    marker = advanceToMarker(ErrorCode::kerNoImageInInputData);
  702|  50.3k|    ++count;
  703|  50.3k|  }
  704|       |
  705|  1.06k|  if (!foundCompletePsData && !psBlob.empty())
  ------------------
  |  Branch (705:7): [True: 961, False: 101]
  |  Branch (705:31): [True: 16, False: 945]
  ------------------
  706|     16|    throw Error(ErrorCode::kerNoImageInInputData);
  707|  1.04k|  search += skipApp13Ps3.size() + skipApp2Icc.size();
  708|       |
  709|  1.04k|  if (comPos == 0) {
  ------------------
  |  Branch (709:7): [True: 956, False: 90]
  ------------------
  710|    956|    if (marker == eoi_)
  ------------------
  |  Branch (710:9): [True: 727, False: 229]
  ------------------
  711|    727|      comPos = count;
  712|    229|    else
  713|    229|      comPos = insertPos;
  714|    956|    ++search;
  715|    956|  }
  716|  1.04k|  if (!exifData_.empty())
  ------------------
  |  Branch (716:7): [True: 583, False: 463]
  ------------------
  717|    583|    ++search;
  718|  1.04k|  if (!writeXmpFromPacket() && !xmpData_.empty())
  ------------------
  |  Branch (718:7): [True: 993, False: 53]
  |  Branch (718:32): [True: 54, False: 939]
  ------------------
  719|     54|    ++search;
  720|  1.04k|  if (writeXmpFromPacket() && !xmpPacket_.empty())
  ------------------
  |  Branch (720:7): [True: 0, False: 1.04k]
  |  Branch (720:31): [True: 0, False: 0]
  ------------------
  721|      0|    ++search;
  722|  1.04k|  if (foundCompletePsData || !iptcData_.empty())
  ------------------
  |  Branch (722:7): [True: 101, False: 945]
  |  Branch (722:30): [True: 0, False: 945]
  ------------------
  723|     48|    ++search;
  724|  1.04k|  if (!comment_.empty())
  ------------------
  |  Branch (724:7): [True: 222, False: 824]
  ------------------
  725|    222|    ++search;
  726|       |
  727|  1.04k|  io_->seekOrThrow(seek, BasicIo::beg, ErrorCode::kerNoImageInInputData);
  728|  1.04k|  count = 0;
  729|  1.04k|  marker = advanceToMarker(ErrorCode::kerNoImageInInputData);
  730|       |
  731|       |  // To simplify this a bit, new segments are inserts at either the start
  732|       |  // or right after app0. This is standard in most jpegs, but has the
  733|       |  // potential to change segment ordering (which is allowed).
  734|       |  // Segments are erased if there is no assigned metadata.
  735|  43.9k|  while (marker != sos_ && search > 0) {
  ------------------
  |  Branch (735:10): [True: 43.6k, False: 297]
  |  Branch (735:28): [True: 43.5k, False: 76]
  ------------------
  736|  43.5k|    DataBuf buf = readNextSegment(marker);
  737|       |
  738|  43.5k|    if (insertPos == count) {
  ------------------
  |  Branch (738:9): [True: 985, False: 42.5k]
  ------------------
  739|       |      // Write Exif data first so that - if there is no app0 - we
  740|       |      // create "Exif images" according to the Exif standard.
  741|    985|      if (!exifData_.empty()) {
  ------------------
  |  Branch (741:11): [True: 583, False: 402]
  ------------------
  742|    583|        Blob blob;
  743|    583|        ByteOrder bo = byteOrder();
  744|    583|        if (bo == invalidByteOrder) {
  ------------------
  |  Branch (744:13): [True: 0, False: 583]
  ------------------
  745|      0|          bo = littleEndian;
  746|      0|          setByteOrder(bo);
  747|      0|        }
  748|    583|        const byte* pExifData = rawExif.c_data();
  749|    583|        size_t exifSize = rawExif.size();
  750|    583|        if (ExifParser::encode(blob, pExifData, exifSize, bo, exifData_) == wmIntrusive) {
  ------------------
  |  Branch (750:13): [True: 466, False: 117]
  ------------------
  751|    466|          pExifData = !blob.empty() ? blob.data() : nullptr;
  ------------------
  |  Branch (751:23): [True: 439, False: 27]
  ------------------
  752|    466|          exifSize = blob.size();
  753|    466|        }
  754|    583|        if (exifSize > 0) {
  ------------------
  |  Branch (754:13): [True: 486, False: 97]
  ------------------
  755|    486|          std::array<byte, 10> tmpBuf;
  756|       |          // Write APP1 marker, size of APP1 field, Exif id and Exif data
  757|    486|          tmpBuf[0] = 0xff;
  758|    486|          tmpBuf[1] = app1_;
  759|       |
  760|    486|          if (exifSize > 0xffff - 8)
  ------------------
  |  Branch (760:15): [True: 62, False: 424]
  ------------------
  761|     62|            throw Error(ErrorCode::kerTooLargeJpegSegment, "Exif");
  762|    424|          us2Data(tmpBuf.data() + 2, static_cast<uint16_t>(exifSize + 8), bigEndian);
  763|    424|          std::copy(exifId_.begin(), exifId_.end(), tmpBuf.begin() + 4);
  764|    424|          if (outIo.write(tmpBuf.data(), 10) != 10)
  ------------------
  |  Branch (764:15): [True: 0, False: 424]
  ------------------
  765|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  766|       |
  767|       |          // Write new Exif data buffer
  768|    424|          if (outIo.write(pExifData, exifSize) != exifSize)
  ------------------
  |  Branch (768:15): [True: 0, False: 424]
  ------------------
  769|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  770|    424|          if (outIo.error())
  ------------------
  |  Branch (770:15): [True: 0, False: 424]
  ------------------
  771|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  772|    424|          --search;
  773|    424|        }
  774|    583|      }
  775|    923|      if (!writeXmpFromPacket() &&
  ------------------
  |  Branch (775:11): [True: 853, False: 70]
  ------------------
  776|    853|          XmpParser::encode(xmpPacket_, xmpData_, XmpParser::useCompactFormat | XmpParser::omitAllFormatting) > 1) {
  ------------------
  |  Branch (776:11): [True: 0, False: 853]
  ------------------
  777|      0|#ifndef SUPPRESS_WARNINGS
  778|      0|        EXV_ERROR << "Failed to encode XMP metadata.\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  779|      0|#endif
  780|      0|      }
  781|    923|      if (!xmpPacket_.empty()) {
  ------------------
  |  Branch (781:11): [True: 54, False: 869]
  ------------------
  782|     54|        std::array<byte, 33> tmpBuf;
  783|       |        // Write APP1 marker, size of APP1 field, XMP id and XMP packet
  784|     54|        tmpBuf[0] = 0xff;
  785|     54|        tmpBuf[1] = app1_;
  786|       |
  787|     54|        if (xmpPacket_.size() > 0xffff - 31)
  ------------------
  |  Branch (787:13): [True: 0, False: 54]
  ------------------
  788|      0|          throw Error(ErrorCode::kerTooLargeJpegSegment, "XMP");
  789|     54|        us2Data(tmpBuf.data() + 2, static_cast<uint16_t>(xmpPacket_.size() + 31), bigEndian);
  790|     54|        std::copy(xmpId_.begin(), xmpId_.end(), tmpBuf.begin() + 4);
  791|     54|        if (outIo.write(tmpBuf.data(), 33) != 33)
  ------------------
  |  Branch (791:13): [True: 0, False: 54]
  ------------------
  792|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  793|       |
  794|       |        // Write new XMP packet
  795|     54|        if (outIo.write(reinterpret_cast<const byte*>(xmpPacket_.data()), xmpPacket_.size()) != xmpPacket_.size())
  ------------------
  |  Branch (795:13): [True: 0, False: 54]
  ------------------
  796|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  797|     54|        if (outIo.error())
  ------------------
  |  Branch (797:13): [True: 0, False: 54]
  ------------------
  798|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  799|     54|        --search;
  800|     54|      }
  801|       |
  802|    923|      if (iccProfileDefined()) {
  ------------------
  |  Branch (802:11): [True: 38, False: 885]
  ------------------
  803|     38|        std::array<byte, 4> tmpBuf;
  804|       |        // Write APP2 marker, size of APP2 field, and IccProfile
  805|       |        // See comments in readMetadata() about the ICC embedding specification
  806|     38|        tmpBuf[0] = 0xff;
  807|     38|        tmpBuf[1] = app2_;
  808|       |
  809|     38|        const size_t chunk_size = (256 * 256) - 40;  // leave bytes for marker, header and padding
  810|     38|        size_t size = iccProfile_.size();
  811|     38|        if (size >= 255 * chunk_size)
  ------------------
  |  Branch (811:13): [True: 0, False: 38]
  ------------------
  812|      0|          throw Error(ErrorCode::kerTooLargeJpegSegment, "IccProfile");
  813|     38|        const size_t chunks = 1 + ((size - 1) / chunk_size);
  814|     76|        for (size_t chunk = 0; chunk < chunks; chunk++) {
  ------------------
  |  Branch (814:32): [True: 38, False: 38]
  ------------------
  815|     38|          auto bytes = std::min<size_t>(size, chunk_size);  // bytes to write
  816|     38|          size -= bytes;
  817|       |
  818|       |          // write JPEG marker (2 bytes)
  819|     38|          if (outIo.write(tmpBuf.data(), 2) != 2)
  ------------------
  |  Branch (819:15): [True: 0, False: 38]
  ------------------
  820|      0|            throw Error(ErrorCode::kerImageWriteFailed);  // JPEG Marker
  821|       |          // write length (2 bytes).  length includes the 2 bytes for the length
  822|     38|          us2Data(tmpBuf.data() + 2, static_cast<uint16_t>(2 + 14 + bytes), bigEndian);
  823|     38|          if (outIo.write(tmpBuf.data() + 2, 2) != 2)
  ------------------
  |  Branch (823:15): [True: 0, False: 38]
  ------------------
  824|      0|            throw Error(ErrorCode::kerImageWriteFailed);  // JPEG Length
  825|       |
  826|       |          // write the ICC_PROFILE header (14 bytes)
  827|     38|          uint8_t pad[2];
  828|     38|          pad[0] = static_cast<uint8_t>(chunk + 1);
  829|     38|          pad[1] = static_cast<uint8_t>(chunks);
  830|     38|          outIo.write(reinterpret_cast<const byte*>(iccId_), 12);
  831|     38|          outIo.write(reinterpret_cast<const byte*>(pad), 2);
  832|     38|          if (outIo.write(iccProfile_.c_data(chunk * chunk_size), bytes) != bytes)
  ------------------
  |  Branch (832:15): [True: 0, False: 38]
  ------------------
  833|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  834|     38|          if (outIo.error())
  ------------------
  |  Branch (834:15): [True: 0, False: 38]
  ------------------
  835|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  836|     38|        }
  837|     38|        --search;
  838|     38|      }
  839|       |
  840|    923|      if (foundCompletePsData || !iptcData_.empty()) {
  ------------------
  |  Branch (840:11): [True: 118, False: 805]
  |  Branch (840:34): [True: 0, False: 805]
  ------------------
  841|       |        // Set the new IPTC IRB, keeps existing IRBs but removes the
  842|       |        // IPTC block if there is no new IPTC data to write
  843|     48|        DataBuf newPsData = Photoshop::setIptcIrb(psBlob.data(), psBlob.size(), iptcData_);
  844|     48|        const size_t maxChunkSize = 0xffff - 16;
  845|     48|        const byte* chunkStart = newPsData.empty() ? nullptr : newPsData.c_data();
  ------------------
  |  Branch (845:34): [True: 2, False: 46]
  ------------------
  846|     48|        const byte* chunkEnd = newPsData.empty() ? nullptr : newPsData.c_data(newPsData.size() - 1);
  ------------------
  |  Branch (846:32): [True: 2, False: 46]
  ------------------
  847|     96|        while (chunkStart < chunkEnd) {
  ------------------
  |  Branch (847:16): [True: 48, False: 48]
  ------------------
  848|       |          // Determine size of next chunk
  849|     48|          size_t chunkSize = (chunkEnd + 1 - chunkStart);
  850|     48|          if (chunkSize > maxChunkSize) {
  ------------------
  |  Branch (850:15): [True: 2, False: 46]
  ------------------
  851|      2|            chunkSize = maxChunkSize;
  852|       |            // Don't break at a valid IRB boundary
  853|      2|            const auto writtenSize = chunkStart - newPsData.c_data();
  854|      2|            if (Photoshop::valid(newPsData.c_data(), writtenSize + chunkSize)) {
  ------------------
  |  Branch (854:17): [True: 0, False: 2]
  ------------------
  855|       |              // Since an IRB has minimum size 12,
  856|       |              // (chunkSize - 8) can't be also a IRB boundary
  857|      0|              chunkSize -= 8;
  858|      0|            }
  859|      2|          }
  860|       |
  861|       |          // Write APP13 marker, chunk size, and ps3Id
  862|     48|          std::array<byte, 18> tmpBuf;
  863|     48|          tmpBuf[0] = 0xff;
  864|     48|          tmpBuf[1] = app13_;
  865|     48|          us2Data(tmpBuf.data() + 2, static_cast<uint16_t>(chunkSize + 16), bigEndian);
  866|     48|          std::copy_n(Photoshop::ps3Id_, 14, tmpBuf.begin() + 4);
  867|     48|          if (outIo.write(tmpBuf.data(), 18) != 18)
  ------------------
  |  Branch (867:15): [True: 0, False: 48]
  ------------------
  868|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  869|     48|          if (outIo.error())
  ------------------
  |  Branch (869:15): [True: 0, False: 48]
  ------------------
  870|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  871|       |
  872|       |          // Write next chunk of the Photoshop IRB data buffer
  873|     48|          if (outIo.write(chunkStart, chunkSize) != chunkSize)
  ------------------
  |  Branch (873:15): [True: 0, False: 48]
  ------------------
  874|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  875|     48|          if (outIo.error())
  ------------------
  |  Branch (875:15): [True: 0, False: 48]
  ------------------
  876|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  877|       |
  878|     48|          chunkStart += chunkSize;
  879|     48|        }
  880|     48|        --search;
  881|     48|      }
  882|    923|    }
  883|  43.4k|    if (comPos == count) {
  ------------------
  |  Branch (883:9): [True: 853, False: 42.6k]
  ------------------
  884|    853|      if (!comment_.empty()) {
  ------------------
  |  Branch (884:11): [True: 116, False: 737]
  ------------------
  885|    116|        std::array<byte, 4> tmpBuf;
  886|       |        // Write COM marker, size of comment, and string
  887|    116|        tmpBuf[0] = 0xff;
  888|    116|        tmpBuf[1] = com_;
  889|       |
  890|    116|        if (comment_.length() > 0xffff - 3)
  ------------------
  |  Branch (890:13): [True: 0, False: 116]
  ------------------
  891|      0|          throw Error(ErrorCode::kerTooLargeJpegSegment, "JPEG comment");
  892|    116|        us2Data(tmpBuf.data() + 2, static_cast<uint16_t>(comment_.length() + 3), bigEndian);
  893|       |
  894|    116|        if (outIo.write(tmpBuf.data(), 4) != 4)
  ------------------
  |  Branch (894:13): [True: 0, False: 116]
  ------------------
  895|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  896|    116|        if (outIo.write(reinterpret_cast<byte*>(comment_.data()), comment_.length()) != comment_.length())
  ------------------
  |  Branch (896:13): [True: 0, False: 116]
  ------------------
  897|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  898|    116|        if (outIo.putb(0) == EOF)
  ------------------
  |  Branch (898:13): [True: 0, False: 116]
  ------------------
  899|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  900|    116|        if (outIo.error())
  ------------------
  |  Branch (900:13): [True: 0, False: 116]
  ------------------
  901|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  902|    116|        --search;
  903|    116|      }
  904|    853|      --search;
  905|    853|    }
  906|  43.4k|    if (marker == eoi_) {
  ------------------
  |  Branch (906:9): [True: 611, False: 42.8k]
  ------------------
  907|    611|      break;
  908|    611|    }
  909|  42.8k|    if (skipApp1Exif == count || skipApp1Xmp == count ||
  ------------------
  |  Branch (909:9): [True: 531, False: 42.3k]
  |  Branch (909:9): [True: 21.2k, False: 21.6k]
  |  Branch (909:34): [True: 93, False: 42.2k]
  ------------------
  910|  42.2k|        std::find(skipApp13Ps3.begin(), skipApp13Ps3.end(), count) != skipApp13Ps3.end() ||
  ------------------
  |  Branch (910:9): [True: 18.6k, False: 23.6k]
  ------------------
  911|  23.6k|        std::find(skipApp2Icc.begin(), skipApp2Icc.end(), count) != skipApp2Icc.end() || skipCom == count) {
  ------------------
  |  Branch (911:9): [True: 1.91k, False: 21.7k]
  |  Branch (911:90): [True: 121, False: 21.5k]
  ------------------
  912|  21.2k|      --search;
  913|  21.6k|    } else {
  914|  21.6k|      std::array<byte, 2> tmpBuf;
  915|       |      // Write marker and a copy of the segment.
  916|  21.6k|      tmpBuf[0] = 0xff;
  917|  21.6k|      tmpBuf[1] = marker;
  918|  21.6k|      if (outIo.write(tmpBuf.data(), 2) != 2)
  ------------------
  |  Branch (918:11): [True: 0, False: 21.6k]
  ------------------
  919|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  920|  21.6k|      if (outIo.write(buf.c_data(), buf.size()) != buf.size())
  ------------------
  |  Branch (920:11): [True: 0, False: 21.6k]
  ------------------
  921|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  922|  21.6k|      if (outIo.error())
  ------------------
  |  Branch (922:11): [True: 0, False: 21.6k]
  ------------------
  923|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  924|  21.6k|    }
  925|       |
  926|       |    // Next marker
  927|  42.8k|    marker = advanceToMarker(ErrorCode::kerNoImageInInputData);
  928|  42.8k|    ++count;
  929|  42.8k|  }
  930|       |
  931|       |  // Populate the fake data, only make sense for remoteio, httpio and sshio.
  932|       |  // it avoids allocating memory for parts of the file that contain image-date.
  933|    984|  io_->populateFakeData();
  934|       |
  935|       |  // Write the final marker, then copy rest of the Io.
  936|    984|  byte tmpBuf[2];
  937|    984|  tmpBuf[0] = 0xff;
  938|    984|  tmpBuf[1] = marker;
  939|    984|  if (outIo.write(tmpBuf, 2) != 2)
  ------------------
  |  Branch (939:7): [True: 0, False: 984]
  ------------------
  940|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  941|       |
  942|    984|  DataBuf buf(4096);
  943|    984|  size_t readSize = io_->read(buf.data(), buf.size());
  944|  1.58k|  while (readSize != 0) {
  ------------------
  |  Branch (944:10): [True: 597, False: 984]
  ------------------
  945|    597|    if (outIo.write(buf.c_data(), readSize) != readSize)
  ------------------
  |  Branch (945:9): [True: 0, False: 597]
  ------------------
  946|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  947|    597|    readSize = io_->read(buf.data(), buf.size());
  948|    597|  }
  949|    984|  if (outIo.error())
  ------------------
  |  Branch (949:7): [True: 0, False: 984]
  ------------------
  950|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  951|       |
  952|    984|}  // JpegBase::doWriteMetadata
_ZN5Exiv29JpegImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  971|  1.73k|    JpegBase(ImageType::jpeg, std::move(io), params, blank_, sizeof(blank_)) {
  972|  1.73k|}
_ZNK5Exiv29JpegImage11writeHeaderERNS_7BasicIoE:
  978|  1.06k|int JpegImage::writeHeader(BasicIo& outIo) const {
  979|       |  // Jpeg header
  980|  1.06k|  byte tmpBuf[2];
  981|  1.06k|  tmpBuf[0] = 0xff;
  982|  1.06k|  tmpBuf[1] = soi_;
  983|  1.06k|  if (outIo.write(tmpBuf, 2) != 2)
  ------------------
  |  Branch (983:7): [True: 0, False: 1.06k]
  ------------------
  984|      0|    return 4;
  985|  1.06k|  if (outIo.error())
  ------------------
  |  Branch (985:7): [True: 0, False: 1.06k]
  ------------------
  986|      0|    return 4;
  987|  1.06k|  return 0;
  988|  1.06k|}
_ZNK5Exiv29JpegImage10isThisTypeERNS_7BasicIoEb:
  990|  11.2k|bool JpegImage::isThisType(BasicIo& iIo, bool advance) const {
  991|  11.2k|  return isJpegType(iIo, advance);
  992|  11.2k|}
_ZN5Exiv215newJpegInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  994|  1.62k|Image::UniquePtr newJpegInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  995|  1.62k|  auto image = std::make_unique<JpegImage>(std::move(io), params);
  996|  1.62k|  if (!image->good()) {
  ------------------
  |  Branch (996:7): [True: 0, False: 1.62k]
  ------------------
  997|      0|    return nullptr;
  998|      0|  }
  999|  1.62k|  return image;
 1000|  1.62k|}
_ZN5Exiv210isJpegTypeERNS_7BasicIoEb:
 1002|  45.3k|bool isJpegType(BasicIo& iIo, bool advance) {
 1003|  45.3k|  bool result = true;
 1004|  45.3k|  byte tmpBuf[2];
 1005|  45.3k|  iIo.read(tmpBuf, 2);
 1006|  45.3k|  if (iIo.error() || iIo.eof())
  ------------------
  |  Branch (1006:7): [True: 0, False: 45.3k]
  |  Branch (1006:22): [True: 25, False: 45.3k]
  ------------------
 1007|     25|    return false;
 1008|       |
 1009|  45.3k|  if (0xff != tmpBuf[0] || soi_ != tmpBuf[1]) {
  ------------------
  |  Branch (1009:7): [True: 30.9k, False: 14.4k]
  |  Branch (1009:28): [True: 89, False: 14.3k]
  ------------------
 1010|  30.9k|    result = false;
 1011|  30.9k|  }
 1012|  45.3k|  if (!advance || !result)
  ------------------
  |  Branch (1012:7): [True: 41.7k, False: 3.64k]
  |  Branch (1012:19): [True: 108, False: 3.53k]
  ------------------
 1013|  41.8k|    iIo.seek(-2, BasicIo::cur);
 1014|  45.3k|  return result;
 1015|  45.3k|}
_ZN5Exiv28ExvImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
 1018|     15|    JpegBase(ImageType::exv, std::move(io), params, blank_, sizeof(blank_)) {
 1019|     15|}
_ZNK5Exiv28ExvImage10isThisTypeERNS_7BasicIoEb:
 1036|     19|bool ExvImage::isThisType(BasicIo& iIo, bool advance) const {
 1037|     19|  return isExvType(iIo, advance);
 1038|     19|}
_ZN5Exiv214newExvInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
 1040|     15|Image::UniquePtr newExvInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
 1041|     15|  auto image = std::make_unique<ExvImage>(std::move(io), params);
 1042|     15|  if (!image->good())
  ------------------
  |  Branch (1042:7): [True: 0, False: 15]
  ------------------
 1043|      0|    return nullptr;
 1044|     15|  return image;
 1045|     15|}
_ZN5Exiv29isExvTypeERNS_7BasicIoEb:
 1047|  30.9k|bool isExvType(BasicIo& iIo, bool advance) {
 1048|  30.9k|  bool result = true;
 1049|  30.9k|  byte tmpBuf[7];
 1050|  30.9k|  iIo.read(tmpBuf, 7);
 1051|  30.9k|  if (iIo.error() || iIo.eof())
  ------------------
  |  Branch (1051:7): [True: 0, False: 30.9k]
  |  Branch (1051:22): [True: 77, False: 30.8k]
  ------------------
 1052|     77|    return false;
 1053|       |
 1054|  30.8k|  if (0xff != tmpBuf[0] || 0x01 != tmpBuf[1] || memcmp(tmpBuf + 2, ExvImage::exiv2Id_, 5) != 0) {
  ------------------
  |  Branch (1054:7): [True: 30.7k, False: 93]
  |  Branch (1054:28): [True: 34, False: 59]
  |  Branch (1054:49): [True: 10, False: 49]
  ------------------
 1055|  30.8k|    result = false;
 1056|  30.8k|  }
 1057|  30.8k|  if (!advance || !result)
  ------------------
  |  Branch (1057:7): [True: 30.8k, False: 15]
  |  Branch (1057:19): [True: 0, False: 15]
  ------------------
 1058|  30.8k|    iIo.seek(-7, BasicIo::cur);
 1059|  30.8k|  return result;
 1060|  30.9k|}
jpgimage.cpp:_ZN5Exiv212_GLOBAL__N_115readSegmentSizeEhRNS_7BasicIoE:
  103|   288k|std::pair<std::array<byte, 2>, uint16_t> readSegmentSize(const byte marker, BasicIo& io) {
  104|   288k|  std::array<byte, 2> buf{0, 0};  // 2-byte buffer for reading the size.
  105|   288k|  uint16_t size{0};               // Size of the segment, including the 2-byte size field
  106|   288k|  if (markerHasLength(marker)) {
  ------------------
  |  Branch (106:7): [True: 254k, False: 34.0k]
  ------------------
  107|   254k|    io.readOrThrow(buf.data(), buf.size(), ErrorCode::kerFailedToReadImageData);
  108|   254k|    size = getUShort(buf.data(), bigEndian);
  109|   254k|    enforce(size >= 2, ErrorCode::kerFailedToReadImageData);
  110|   254k|  }
  111|   288k|  return {buf, size};
  112|   288k|}
jpgimage.cpp:_ZN5Exiv212_GLOBAL__N_18inRange2Eiiiii:
   91|  72.6k|constexpr bool inRange2(int value, int lo1, int hi1, int lo2, int hi2) {
   92|  72.6k|  return inRange(lo1, value, hi1) || inRange(lo2, value, hi2);
  ------------------
  |  Branch (92:10): [True: 130, False: 72.5k]
  |  Branch (92:38): [True: 227, False: 72.2k]
  ------------------
   93|  72.6k|}
jpgimage.cpp:_ZN5Exiv212_GLOBAL__N_17inRangeEiii:
   87|   145k|constexpr bool inRange(int lo, int value, int hi) {
   88|   145k|  return lo <= value && value <= hi;
  ------------------
  |  Branch (88:10): [True: 141k, False: 3.36k]
  |  Branch (88:25): [True: 357, False: 141k]
  ------------------
   89|   145k|}
jpgimage.cpp:_ZN5Exiv212_GLOBAL__N_115markerHasLengthEh:
   98|   344k|bool markerHasLength(byte m) {
   99|   344k|  bool markerWithoutLength = m >= rst1_ && m <= eoi_;
  ------------------
  |  Branch (99:30): [True: 320k, False: 23.5k]
  |  Branch (99:44): [True: 43.2k, False: 277k]
  ------------------
  100|   344k|  return !markerWithoutLength;
  101|   344k|}

_ZN5Exiv28Internal15readExiv2ConfigERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_S9_:
   90|  14.4k|                            const std::string& def) {
   91|  14.4k|  std::string result = def;
   92|       |
   93|       |#if defined(EXV_ENABLE_INIH) && defined(EXV_ENABLE_FILESYSTEM)
   94|       |  INIReader reader(Exiv2::Internal::getExiv2ConfigPath());
   95|       |  if (reader.ParseError() == 0) {
   96|       |    result = reader.Get(section, value, def);
   97|       |  }
   98|       |#endif
   99|       |
  100|  14.4k|  return result;
  101|  14.4k|}
_ZNK5Exiv28Internal14TiffMnRegistryeqENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEE:
  133|   360k|bool TiffMnRegistry::operator==(std::string_view key) const {
  134|   360k|  if (!key.empty() && key.front() == '-')
  ------------------
  |  Branch (134:7): [True: 334k, False: 25.7k]
  |  Branch (134:23): [True: 1.95k, False: 332k]
  ------------------
  135|  1.95k|    return false;
  136|   358k|  return key.starts_with(make_);
  137|   360k|}
_ZNK5Exiv28Internal14TiffMnRegistryeqENS_5IfdIdE:
  139|  69.7k|bool TiffMnRegistry::operator==(IfdId key) const {
  140|  69.7k|  return mnGroup_ == key;
  141|  69.7k|}
_ZN5Exiv28Internal13TiffMnCreator6createEtNS_5IfdIdENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEEPKhmNS_9ByteOrderE:
  144|  36.5k|                                                        const byte* pData, size_t size, ByteOrder byteOrder) {
  145|  36.5k|  if (auto tmr = Exiv2::find(registry_, make))
  ------------------
  |  Branch (145:12): [True: 35.0k, False: 1.49k]
  ------------------
  146|  35.0k|    return tmr->newMnFct_(tag, group, tmr->mnGroup_, pData, size, byteOrder);
  147|  1.49k|  return nullptr;
  148|  36.5k|}  // TiffMnCreator::create
_ZN5Exiv28Internal13TiffMnCreator6createEtNS_5IfdIdES2_:
  150|  5.88k|std::unique_ptr<TiffIfdMakernote> TiffMnCreator::create(uint16_t tag, IfdId group, IfdId mnGroup) {
  151|  5.88k|  if (auto tmr = Exiv2::find(registry_, mnGroup)) {
  ------------------
  |  Branch (151:12): [True: 5.88k, False: 0]
  ------------------
  152|  5.88k|    if (tmr->newMnFct2_) {
  ------------------
  |  Branch (152:9): [True: 5.88k, False: 0]
  ------------------
  153|  5.88k|      return tmr->newMnFct2_(tag, group, mnGroup);
  154|  5.88k|    }
  155|      0|    std::cout << "mnGroup = " << mnGroup << "\n";
  156|      0|  }
  157|      0|  return nullptr;
  158|  5.88k|}  // TiffMnCreator::create
_ZN5Exiv28Internal8MnHeader12setByteOrderENS_9ByteOrderE:
  160|  3.91k|void MnHeader::setByteOrder(ByteOrder) {
  161|  3.91k|}
_ZNK5Exiv28Internal8MnHeader9ifdOffsetEv:
  163|    132|size_t MnHeader::ifdOffset() const {
  164|    132|  return 0;
  165|    132|}
_ZNK5Exiv28Internal8MnHeader9byteOrderEv:
  167|  31.4k|ByteOrder MnHeader::byteOrder() const {
  168|  31.4k|  return invalidByteOrder;
  169|  31.4k|}
_ZNK5Exiv28Internal8MnHeader10baseOffsetEm:
  171|  4.36k|size_t MnHeader::baseOffset(size_t /*mnOffset*/) const {
  172|  4.36k|  return 0;
  173|  4.36k|}
_ZN5Exiv28Internal15OlympusMnHeader15sizeOfSignatureEv:
  177|  3.31k|size_t OlympusMnHeader::sizeOfSignature() {
  178|  3.31k|  return sizeof(signature_);
  179|  3.31k|}
_ZN5Exiv28Internal15OlympusMnHeaderC2Ev:
  181|    389|OlympusMnHeader::OlympusMnHeader() {
  182|    389|  read(signature_, sizeOfSignature(), invalidByteOrder);
  183|    389|}
_ZNK5Exiv28Internal15OlympusMnHeader4sizeEv:
  185|    532|size_t OlympusMnHeader::size() const {
  186|    532|  return header_.size();
  187|    532|}
_ZNK5Exiv28Internal15OlympusMnHeader9ifdOffsetEv:
  189|     47|size_t OlympusMnHeader::ifdOffset() const {
  190|     47|  return sizeOfSignature();
  191|     47|}
_ZN5Exiv28Internal15OlympusMnHeader4readEPKhmNS_9ByteOrderE:
  193|    718|bool OlympusMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  194|    718|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (194:7): [True: 0, False: 718]
  |  Branch (194:17): [True: 0, False: 718]
  ------------------
  195|      0|    return false;
  196|    718|  header_.alloc(sizeOfSignature());
  197|    718|  std::copy_n(pData, header_.size(), header_.begin());
  198|    718|  return header_.size() >= sizeOfSignature() && 0 == header_.cmpBytes(0, signature_, 6);
  ------------------
  |  Branch (198:10): [True: 718, False: 0]
  |  Branch (198:49): [True: 436, False: 282]
  ------------------
  199|    718|}
_ZNK5Exiv28Internal15OlympusMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  201|     59|size_t OlympusMnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  202|     59|  ioWrapper.write(signature_, sizeOfSignature());
  203|     59|  return sizeOfSignature();
  204|     59|}  // OlympusMnHeader::write
_ZN5Exiv28Internal16Olympus2MnHeader15sizeOfSignatureEv:
  208|  37.1k|size_t Olympus2MnHeader::sizeOfSignature() {
  209|  37.1k|  return sizeof(signature_);
  210|  37.1k|}
_ZN5Exiv28Internal16Olympus2MnHeaderC2Ev:
  212|  4.11k|Olympus2MnHeader::Olympus2MnHeader() {
  213|  4.11k|  read(signature_, sizeOfSignature(), invalidByteOrder);
  214|  4.11k|}
_ZNK5Exiv28Internal16Olympus2MnHeader9ifdOffsetEv:
  220|  4.11k|size_t Olympus2MnHeader::ifdOffset() const {
  221|  4.11k|  return sizeOfSignature();
  222|  4.11k|}
_ZNK5Exiv28Internal16Olympus2MnHeader10baseOffsetEm:
  224|  4.11k|size_t Olympus2MnHeader::baseOffset(size_t mnOffset) const {
  225|  4.11k|  return mnOffset;
  226|  4.11k|}
_ZN5Exiv28Internal16Olympus2MnHeader4readEPKhmNS_9ByteOrderE:
  228|  8.22k|bool Olympus2MnHeader::read(const byte* pData, size_t size, ByteOrder) {
  229|  8.22k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (229:7): [True: 0, False: 8.22k]
  |  Branch (229:17): [True: 0, False: 8.22k]
  ------------------
  230|      0|    return false;
  231|  8.22k|  header_.alloc(sizeOfSignature());
  232|  8.22k|  std::copy_n(pData, header_.size(), header_.begin());
  233|  8.22k|  return header_.size() >= sizeOfSignature() && 0 == header_.cmpBytes(0, signature_, 10);
  ------------------
  |  Branch (233:10): [True: 8.22k, False: 0]
  |  Branch (233:49): [True: 8.22k, False: 0]
  ------------------
  234|  8.22k|}
_ZN5Exiv28Internal16OMSystemMnHeader15sizeOfSignatureEv:
  244|  27.3k|size_t OMSystemMnHeader::sizeOfSignature() {
  245|  27.3k|  return sizeof(signature_);
  246|  27.3k|}
_ZN5Exiv28Internal16OMSystemMnHeaderC2Ev:
  248|  3.85k|OMSystemMnHeader::OMSystemMnHeader() {
  249|  3.85k|  read(signature_, sizeOfSignature(), invalidByteOrder);
  250|  3.85k|}
_ZNK5Exiv28Internal16OMSystemMnHeader4sizeEv:
  252|  33.8k|size_t OMSystemMnHeader::size() const {
  253|  33.8k|  return header_.size();
  254|  33.8k|}
_ZNK5Exiv28Internal16OMSystemMnHeader9ifdOffsetEv:
  256|     21|size_t OMSystemMnHeader::ifdOffset() const {
  257|     21|  return sizeOfSignature();
  258|     21|}
_ZNK5Exiv28Internal16OMSystemMnHeader10baseOffsetEm:
  260|  3.78k|size_t OMSystemMnHeader::baseOffset(size_t mnOffset) const {
  261|  3.78k|  return mnOffset;
  262|  3.78k|}
_ZN5Exiv28Internal16OMSystemMnHeader4readEPKhmNS_9ByteOrderE:
  264|  3.93k|bool OMSystemMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  265|  3.93k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (265:7): [True: 0, False: 3.93k]
  |  Branch (265:17): [True: 0, False: 3.93k]
  ------------------
  266|      0|    return false;
  267|  3.93k|  header_.alloc(sizeOfSignature());
  268|  3.93k|  std::copy_n(pData, header_.size(), header_.begin());
  269|  3.93k|  return header_.size() >= sizeOfSignature() && 0 == header_.cmpBytes(0, signature_, sizeOfSignature() - 2);
  ------------------
  |  Branch (269:10): [True: 3.93k, False: 0]
  |  Branch (269:49): [True: 3.88k, False: 59]
  ------------------
  270|  3.93k|}
_ZNK5Exiv28Internal16OMSystemMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  272|  3.75k|size_t OMSystemMnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  273|  3.75k|  ioWrapper.write(signature_, sizeOfSignature());
  274|  3.75k|  return sizeOfSignature();
  275|  3.75k|}  // OMSystemMnHeader::write
_ZN5Exiv28Internal12FujiMnHeader15sizeOfSignatureEv:
  280|  17.8k|size_t FujiMnHeader::sizeOfSignature() {
  281|  17.8k|  return sizeof(signature_);
  282|  17.8k|}
_ZN5Exiv28Internal12FujiMnHeaderC2Ev:
  284|  2.14k|FujiMnHeader::FujiMnHeader() {
  285|  2.14k|  read(signature_, sizeOfSignature(), byteOrder_);
  286|  2.14k|}
_ZNK5Exiv28Internal12FujiMnHeader4sizeEv:
  288|     54|size_t FujiMnHeader::size() const {
  289|     54|  return header_.size();
  290|     54|}
_ZNK5Exiv28Internal12FujiMnHeader9ifdOffsetEv:
  292|  1.79k|size_t FujiMnHeader::ifdOffset() const {
  293|  1.79k|  return start_;
  294|  1.79k|}
_ZNK5Exiv28Internal12FujiMnHeader9byteOrderEv:
  296|  7.16k|ByteOrder FujiMnHeader::byteOrder() const {
  297|  7.16k|  return byteOrder_;
  298|  7.16k|}
_ZNK5Exiv28Internal12FujiMnHeader10baseOffsetEm:
  300|  1.79k|size_t FujiMnHeader::baseOffset(size_t mnOffset) const {
  301|  1.79k|  return mnOffset;
  302|  1.79k|}
_ZN5Exiv28Internal12FujiMnHeader4readEPKhmNS_9ByteOrderE:
  304|  4.29k|bool FujiMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  305|  4.29k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (305:7): [True: 0, False: 4.29k]
  |  Branch (305:17): [True: 0, False: 4.29k]
  ------------------
  306|      0|    return false;
  307|  4.29k|  header_.alloc(sizeOfSignature());
  308|  4.29k|  std::copy_n(pData, header_.size(), header_.begin());
  309|       |  // Read offset to the IFD relative to the start of the makernote
  310|       |  // from the header. Note that we ignore the byteOrder argument
  311|  4.29k|  start_ = header_.read_uint32(8, byteOrder_);
  312|  4.29k|  return header_.size() >= sizeOfSignature() && 0 == header_.cmpBytes(0, signature_, 8);
  ------------------
  |  Branch (312:10): [True: 4.29k, False: 0]
  |  Branch (312:49): [True: 3.94k, False: 351]
  ------------------
  313|  4.29k|}
_ZNK5Exiv28Internal12FujiMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  315|      6|size_t FujiMnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  316|      6|  ioWrapper.write(signature_, sizeOfSignature());
  317|      6|  return sizeOfSignature();
  318|      6|}  // FujiMnHeader::write
_ZN5Exiv28Internal14Nikon2MnHeader15sizeOfSignatureEv:
  322|  1.91k|size_t Nikon2MnHeader::sizeOfSignature() {
  323|  1.91k|  return sizeof(signature_);
  324|  1.91k|}
_ZN5Exiv28Internal14Nikon2MnHeaderC2Ev:
  326|    224|Nikon2MnHeader::Nikon2MnHeader() {
  327|    224|  read(signature_, sizeOfSignature(), invalidByteOrder);
  328|    224|}
_ZNK5Exiv28Internal14Nikon2MnHeader4sizeEv:
  330|    139|size_t Nikon2MnHeader::size() const {
  331|    139|  return sizeOfSignature();
  332|    139|}
_ZNK5Exiv28Internal14Nikon2MnHeader9ifdOffsetEv:
  334|    207|size_t Nikon2MnHeader::ifdOffset() const {
  335|    207|  return start_;
  336|    207|}
_ZN5Exiv28Internal14Nikon2MnHeader4readEPKhmNS_9ByteOrderE:
  338|    431|bool Nikon2MnHeader::read(const byte* pData, size_t size, ByteOrder) {
  339|    431|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (339:7): [True: 0, False: 431]
  |  Branch (339:17): [True: 0, False: 431]
  ------------------
  340|      0|    return false;
  341|    431|  if (0 != memcmp(pData, signature_, 6))
  ------------------
  |  Branch (341:7): [True: 0, False: 431]
  ------------------
  342|      0|    return false;
  343|    431|  buf_.alloc(sizeOfSignature());
  344|    431|  std::copy_n(pData, buf_.size(), buf_.begin());
  345|    431|  start_ = sizeOfSignature();
  346|    431|  return true;
  347|    431|}  // Nikon2MnHeader::read
_ZNK5Exiv28Internal14Nikon2MnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  349|     15|size_t Nikon2MnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  350|     15|  ioWrapper.write(signature_, sizeOfSignature());
  351|     15|  return sizeOfSignature();
  352|     15|}  // Nikon2MnHeader::write
_ZN5Exiv28Internal14Nikon3MnHeader15sizeOfSignatureEv:
  357|  10.4k|size_t Nikon3MnHeader::sizeOfSignature() {
  358|  10.4k|  return sizeof(signature_);
  359|  10.4k|}
_ZN5Exiv28Internal14Nikon3MnHeaderC2Ev:
  361|  1.99k|Nikon3MnHeader::Nikon3MnHeader() : start_(sizeOfSignature()) {
  362|  1.99k|  buf_.alloc(sizeOfSignature());
  363|  1.99k|  std::copy_n(signature_, buf_.size(), buf_.begin());
  364|  1.99k|}
_ZNK5Exiv28Internal14Nikon3MnHeader4sizeEv:
  366|    677|size_t Nikon3MnHeader::size() const {
  367|    677|  return sizeOfSignature();
  368|    677|}
_ZNK5Exiv28Internal14Nikon3MnHeader9ifdOffsetEv:
  370|  1.91k|size_t Nikon3MnHeader::ifdOffset() const {
  371|  1.91k|  return start_;
  372|  1.91k|}
_ZNK5Exiv28Internal14Nikon3MnHeader9byteOrderEv:
  374|  7.92k|ByteOrder Nikon3MnHeader::byteOrder() const {
  375|  7.92k|  return byteOrder_;
  376|  7.92k|}
_ZNK5Exiv28Internal14Nikon3MnHeader10baseOffsetEm:
  378|  1.98k|size_t Nikon3MnHeader::baseOffset(size_t mnOffset) const {
  379|  1.98k|  return Safe::add<size_t>(mnOffset, 10);
  380|  1.98k|}
_ZN5Exiv28Internal14Nikon3MnHeader4readEPKhmNS_9ByteOrderE:
  382|  1.91k|bool Nikon3MnHeader::read(const byte* pData, size_t size, ByteOrder) {
  383|  1.91k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (383:7): [True: 0, False: 1.91k]
  |  Branch (383:17): [True: 0, False: 1.91k]
  ------------------
  384|      0|    return false;
  385|  1.91k|  if (0 != memcmp(pData, signature_, 6))
  ------------------
  |  Branch (385:7): [True: 0, False: 1.91k]
  ------------------
  386|      0|    return false;
  387|  1.91k|  buf_.alloc(sizeOfSignature());
  388|  1.91k|  std::copy_n(pData, buf_.size(), buf_.begin());
  389|  1.91k|  TiffHeader th;
  390|  1.91k|  if (!th.read(buf_.data(10), 8))
  ------------------
  |  Branch (390:7): [True: 0, False: 1.91k]
  ------------------
  391|      0|    return false;
  392|  1.91k|  byteOrder_ = th.byteOrder();
  393|  1.91k|  start_ = 10 + th.offset();
  394|  1.91k|  return true;
  395|  1.91k|}  // Nikon3MnHeader::read
_ZNK5Exiv28Internal14Nikon3MnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  397|     74|size_t Nikon3MnHeader::write(IoWrapper& ioWrapper, ByteOrder byteOrder) const {
  398|     74|  ioWrapper.write(buf_.c_data(), 10);
  399|       |  /// \todo: This removes any gap between the header and makernote IFD. The gap should be copied too.
  400|     74|  TiffHeader th(byteOrder);
  401|     74|  DataBuf buf = th.write();
  402|     74|  ioWrapper.write(buf.c_data(), buf.size());
  403|     74|  return 10 + buf.size();
  404|     74|}
_ZN5Exiv28Internal14Nikon3MnHeader12setByteOrderENS_9ByteOrderE:
  406|     81|void Nikon3MnHeader::setByteOrder(ByteOrder byteOrder) {
  407|     81|  byteOrder_ = byteOrder;
  408|     81|}
_ZN5Exiv28Internal17PanasonicMnHeader15sizeOfSignatureEv:
  412|  17.0k|size_t PanasonicMnHeader::sizeOfSignature() {
  413|  17.0k|  return sizeof(signature_);
  414|  17.0k|}
_ZN5Exiv28Internal17PanasonicMnHeaderC2Ev:
  416|  2.13k|PanasonicMnHeader::PanasonicMnHeader() {
  417|  2.13k|  read(signature_, sizeOfSignature(), invalidByteOrder);
  418|  2.13k|}
_ZNK5Exiv28Internal17PanasonicMnHeader4sizeEv:
  420|     54|size_t PanasonicMnHeader::size() const {
  421|     54|  return sizeOfSignature();
  422|     54|}
_ZNK5Exiv28Internal17PanasonicMnHeader9ifdOffsetEv:
  424|  1.98k|size_t PanasonicMnHeader::ifdOffset() const {
  425|  1.98k|  return start_;
  426|  1.98k|}
_ZN5Exiv28Internal17PanasonicMnHeader4readEPKhmNS_9ByteOrderE:
  428|  4.25k|bool PanasonicMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  429|  4.25k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (429:7): [True: 0, False: 4.25k]
  |  Branch (429:17): [True: 0, False: 4.25k]
  ------------------
  430|      0|    return false;
  431|  4.25k|  if (0 != memcmp(pData, signature_, 9))
  ------------------
  |  Branch (431:7): [True: 144, False: 4.11k]
  ------------------
  432|    144|    return false;
  433|  4.11k|  buf_.alloc(sizeOfSignature());
  434|  4.11k|  std::copy_n(pData, buf_.size(), buf_.begin());
  435|  4.11k|  start_ = sizeOfSignature();
  436|  4.11k|  return true;
  437|  4.25k|}  // PanasonicMnHeader::read
_ZNK5Exiv28Internal17PanasonicMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  439|      6|size_t PanasonicMnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  440|      6|  ioWrapper.write(signature_, sizeOfSignature());
  441|      6|  return sizeOfSignature();
  442|      6|}  // PanasonicMnHeader::write
_ZN5Exiv28Internal17PentaxDngMnHeader15sizeOfSignatureEv:
  446|  33.6k|size_t PentaxDngMnHeader::sizeOfSignature() {
  447|  33.6k|  return sizeof(signature_);
  448|  33.6k|}
_ZN5Exiv28Internal17PentaxDngMnHeaderC2Ev:
  450|  4.20k|PentaxDngMnHeader::PentaxDngMnHeader() {
  451|  4.20k|  read(signature_, sizeOfSignature(), invalidByteOrder);
  452|  4.20k|}
_ZNK5Exiv28Internal17PentaxDngMnHeader4sizeEv:
  454|  6.99k|size_t PentaxDngMnHeader::size() const {
  455|  6.99k|  return header_.size();
  456|  6.99k|}
_ZNK5Exiv28Internal17PentaxDngMnHeader10baseOffsetEm:
  458|  4.20k|size_t PentaxDngMnHeader::baseOffset(size_t mnOffset) const {
  459|  4.20k|  return mnOffset;
  460|  4.20k|}
_ZNK5Exiv28Internal17PentaxDngMnHeader9ifdOffsetEv:
  462|  2.80k|size_t PentaxDngMnHeader::ifdOffset() const {
  463|  2.80k|  return sizeOfSignature();
  464|  2.80k|}
_ZN5Exiv28Internal17PentaxDngMnHeader4readEPKhmNS_9ByteOrderE:
  466|  7.01k|bool PentaxDngMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  467|  7.01k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (467:7): [True: 0, False: 7.01k]
  |  Branch (467:17): [True: 0, False: 7.01k]
  ------------------
  468|      0|    return false;
  469|  7.01k|  header_.alloc(sizeOfSignature());
  470|  7.01k|  std::copy_n(pData, header_.size(), header_.begin());
  471|  7.01k|  return header_.size() >= sizeOfSignature() && 0 == header_.cmpBytes(0, signature_, 7);
  ------------------
  |  Branch (471:10): [True: 7.01k, False: 0]
  |  Branch (471:49): [True: 7.01k, False: 0]
  ------------------
  472|  7.01k|}
_ZNK5Exiv28Internal17PentaxDngMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  474|  1.39k|size_t PentaxDngMnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  475|  1.39k|  ioWrapper.write(signature_, sizeOfSignature());
  476|  1.39k|  return sizeOfSignature();
  477|  1.39k|}  // PentaxDngMnHeader::write
_ZN5Exiv28Internal14PentaxMnHeader15sizeOfSignatureEv:
  481|    862|size_t PentaxMnHeader::sizeOfSignature() {
  482|    862|  return sizeof(signature_);
  483|    862|}
_ZN5Exiv28Internal14PentaxMnHeaderC2Ev:
  485|     89|PentaxMnHeader::PentaxMnHeader() {
  486|     89|  read(signature_, sizeOfSignature(), invalidByteOrder);
  487|     89|}
_ZNK5Exiv28Internal14PentaxMnHeader9ifdOffsetEv:
  493|     89|size_t PentaxMnHeader::ifdOffset() const {
  494|     89|  return sizeOfSignature();
  495|     89|}
_ZN5Exiv28Internal14PentaxMnHeader4readEPKhmNS_9ByteOrderE:
  497|    178|bool PentaxMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  498|    178|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (498:7): [True: 0, False: 178]
  |  Branch (498:17): [True: 0, False: 178]
  ------------------
  499|      0|    return false;
  500|    178|  header_.alloc(sizeOfSignature());
  501|    178|  std::copy_n(pData, header_.size(), header_.begin());
  502|    178|  return header_.size() >= sizeOfSignature() && 0 == header_.cmpBytes(0, signature_, 3);
  ------------------
  |  Branch (502:10): [True: 178, False: 0]
  |  Branch (502:49): [True: 178, False: 0]
  ------------------
  503|    178|}
_ZN5Exiv28Internal15SamsungMnHeaderC2Ev:
  510|    151|SamsungMnHeader::SamsungMnHeader() {
  511|    151|  read(nullptr, 0, invalidByteOrder);
  512|    151|}
_ZNK5Exiv28Internal15SamsungMnHeader4sizeEv:
  514|    176|size_t SamsungMnHeader::size() const {
  515|    176|  return 0;
  516|    176|}
_ZNK5Exiv28Internal15SamsungMnHeader10baseOffsetEm:
  518|    151|size_t SamsungMnHeader::baseOffset(size_t mnOffset) const {
  519|    151|  return mnOffset;
  520|    151|}
_ZN5Exiv28Internal15SamsungMnHeader4readEPKhmNS_9ByteOrderE:
  522|    283|bool SamsungMnHeader::read(const byte* /*pData*/, size_t /*size*/, ByteOrder) {
  523|    283|  return true;
  524|    283|}  // SamsungMnHeader::read
_ZNK5Exiv28Internal15SamsungMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  526|     19|size_t SamsungMnHeader::write(IoWrapper& /*ioWrapper*/, ByteOrder) const {
  527|     19|  return 0;
  528|     19|}  // SamsungMnHeader::write
_ZN5Exiv28Internal13SigmaMnHeader15sizeOfSignatureEv:
  533|  1.17k|size_t SigmaMnHeader::sizeOfSignature() {
  534|  1.17k|  return sizeof(signature1_);
  535|  1.17k|}
_ZN5Exiv28Internal13SigmaMnHeaderC2Ev:
  537|    137|SigmaMnHeader::SigmaMnHeader() {
  538|    137|  read(signature1_, sizeOfSignature(), invalidByteOrder);
  539|    137|}
_ZNK5Exiv28Internal13SigmaMnHeader9ifdOffsetEv:
  545|     74|size_t SigmaMnHeader::ifdOffset() const {
  546|     74|  return start_;
  547|     74|}
_ZN5Exiv28Internal13SigmaMnHeader4readEPKhmNS_9ByteOrderE:
  549|    274|bool SigmaMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  550|    274|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (550:7): [True: 0, False: 274]
  |  Branch (550:17): [True: 0, False: 274]
  ------------------
  551|      0|    return false;
  552|    274|  if (0 != memcmp(pData, signature1_, 8) && 0 != memcmp(pData, signature2_, 8))
  ------------------
  |  Branch (552:7): [True: 102, False: 172]
  |  Branch (552:45): [True: 63, False: 39]
  ------------------
  553|     63|    return false;
  554|    211|  buf_.alloc(sizeOfSignature());
  555|    211|  std::copy_n(pData, buf_.size(), buf_.begin());
  556|    211|  start_ = sizeOfSignature();
  557|    211|  return true;
  558|    274|}  // SigmaMnHeader::read
_ZN5Exiv28Internal12SonyMnHeader15sizeOfSignatureEv:
  567|  11.3k|size_t SonyMnHeader::sizeOfSignature() {
  568|  11.3k|  return sizeof(signature_);
  569|  11.3k|}
_ZN5Exiv28Internal12SonyMnHeaderC2Ev:
  571|  1.11k|SonyMnHeader::SonyMnHeader() {
  572|  1.11k|  read(signature_, sizeOfSignature(), invalidByteOrder);
  573|  1.11k|}
_ZNK5Exiv28Internal12SonyMnHeader4sizeEv:
  575|    216|size_t SonyMnHeader::size() const {
  576|    216|  return sizeOfSignature();
  577|    216|}
_ZNK5Exiv28Internal12SonyMnHeader9ifdOffsetEv:
  579|  1.09k|size_t SonyMnHeader::ifdOffset() const {
  580|  1.09k|  return start_;
  581|  1.09k|}
_ZN5Exiv28Internal12SonyMnHeader4readEPKhmNS_9ByteOrderE:
  583|  2.20k|bool SonyMnHeader::read(const byte* pData, size_t size, ByteOrder) {
  584|  2.20k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (584:7): [True: 0, False: 2.20k]
  |  Branch (584:17): [True: 0, False: 2.20k]
  ------------------
  585|      0|    return false;
  586|  2.20k|  if (0 != memcmp(pData, signature_, sizeOfSignature()))
  ------------------
  |  Branch (586:7): [True: 0, False: 2.20k]
  ------------------
  587|      0|    return false;
  588|  2.20k|  buf_.alloc(sizeOfSignature());
  589|  2.20k|  std::copy_n(pData, buf_.size(), buf_.begin());
  590|  2.20k|  start_ = sizeOfSignature();
  591|  2.20k|  return true;
  592|  2.20k|}  // SonyMnHeader::read
_ZNK5Exiv28Internal12SonyMnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  594|     24|size_t SonyMnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  595|     24|  ioWrapper.write(signature_, sizeOfSignature());
  596|     24|  return sizeOfSignature();
  597|     24|}  // SonyMnHeader::write
_ZN5Exiv28Internal14Casio2MnHeader15sizeOfSignatureEv:
  602|  6.93k|size_t Casio2MnHeader::sizeOfSignature() {
  603|  6.93k|  return sizeof(signature_);
  604|  6.93k|}
_ZN5Exiv28Internal14Casio2MnHeaderC2Ev:
  606|    767|Casio2MnHeader::Casio2MnHeader() {
  607|    767|  read(signature_, sizeOfSignature(), invalidByteOrder);
  608|    767|}
_ZNK5Exiv28Internal14Casio2MnHeader4sizeEv:
  610|     45|size_t Casio2MnHeader::size() const {
  611|     45|  return sizeOfSignature();
  612|     45|}
_ZNK5Exiv28Internal14Casio2MnHeader9ifdOffsetEv:
  614|    762|size_t Casio2MnHeader::ifdOffset() const {
  615|    762|  return start_;
  616|    762|}
_ZNK5Exiv28Internal14Casio2MnHeader9byteOrderEv:
  618|  3.06k|ByteOrder Casio2MnHeader::byteOrder() const {
  619|  3.06k|  return byteOrder_;
  620|  3.06k|}
_ZN5Exiv28Internal14Casio2MnHeader4readEPKhmNS_9ByteOrderE:
  622|  1.52k|bool Casio2MnHeader::read(const byte* pData, size_t size, ByteOrder) {
  623|  1.52k|  if (!pData || size < sizeOfSignature())
  ------------------
  |  Branch (623:7): [True: 0, False: 1.52k]
  |  Branch (623:17): [True: 0, False: 1.52k]
  ------------------
  624|      0|    return false;
  625|  1.52k|  if (0 != memcmp(pData, signature_, sizeOfSignature()))
  ------------------
  |  Branch (625:7): [True: 0, False: 1.52k]
  ------------------
  626|      0|    return false;
  627|  1.52k|  buf_.alloc(sizeOfSignature());
  628|  1.52k|  std::copy_n(pData, buf_.size(), buf_.begin());
  629|  1.52k|  start_ = sizeOfSignature();
  630|  1.52k|  return true;
  631|  1.52k|}  // Casio2MnHeader::read
_ZNK5Exiv28Internal14Casio2MnHeader5writeERNS0_9IoWrapperENS_9ByteOrderE:
  633|      5|size_t Casio2MnHeader::write(IoWrapper& ioWrapper, ByteOrder) const {
  634|      5|  ioWrapper.write(signature_, sizeOfSignature());
  635|      5|  return sizeOfSignature();
  636|      5|}  // Casio2MnHeader::write
_ZN5Exiv28Internal8newIfdMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  642|  4.87k|                                           ByteOrder) {
  643|       |  // Require at least an IFD with 1 entry, but not necessarily a next pointer
  644|  4.87k|  if (size < 14)
  ------------------
  |  Branch (644:7): [True: 607, False: 4.26k]
  ------------------
  645|    607|    return nullptr;
  646|  4.26k|  return newIfdMn2(tag, group, mnGroup);
  647|  4.87k|}
_ZN5Exiv28Internal9newIfdMn2EtNS_5IfdIdES1_:
  649|  5.88k|std::unique_ptr<TiffIfdMakernote> newIfdMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  650|  5.88k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, nullptr);
  651|  5.88k|}
_ZN5Exiv28Internal12newOlympusMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  654|  4.82k|                                               ByteOrder) {
  655|       |  // FIXME: workaround for overwritten OM System header in Olympus files (https://github.com/Exiv2/exiv2/issues/2542)
  656|  4.82k|  if (size >= 14 && std::string(reinterpret_cast<const char*>(pData), 14) == std::string("OM SYSTEM\0\0\0II", 14)) {
  ------------------
  |  Branch (656:7): [True: 4.58k, False: 245]
  |  Branch (656:7): [True: 31, False: 4.79k]
  |  Branch (656:21): [True: 31, False: 4.54k]
  ------------------
  657|       |    // Require at least the header and an IFD with 1 entry
  658|     31|    if (size < OMSystemMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (658:9): [True: 10, False: 21]
  ------------------
  659|     10|      return nullptr;
  660|     21|    return newOMSystemMn2(tag, group, IfdId::olympus2Id);
  661|     31|  }
  662|  4.79k|  if (size < 10 || std::string(reinterpret_cast<const char*>(pData), 10) != std::string("OLYMPUS\0II", 10)) {
  ------------------
  |  Branch (662:7): [True: 233, False: 4.56k]
  |  Branch (662:7): [True: 605, False: 4.18k]
  |  Branch (662:20): [True: 372, False: 4.18k]
  ------------------
  663|       |    // Require at least the header and an IFD with 1 entry
  664|    605|    if (size < OlympusMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (664:9): [True: 276, False: 329]
  ------------------
  665|    276|      return nullptr;
  666|    329|    return newOlympusMn2(tag, group, IfdId::olympusId);
  667|    605|  }
  668|       |  // Require at least the header and an IFD with 1 entry
  669|  4.18k|  if (size < Olympus2MnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (669:7): [True: 75, False: 4.11k]
  ------------------
  670|     75|    return nullptr;
  671|  4.11k|  return newOlympus2Mn2(tag, group, IfdId::olympus2Id);
  672|  4.18k|}
_ZN5Exiv28Internal13newOlympusMn2EtNS_5IfdIdES1_:
  674|    389|std::unique_ptr<TiffIfdMakernote> newOlympusMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  675|    389|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<OlympusMnHeader>());
  676|    389|}
_ZN5Exiv28Internal14newOlympus2Mn2EtNS_5IfdIdES1_:
  678|  4.11k|std::unique_ptr<TiffIfdMakernote> newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  679|  4.11k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<Olympus2MnHeader>());
  680|  4.11k|}
_ZN5Exiv28Internal13newOMSystemMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  683|    152|                                                ByteOrder) {
  684|       |  // Require at least the header and an IFD with 1 entry
  685|    152|  if (size < OMSystemMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (685:7): [True: 93, False: 59]
  ------------------
  686|     93|    return nullptr;
  687|     59|  return newOMSystemMn2(tag, group, mnGroup);
  688|    152|}
_ZN5Exiv28Internal14newOMSystemMn2EtNS_5IfdIdES1_:
  690|  3.85k|std::unique_ptr<TiffIfdMakernote> newOMSystemMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  691|  3.85k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<OMSystemMnHeader>());
  692|  3.85k|}
_ZN5Exiv28Internal9newFujiMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  695|  2.79k|                                            ByteOrder) {
  696|       |  // Require at least the header and an IFD with 1 entry
  697|  2.79k|  if (size < FujiMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (697:7): [True: 655, False: 2.14k]
  ------------------
  698|    655|    return nullptr;
  699|  2.14k|  return newFujiMn2(tag, group, mnGroup);
  700|  2.79k|}
_ZN5Exiv28Internal10newFujiMn2EtNS_5IfdIdES1_:
  702|  2.14k|std::unique_ptr<TiffIfdMakernote> newFujiMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  703|  2.14k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<FujiMnHeader>());
  704|  2.14k|}
_ZN5Exiv28Internal10newNikonMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  707|  3.15k|                                             ByteOrder) {
  708|       |  // If there is no "Nikon" string it must be Nikon1 format
  709|  3.15k|  if (size < 6 || std::string(reinterpret_cast<const char*>(pData), 6) != std::string("Nikon\0", 6)) {
  ------------------
  |  Branch (709:7): [True: 487, False: 2.66k]
  |  Branch (709:7): [True: 990, False: 2.16k]
  |  Branch (709:19): [True: 503, False: 2.16k]
  ------------------
  710|       |    // Require at least an IFD with 1 entry
  711|    990|    if (size < 18)
  ------------------
  |  Branch (711:9): [True: 511, False: 479]
  ------------------
  712|    511|      return nullptr;
  713|    479|    return newIfdMn2(tag, group, IfdId::nikon1Id);
  714|    990|  }
  715|       |  // If the "Nikon" string is not followed by a TIFF header, we assume
  716|       |  // Nikon2 format
  717|  2.16k|  TiffHeader tiffHeader;
  718|  2.16k|  if (size < 18 || !tiffHeader.read(pData + 10, size - 10) || tiffHeader.tag() != 0x002a) {
  ------------------
  |  Branch (718:7): [True: 5, False: 2.15k]
  |  Branch (718:20): [True: 208, False: 1.94k]
  |  Branch (718:63): [True: 20, False: 1.92k]
  ------------------
  719|       |    // Require at least the header and an IFD with 1 entry
  720|    233|    if (size < Nikon2MnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (720:9): [True: 26, False: 207]
  ------------------
  721|     26|      return nullptr;
  722|    207|    return newNikon2Mn2(tag, group, IfdId::nikon2Id);
  723|    233|  }
  724|       |  // Else we have a Nikon3 makernote
  725|       |  // Require at least the header and an IFD with 1 entry
  726|  1.92k|  if (size < Nikon3MnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (726:7): [True: 11, False: 1.91k]
  ------------------
  727|     11|    return nullptr;
  728|  1.91k|  return newNikon3Mn2(tag, group, IfdId::nikon3Id);
  729|  1.92k|}
_ZN5Exiv28Internal12newNikon2Mn2EtNS_5IfdIdES1_:
  731|    224|std::unique_ptr<TiffIfdMakernote> newNikon2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  732|    224|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<Nikon2MnHeader>());
  733|    224|}
_ZN5Exiv28Internal12newNikon3Mn2EtNS_5IfdIdES1_:
  735|  1.99k|std::unique_ptr<TiffIfdMakernote> newNikon3Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  736|  1.99k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<Nikon3MnHeader>());
  737|  1.99k|}
_ZN5Exiv28Internal14newPanasonicMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  740|  2.37k|                                                 ByteOrder) {
  741|       |  // Require at least the header and an IFD with 1 entry, but without a next pointer
  742|  2.37k|  if (size < PanasonicMnHeader::sizeOfSignature() + 14)
  ------------------
  |  Branch (742:7): [True: 246, False: 2.12k]
  ------------------
  743|    246|    return nullptr;
  744|  2.12k|  return newPanasonicMn2(tag, group, mnGroup);
  745|  2.37k|}
_ZN5Exiv28Internal15newPanasonicMn2EtNS_5IfdIdES1_:
  747|  2.13k|std::unique_ptr<TiffIfdMakernote> newPanasonicMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  748|  2.13k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<PanasonicMnHeader>(), false);
  749|  2.13k|}
_ZN5Exiv28Internal11newPentaxMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  752|  3.41k|                                              ByteOrder) {
  753|  3.41k|  if (size > 8 && std::string(reinterpret_cast<const char*>(pData), 8) == std::string("PENTAX \0", 8)) {
  ------------------
  |  Branch (753:7): [True: 3.16k, False: 256]
  |  Branch (753:7): [True: 2.82k, False: 596]
  |  Branch (753:19): [True: 2.82k, False: 340]
  ------------------
  754|       |    // Require at least the header and an IFD with 1 entry
  755|  2.82k|    if (size < PentaxDngMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (755:9): [True: 15, False: 2.80k]
  ------------------
  756|     15|      return nullptr;
  757|  2.80k|    return newPentaxDngMn2(tag, group, (tag == 0xc634 ? IfdId::pentaxDngId : IfdId::pentaxId));
  ------------------
  |  Branch (757:41): [True: 2.80k, False: 0]
  ------------------
  758|  2.82k|  }
  759|    596|  if (size > 4 && std::string(reinterpret_cast<const char*>(pData), 4) == std::string("AOC\0", 4)) {
  ------------------
  |  Branch (759:7): [True: 359, False: 237]
  |  Branch (759:7): [True: 87, False: 509]
  |  Branch (759:19): [True: 87, False: 272]
  ------------------
  760|       |    // Require at least the header and an IFD with 1 entry
  761|     87|    if (size < PentaxMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (761:9): [True: 19, False: 68]
  ------------------
  762|     19|      return nullptr;
  763|     68|    return newPentaxMn2(tag, group, IfdId::pentaxId);
  764|     87|  }
  765|    509|  return nullptr;
  766|    596|}
_ZN5Exiv28Internal12newPentaxMn2EtNS_5IfdIdES1_:
  768|     89|std::unique_ptr<TiffIfdMakernote> newPentaxMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  769|     89|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<PentaxMnHeader>());
  770|     89|}
_ZN5Exiv28Internal15newPentaxDngMn2EtNS_5IfdIdES1_:
  772|  4.20k|std::unique_ptr<TiffIfdMakernote> newPentaxDngMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  773|  4.20k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<PentaxDngMnHeader>());
  774|  4.20k|}
_ZN5Exiv28Internal12newSamsungMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  777|    323|                                               ByteOrder) {
  778|    323|  if (size > 4 && std::string(reinterpret_cast<const char*>(pData), 4) == std::string("AOC\0", 4)) {
  ------------------
  |  Branch (778:7): [True: 237, False: 86]
  |  Branch (778:7): [True: 63, False: 260]
  |  Branch (778:19): [True: 63, False: 174]
  ------------------
  779|       |    // Samsung branded Pentax camera:
  780|       |    // Require at least the header and an IFD with 1 entry
  781|     63|    if (size < PentaxMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (781:9): [True: 42, False: 21]
  ------------------
  782|     42|      return nullptr;
  783|     21|    return newPentaxMn2(tag, group, IfdId::pentaxId);
  784|     63|  }
  785|       |  // Genuine Samsung camera:
  786|       |  // Require at least an IFD with 1 entry
  787|    260|  if (size < 18)
  ------------------
  |  Branch (787:7): [True: 128, False: 132]
  ------------------
  788|    128|    return nullptr;
  789|    132|  return newSamsungMn2(tag, group, mnGroup);
  790|    260|}
_ZN5Exiv28Internal13newSamsungMn2EtNS_5IfdIdES1_:
  792|    151|std::unique_ptr<TiffIfdMakernote> newSamsungMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  793|    151|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<SamsungMnHeader>());
  794|    151|}
_ZN5Exiv28Internal10newSigmaMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  797|    342|                                             ByteOrder) {
  798|       |  // Require at least the header and an IFD with 1 entry
  799|    342|  if (size < SigmaMnHeader::sizeOfSignature() + 18)
  ------------------
  |  Branch (799:7): [True: 205, False: 137]
  ------------------
  800|    205|    return nullptr;
  801|    137|  return newSigmaMn2(tag, group, mnGroup);
  802|    342|}
_ZN5Exiv28Internal11newSigmaMn2EtNS_5IfdIdES1_:
  804|    137|std::unique_ptr<TiffIfdMakernote> newSigmaMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  805|    137|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<SigmaMnHeader>());
  806|    137|}
_ZN5Exiv28Internal9newSonyMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  809|  10.9k|                                            ByteOrder) {
  810|       |  // If there is no "SONY DSC " string we assume it's a simple IFD Makernote
  811|  10.9k|  if (size < 12 || std::string(reinterpret_cast<const char*>(pData), 12) != std::string("SONY DSC \0\0\0", 12)) {
  ------------------
  |  Branch (811:7): [True: 1.54k, False: 9.43k]
  |  Branch (811:7): [True: 9.86k, False: 1.11k]
  |  Branch (811:20): [True: 8.31k, False: 1.11k]
  ------------------
  812|       |    // Require at least an IFD with 1 entry
  813|  9.86k|    if (size < 18)
  ------------------
  |  Branch (813:9): [True: 1.56k, False: 8.30k]
  ------------------
  814|  1.56k|      return nullptr;
  815|  8.30k|    return newSony2Mn2(tag, group, IfdId::sony2Id);
  816|  9.86k|  }
  817|       |  // Require at least the header and an IFD with 1 entry, but without a next pointer
  818|  1.11k|  if (size < SonyMnHeader::sizeOfSignature() + 14)
  ------------------
  |  Branch (818:7): [True: 26, False: 1.09k]
  ------------------
  819|     26|    return nullptr;
  820|  1.09k|  return newSony1Mn2(tag, group, IfdId::sony1Id);
  821|  1.11k|}
_ZN5Exiv28Internal11newSony1Mn2EtNS_5IfdIdES1_:
  823|  1.11k|std::unique_ptr<TiffIfdMakernote> newSony1Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  824|  1.11k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<SonyMnHeader>(), false);
  825|  1.11k|}
_ZN5Exiv28Internal11newSony2Mn2EtNS_5IfdIdES1_:
  827|  8.33k|std::unique_ptr<TiffIfdMakernote> newSony2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  828|  8.33k|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, nullptr, true);
  829|  8.33k|}
_ZN5Exiv28Internal10newCasioMnEtNS_5IfdIdES1_PKhmNS_9ByteOrderE:
  832|  1.78k|                                             ByteOrder) {
  833|  1.78k|  if (size > 6 && std::string(reinterpret_cast<const char*>(pData), 6) == std::string("QVC\0\0\0", 6))
  ------------------
  |  Branch (833:7): [True: 1.46k, False: 319]
  |  Branch (833:7): [True: 762, False: 1.02k]
  |  Branch (833:19): [True: 762, False: 706]
  ------------------
  834|    762|    return newCasio2Mn2(tag, group, IfdId::casio2Id);
  835|       |  // Require at least an IFD with 1 entry, but not necessarily a next pointer
  836|  1.02k|  if (size < 14)
  ------------------
  |  Branch (836:7): [True: 337, False: 688]
  ------------------
  837|    337|    return nullptr;
  838|    688|  return newIfdMn2(tag, group, IfdId::casioId);
  839|  1.02k|}
_ZN5Exiv28Internal12newCasio2Mn2EtNS_5IfdIdES1_:
  841|    767|std::unique_ptr<TiffIfdMakernote> newCasio2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
  842|    767|  return std::make_unique<TiffIfdMakernote>(tag, group, mnGroup, std::make_unique<Casio2MnHeader>());
  843|    767|}
_ZN5Exiv28Internal13nikonSelectorEtPKhmPNS0_13TiffComponentE:
  910|    393|int nikonSelector(uint16_t tag, const byte* pData, size_t size, TiffComponent* /*pRoot*/) {
  911|    393|  if (size < 4)
  ------------------
  |  Branch (911:7): [True: 6, False: 387]
  ------------------
  912|      6|    return -1;
  913|       |
  914|    387|  auto ix = NikonArrayIdx::Key{tag, reinterpret_cast<const char*>(pData), size};
  915|    387|  if (auto it = Exiv2::find(nikonArrayIdx, ix))
  ------------------
  |  Branch (915:12): [True: 331, False: 56]
  ------------------
  916|    331|    return it->idx_;
  917|     56|  return -1;
  918|    387|}
_ZN5Exiv28Internal10nikonCryptEtPKhmPNS0_13TiffComponentE:
  920|    231|DataBuf nikonCrypt(uint16_t tag, const byte* pData, size_t size, TiffComponent* pRoot) {
  921|    231|  DataBuf buf;
  922|       |
  923|    231|  if (size < 4)
  ------------------
  |  Branch (923:7): [True: 0, False: 231]
  ------------------
  924|      0|    return buf;
  925|    231|  auto nci = Exiv2::find(nikonArrayIdx, NikonArrayIdx::Key{tag, reinterpret_cast<const char*>(pData), size});
  926|    231|  if (!nci || nci->start_ == NA || size <= nci->start_)
  ------------------
  |  |  865|    462|#define NA std::numeric_limits<uint32_t>::max()
  ------------------
  |  Branch (926:7): [True: 0, False: 231]
  |  Branch (926:15): [True: 8, False: 223]
  |  Branch (926:36): [True: 27, False: 196]
  ------------------
  927|     35|    return buf;
  928|       |
  929|       |  // Find Exif.Nikon3.ShutterCount
  930|    196|  TiffFinder finder(0x00a7, IfdId::nikon3Id);
  931|    196|  pRoot->accept(finder);
  932|    196|  auto te = dynamic_cast<const TiffEntryBase*>(finder.result());
  933|    196|  if (!te || !te->pValue() || te->pValue()->count() == 0)
  ------------------
  |  Branch (933:7): [True: 38, False: 158]
  |  Branch (933:14): [True: 81, False: 77]
  |  Branch (933:31): [True: 14, False: 63]
  ------------------
  934|    133|    return buf;
  935|     63|  auto count = te->pValue()->toUint32();
  936|       |
  937|       |  // Find Exif.Nikon3.SerialNumber
  938|     63|  finder.init(0x001d, IfdId::nikon3Id);
  939|     63|  pRoot->accept(finder);
  940|     63|  te = dynamic_cast<const TiffEntryBase*>(finder.result());
  941|     63|  if (!te || !te->pValue() || te->pValue()->count() == 0)
  ------------------
  |  Branch (941:7): [True: 17, False: 46]
  |  Branch (941:14): [True: 12, False: 34]
  |  Branch (941:31): [True: 6, False: 28]
  ------------------
  942|     35|    return buf;
  943|     28|  bool ok(false);
  944|     28|  auto serial = stringTo<uint32_t>(te->pValue()->toString(), ok);
  945|     28|  if (!ok) {
  ------------------
  |  Branch (945:7): [True: 16, False: 12]
  ------------------
  946|     16|    std::string model = getExifModel(pRoot);
  947|     16|    if (model.empty())
  ------------------
  |  Branch (947:9): [True: 9, False: 7]
  ------------------
  948|      9|      return buf;
  949|      7|    if (Internal::contains(model, "D50")) {
  ------------------
  |  Branch (949:9): [True: 0, False: 7]
  ------------------
  950|      0|      serial = 0x22;
  951|      7|    } else {
  952|      7|      serial = 0x60;
  953|      7|    }
  954|      7|  }
  955|     19|  buf.alloc(size);
  956|     19|  std::copy_n(pData, buf.size(), buf.begin());
  957|     19|  ncrypt(buf.data(nci->start_), static_cast<uint32_t>(buf.size()) - nci->start_, count, serial);
  958|     19|  return buf;
  959|     28|}
_ZN5Exiv28Internal14sonyCsSelectorEtPKhmPNS0_13TiffComponentE:
  961|    732|int sonyCsSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
  962|    732|  std::string model = getExifModel(pRoot);
  963|    732|  if (model.empty())
  ------------------
  |  Branch (963:7): [True: 111, False: 621]
  ------------------
  964|    111|    return -1;
  965|    621|  int idx = 0;
  966|    621|  if (Internal::contains(model, "DSLR-A330") || Internal::contains(model, "DSLR-A380")) {
  ------------------
  |  Branch (966:7): [True: 3, False: 618]
  |  Branch (966:49): [True: 27, False: 591]
  ------------------
  967|     30|    idx = 1;
  968|     30|  }
  969|    621|  return idx;
  970|    732|}
_ZN5Exiv28Internal17sony2010eSelectorEtPKhmPNS0_13TiffComponentE:
  971|     66|int sony2010eSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
  972|     66|  static constexpr const char* models[] = {
  973|     66|      "SLT-A58",   "SLT-A99",  "ILCE-3000", "ILCE-3500", "NEX-3N",    "NEX-5R",   "NEX-5T",
  974|     66|      "NEX-6",     "VG30E",    "VG900",     "DSC-RX100", "DSC-RX1",   "DSC-RX1R", "DSC-HX300",
  975|     66|      "DSC-HX50V", "DSC-TX30", "DSC-WX60",  "DSC-WX200", "DSC-WX300",
  976|     66|  };
  977|     66|  return Exiv2::find(models, getExifModel(pRoot)) ? 0 : -1;
  ------------------
  |  Branch (977:10): [True: 7, False: 59]
  ------------------
  978|     66|}
_ZN5Exiv28Internal15sony2FpSelectorEtPKhmPNS0_13TiffComponentE:
  980|    395|int sony2FpSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
  981|       |  // Not valid for models beginning
  982|    395|  std::string model = getExifModel(pRoot);
  983|    395|  for (auto str : {"SLT-", "HV", "ILCA-"})
  ------------------
  |  Branch (983:17): [True: 1.11k, False: 345]
  ------------------
  984|  1.11k|    if (model.starts_with(str))
  ------------------
  |  Branch (984:9): [True: 50, False: 1.06k]
  ------------------
  985|     50|      return -1;
  986|    345|  return 0;
  987|    395|}
_ZN5Exiv28Internal18sonyMisc2bSelectorEtPKhmPNS0_13TiffComponentE:
  989|     96|int sonyMisc2bSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
  990|       |  // From Exiftool: https://github.com/exiftool/exiftool/blob/master/lib/Image/ExifTool/Sony.pm
  991|       |  // >  First byte must be 9 or 12 or 13 or 15 or 16 and 4th byte must be 2 (deciphered)
  992|       |
  993|       |  // Get the value from the image format that is being used
  994|     96|  auto value = getExifValue(pRoot, 0x9404, Exiv2::IfdId::sony1Id);
  995|     96|  if (!value) {
  ------------------
  |  Branch (995:7): [True: 45, False: 51]
  ------------------
  996|     45|    value = getExifValue(pRoot, 0x9404, Exiv2::IfdId::sony2Id);
  997|     45|    if (!value)
  ------------------
  |  Branch (997:9): [True: 0, False: 45]
  ------------------
  998|      0|      return -1;
  999|     45|  }
 1000|       |
 1001|     96|  if (value->count() < 4)
  ------------------
  |  Branch (1001:7): [True: 14, False: 82]
  ------------------
 1002|     14|    return -1;
 1003|       |
 1004|     82|  switch (value->toInt64(0)) {                 // Using encrypted values
 1005|      3|    case 231:                                  // 231 == 9
  ------------------
  |  Branch (1005:5): [True: 3, False: 79]
  ------------------
 1006|     12|    case 234:                                  // 234 == 12
  ------------------
  |  Branch (1006:5): [True: 9, False: 73]
  ------------------
 1007|     18|    case 205:                                  // 205 == 13
  ------------------
  |  Branch (1007:5): [True: 6, False: 76]
  ------------------
 1008|     44|    case 138:                                  // 138 == 15
  ------------------
  |  Branch (1008:5): [True: 26, False: 56]
  ------------------
 1009|     56|    case 112:                                  // 112 == 16
  ------------------
  |  Branch (1009:5): [True: 12, False: 70]
  ------------------
 1010|     56|      return value->toInt64(3) == 8 ? 0 : -1;  // 8   == 2
  ------------------
  |  Branch (1010:14): [True: 33, False: 23]
  ------------------
 1011|     26|    default:
  ------------------
  |  Branch (1011:5): [True: 26, False: 56]
  ------------------
 1012|     26|      break;
 1013|     82|  }
 1014|     26|  return -1;
 1015|     82|}
_ZN5Exiv28Internal18sonyMisc3cSelectorEtPKhmPNS0_13TiffComponentE:
 1016|    260|int sonyMisc3cSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
 1017|       |  // For condition, see Exiftool (Tag 9400c):
 1018|       |  // https://github.com/exiftool/exiftool/blob/2200871d9cef988051d2a99d67df3bda6cbb30a8/lib/Image/ExifTool/Sony.pm#L1826
 1019|       |
 1020|       |  // Get the value from the image format that is being used
 1021|    260|  auto value = getExifValue(pRoot, 0x9400, Exiv2::IfdId::sony1Id);
 1022|    260|  if (!value) {
  ------------------
  |  Branch (1022:7): [True: 56, False: 204]
  ------------------
 1023|     56|    value = getExifValue(pRoot, 0x9400, Exiv2::IfdId::sony2Id);
 1024|     56|    if (!value)
  ------------------
  |  Branch (1024:9): [True: 0, False: 56]
  ------------------
 1025|      0|      return -1;
 1026|     56|  }
 1027|       |
 1028|    260|  if (value->count() < 1)
  ------------------
  |  Branch (1028:7): [True: 1, False: 259]
  ------------------
 1029|      1|    return -1;
 1030|       |
 1031|    259|  switch (value->toInt64()) {
 1032|     45|    case 35:  // 0x23 for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2
  ------------------
  |  Branch (1032:5): [True: 45, False: 214]
  ------------------
 1033|     61|    case 36:  // 0x24 for ILCA-99M2,ILCE-5100/6300/6500/7M2/7RM2/7S/7SM2/QX1,
  ------------------
  |  Branch (1033:5): [True: 16, False: 243]
  ------------------
 1034|       |              // DSC-HX80/HX90V/QX30/RX0/RX100M3/RX100M4/RX100M5/RX10M2/RX10M3/RX1RM2/WX500
 1035|     68|    case 38:  // 0x26 for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX95/HX99
  ------------------
  |  Branch (1035:5): [True: 7, False: 252]
  ------------------
 1036|    112|    case 40:  // 0x28 for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/1F/1M2/E10
  ------------------
  |  Branch (1036:5): [True: 44, False: 215]
  ------------------
 1037|    144|    case 49:  // 0x31 for ILCE-1/7M4/7SM3, ILME-FX3
  ------------------
  |  Branch (1037:5): [True: 32, False: 227]
  ------------------
 1038|    155|    case 50:  // 0x32 for ILCE-7RM5, ILME-FX30
  ------------------
  |  Branch (1038:5): [True: 11, False: 248]
  ------------------
 1039|    183|    case 51:  // 0x33 for ILCE-6700/7CM2/7CR/9M3, ZV-E1
  ------------------
  |  Branch (1039:5): [True: 28, False: 231]
  ------------------
 1040|    196|    case 52:  // 0x34 for DSC-RX10M5
  ------------------
  |  Branch (1040:5): [True: 13, False: 246]
  ------------------
 1041|    206|    case 65:  // 0x41 for ILCE-7M5
  ------------------
  |  Branch (1041:5): [True: 10, False: 249]
  ------------------
 1042|    212|    case 67:  // 0x43 for ILCE-7RM6
  ------------------
  |  Branch (1042:5): [True: 6, False: 253]
  ------------------
 1043|    212|      return 0;
 1044|     47|    default:
  ------------------
  |  Branch (1044:5): [True: 47, False: 212]
  ------------------
 1045|     47|      break;
 1046|    259|  }
 1047|     47|  return -1;
 1048|    259|}
makernote_int.cpp:_ZN12_GLOBAL__N_112getExifValueEPN5Exiv28Internal13TiffComponentEtNS0_5IfdIdE:
 1054|  1.66k|const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, uint16_t tag, Exiv2::IfdId group) {
 1055|  1.66k|  Exiv2::Internal::TiffFinder finder(tag, group);
 1056|  1.66k|  if (!pRoot)
  ------------------
  |  Branch (1056:7): [True: 0, False: 1.66k]
  ------------------
 1057|      0|    return nullptr;
 1058|  1.66k|  pRoot->accept(finder);
 1059|  1.66k|  auto te = dynamic_cast<const Exiv2::Internal::TiffEntryBase*>(finder.result());
 1060|  1.66k|  return (!te || !te->pValue()) ? nullptr : te->pValue();
  ------------------
  |  Branch (1060:11): [True: 280, False: 1.38k]
  |  Branch (1060:18): [True: 72, False: 1.31k]
  ------------------
 1061|  1.66k|}
makernote_int.cpp:_ZN12_GLOBAL__N_112getExifModelEPN5Exiv28Internal13TiffComponentE:
 1063|  1.20k|std::string getExifModel(Exiv2::Internal::TiffComponent* pRoot) {
 1064|       |  // Lookup the Exif.Image.Model tag
 1065|  1.20k|  const auto value = getExifValue(pRoot, 0x0110, Exiv2::IfdId::ifd0Id);
 1066|  1.20k|  return (!value || value->count() == 0) ? std::string() : value->toString();
  ------------------
  |  Branch (1066:11): [True: 251, False: 958]
  |  Branch (1066:21): [True: 55, False: 903]
  ------------------
 1067|  1.20k|}
makernote_int.cpp:_ZN12_GLOBAL__N_16ncryptEPhjjj:
 1069|     19|void ncrypt(Exiv2::byte* pData, uint32_t size, uint32_t count, uint32_t serial) {
 1070|     19|  static const Exiv2::byte xlat[2][256] = {
 1071|     19|      {0xc1, 0xbf, 0x6d, 0x0d, 0x59, 0xc5, 0x13, 0x9d, 0x83, 0x61, 0x6b, 0x4f, 0xc7, 0x7f, 0x3d, 0x3d, 0x53, 0x59, 0xe3,
 1072|     19|       0xc7, 0xe9, 0x2f, 0x95, 0xa7, 0x95, 0x1f, 0xdf, 0x7f, 0x2b, 0x29, 0xc7, 0x0d, 0xdf, 0x07, 0xef, 0x71, 0x89, 0x3d,
 1073|     19|       0x13, 0x3d, 0x3b, 0x13, 0xfb, 0x0d, 0x89, 0xc1, 0x65, 0x1f, 0xb3, 0x0d, 0x6b, 0x29, 0xe3, 0xfb, 0xef, 0xa3, 0x6b,
 1074|     19|       0x47, 0x7f, 0x95, 0x35, 0xa7, 0x47, 0x4f, 0xc7, 0xf1, 0x59, 0x95, 0x35, 0x11, 0x29, 0x61, 0xf1, 0x3d, 0xb3, 0x2b,
 1075|     19|       0x0d, 0x43, 0x89, 0xc1, 0x9d, 0x9d, 0x89, 0x65, 0xf1, 0xe9, 0xdf, 0xbf, 0x3d, 0x7f, 0x53, 0x97, 0xe5, 0xe9, 0x95,
 1076|     19|       0x17, 0x1d, 0x3d, 0x8b, 0xfb, 0xc7, 0xe3, 0x67, 0xa7, 0x07, 0xf1, 0x71, 0xa7, 0x53, 0xb5, 0x29, 0x89, 0xe5, 0x2b,
 1077|     19|       0xa7, 0x17, 0x29, 0xe9, 0x4f, 0xc5, 0x65, 0x6d, 0x6b, 0xef, 0x0d, 0x89, 0x49, 0x2f, 0xb3, 0x43, 0x53, 0x65, 0x1d,
 1078|     19|       0x49, 0xa3, 0x13, 0x89, 0x59, 0xef, 0x6b, 0xef, 0x65, 0x1d, 0x0b, 0x59, 0x13, 0xe3, 0x4f, 0x9d, 0xb3, 0x29, 0x43,
 1079|     19|       0x2b, 0x07, 0x1d, 0x95, 0x59, 0x59, 0x47, 0xfb, 0xe5, 0xe9, 0x61, 0x47, 0x2f, 0x35, 0x7f, 0x17, 0x7f, 0xef, 0x7f,
 1080|     19|       0x95, 0x95, 0x71, 0xd3, 0xa3, 0x0b, 0x71, 0xa3, 0xad, 0x0b, 0x3b, 0xb5, 0xfb, 0xa3, 0xbf, 0x4f, 0x83, 0x1d, 0xad,
 1081|     19|       0xe9, 0x2f, 0x71, 0x65, 0xa3, 0xe5, 0x07, 0x35, 0x3d, 0x0d, 0xb5, 0xe9, 0xe5, 0x47, 0x3b, 0x9d, 0xef, 0x35, 0xa3,
 1082|     19|       0xbf, 0xb3, 0xdf, 0x53, 0xd3, 0x97, 0x53, 0x49, 0x71, 0x07, 0x35, 0x61, 0x71, 0x2f, 0x43, 0x2f, 0x11, 0xdf, 0x17,
 1083|     19|       0x97, 0xfb, 0x95, 0x3b, 0x7f, 0x6b, 0xd3, 0x25, 0xbf, 0xad, 0xc7, 0xc5, 0xc5, 0xb5, 0x8b, 0xef, 0x2f, 0xd3, 0x07,
 1084|     19|       0x6b, 0x25, 0x49, 0x95, 0x25, 0x49, 0x6d, 0x71, 0xc7},
 1085|     19|      {0xa7, 0xbc, 0xc9, 0xad, 0x91, 0xdf, 0x85, 0xe5, 0xd4, 0x78, 0xd5, 0x17, 0x46, 0x7c, 0x29, 0x4c, 0x4d, 0x03, 0xe9,
 1086|     19|       0x25, 0x68, 0x11, 0x86, 0xb3, 0xbd, 0xf7, 0x6f, 0x61, 0x22, 0xa2, 0x26, 0x34, 0x2a, 0xbe, 0x1e, 0x46, 0x14, 0x68,
 1087|     19|       0x9d, 0x44, 0x18, 0xc2, 0x40, 0xf4, 0x7e, 0x5f, 0x1b, 0xad, 0x0b, 0x94, 0xb6, 0x67, 0xb4, 0x0b, 0xe1, 0xea, 0x95,
 1088|     19|       0x9c, 0x66, 0xdc, 0xe7, 0x5d, 0x6c, 0x05, 0xda, 0xd5, 0xdf, 0x7a, 0xef, 0xf6, 0xdb, 0x1f, 0x82, 0x4c, 0xc0, 0x68,
 1089|     19|       0x47, 0xa1, 0xbd, 0xee, 0x39, 0x50, 0x56, 0x4a, 0xdd, 0xdf, 0xa5, 0xf8, 0xc6, 0xda, 0xca, 0x90, 0xca, 0x01, 0x42,
 1090|     19|       0x9d, 0x8b, 0x0c, 0x73, 0x43, 0x75, 0x05, 0x94, 0xde, 0x24, 0xb3, 0x80, 0x34, 0xe5, 0x2c, 0xdc, 0x9b, 0x3f, 0xca,
 1091|     19|       0x33, 0x45, 0xd0, 0xdb, 0x5f, 0xf5, 0x52, 0xc3, 0x21, 0xda, 0xe2, 0x22, 0x72, 0x6b, 0x3e, 0xd0, 0x5b, 0xa8, 0x87,
 1092|     19|       0x8c, 0x06, 0x5d, 0x0f, 0xdd, 0x09, 0x19, 0x93, 0xd0, 0xb9, 0xfc, 0x8b, 0x0f, 0x84, 0x60, 0x33, 0x1c, 0x9b, 0x45,
 1093|     19|       0xf1, 0xf0, 0xa3, 0x94, 0x3a, 0x12, 0x77, 0x33, 0x4d, 0x44, 0x78, 0x28, 0x3c, 0x9e, 0xfd, 0x65, 0x57, 0x16, 0x94,
 1094|     19|       0x6b, 0xfb, 0x59, 0xd0, 0xc8, 0x22, 0x36, 0xdb, 0xd2, 0x63, 0x98, 0x43, 0xa1, 0x04, 0x87, 0x86, 0xf7, 0xa6, 0x26,
 1095|     19|       0xbb, 0xd6, 0x59, 0x4d, 0xbf, 0x6a, 0x2e, 0xaa, 0x2b, 0xef, 0xe6, 0x78, 0xb6, 0x4e, 0xe0, 0x2f, 0xdc, 0x7c, 0xbe,
 1096|     19|       0x57, 0x19, 0x32, 0x7e, 0x2a, 0xd0, 0xb8, 0xba, 0x29, 0x00, 0x3c, 0x52, 0x7d, 0xa8, 0x49, 0x3b, 0x2d, 0xeb, 0x25,
 1097|     19|       0x49, 0xfa, 0xa3, 0xaa, 0x39, 0xa7, 0xc5, 0xa7, 0x50, 0x11, 0x36, 0xfb, 0xc6, 0x67, 0x4a, 0xf5, 0xa5, 0x12, 0x65,
 1098|     19|       0x7e, 0xb0, 0xdf, 0xaf, 0x4e, 0xb3, 0x61, 0x7f, 0x2f},
 1099|     19|  };
 1100|     19|  Exiv2::byte key = 0;
 1101|     95|  for (int i = 0; i < 4; ++i) {
  ------------------
  |  Branch (1101:19): [True: 76, False: 19]
  ------------------
 1102|     76|    key ^= static_cast<Exiv2::byte>(count >> (i * 8));
 1103|     76|  }
 1104|     19|  Exiv2::byte ci = xlat[0][serial & 0xff];
 1105|     19|  Exiv2::byte cj = xlat[1][key];
 1106|     19|  Exiv2::byte ck = 0x60;
 1107|  1.85k|  for (uint32_t i = 0; i < size; ++i) {
  ------------------
  |  Branch (1107:24): [True: 1.83k, False: 19]
  ------------------
 1108|  1.83k|    cj += ci * ck++;
 1109|  1.83k|    pData[i] ^= cj;
 1110|  1.83k|  }
 1111|     19|}
_ZNK5Exiv28Internal13NikonArrayIdxeqERKNS1_3KeyE:
  854|  10.8k|  bool operator==(const Key& key) const {
  855|  10.8k|    return key.tag_ == tag_ && 0 == strncmp(key.ver_, ver_, strlen(ver_)) && (size_ == 0 || key.size_ == size_);
  ------------------
  |  Branch (855:12): [True: 3.45k, False: 7.41k]
  |  Branch (855:32): [True: 579, False: 2.87k]
  |  Branch (855:79): [True: 522, False: 57]
  |  Branch (855:93): [True: 40, False: 17]
  ------------------
  856|  10.8k|  }

_ZN5Exiv28Internal8MnHeaderC2Ev:
   99|  21.3k|  MnHeader() = default;
_ZN5Exiv28Internal8MnHeaderD2Ev:
  101|  21.3k|  virtual ~MnHeader() = default;

_ZN5Exiv213MatroskaVideoC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  600|  1.30k|    Image(ImageType::mkv, mdNone, std::move(io), params) {
  601|  1.30k|}  // MatroskaVideo::MatroskaVideo
_ZNK5Exiv213MatroskaVideo8mimeTypeEv:
  603|  1.30k|std::string MatroskaVideo::mimeType() const {
  604|  1.30k|  return "video/matroska";
  605|  1.30k|}
_ZN5Exiv213MatroskaVideo12readMetadataEv:
  610|  1.30k|void MatroskaVideo::readMetadata() {
  611|  1.30k|  if (io_->open() != 0)
  ------------------
  |  Branch (611:7): [True: 0, False: 1.30k]
  ------------------
  612|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  613|       |
  614|       |  // Ensure that this is the correct image type
  615|  1.30k|  if (!isMkvType(*io_, false)) {
  ------------------
  |  Branch (615:7): [True: 0, False: 1.30k]
  ------------------
  616|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (616:9): [True: 0, False: 0]
  |  Branch (616:25): [True: 0, False: 0]
  ------------------
  617|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  618|      0|    throw Error(ErrorCode::kerNotAnImage, "Matroska");
  619|      0|  }
  620|       |
  621|  1.30k|  IoCloser closer(*io_);
  622|  1.30k|  clearMetadata();
  623|  1.30k|  continueTraversing_ = true;
  624|  1.30k|  height_ = width_ = 1;
  625|       |
  626|  1.30k|  xmpData_["Xmp.video.FileSize"] = io_->size() / bytesMB;
  627|  1.30k|  xmpData_["Xmp.video.MimeType"] = mimeType();
  628|       |
  629|  50.6k|  while (continueTraversing_)
  ------------------
  |  Branch (629:10): [True: 49.3k, False: 1.30k]
  ------------------
  630|  49.3k|    decodeBlock();
  631|       |
  632|  1.30k|  xmpData_["Xmp.video.AspectRatio"] = getAspectRatio(width_, height_);
  633|  1.30k|}
_ZN5Exiv213MatroskaVideo11decodeBlockEv:
  635|  49.3k|void MatroskaVideo::decodeBlock() {
  636|  49.3k|  byte buf[8];
  637|  49.3k|  io_->read(buf, 1);
  638|       |
  639|  49.3k|  if (io_->eof()) {
  ------------------
  |  Branch (639:7): [True: 137, False: 49.1k]
  ------------------
  640|    137|    continueTraversing_ = false;
  641|    137|    return;
  642|    137|  }
  643|       |
  644|  49.1k|  uint32_t block_size = findBlockSize(buf[0]);  // 0-8
  645|  49.1k|  if (block_size > 0)
  ------------------
  |  Branch (645:7): [True: 49.0k, False: 184]
  ------------------
  646|  49.0k|    io_->readOrThrow(buf + 1, block_size - 1, ErrorCode::kerCorruptedMetadata);
  647|       |
  648|  49.1k|  auto tag_id = returnTagValue(buf, block_size);
  649|  49.1k|  const MatroskaTag* tag = Exiv2::find(matroskaTags, tag_id);
  650|       |
  651|  49.1k|  if (!tag) {
  ------------------
  |  Branch (651:7): [True: 644, False: 48.5k]
  ------------------
  652|    644|    continueTraversing_ = false;
  653|    644|    return;
  654|    644|  }
  655|       |
  656|       |  // tag->dump(std::cout);
  657|       |
  658|  48.5k|  if (tag->_id == Cues || tag->_id == Cluster) {
  ------------------
  |  Branch (658:7): [True: 226, False: 48.3k]
  |  Branch (658:27): [True: 1, False: 48.3k]
  ------------------
  659|      1|    continueTraversing_ = false;
  660|      1|    return;
  661|      1|  }
  662|       |
  663|  48.5k|  io_->readOrThrow(buf, 1, ErrorCode::kerCorruptedMetadata);
  664|  48.5k|  block_size = findBlockSize(buf[0]);  // 0-8
  665|       |
  666|  48.5k|  if (block_size > 0)
  ------------------
  |  Branch (666:7): [True: 48.2k, False: 299]
  ------------------
  667|  48.2k|    io_->readOrThrow(buf + 1, block_size - 1, ErrorCode::kerCorruptedMetadata);
  668|  48.5k|  size_t size = returnTagValue(buf, block_size);
  669|       |
  670|  48.5k|  if (tag->isComposite() && !tag->isSkipped())
  ------------------
  |  Branch (670:7): [True: 29.0k, False: 19.4k]
  |  Branch (670:29): [True: 29.0k, False: 0]
  ------------------
  671|  29.0k|    return;
  672|       |
  673|  19.4k|  const size_t bufMaxSize = 200;
  674|       |
  675|  19.4k|#ifndef SUPPRESS_WARNINGS
  676|  19.4k|  if (!tag->isSkipped() && size > bufMaxSize) {
  ------------------
  |  Branch (676:7): [True: 17.7k, False: 1.75k]
  |  Branch (676:28): [True: 52, False: 17.6k]
  ------------------
  677|     52|    EXV_WARNING << "Size " << size << " of Matroska tag 0x" << std::hex << tag->_id << std::dec << " is greater than "
  ------------------
  |  |  138|     52|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 52]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     52|  LogMsg(LogMsg::warn).os()
  ------------------
  678|      0|                << bufMaxSize << ": ignoring it.\n";
  679|     52|  }
  680|  19.4k|#endif
  681|  19.4k|  if (tag->isSkipped() || size > bufMaxSize) {
  ------------------
  |  Branch (681:7): [True: 1.75k, False: 17.7k]
  |  Branch (681:27): [True: 52, False: 17.6k]
  ------------------
  682|  1.49k|    io_->seek(size, BasicIo::cur);
  683|  1.49k|    return;
  684|  1.49k|  }
  685|       |
  686|  17.9k|  DataBuf buf2(bufMaxSize + 1);
  687|  17.9k|  io_->readOrThrow(buf2.data(), size, ErrorCode::kerCorruptedMetadata);
  688|  17.9k|  switch (tag->_type) {
  689|  3.34k|    case InternalField:
  ------------------
  |  Branch (689:5): [True: 3.34k, False: 14.6k]
  ------------------
  690|  3.34k|      decodeInternalTags(tag, buf2.data());
  691|  3.34k|      break;
  692|  1.32k|    case String:
  ------------------
  |  Branch (692:5): [True: 1.32k, False: 16.6k]
  ------------------
  693|  1.32k|    case Utf8:
  ------------------
  |  Branch (693:5): [True: 0, False: 17.9k]
  ------------------
  694|  1.32k|      decodeStringTags(tag, buf2.data());
  695|  1.32k|      break;
  696|  4.16k|    case Integer:
  ------------------
  |  Branch (696:5): [True: 4.16k, False: 13.8k]
  ------------------
  697|  5.30k|    case UInteger:
  ------------------
  |  Branch (697:5): [True: 1.14k, False: 16.8k]
  ------------------
  698|  5.30k|      decodeIntegerTags(tag, buf2.data());
  699|  5.30k|      break;
  700|  5.45k|    case Boolean:
  ------------------
  |  Branch (700:5): [True: 5.45k, False: 12.5k]
  ------------------
  701|  5.45k|      decodeBooleanTags(tag, buf2.data());
  702|  5.45k|      break;
  703|    832|    case Date:
  ------------------
  |  Branch (703:5): [True: 832, False: 17.1k]
  ------------------
  704|    832|      decodeDateTags(tag, buf2.data(), size);
  705|    832|      break;
  706|  1.22k|    case Float:
  ------------------
  |  Branch (706:5): [True: 1.22k, False: 16.7k]
  ------------------
  707|  1.22k|      decodeFloatTags(tag, buf2.data());
  708|  1.22k|      break;
  709|      0|    case Binary:
  ------------------
  |  Branch (709:5): [True: 0, False: 17.9k]
  ------------------
  710|      0|      break;
  711|      0|    case Master:
  ------------------
  |  Branch (711:5): [True: 0, False: 17.9k]
  ------------------
  712|      0|      break;
  713|      0|    default:
  ------------------
  |  Branch (713:5): [True: 0, False: 17.9k]
  ------------------
  714|      0|      break;
  715|  17.9k|  }
  716|  17.9k|}  // MatroskaVideo::decodeBlock
_ZN5Exiv213MatroskaVideo18decodeInternalTagsEPKNS_8Internal11MatroskaTagEPKh:
  718|  3.34k|void MatroskaVideo::decodeInternalTags(const MatroskaTag* tag, const byte* buf) {
  719|  3.34k|  uint64_t key = getULongLong(buf, bigEndian);
  720|  3.34k|  if (!key)
  ------------------
  |  Branch (720:7): [True: 40, False: 3.30k]
  ------------------
  721|     40|    return;
  722|       |
  723|  3.30k|  auto internalMt = [=]() -> const MatroskaTag* {
  724|  3.30k|    switch (tag->_id) {
  725|  3.30k|      case Xmp_video_VideoScanTpye:
  726|  3.30k|        return Exiv2::find(videoScanType, key);
  727|  3.30k|      case Xmp_audio_ChannelType:
  728|  3.30k|        return Exiv2::find(audioChannels, key);
  729|  3.30k|      case Xmp_video_ContentCompressAlgo:
  730|  3.30k|        return Exiv2::find(compressionAlgorithm, key);
  731|  3.30k|      case Xmp_video_ContentEncryptAlgo:
  732|  3.30k|        return Exiv2::find(encryptionAlgorithm, key);
  733|  3.30k|      case Xmp_video_ContentSignAlgo_1:
  734|  3.30k|      case Xmp_video_ContentSignAlgo_2:
  735|  3.30k|        return Exiv2::find(contentSignatureAlgorithm, key);
  736|  3.30k|      case Xmp_video_ContentSignHashAlgo_1:
  737|  3.30k|      case Xmp_video_ContentSignHashAlgo_2:
  738|  3.30k|        return Exiv2::find(contentSignatureHashAlgorithm, key);
  739|  3.30k|      case Xmp_video_ContentEncodingType:
  740|  3.30k|        return Exiv2::find(encodingType, key);
  741|  3.30k|      case Xmp_video_DisplayUnit:
  742|  3.30k|        return Exiv2::find(displayUnit, key);
  743|  3.30k|      case Xmp_video_AspectRatioType:
  744|  3.30k|        return Exiv2::find(aspectRatioType, key);
  745|  3.30k|      case Xmp_video_PhysicalEquivalent:
  746|  3.30k|        return Exiv2::find(chapterPhysicalEquivalent, key);
  747|  3.30k|      case Xmp_video_TranslateCodec:
  748|  3.30k|        return Exiv2::find(chapterTranslateCodec, key);
  749|  3.30k|      case Video_Audio_CodecID:
  750|  3.30k|        return Exiv2::find(trackCodec, key);
  751|  3.30k|      case Video_Audio_CodecName:
  752|  3.30k|        return Exiv2::find(codecInfo, key);
  753|  3.30k|      case CodecDownloadURL:
  754|  3.30k|      case CodecInfoURL:
  755|  3.30k|        return Exiv2::find(codecDownloadUrl, key);
  756|  3.30k|    }
  757|  3.30k|    return nullptr;
  758|  3.30k|  }();
  759|  3.30k|  if (internalMt) {
  ------------------
  |  Branch (759:7): [True: 1.18k, False: 2.12k]
  ------------------
  760|  1.18k|    xmpData_[tag->_label] = internalMt->_label;
  761|  2.12k|  } else {
  762|  2.12k|    xmpData_[tag->_label] = key;
  763|  2.12k|  }
  764|  3.30k|}
_ZN5Exiv213MatroskaVideo16decodeStringTagsEPKNS_8Internal11MatroskaTagEPKh:
  766|  1.32k|void MatroskaVideo::decodeStringTags(const MatroskaTag* tag, const byte* buf) {
  767|  1.32k|  if (tag->_id == TrackNumber) {
  ------------------
  |  Branch (767:7): [True: 83, False: 1.23k]
  ------------------
  768|     83|    track_count_++;
  769|     83|    xmpData_[tag->_label] = track_count_;
  770|  1.23k|  } else {
  771|  1.23k|    xmpData_[tag->_label] = buf;
  772|  1.23k|  }
  773|  1.32k|}
_ZN5Exiv213MatroskaVideo17decodeIntegerTagsEPKNS_8Internal11MatroskaTagEPKh:
  775|  5.30k|void MatroskaVideo::decodeIntegerTags(const MatroskaTag* tag, const byte* buf) {
  776|  5.30k|  uint64_t value = getULongLong(buf, bigEndian);
  777|  5.30k|  if (!value)
  ------------------
  |  Branch (777:7): [True: 4.26k, False: 1.04k]
  ------------------
  778|  4.26k|    return;
  779|       |
  780|  1.04k|  if (tag->_id == Xmp_video_Width_1 || tag->_id == Xmp_video_Width_2)
  ------------------
  |  Branch (780:7): [True: 559, False: 481]
  |  Branch (780:40): [True: 115, False: 366]
  ------------------
  781|    674|    width_ = value;
  782|  1.04k|  if (tag->_id == Xmp_video_Height_1 || tag->_id == Xmp_video_Height_2)
  ------------------
  |  Branch (782:7): [True: 233, False: 807]
  |  Branch (782:41): [True: 51, False: 756]
  ------------------
  783|    284|    height_ = value;
  784|  1.04k|  xmpData_[tag->_label] = value;
  785|  1.04k|}
_ZN5Exiv213MatroskaVideo17decodeBooleanTagsEPKNS_8Internal11MatroskaTagEPKh:
  787|  5.45k|void MatroskaVideo::decodeBooleanTags(const MatroskaTag* tag, const byte* buf) {
  788|  5.45k|  const MatroskaTag* internalMt = nullptr;
  789|  5.45k|  uint64_t key = getULongLong(buf, bigEndian);
  790|  5.45k|  if (!key)
  ------------------
  |  Branch (790:7): [True: 1.14k, False: 4.31k]
  ------------------
  791|  1.14k|    return;
  792|       |
  793|  4.31k|  switch (tag->_id) {
  794|  1.90k|    case TrackType:  // this tags is used internally only to deduce the type of track (video or audio)
  ------------------
  |  Branch (794:5): [True: 1.90k, False: 2.40k]
  ------------------
  795|  1.90k|      if (auto f = Exiv2::find(matroskaTrackType, key)) {
  ------------------
  |  Branch (795:16): [True: 205, False: 1.70k]
  ------------------
  796|    205|        stream_ = f->_id;
  797|    205|      }
  798|  1.90k|      break;
  799|     93|    case TrackUsed:
  ------------------
  |  Branch (799:5): [True: 93, False: 4.22k]
  ------------------
  800|     93|      internalMt = Exiv2::find(trackEnable, key);
  801|     93|      break;
  802|    425|    case TrackDefault:
  ------------------
  |  Branch (802:5): [True: 425, False: 3.89k]
  ------------------
  803|    425|      internalMt = Exiv2::find(defaultOn, key);
  804|    425|      break;
  805|    917|    case TrackForced:
  ------------------
  |  Branch (805:5): [True: 917, False: 3.39k]
  ------------------
  806|    917|      internalMt = Exiv2::find(trackForced, key);
  807|    917|      break;
  808|    302|    case TrackLacing:
  ------------------
  |  Branch (808:5): [True: 302, False: 4.01k]
  ------------------
  809|    302|      internalMt = Exiv2::find(trackLacing, key);
  810|    302|      break;
  811|    526|    case CodecDecodeAll:
  ------------------
  |  Branch (811:5): [True: 526, False: 3.79k]
  ------------------
  812|    526|      internalMt = Exiv2::find(codecDecodeAll, key);
  813|    526|      break;
  814|    126|    case CodecSettings:
  ------------------
  |  Branch (814:5): [True: 126, False: 4.19k]
  ------------------
  815|    126|      internalMt = Exiv2::find(codecSettings, key);
  816|    126|      break;
  817|     19|    case Xmp_video_TagDefault:
  ------------------
  |  Branch (817:5): [True: 19, False: 4.29k]
  ------------------
  818|     19|      internalMt = tag;
  819|     19|      break;
  820|      0|    default:
  ------------------
  |  Branch (820:5): [True: 0, False: 4.31k]
  ------------------
  821|      0|      break;
  822|  4.31k|  }
  823|       |
  824|  4.31k|  if (internalMt) {
  ------------------
  |  Branch (824:7): [True: 1.05k, False: 3.25k]
  ------------------
  825|  1.05k|    xmpData_[internalMt->_label] = "Yes";
  826|  1.05k|  }
  827|  4.31k|}
_ZN5Exiv213MatroskaVideo14decodeDateTagsEPKNS_8Internal11MatroskaTagEPKhm:
  829|    832|void MatroskaVideo::decodeDateTags(const MatroskaTag* tag, const byte* buf, size_t size) {
  830|    832|  int64_t duration_in_ms = 0;
  831|    832|  uint64_t value;
  832|    832|  switch (tag->_id) {
  833|    169|    case Xmp_video_Duration:
  ------------------
  |  Branch (833:5): [True: 169, False: 663]
  ------------------
  834|    169|      if (size <= 4) {
  ------------------
  |  Branch (834:11): [True: 45, False: 124]
  ------------------
  835|     45|        duration_in_ms = std::llround(getFloat(buf, bigEndian) * time_code_scale_ * 1000.0);
  836|    124|      } else {
  837|    124|        duration_in_ms = std::llround(getDouble(buf, bigEndian) * time_code_scale_ * 1000);
  838|    124|      }
  839|    169|      xmpData_[tag->_label] = duration_in_ms;
  840|    169|      break;
  841|    589|    case Xmp_video_DateUTC:
  ------------------
  |  Branch (841:5): [True: 589, False: 243]
  ------------------
  842|    589|      value = getULongLong(buf, bigEndian);
  843|    589|      if (!value)
  ------------------
  |  Branch (843:11): [True: 229, False: 360]
  ------------------
  844|    229|        return;
  845|    360|      duration_in_ms = value / 1000000000;
  846|    360|      xmpData_[tag->_label] = duration_in_ms;
  847|    360|      break;
  848|       |
  849|     74|    case TimecodeScale:
  ------------------
  |  Branch (849:5): [True: 74, False: 758]
  ------------------
  850|     74|      value = getULongLong(buf, bigEndian);
  851|     74|      if (!value)
  ------------------
  |  Branch (851:11): [True: 11, False: 63]
  ------------------
  852|     11|        return;
  853|     63|      time_code_scale_ = static_cast<double>(value) / static_cast<double>(1000000000);
  854|     63|      xmpData_[tag->_label] = time_code_scale_;
  855|     63|      break;
  856|      0|    default:
  ------------------
  |  Branch (856:5): [True: 0, False: 832]
  ------------------
  857|      0|      break;
  858|    832|  }
  859|    832|}
_ZN5Exiv213MatroskaVideo15decodeFloatTagsEPKNS_8Internal11MatroskaTagEPKh:
  861|  1.22k|void MatroskaVideo::decodeFloatTags(const MatroskaTag* tag, const byte* buf) {
  862|  1.22k|  xmpData_[tag->_label] = getFloat(buf, bigEndian);
  863|       |
  864|  1.22k|  switch (tag->_id) {
  865|    202|    case Xmp_audio_SampleRate:
  ------------------
  |  Branch (865:5): [True: 202, False: 1.02k]
  ------------------
  866|    273|    case Xmp_audio_OutputSampleRate:
  ------------------
  |  Branch (866:5): [True: 71, False: 1.15k]
  ------------------
  867|    273|      xmpData_[tag->_label] = getFloat(buf, bigEndian);
  868|    273|      break;
  869|      0|    case VideoFrameRate_DefaultDuration:
  ------------------
  |  Branch (869:5): [True: 0, False: 1.22k]
  ------------------
  870|    955|    case Xmp_video_FrameRate: {
  ------------------
  |  Branch (870:5): [True: 955, False: 273]
  ------------------
  871|    955|      uint64_t key = getULongLong(buf, bigEndian);
  872|    955|      if (!key)
  ------------------
  |  Branch (872:11): [True: 16, False: 939]
  ------------------
  873|     16|        return;
  874|    939|      if (auto internalMt = Exiv2::find(streamRate, key)) {
  ------------------
  |  Branch (874:16): [True: 562, False: 377]
  ------------------
  875|    562|        double frame_rate = 0;
  876|    562|        switch (stream_) {
  877|     73|          case 1:  // video
  ------------------
  |  Branch (877:11): [True: 73, False: 489]
  ------------------
  878|     73|            frame_rate = 1000000000.0 / static_cast<double>(key);
  879|     73|            break;
  880|     18|          case 2:  // audio
  ------------------
  |  Branch (880:11): [True: 18, False: 544]
  ------------------
  881|     18|            frame_rate = static_cast<double>(key) / 1000;
  882|     18|            break;
  883|    471|          default:
  ------------------
  |  Branch (883:11): [True: 471, False: 91]
  ------------------
  884|    471|            break;
  885|    562|        }
  886|    562|        if (std::isgreater(frame_rate, 0.0))
  ------------------
  |  Branch (886:13): [True: 91, False: 471]
  ------------------
  887|     91|          xmpData_[internalMt->_label] = frame_rate;
  888|    562|      } else
  889|    377|        xmpData_[tag->_label] = "Variable Bit Rate";
  890|    939|    } break;
  891|    939|    default:
  ------------------
  |  Branch (891:5): [True: 0, False: 1.22k]
  ------------------
  892|      0|      xmpData_[tag->_label] = getFloat(buf, bigEndian);
  893|      0|      break;
  894|  1.22k|  }
  895|  1.22k|}
_ZN5Exiv213MatroskaVideo13findBlockSizeEh:
  897|  97.4k|uint32_t MatroskaVideo::findBlockSize(byte b) {
  898|  97.4k|  if (b & 128)
  ------------------
  |  Branch (898:7): [True: 81.6k, False: 15.7k]
  ------------------
  899|  81.6k|    return 1;
  900|  15.7k|  if (b & 64)
  ------------------
  |  Branch (900:7): [True: 8.52k, False: 7.26k]
  ------------------
  901|  8.52k|    return 2;
  902|  7.26k|  if (b & 32)
  ------------------
  |  Branch (902:7): [True: 2.67k, False: 4.58k]
  ------------------
  903|  2.67k|    return 3;
  904|  4.58k|  if (b & 16)
  ------------------
  |  Branch (904:7): [True: 2.77k, False: 1.81k]
  ------------------
  905|  2.77k|    return 4;
  906|  1.81k|  if (b & 8)
  ------------------
  |  Branch (906:7): [True: 257, False: 1.56k]
  ------------------
  907|    257|    return 5;
  908|  1.56k|  if (b & 4)
  ------------------
  |  Branch (908:7): [True: 197, False: 1.36k]
  ------------------
  909|    197|    return 6;
  910|  1.36k|  if (b & 2)
  ------------------
  |  Branch (910:7): [True: 813, False: 552]
  ------------------
  911|    813|    return 7;
  912|    552|  if (b & 1)
  ------------------
  |  Branch (912:7): [True: 330, False: 222]
  ------------------
  913|    330|    return 8;
  914|    222|  return 0;
  915|    552|}
_ZN5Exiv214newMkvInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  917|  1.30k|Image::UniquePtr newMkvInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  918|  1.30k|  auto image = std::make_unique<MatroskaVideo>(std::move(io), params);
  919|  1.30k|  if (!image->good()) {
  ------------------
  |  Branch (919:7): [True: 0, False: 1.30k]
  ------------------
  920|      0|    return nullptr;
  921|      0|  }
  922|  1.30k|  return image;
  923|  1.30k|}
_ZN5Exiv29isMkvTypeERNS_7BasicIoEb:
  925|  9.35k|bool isMkvType(BasicIo& iIo, bool advance) {
  926|  9.35k|  bool result = true;
  927|  9.35k|  byte tmpBuf[4];
  928|  9.35k|  iIo.read(tmpBuf, 4);
  929|       |
  930|  9.35k|  if (iIo.error() || iIo.eof())
  ------------------
  |  Branch (930:7): [True: 0, False: 9.35k]
  |  Branch (930:22): [True: 147, False: 9.21k]
  ------------------
  931|    147|    return false;
  932|       |
  933|  9.21k|  if (0x1a != tmpBuf[0] || 0x45 != tmpBuf[1] || 0xdf != tmpBuf[2] || 0xa3 != tmpBuf[3]) {
  ------------------
  |  Branch (933:7): [True: 5.25k, False: 3.95k]
  |  Branch (933:28): [True: 8, False: 3.95k]
  |  Branch (933:49): [True: 10, False: 3.94k]
  |  Branch (933:70): [True: 13, False: 3.92k]
  ------------------
  934|  5.28k|    result = false;
  935|  5.28k|  }
  936|       |
  937|  9.21k|  if (!advance || !result)
  ------------------
  |  Branch (937:7): [True: 9.21k, False: 0]
  |  Branch (937:19): [True: 0, False: 0]
  ------------------
  938|  9.21k|    iIo.seek(0, BasicIo::beg);
  939|  9.21k|  return result;
  940|  9.35k|}
matroskavideo.cpp:_ZN5Exiv28InternalL14returnTagValueEPKhm:
  582|  97.4k|[[nodiscard]] static size_t returnTagValue(const byte* buf, size_t size) {
  583|  97.4k|  enforce(size > 0 && size <= 8, Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (583:11): [True: 97.1k, False: 222]
  |  Branch (583:23): [True: 97.1k, False: 0]
  ------------------
  584|       |
  585|  97.4k|  size_t b0 = buf[0] & (0xff >> size);
  586|  97.4k|  size_t tag = b0 << ((size - 1) * 8);
  587|   128k|  for (size_t i = 1; i < size; ++i) {
  ------------------
  |  Branch (587:22): [True: 31.2k, False: 97.4k]
  ------------------
  588|  31.2k|    tag |= static_cast<size_t>(buf[i]) << ((size - i - 1) * 8);
  589|  31.2k|  }
  590|       |
  591|  97.4k|  return tag;
  592|  97.4k|}
matroskavideo.cpp:_ZZN5Exiv213MatroskaVideo18decodeInternalTagsEPKNS_8Internal11MatroskaTagEPKhENK3$_0clEv:
  723|  3.30k|  auto internalMt = [=]() -> const MatroskaTag* {
  724|  3.30k|    switch (tag->_id) {
  ------------------
  |  Branch (724:13): [True: 3.30k, False: 0]
  ------------------
  725|    288|      case Xmp_video_VideoScanTpye:
  ------------------
  |  Branch (725:7): [True: 288, False: 3.02k]
  ------------------
  726|    288|        return Exiv2::find(videoScanType, key);
  727|    462|      case Xmp_audio_ChannelType:
  ------------------
  |  Branch (727:7): [True: 462, False: 2.84k]
  ------------------
  728|    462|        return Exiv2::find(audioChannels, key);
  729|    372|      case Xmp_video_ContentCompressAlgo:
  ------------------
  |  Branch (729:7): [True: 372, False: 2.93k]
  ------------------
  730|    372|        return Exiv2::find(compressionAlgorithm, key);
  731|    385|      case Xmp_video_ContentEncryptAlgo:
  ------------------
  |  Branch (731:7): [True: 385, False: 2.92k]
  ------------------
  732|    385|        return Exiv2::find(encryptionAlgorithm, key);
  733|     89|      case Xmp_video_ContentSignAlgo_1:
  ------------------
  |  Branch (733:7): [True: 89, False: 3.22k]
  ------------------
  734|    205|      case Xmp_video_ContentSignAlgo_2:
  ------------------
  |  Branch (734:7): [True: 116, False: 3.19k]
  ------------------
  735|    205|        return Exiv2::find(contentSignatureAlgorithm, key);
  736|     23|      case Xmp_video_ContentSignHashAlgo_1:
  ------------------
  |  Branch (736:7): [True: 23, False: 3.28k]
  ------------------
  737|    174|      case Xmp_video_ContentSignHashAlgo_2:
  ------------------
  |  Branch (737:7): [True: 151, False: 3.15k]
  ------------------
  738|    174|        return Exiv2::find(contentSignatureHashAlgorithm, key);
  739|     40|      case Xmp_video_ContentEncodingType:
  ------------------
  |  Branch (739:7): [True: 40, False: 3.26k]
  ------------------
  740|     40|        return Exiv2::find(encodingType, key);
  741|    427|      case Xmp_video_DisplayUnit:
  ------------------
  |  Branch (741:7): [True: 427, False: 2.88k]
  ------------------
  742|    427|        return Exiv2::find(displayUnit, key);
  743|    199|      case Xmp_video_AspectRatioType:
  ------------------
  |  Branch (743:7): [True: 199, False: 3.11k]
  ------------------
  744|    199|        return Exiv2::find(aspectRatioType, key);
  745|    622|      case Xmp_video_PhysicalEquivalent:
  ------------------
  |  Branch (745:7): [True: 622, False: 2.68k]
  ------------------
  746|    622|        return Exiv2::find(chapterPhysicalEquivalent, key);
  747|     85|      case Xmp_video_TranslateCodec:
  ------------------
  |  Branch (747:7): [True: 85, False: 3.22k]
  ------------------
  748|     85|        return Exiv2::find(chapterTranslateCodec, key);
  749|      0|      case Video_Audio_CodecID:
  ------------------
  |  Branch (749:7): [True: 0, False: 3.30k]
  ------------------
  750|      0|        return Exiv2::find(trackCodec, key);
  751|     29|      case Video_Audio_CodecName:
  ------------------
  |  Branch (751:7): [True: 29, False: 3.28k]
  ------------------
  752|     29|        return Exiv2::find(codecInfo, key);
  753|      7|      case CodecDownloadURL:
  ------------------
  |  Branch (753:7): [True: 7, False: 3.30k]
  ------------------
  754|     21|      case CodecInfoURL:
  ------------------
  |  Branch (754:7): [True: 14, False: 3.29k]
  ------------------
  755|     21|        return Exiv2::find(codecDownloadUrl, key);
  756|  3.30k|    }
  757|      0|    return nullptr;
  758|  3.30k|  }();

_ZN5Exiv23KeyD2Ev:
   11|  67.8M|Key::~Key() = default;
_ZN5Exiv29MetadatumD2Ev:
   17|  45.3M|Metadatum::~Metadatum() = default;
_ZNK5Exiv29Metadatum5printEPKNS_8ExifDataE:
   19|  1.17M|std::string Metadatum::print(const ExifData* pMetadata) const {
   20|  1.17M|  std::ostringstream os;
   21|  1.17M|  write(os, pMetadata);
   22|  1.17M|  return os.str();
   23|  1.17M|}
_ZNK5Exiv29Metadatum8toUint32Em:
   25|  21.3k|uint32_t Metadatum::toUint32(size_t n) const {
   26|  21.3k|  auto i = toInt64(n);
   27|  21.3k|  Internal::enforce(std::numeric_limits<uint32_t>::min() <= i, ErrorCode::kerCorruptedMetadata);
   28|  21.3k|  Internal::enforce(i <= std::numeric_limits<uint32_t>::max(), ErrorCode::kerCorruptedMetadata);
   29|  21.3k|  return static_cast<uint32_t>(i);
   30|  21.3k|}

_ZN5Exiv28Internal16MinoltaMakerNote28printMinoltaExposureSpeedStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  295|    590|std::ostream& MinoltaMakerNote::printMinoltaExposureSpeedStd(std::ostream& os, const Value& value, const ExifData*) {
  296|       |  // From the PHP JPEG Metadata Toolkit
  297|    590|  os << (value.toInt64() / 8) - 1;
  298|    590|  return os;
  299|    590|}
_ZN5Exiv28Internal16MinoltaMakerNote27printMinoltaExposureTimeStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  301|    568|std::ostream& MinoltaMakerNote::printMinoltaExposureTimeStd(std::ostream& os, const Value& value, const ExifData*) {
  302|       |  // From the PHP JPEG Metadata Toolkit
  303|    568|  os << (value.toInt64() / 8) - 6;
  304|    568|  return os;
  305|    568|}
_ZN5Exiv28Internal16MinoltaMakerNote22printMinoltaFNumberStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  307|    562|std::ostream& MinoltaMakerNote::printMinoltaFNumberStd(std::ostream& os, const Value& value, const ExifData*) {
  308|       |  // From the PHP JPEG Metadata Toolkit
  309|    562|  os << (value.toInt64() / 8) - 1;
  310|    562|  return os;
  311|    562|}
_ZN5Exiv28Internal16MinoltaMakerNote35printMinoltaExposureCompensationStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  314|    560|                                                                    const ExifData*) {
  315|       |  // From the PHP JPEG Metadata Toolkit
  316|    560|  os << value.toInt64() / 256;
  317|    560|  return os;
  318|    560|}
_ZN5Exiv28Internal16MinoltaMakerNote26printMinoltaFocalLengthStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  320|    554|std::ostream& MinoltaMakerNote::printMinoltaFocalLengthStd(std::ostream& os, const Value& value, const ExifData*) {
  321|       |  // From the PHP JPEG Metadata Toolkit
  322|    554|  os << (value.toInt64() / 3) - 2;
  323|    554|  return os;
  324|    554|}
_ZN5Exiv28Internal16MinoltaMakerNote19printMinoltaDateStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  326|    554|std::ostream& MinoltaMakerNote::printMinoltaDateStd(std::ostream& os, const Value& value, const ExifData*) {
  327|       |  // From the PHP JPEG Metadata Toolkit
  328|    554|  auto val = value.toInt64();
  329|    554|  os << stringFormat("{}:{:02}:{:02}", val / 65536, (val % 65536) / 256, val % 256);
  ------------------
  |  |   18|    554|#define stringFormat std::format
  ------------------
  330|    554|  return os;
  331|    554|}
_ZN5Exiv28Internal16MinoltaMakerNote19printMinoltaTimeStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  333|    550|std::ostream& MinoltaMakerNote::printMinoltaTimeStd(std::ostream& os, const Value& value, const ExifData*) {
  334|       |  // From the PHP JPEG Metadata Toolkit
  335|    550|  auto val = value.toInt64();
  336|    550|  os << stringFormat("{:02}:{:02}:{:02}", val / 65536, (val % 65536) / 256, val % 256);
  ------------------
  |  |   18|    550|#define stringFormat std::format
  ------------------
  337|    550|  return os;
  338|    550|}
_ZN5Exiv28Internal16MinoltaMakerNote32printMinoltaFlashExposureCompStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  341|    548|                                                                 const ExifData*) {
  342|       |  // From the PHP JPEG Metadata Toolkit
  343|    548|  os << (value.toInt64() - 6) / 3;
  344|    548|  return os;
  345|    548|}
_ZN5Exiv28Internal16MinoltaMakerNote27printMinoltaWhiteBalanceStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  347|  1.64k|std::ostream& MinoltaMakerNote::printMinoltaWhiteBalanceStd(std::ostream& os, const Value& value, const ExifData*) {
  348|       |  // From the PHP JPEG Metadata Toolkit
  349|  1.64k|  os << value.toInt64() / 256;
  350|  1.64k|  return os;
  351|  1.64k|}
_ZN5Exiv28Internal16MinoltaMakerNote25printMinoltaBrightnessStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  353|    528|std::ostream& MinoltaMakerNote::printMinoltaBrightnessStd(std::ostream& os, const Value& value, const ExifData*) {
  354|       |  // From the PHP JPEG Metadata Toolkit
  355|    528|  os << (value.toInt64() / 8) - 6;
  356|    528|  return os;
  357|    528|}
_ZN5Exiv28Internal16MinoltaMakerNote32printMinoltaExposureManualBias5DERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  685|     62|                                                                 const ExifData*) {
  686|       |  // From Xavier Raynaud: the value is converted from 0:256 to -5.33:5.33
  687|     62|  return os << stringFormat("{:.2f}", static_cast<float>(value.toInt64() - 128) / 24);
  ------------------
  |  |   18|     62|#define stringFormat std::format
  ------------------
  688|     62|}
_ZN5Exiv28Internal16MinoltaMakerNote34printMinoltaExposureCompensation5DERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  692|     70|                                                                   const ExifData*) {
  693|     70|  return os << stringFormat("{:.2f}", static_cast<float>(value.toInt64() - 300) / 100);
  ------------------
  |  |   18|     70|#define stringFormat std::format
  ------------------
  694|     70|}
_ZN5Exiv28Internal22printMinoltaSonyLensIDERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1821|  3.57k|std::ostream& printMinoltaSonyLensID(std::ostream& os, const Value& value, const ExifData* metadata) {
 1822|       |  //! List of lens ids which require special treatment from printMinoltaSonyLensID
 1823|  3.57k|  static constexpr struct LensIdFct {
 1824|  3.57k|    uint32_t idx;
 1825|  3.57k|    PrintFct fct;
 1826|       |
 1827|  3.57k|    bool operator==(uint32_t i) const {
 1828|  3.57k|      return i == idx;
 1829|  3.57k|    }
 1830|  3.57k|  } lensIdFct[] = {
 1831|  3.57k|      {0x001cu, &resolveLens0x1c}, {0x0029u, &resolveLens0x29}, {0x0034u, &resolveLens0x34},
 1832|  3.57k|      {0x0080u, &resolveLens0x80}, {0x00ffu, &resolveLens0xff}, {0xffffu, &resolveLens0xffff},
 1833|       |      //{0x00ffu, &resolveLensTypeUsingExiftool}, // was used for debugging
 1834|  3.57k|  };
 1835|       |  // #1145 end - respect lenses with shared LensID
 1836|       |  // ----------------------------------------------------------------------
 1837|       |
 1838|       |  // #1034
 1839|  3.57k|  const std::string undefined("undefined");
 1840|  3.57k|  const std::string minolta("minolta");
 1841|  3.57k|  const std::string sony("sony");
 1842|  3.57k|  if (Internal::readExiv2Config(minolta, value.toString(), undefined) != undefined) {
  ------------------
  |  Branch (1842:7): [True: 0, False: 3.57k]
  ------------------
 1843|      0|    return os << Internal::readExiv2Config(minolta, value.toString(), undefined);
 1844|      0|  }
 1845|  3.57k|  if (Internal::readExiv2Config(sony, value.toString(), undefined) != undefined) {
  ------------------
  |  Branch (1845:7): [True: 0, False: 3.57k]
  ------------------
 1846|      0|    return os << Internal::readExiv2Config(sony, value.toString(), undefined);
 1847|      0|  }
 1848|       |
 1849|       |  // #1145 - respect lenses with shared LensID
 1850|  3.57k|  uint32_t index = value.toUint32();
 1851|  3.57k|  if (metadata)
  ------------------
  |  Branch (1851:7): [True: 1.78k, False: 1.78k]
  ------------------
 1852|  1.78k|    if (auto f = Exiv2::find(lensIdFct, index))
  ------------------
  |  Branch (1852:14): [True: 1.23k, False: 553]
  ------------------
 1853|  1.23k|      return f->fct(os, value, metadata);
 1854|  2.34k|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|  2.34k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1855|  3.57k|}
_ZN5Exiv28Internal25printMinoltaSonyColorModeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1867|    142|std::ostream& printMinoltaSonyColorMode(std::ostream& os, const Value& value, const ExifData* metadata) {
 1868|    142|  return EXV_PRINT_TAG(minoltaSonyColorMode)(os, value, metadata);
  ------------------
  |  |  199|    142|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1869|    142|}
_ZN5Exiv28Internal25printMinoltaSonyBoolValueERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1879|  2.58k|std::ostream& printMinoltaSonyBoolValue(std::ostream& os, const Value& value, const ExifData* metadata) {
 1880|  2.58k|  return EXV_PRINT_TAG(minoltaSonyBoolFunction)(os, value, metadata);
  ------------------
  |  |  199|  2.58k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1881|  2.58k|}
_ZN5Exiv28Internal32printMinoltaSonyBoolInverseValueERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1891|    698|std::ostream& printMinoltaSonyBoolInverseValue(std::ostream& os, const Value& value, const ExifData* metadata) {
 1892|    698|  return EXV_PRINT_TAG(minoltaSonyBoolInverseFunction)(os, value, metadata);
  ------------------
  |  |  199|    698|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1893|    698|}
_ZN5Exiv28Internal26printMinoltaSonyAFAreaModeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1904|    566|std::ostream& printMinoltaSonyAFAreaMode(std::ostream& os, const Value& value, const ExifData* metadata) {
 1905|    566|  return EXV_PRINT_TAG(minoltaSonyAFAreaMode)(os, value, metadata);
  ------------------
  |  |  199|    566|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1906|    566|}
_ZN5Exiv28Internal32printMinoltaSonyLocalAFAreaPointERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1917|    566|std::ostream& printMinoltaSonyLocalAFAreaPoint(std::ostream& os, const Value& value, const ExifData* metadata) {
 1918|    566|  return EXV_PRINT_TAG(minoltaSonyLocalAFAreaPoint)(os, value, metadata);
  ------------------
  |  |  199|    566|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1919|    566|}
_ZN5Exiv28Internal41printMinoltaSonyDynamicRangeOptimizerModeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1929|    708|                                                        const ExifData* metadata) {
 1930|    708|  return EXV_PRINT_TAG(minoltaSonyDynamicRangeOptimizerMode)(os, value, metadata);
  ------------------
  |  |  199|    708|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1931|    708|}
_ZN5Exiv28Internal43printMinoltaSonyPrioritySetupShutterReleaseERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1942|    488|                                                          const ExifData* metadata) {
 1943|    488|  return EXV_PRINT_TAG(minoltaSonyPrioritySetupShutterRelease)(os, value, metadata);
  ------------------
  |  |  199|    488|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1944|    488|}
_ZN5Exiv28Internal25printMinoltaSonyQualityCsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1954|    400|std::ostream& printMinoltaSonyQualityCs(std::ostream& os, const Value& value, const ExifData* metadata) {
 1955|    400|  return EXV_PRINT_TAG(minoltaSonyQualityCs)(os, value, metadata);
  ------------------
  |  |  199|    400|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1956|    400|}
_ZN5Exiv28Internal24printMinoltaSonyRotationERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1967|    468|std::ostream& printMinoltaSonyRotation(std::ostream& os, const Value& value, const ExifData* metadata) {
 1968|    468|  return EXV_PRINT_TAG(minoltaSonyRotation)(os, value, metadata);
  ------------------
  |  |  199|    468|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1969|    468|}
_ZN5Exiv28Internal25printMinoltaSonySceneModeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2002|  2.40k|std::ostream& printMinoltaSonySceneMode(std::ostream& os, const Value& value, const ExifData* metadata) {
 2003|  2.40k|  return EXV_PRINT_TAG(minoltaSonySceneMode)(os, value, metadata);
  ------------------
  |  |  199|  2.40k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2004|  2.40k|}
_ZN5Exiv28Internal34printMinoltaSonyTeleconverterModelERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2021|    390|std::ostream& printMinoltaSonyTeleconverterModel(std::ostream& os, const Value& value, const ExifData* metadata) {
 2022|    390|  return EXV_PRINT_TAG(minoltaSonyTeleconverterModel)(os, value, metadata);
  ------------------
  |  |  199|    390|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2023|    390|}
_ZN5Exiv28Internal28printMinoltaSonyZoneMatchingERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2034|    162|std::ostream& printMinoltaSonyZoneMatching(std::ostream& os, const Value& value, const ExifData* metadata) {
 2035|    162|  return EXV_PRINT_TAG(minoltaSonyZoneMatching)(os, value, metadata);
  ------------------
  |  |  199|    162|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2036|    162|}
minoltamn_int.cpp:_ZN5Exiv28InternalL15resolveLens0x1cERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1661|     99|static std::ostream& resolveLens0x1c(std::ostream& os, const Value& value, const ExifData* metadata) {
 1662|     99|  try {
 1663|     99|    long index = 0;
 1664|       |
 1665|     99|    std::string model = getKeyString("Exif.Image.Model", metadata);
 1666|     99|    std::string lens = getKeyString("Exif.Photo.LensModel", metadata);
 1667|       |
 1668|     99|    if (model == "SLT-A77V" && lens == "100mm F2.8 Macro") {
  ------------------
  |  Branch (1668:9): [True: 21, False: 78]
  |  Branch (1668:32): [True: 0, False: 21]
  ------------------
 1669|      0|      index = 2;
 1670|      0|    }
 1671|       |
 1672|     99|    if (index > 0) {
  ------------------
  |  Branch (1672:9): [True: 0, False: 99]
  ------------------
 1673|      0|      const long lensID = 0x1c;
 1674|      0|      return resolvedLens(os, lensID, index);
 1675|      0|    }
 1676|     99|  } catch (...) {
 1677|      0|  }
 1678|     99|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|     99|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1679|     99|}
minoltamn_int.cpp:_ZN5Exiv28InternalL12getKeyStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKNS_8ExifDataE:
 1598|  2.34k|static std::string getKeyString(const std::string& key, const ExifData* metadata) {
 1599|  2.34k|  std::string result;
 1600|  2.34k|  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
  ------------------
  |  Branch (1600:7): [True: 943, False: 1.39k]
  ------------------
 1601|    943|    result = metadata->findKey(ExifKey(key))->toString();
 1602|    943|  }
 1603|  2.34k|  return result;
 1604|  2.34k|}
minoltamn_int.cpp:_ZN5Exiv28InternalL12resolvedLensERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEll:
 1655|    105|static std::ostream& resolvedLens(std::ostream& os, long lensID, long index) {
 1656|    105|  auto td = Exiv2::find(minoltaSonyLensID, lensID);
 1657|    105|  std::vector<std::string> tokens = split(td[0].label_, "|");
 1658|    105|  return os << _(trim(tokens.at(index - 1)).c_str());
  ------------------
  |  |   40|    105|#define _(String) (String)
  ------------------
 1659|    105|}
minoltamn_int.cpp:_ZN5Exiv28InternalL5splitERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
 1635|    105|static std::vector<std::string> split(const std::string& str, const std::string& delim) {
 1636|    105|  std::vector<std::string> tokens;
 1637|    105|  size_t prev = 0;
 1638|    105|  size_t pos = 0;
 1639|    427|  while (pos < str.length() && prev < str.length()) {
  ------------------
  |  Branch (1639:10): [True: 322, False: 105]
  |  Branch (1639:32): [True: 322, False: 0]
  ------------------
 1640|    322|    pos = str.find(delim, prev);
 1641|    322|    if (pos == std::string::npos)
  ------------------
  |  Branch (1641:9): [True: 105, False: 217]
  ------------------
 1642|    105|      pos = str.length();
 1643|    322|    std::string token = str.substr(prev, pos - prev);
 1644|    322|    if (!token.empty())
  ------------------
  |  Branch (1644:9): [True: 322, False: 0]
  ------------------
 1645|    322|      tokens.push_back(std::move(token));
 1646|    322|    prev = pos + delim.length();
 1647|    322|  }
 1648|    105|  return tokens;
 1649|    105|}
minoltamn_int.cpp:_ZN5Exiv28InternalL4trimERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKc:
 1630|    105|static std::string& trim(std::string& s, const char* t = " \t\n\r\f\v") {
 1631|    105|  return ltrim(rtrim(s, t), t);
 1632|    105|}
minoltamn_int.cpp:_ZN5Exiv28InternalL5ltrimERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKc:
 1618|    105|static std::string& ltrim(std::string& s, const char* t = " \t\n\r\f\v") {
 1619|    105|  s.erase(0, s.find_first_not_of(t));
 1620|    105|  return s;
 1621|    105|}
minoltamn_int.cpp:_ZN5Exiv28InternalL5rtrimERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKc:
 1624|    105|static std::string& rtrim(std::string& s, const char* t = " \t\n\r\f\v") {
 1625|    105|  s.erase(s.find_last_not_of(t) + 1);
 1626|    105|  return s;
 1627|    105|}
minoltamn_int.cpp:_ZN5Exiv28InternalL15resolveLens0x29ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1681|    124|static std::ostream& resolveLens0x29(std::ostream& os, const Value& value, const ExifData* metadata) {
 1682|    124|  try {
 1683|    124|    long index = 0;
 1684|       |
 1685|    124|    std::string model = getKeyString("Exif.Image.Model", metadata);
 1686|    124|    std::string lens = getKeyString("Exif.Photo.LensModel", metadata);
 1687|       |
 1688|    124|    if (model == "SLT-A77V" && lens == "DT 11-18mm F4.5-5.6") {
  ------------------
  |  Branch (1688:9): [True: 20, False: 104]
  |  Branch (1688:32): [True: 0, False: 20]
  ------------------
 1689|      0|      index = 2;
 1690|      0|    }
 1691|       |
 1692|    124|    if (index > 0) {
  ------------------
  |  Branch (1692:9): [True: 0, False: 124]
  ------------------
 1693|      0|      const long lensID = 0x29;
 1694|      0|      return resolvedLens(os, lensID, index);
 1695|      0|    }
 1696|    124|  } catch (...) {
 1697|      0|  }
 1698|    124|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|    124|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1699|    124|}
minoltamn_int.cpp:_ZN5Exiv28InternalL15resolveLens0x34ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1701|    256|static std::ostream& resolveLens0x34(std::ostream& os, const Value& value, const ExifData* metadata) {
 1702|    256|  try {
 1703|    256|    long index = 0;
 1704|       |
 1705|    256|    std::string model = getKeyString("Exif.Image.Model", metadata);
 1706|    256|    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
 1707|    256|    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
 1708|       |
 1709|       |    // F2_8
 1710|    256|    if (model == "SLT-A77V" && maxAperture == "760/256") {
  ------------------
  |  Branch (1710:9): [True: 44, False: 212]
  |  Branch (1710:32): [True: 0, False: 44]
  ------------------
 1711|      0|      index = 4;
 1712|      0|    }
 1713|    256|    if (model == "SLT-A77V" && inRange(focalLength, 70, 300)) {
  ------------------
  |  Branch (1713:9): [True: 44, False: 212]
  |  Branch (1713:32): [True: 7, False: 37]
  ------------------
 1714|      7|      index = 3;
 1715|      7|    }
 1716|       |
 1717|    256|    if (index > 0) {
  ------------------
  |  Branch (1717:9): [True: 7, False: 249]
  ------------------
 1718|      7|      const long lensID = 0x34;
 1719|      7|      return resolvedLens(os, lensID, index);
 1720|      7|    }
 1721|    256|  } catch (...) {
 1722|     75|  }
 1723|    249|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|    249|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1724|    256|}
minoltamn_int.cpp:_ZN5Exiv28InternalL10getKeyLongERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKNS_8ExifDataEi:
 1607|    914|static long getKeyLong(const std::string& key, const ExifData* metadata, int which) {
 1608|    914|  long result = -1;
 1609|    914|  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
  ------------------
  |  Branch (1609:7): [True: 385, False: 529]
  ------------------
 1610|    385|    result = static_cast<long>(metadata->findKey(ExifKey(key))->toFloat(which));
 1611|    385|  }
 1612|    914|  return result;
 1613|    914|}
minoltamn_int.cpp:_ZN5Exiv28InternalL7inRangeElll:
 1651|     44|static bool inRange(long value, long min, long max) {
 1652|     44|  return min <= value && value <= max;
  ------------------
  |  Branch (1652:10): [True: 13, False: 31]
  |  Branch (1652:26): [True: 7, False: 6]
  ------------------
 1653|     44|}
minoltamn_int.cpp:_ZN5Exiv28InternalL15resolveLens0x80ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1726|    243|static std::ostream& resolveLens0x80(std::ostream& os, const Value& value, const ExifData* metadata) {
 1727|    243|  try {
 1728|    243|    long index = 0;
 1729|       |
 1730|    243|    std::string model = getKeyString("Exif.Image.Model", metadata);
 1731|    243|    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
 1732|    243|    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
 1733|       |
 1734|       |    // F4
 1735|    243|    if (model == "SLT-A77V" && maxAperture == "1024/256" && inRange(focalLength, 18, 200)) {
  ------------------
  |  Branch (1735:9): [True: 22, False: 221]
  |  Branch (1735:32): [True: 0, False: 22]
  |  Branch (1735:61): [True: 0, False: 0]
  ------------------
 1736|      0|      index = 2;
 1737|      0|    }
 1738|       |
 1739|    243|    if (index > 0) {
  ------------------
  |  Branch (1739:9): [True: 0, False: 243]
  ------------------
 1740|      0|      const long lensID = 0x80;
 1741|      0|      return resolvedLens(os, lensID, index);
 1742|      0|    }
 1743|    243|  } catch (...) {
 1744|     74|  }
 1745|    243|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|    243|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1746|    243|}
minoltamn_int.cpp:_ZN5Exiv28InternalL15resolveLens0xffERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1748|    415|static std::ostream& resolveLens0xff(std::ostream& os, const Value& value, const ExifData* metadata) {
 1749|    415|  try {
 1750|    415|    long index = 0;
 1751|       |
 1752|    415|    std::string model = getKeyString("Exif.Image.Model", metadata);
 1753|    415|    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
 1754|    415|    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
 1755|       |
 1756|       |    // F2_8
 1757|    415|    if (model == "SLT-A77V" && maxAperture == "760/256" && inRange(focalLength, 17, 50)) {
  ------------------
  |  Branch (1757:9): [True: 31, False: 384]
  |  Branch (1757:32): [True: 0, False: 31]
  |  Branch (1757:60): [True: 0, False: 0]
  ------------------
 1758|      0|      index = 1;
 1759|      0|    }
 1760|       |
 1761|    415|    if (index > 0) {
  ------------------
  |  Branch (1761:9): [True: 0, False: 415]
  ------------------
 1762|      0|      const long lensID = 0xff;
 1763|      0|      return resolvedLens(os, lensID, index);
 1764|      0|    }
 1765|    415|  } catch (...) {
 1766|    129|  }
 1767|    415|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|    415|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1768|    415|}
minoltamn_int.cpp:_ZN5Exiv28InternalL17resolveLens0xffffERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1770|     98|static std::ostream& resolveLens0xffff(std::ostream& os, const Value& value, const ExifData* metadata) {
 1771|     98|  try {
 1772|     98|    long index = 1;
 1773|       |
 1774|       |    // #1153
 1775|     98|    std::string model = getKeyString("Exif.Image.Model", metadata);
 1776|     98|    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
 1777|       |
 1778|     98|    std::string F1_8 = "434/256";
 1779|     98|    static constexpr const char* maxApertures[] = {
 1780|     98|        "926/256",   // F3.5
 1781|     98|        "1024/256",  // F4
 1782|     98|        "1110/256",  // F4.5
 1783|     98|        "1188/256",  // F5
 1784|     98|        "1272/256",  // F5.6
 1785|     98|    };
 1786|       |
 1787|     98|    if (model == "ILCE-6000" && maxAperture == F1_8)
  ------------------
  |  Branch (1787:9): [True: 6, False: 92]
  |  Branch (1787:33): [True: 0, False: 6]
  ------------------
 1788|      0|      try {
 1789|      0|        long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
 1790|      0|        if (focalLength > 0) {
  ------------------
  |  Branch (1790:13): [True: 0, False: 0]
  ------------------
 1791|      0|          long focalL35mm = getKeyLong("Exif.Photo.FocalLengthIn35mmFilm", metadata);
 1792|      0|          long focalRatio = (focalL35mm * 100) / focalLength;
 1793|      0|          if (inRange(focalRatio, 145, 155))
  ------------------
  |  Branch (1793:15): [True: 0, False: 0]
  ------------------
 1794|      0|            index = 2;
 1795|      0|        }
 1796|      0|      } catch (...) {
 1797|      0|      }
 1798|       |
 1799|     98|    if (model == "ILCE-6000" && Exiv2::find(maxApertures, maxAperture))
  ------------------
  |  Branch (1799:9): [True: 6, False: 92]
  |  Branch (1799:33): [True: 0, False: 6]
  ------------------
 1800|      0|      try {
 1801|      0|        long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
 1802|      0|        if (focalLength > 0) {
  ------------------
  |  Branch (1802:13): [True: 0, False: 0]
  ------------------
 1803|      0|          long focalL35mm = getKeyLong("Exif.Photo.FocalLengthIn35mmFilm", metadata);
 1804|      0|          long focalRatio = (focalL35mm * 100) / focalLength;
 1805|      0|          if (inRange(focalRatio, 145, 155))
  ------------------
  |  Branch (1805:15): [True: 0, False: 0]
  ------------------
 1806|      0|            index = 3;
 1807|      0|        }
 1808|      0|      } catch (...) {
 1809|      0|      }
 1810|       |
 1811|     98|    if (index > 0) {
  ------------------
  |  Branch (1811:9): [True: 98, False: 0]
  ------------------
 1812|     98|      const long lensID = 0xffff;
 1813|     98|      return resolvedLens(os, lensID, index);
 1814|     98|    }
 1815|     98|  } catch (...) {
 1816|      0|  }
 1817|       |
 1818|      0|  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
  ------------------
  |  |  199|      0|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1819|     98|}
minoltamn_int.cpp:_ZZN5Exiv28Internal22printMinoltaSonyLensIDERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK9LensIdFcteqEj:
 1827|  8.06k|    bool operator==(uint32_t i) const {
 1828|  8.06k|      return i == idx;
 1829|  8.06k|    }

_ZN5Exiv28Internal16MinoltaMakerNote7tagListEv:
   25|   145k|  static constexpr auto tagList() {
   26|   145k|    return tagInfo_;
   27|   145k|  }
_ZN5Exiv28Internal16MinoltaMakerNote11tagListCs5DEv:
   37|  1.03M|  static constexpr auto tagListCs5D() {
   38|  1.03M|    return tagInfoCs5D_;
   39|  1.03M|  }
_ZN5Exiv28Internal16MinoltaMakerNote11tagListCs7DEv:
   33|   462k|  static constexpr auto tagListCs7D() {
   34|   462k|    return tagInfoCs7D_;
   35|   462k|  }
_ZN5Exiv28Internal16MinoltaMakerNote12tagListCsStdEv:
   29|   195k|  static constexpr auto tagListCsStd() {
   30|   195k|    return tagInfoCsStd_;
   31|   195k|  }
_ZN5Exiv28Internal16MinoltaMakerNote13tagListCsA100Ev:
   41|  29.9k|  static constexpr auto tagListCsA100() {
   42|  29.9k|    return tagInfoCsA100_;
   43|  29.9k|  }

_ZN5Exiv28MrwImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   24|    113|    Image(ImageType::mrw, mdExif | mdIptc | mdXmp, std::move(io), params) {
   25|    113|}
_ZNK5Exiv28MrwImage10pixelWidthEv:
   31|      3|uint32_t MrwImage::pixelWidth() const {
   32|      3|  auto imageWidth = exifData_.findKey(Exiv2::ExifKey("Exif.Image.ImageWidth"));
   33|      3|  if (imageWidth != exifData_.end() && imageWidth->count() > 0) {
  ------------------
  |  Branch (33:7): [True: 0, False: 3]
  |  Branch (33:7): [True: 0, False: 3]
  |  Branch (33:40): [True: 0, False: 0]
  ------------------
   34|      0|    return imageWidth->toUint32();
   35|      0|  }
   36|      3|  return 0;
   37|      3|}
_ZNK5Exiv28MrwImage11pixelHeightEv:
   39|      3|uint32_t MrwImage::pixelHeight() const {
   40|      3|  auto imageHeight = exifData_.findKey(Exiv2::ExifKey("Exif.Image.ImageLength"));
   41|      3|  if (imageHeight != exifData_.end() && imageHeight->count() > 0) {
  ------------------
  |  Branch (41:7): [True: 0, False: 3]
  |  Branch (41:7): [True: 0, False: 3]
  |  Branch (41:41): [True: 0, False: 0]
  ------------------
   42|      0|    return imageHeight->toUint32();
   43|      0|  }
   44|      3|  return 0;
   45|      3|}
_ZN5Exiv28MrwImage12readMetadataEv:
   62|    113|void MrwImage::readMetadata() {
   63|       |#ifdef EXIV2_DEBUG_MESSAGES
   64|       |  std::cerr << "Reading MRW file " << io_->path() << "\n";
   65|       |#endif
   66|    113|  if (io_->open() != 0) {
  ------------------
  |  Branch (66:7): [True: 0, False: 113]
  ------------------
   67|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   68|      0|  }
   69|    113|  IoCloser closer(*io_);
   70|       |  // Ensure that this is the correct image type
   71|    113|  if (!isMrwType(*io_, false)) {
  ------------------
  |  Branch (71:7): [True: 0, False: 113]
  ------------------
   72|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (72:9): [True: 0, False: 0]
  |  Branch (72:25): [True: 0, False: 0]
  ------------------
   73|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   74|      0|    throw Error(ErrorCode::kerNotAnImage, "MRW");
   75|      0|  }
   76|    113|  clearMetadata();
   77|       |
   78|       |  // Find the TTW block and read it into a buffer
   79|    113|  uint32_t const len = 8;
   80|    113|  byte tmp[len];
   81|    113|  io_->read(tmp, len);
   82|    113|  uint32_t pos = len;
   83|    113|  uint32_t const end = getULong(tmp + 4, bigEndian);
   84|       |
   85|    113|  pos += len;
   86|    113|  Internal::enforce(pos <= end, ErrorCode::kerFailedToReadImageData);
   87|    113|  io_->read(tmp, len);
   88|    113|  if (io_->error() || io_->eof())
  ------------------
  |  Branch (88:7): [True: 3, False: 110]
  |  Branch (88:23): [True: 0, False: 110]
  ------------------
   89|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
   90|       |
   91|    454|  while (memcmp(tmp + 1, "TTW", 3) != 0) {
  ------------------
  |  Branch (91:10): [True: 341, False: 113]
  ------------------
   92|    341|    uint32_t const siz = getULong(tmp + 4, bigEndian);
   93|    341|    Internal::enforce(siz <= end - pos, ErrorCode::kerFailedToReadImageData);
   94|    341|    pos += siz;
   95|    341|    io_->seek(siz, BasicIo::cur);
   96|    341|    Internal::enforce(!io_->error() && !io_->eof(), ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (96:23): [True: 326, False: 15]
  |  Branch (96:40): [True: 279, False: 47]
  ------------------
   97|       |
   98|    341|    Internal::enforce(len <= end - pos, ErrorCode::kerFailedToReadImageData);
   99|    341|    pos += len;
  100|    341|    io_->read(tmp, len);
  101|    341|    Internal::enforce(!io_->error() && !io_->eof(), ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (101:23): [True: 278, False: 63]
  |  Branch (101:40): [True: 253, False: 25]
  ------------------
  102|    341|  }
  103|       |
  104|    113|  const uint32_t siz = getULong(tmp + 4, bigEndian);
  105|       |  // First do an approximate bounds check of siz, so that we don't
  106|       |  // get DOS-ed by a 4GB allocation on the next line. If siz is
  107|       |  // greater than io_->size() then it is definitely invalid. But the
  108|       |  // exact bounds checking is done by the call to io_->read, which
  109|       |  // will fail if there are fewer than siz bytes left to read.
  110|    113|  Internal::enforce(siz <= io_->size(), ErrorCode::kerFailedToReadImageData);
  111|    113|  DataBuf buf(siz);
  112|    113|  io_->read(buf.data(), buf.size());
  113|    113|  Internal::enforce(!io_->error() && !io_->eof(), ErrorCode::kerFailedToReadImageData);
  ------------------
  |  Branch (113:21): [True: 14, False: 99]
  |  Branch (113:38): [True: 13, False: 1]
  ------------------
  114|       |
  115|    113|  const DecodeParams dp(max_recursion_depth_);
  116|    113|  ByteOrder bo = TiffParser::decode(exifData_, iptcData_, xmpData_, buf.c_data(), buf.size(), dp);
  117|    113|  setByteOrder(bo);
  118|    113|}  // MrwImage::readMetadata
_ZN5Exiv214newMrwInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  127|    113|Image::UniquePtr newMrwInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  128|    113|  auto image = std::make_unique<MrwImage>(std::move(io), params);
  129|    113|  if (!image->good()) {
  ------------------
  |  Branch (129:7): [True: 0, False: 113]
  ------------------
  130|      0|    return nullptr;
  131|      0|  }
  132|    113|  return image;
  133|    113|}
_ZN5Exiv29isMrwTypeERNS_7BasicIoEb:
  135|  30.1k|bool isMrwType(BasicIo& iIo, bool advance) {
  136|  30.1k|  const int32_t len = 4;
  137|  30.1k|  const std::array<byte, len> MrwId{0x0, 0x4d, 0x52, 0x4d};
  138|  30.1k|  std::array<byte, len> buf;
  139|  30.1k|  iIo.read(buf.data(), len);
  140|  30.1k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (140:7): [True: 0, False: 30.1k]
  |  Branch (140:22): [True: 91, False: 30.0k]
  ------------------
  141|     91|    return false;
  142|     91|  }
  143|  30.0k|  bool rc = buf == MrwId;
  144|  30.0k|  if (!advance || !rc) {
  ------------------
  |  Branch (144:7): [True: 30.0k, False: 0]
  |  Branch (144:19): [True: 0, False: 0]
  ------------------
  145|  30.0k|    iIo.seek(-len, BasicIo::cur);
  146|  30.0k|  }
  147|  30.0k|  return rc;
  148|  30.1k|}

_ZN5Exiv28Internal15Nikon1MakerNote11print0x0002ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  173|  1.64k|std::ostream& Nikon1MakerNote::print0x0002(std::ostream& os, const Value& value, const ExifData*) {
  174|  1.64k|  if (value.count() > 1)
  ------------------
  |  Branch (174:7): [True: 1.62k, False: 22]
  ------------------
  175|  1.62k|    return os << value.toInt64(1);
  176|     22|  return os << "(" << value << ")";
  177|  1.64k|}
_ZN5Exiv28Internal15Nikon1MakerNote13printBarValueERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  187|     90|std::ostream& Nikon1MakerNote::printBarValue(std::ostream& os, const Value& value, const ExifData* exifData) {
  188|     90|  if (!exifData)
  ------------------
  |  Branch (188:7): [True: 45, False: 45]
  ------------------
  189|     45|    return os << "undefined";
  190|       |
  191|     45|  if (value.count() >= 9) {
  ------------------
  |  Branch (191:7): [True: 20, False: 25]
  ------------------
  192|     20|    ByteOrder bo = getKeyString("Exif.MakerNote.ByteOrder", exifData) == "MM" ? bigEndian : littleEndian;
  ------------------
  |  Branch (192:20): [True: 20, False: 0]
  ------------------
  193|     20|    byte p[4];
  194|    100|    for (int n = 0; n < 4; n++)
  ------------------
  |  Branch (194:21): [True: 80, False: 20]
  ------------------
  195|     80|      p[n] = static_cast<byte>(value.toInt64(6 + n));
  196|     20|    os << getLong(p, bo);
  197|     20|  }
  198|       |
  199|     45|  return os;
  200|     90|}
_ZN5Exiv28Internal15Nikon1MakerNote11print0x0007ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  202|    128|std::ostream& Nikon1MakerNote::print0x0007(std::ostream& os, const Value& value, const ExifData*) {
  203|    128|  std::string focus = value.toString();
  204|    128|  if (focus == "AF-C  ")
  ------------------
  |  Branch (204:7): [True: 6, False: 122]
  ------------------
  205|      6|    return os << _("Continuous autofocus");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  206|    122|  if (focus == "AF-S  ")
  ------------------
  |  Branch (206:7): [True: 4, False: 118]
  ------------------
  207|      4|    return os << _("Single autofocus");
  ------------------
  |  |   40|      4|#define _(String) (String)
  ------------------
  208|    118|  if (focus == "AF-A  ")
  ------------------
  |  Branch (208:7): [True: 6, False: 112]
  ------------------
  209|      6|    return os << _("Automatic");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  210|    112|  return os << "(" << value << ")";
  211|    118|}
_ZN5Exiv28Internal15Nikon1MakerNote11print0x0085ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  213|    132|std::ostream& Nikon1MakerNote::print0x0085(std::ostream& os, const Value& value, const ExifData*) {
  214|    132|  auto [r, s] = value.toRational();
  215|    132|  if (r == 0)
  ------------------
  |  Branch (215:7): [True: 82, False: 50]
  ------------------
  216|     82|    return os << _("Unknown");
  ------------------
  |  |   40|     82|#define _(String) (String)
  ------------------
  217|     50|  if (s != 0)
  ------------------
  |  Branch (217:7): [True: 28, False: 22]
  ------------------
  218|     28|    return os << stringFormat("{:.2f} m", static_cast<float>(r) / s);
  ------------------
  |  |   18|     28|#define stringFormat std::format
  ------------------
  219|     22|  return os << "(" << value << ")";
  220|     50|}
_ZN5Exiv28Internal15Nikon1MakerNote11print0x0086ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  222|    112|std::ostream& Nikon1MakerNote::print0x0086(std::ostream& os, const Value& value, const ExifData*) {
  223|    112|  auto [r, s] = value.toRational();
  224|    112|  if (r == 0)
  ------------------
  |  Branch (224:7): [True: 30, False: 82]
  ------------------
  225|     30|    return os << _("Not used");
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  226|     82|  if (s == 0)
  ------------------
  |  Branch (226:7): [True: 14, False: 68]
  ------------------
  227|     14|    return os << "(" << value << ")";
  228|     68|  return os << stringFormat("{:.1f}x", static_cast<float>(r) / s);
  ------------------
  |  |   18|     68|#define stringFormat std::format
  ------------------
  229|     82|}
_ZN5Exiv28Internal15Nikon1MakerNote11print0x0088ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  231|  1.06k|std::ostream& Nikon1MakerNote::print0x0088(std::ostream& os, const Value& value, const ExifData*) {
  232|  1.06k|  if (value.count() >= 1) {
  ------------------
  |  Branch (232:7): [True: 1.06k, False: 0]
  ------------------
  233|  1.06k|    const uint32_t focusArea = value.toUint32(0);
  234|  1.06k|    if (focusArea >= nikonFocusarea.size()) {
  ------------------
  |  Branch (234:9): [True: 768, False: 296]
  ------------------
  235|    768|      os << "Invalid value";
  236|    768|    } else {
  237|    296|      os << nikonFocusarea[focusArea];
  238|    296|    }
  239|  1.06k|  }
  240|  1.06k|  if (value.count() >= 2) {
  ------------------
  |  Branch (240:7): [True: 944, False: 120]
  ------------------
  241|    944|    os << "; ";
  242|    944|    const uint32_t focusPoint = value.toUint32(1);
  243|       |
  244|    944|    if (focusPoint <= 4) {
  ------------------
  |  Branch (244:9): [True: 182, False: 762]
  ------------------
  245|    182|      os << nikonFocuspoints[focusPoint];
  246|    762|    } else {
  247|    762|      os << value;
  248|    762|      if (focusPoint < nikonFocuspoints.size()) {
  ------------------
  |  Branch (248:11): [True: 80, False: 682]
  ------------------
  249|     80|        os << " " << _("guess") << " " << nikonFocuspoints[focusPoint];
  ------------------
  |  |   40|     80|#define _(String) (String)
  ------------------
  250|     80|      }
  251|    762|    }
  252|    944|  }
  253|  1.06k|  if (value.count() >= 3) {
  ------------------
  |  Branch (253:7): [True: 934, False: 130]
  ------------------
  254|    934|    const uint32_t focusPointsUsed1 = value.toUint32(2);
  255|    934|    const uint32_t focusPointsUsed2 = value.toUint32(3);
  256|       |
  257|    934|    if (focusPointsUsed1 != 0 && focusPointsUsed2 != 0) {
  ------------------
  |  Branch (257:9): [True: 632, False: 302]
  |  Branch (257:34): [True: 562, False: 70]
  ------------------
  258|    562|      os << "; [";
  259|       |
  260|    562|      if (focusPointsUsed1 & 1)
  ------------------
  |  Branch (260:11): [True: 304, False: 258]
  ------------------
  261|    304|        os << nikonFocuspoints[0] << " ";
  262|    562|      if (focusPointsUsed1 & 2)
  ------------------
  |  Branch (262:11): [True: 290, False: 272]
  ------------------
  263|    290|        os << nikonFocuspoints[1] << " ";
  264|    562|      if (focusPointsUsed1 & 4)
  ------------------
  |  Branch (264:11): [True: 294, False: 268]
  ------------------
  265|    294|        os << nikonFocuspoints[2] << " ";
  266|    562|      if (focusPointsUsed1 & 8)
  ------------------
  |  Branch (266:11): [True: 184, False: 378]
  ------------------
  267|    184|        os << nikonFocuspoints[3] << " ";
  268|    562|      if (focusPointsUsed1 & 16)
  ------------------
  |  Branch (268:11): [True: 124, False: 438]
  ------------------
  269|    124|        os << nikonFocuspoints[4] << " ";
  270|    562|      if (focusPointsUsed1 & 32)
  ------------------
  |  Branch (270:11): [True: 294, False: 268]
  ------------------
  271|    294|        os << nikonFocuspoints[5] << " ";
  272|    562|      if (focusPointsUsed1 & 64)
  ------------------
  |  Branch (272:11): [True: 410, False: 152]
  ------------------
  273|    410|        os << nikonFocuspoints[6] << " ";
  274|    562|      if (focusPointsUsed1 & 128)
  ------------------
  |  Branch (274:11): [True: 104, False: 458]
  ------------------
  275|    104|        os << nikonFocuspoints[7] << " ";
  276|       |
  277|    562|      if (focusPointsUsed2 & 1)
  ------------------
  |  Branch (277:11): [True: 300, False: 262]
  ------------------
  278|    300|        os << nikonFocuspoints[8] << " ";
  279|    562|      if (focusPointsUsed2 & 2)
  ------------------
  |  Branch (279:11): [True: 116, False: 446]
  ------------------
  280|    116|        os << nikonFocuspoints[9] << " ";
  281|    562|      if (focusPointsUsed2 & 4)
  ------------------
  |  Branch (281:11): [True: 438, False: 124]
  ------------------
  282|    438|        os << nikonFocuspoints[10] << " ";
  283|       |
  284|    562|      os << "]";
  285|    562|    }
  286|    934|  } else {
  287|    130|    os << "(" << value << ")";
  288|    130|  }
  289|  1.06k|  return os;
  290|  1.06k|}
_ZN5Exiv28Internal15Nikon2MakerNote11print0x000aERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  349|    110|std::ostream& Nikon2MakerNote::print0x000a(std::ostream& os, const Value& value, const ExifData*) {
  350|    110|  auto [r, s] = value.toRational();
  351|    110|  if (r == 0)
  ------------------
  |  Branch (351:7): [True: 50, False: 60]
  ------------------
  352|     50|    return os << _("Not used");
  ------------------
  |  |   40|     50|#define _(String) (String)
  ------------------
  353|     60|  if (s == 0)
  ------------------
  |  Branch (353:7): [True: 16, False: 44]
  ------------------
  354|     16|    return os << "(" << value << ")";
  355|     44|  return os << stringFormat("{:.1f}x", static_cast<float>(r) / s);
  ------------------
  |  |   18|     44|#define stringFormat std::format
  ------------------
  356|     60|}
_ZN5Exiv28Internal15Nikon3MakerNote10printIiIsoERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1662|     54|std::ostream& Nikon3MakerNote::printIiIso(std::ostream& os, const Value& value, const ExifData*) {
 1663|     54|  auto v = std::lround(100.0 * std::exp2((value.toInt64() / 12.0) - 5));
 1664|     54|  return os << v;
 1665|     54|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x0002ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1667|     60|std::ostream& Nikon3MakerNote::print0x0002(std::ostream& os, const Value& value, const ExifData*) {
 1668|     60|  if (value.count() > 1)
  ------------------
  |  Branch (1668:7): [True: 24, False: 36]
  ------------------
 1669|     24|    return os << value.toInt64(1);
 1670|     36|  return os << "(" << value << ")";
 1671|     60|}
_ZN5Exiv28Internal15Nikon3MakerNote16printAf2AreaModeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1673|     78|std::ostream& Nikon3MakerNote::printAf2AreaMode(std::ostream& os, const Value& value, const ExifData* metadata) {
 1674|     78|  int contrastDetectAF = 0;
 1675|     78|  if (metadata) {
  ------------------
  |  Branch (1675:7): [True: 39, False: 39]
  ------------------
 1676|     39|    auto pos = metadata->findKey(ExifKey("Exif.NikonAf2.ContrastDetectAF"));
 1677|     39|    if (pos != metadata->end() && pos->count() != 0) {
  ------------------
  |  Branch (1677:9): [True: 39, False: 0]
  |  Branch (1677:9): [True: 39, False: 0]
  |  Branch (1677:35): [True: 39, False: 0]
  ------------------
 1678|     39|      contrastDetectAF = pos->toUint32();
 1679|     39|    }
 1680|     39|  }
 1681|       |
 1682|     78|  if (contrastDetectAF == 0)
  ------------------
  |  Branch (1682:7): [True: 59, False: 19]
  ------------------
 1683|     59|    return EXV_PRINT_TAG(nikonAf2AreaModeContrastDetectAfOff)(os, value, nullptr);
  ------------------
  |  |  199|     59|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1684|     19|  return EXV_PRINT_TAG(nikonAf2AreaModeContrastDetectAfOn)(os, value, nullptr);
  ------------------
  |  |  199|     19|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1685|     78|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x0007ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1687|    268|std::ostream& Nikon3MakerNote::print0x0007(std::ostream& os, const Value& value, const ExifData*) {
 1688|    268|  std::string focus = value.toString();
 1689|    268|  if (focus == "AF-C  ")
  ------------------
  |  Branch (1689:7): [True: 6, False: 262]
  ------------------
 1690|      6|    return os << _("Continuous autofocus");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1691|    262|  if (focus == "AF-S  ")
  ------------------
  |  Branch (1691:7): [True: 16, False: 246]
  ------------------
 1692|     16|    return os << _("Single autofocus");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
 1693|    246|  if (focus == "AF-A  ")
  ------------------
  |  Branch (1693:7): [True: 14, False: 232]
  ------------------
 1694|     14|    return os << _("Automatic");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1695|    232|  return os << "(" << value << ")";
 1696|    246|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x0083ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1698|    324|std::ostream& Nikon3MakerNote::print0x0083(std::ostream& os, const Value& value, const ExifData*) {
 1699|    324|  const uint32_t lensType = value.toUint32();
 1700|       |
 1701|    324|  bool valid = false;
 1702|    324|  if (lensType & 1) {
  ------------------
  |  Branch (1702:7): [True: 180, False: 144]
  ------------------
 1703|    180|    os << "MF ";
 1704|    180|    valid = true;
 1705|    180|  }
 1706|    324|  if (lensType & 2) {
  ------------------
  |  Branch (1706:7): [True: 144, False: 180]
  ------------------
 1707|    144|    os << "D ";
 1708|    144|    valid = true;
 1709|    144|  }
 1710|    324|  if (lensType & 4) {
  ------------------
  |  Branch (1710:7): [True: 116, False: 208]
  ------------------
 1711|    116|    os << "G ";
 1712|    116|    valid = true;
 1713|    116|  }
 1714|    324|  if (lensType & 8) {
  ------------------
  |  Branch (1714:7): [True: 90, False: 234]
  ------------------
 1715|     90|    os << "VR";
 1716|     90|    valid = true;
 1717|     90|  }
 1718|       |
 1719|    324|  if (!valid)
  ------------------
  |  Branch (1719:7): [True: 128, False: 196]
  ------------------
 1720|    128|    os << "(" << lensType << ")";
 1721|       |
 1722|    324|  return os;
 1723|    324|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x0085ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1751|    200|std::ostream& Nikon3MakerNote::print0x0085(std::ostream& os, const Value& value, const ExifData*) {
 1752|    200|  auto [r, s] = value.toRational();
 1753|    200|  if (r == 0)
  ------------------
  |  Branch (1753:7): [True: 24, False: 176]
  ------------------
 1754|     24|    return os << _("Unknown");
  ------------------
  |  |   40|     24|#define _(String) (String)
  ------------------
 1755|    176|  if (s == 0)
  ------------------
  |  Branch (1755:7): [True: 34, False: 142]
  ------------------
 1756|     34|    return os << "(" << value << ")";
 1757|    142|  return os << stringFormat("{:.2f} m", static_cast<float>(r) / s);
  ------------------
  |  |   18|    142|#define stringFormat std::format
  ------------------
 1758|    176|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x0086ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1760|     80|std::ostream& Nikon3MakerNote::print0x0086(std::ostream& os, const Value& value, const ExifData*) {
 1761|     80|  auto [r, s] = value.toRational();
 1762|     80|  if (r == 0)
  ------------------
  |  Branch (1762:7): [True: 34, False: 46]
  ------------------
 1763|     34|    return os << _("Not used");
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
 1764|     46|  if (s == 0)
  ------------------
  |  Branch (1764:7): [True: 10, False: 36]
  ------------------
 1765|     10|    return os << "(" << value << ")";
 1766|     36|  return os << stringFormat("{:.1f}x", static_cast<float>(r) / s);
  ------------------
  |  |   18|     36|#define stringFormat std::format
  ------------------
 1767|     46|}
_ZN5Exiv28Internal15Nikon3MakerNote20printAfPointsInFocusERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1845|     92|std::ostream& Nikon3MakerNote::printAfPointsInFocus(std::ostream& os, const Value& value, const ExifData* metadata) {
 1846|     92|  if (value.typeId() != unsignedShort)
  ------------------
  |  Branch (1846:7): [True: 0, False: 92]
  ------------------
 1847|      0|    return os << "(" << value << ")";
 1848|       |
 1849|     92|  bool dModel = false;
 1850|     92|  if (metadata) {
  ------------------
  |  Branch (1850:7): [True: 46, False: 46]
  ------------------
 1851|     46|    auto pos = metadata->findKey(ExifKey("Exif.Image.Model"));
 1852|     46|    if (pos != metadata->end() && pos->count() != 0) {
  ------------------
  |  Branch (1852:9): [True: 22, False: 24]
  |  Branch (1852:9): [True: 19, False: 27]
  |  Branch (1852:35): [True: 19, False: 3]
  ------------------
 1853|     19|      std::string model = pos->toString();
 1854|     19|      if (Internal::contains(model, "NIKON D")) {
  ------------------
  |  Branch (1854:11): [True: 9, False: 10]
  ------------------
 1855|      9|        dModel = true;
 1856|      9|      }
 1857|     19|    }
 1858|     46|  }
 1859|       |
 1860|     92|  auto val = static_cast<uint16_t>(value.toInt64());
 1861|     92|  if (dModel)
  ------------------
  |  Branch (1861:7): [True: 9, False: 83]
  ------------------
 1862|      9|    val = (val >> 8) | ((val & 0x00ffU) << 8);
 1863|       |
 1864|     92|  if (val == 0x07ff)
  ------------------
  |  Branch (1864:7): [True: 2, False: 90]
  ------------------
 1865|      2|    return os << _("All 11 Points");
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
 1866|       |
 1867|     90|  UShortValue v;
 1868|     90|  v.value_.push_back(val);
 1869|     90|  return EXV_PRINT_TAG_BITMASK(nikonAfPointsInFocus)(os, v, nullptr);
  ------------------
  |  |  229|     90|#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
  ------------------
 1870|     92|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x0089ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1872|  1.08k|std::ostream& Nikon3MakerNote::print0x0089(std::ostream& os, const Value& value, const ExifData* metadata) {
 1873|  1.08k|  if (value.count() != 1 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (1873:7): [True: 20, False: 1.06k]
  |  Branch (1873:29): [True: 36, False: 1.03k]
  ------------------
 1874|     56|    return os << "(" << value << ")";
 1875|     56|  }
 1876|  1.03k|  const auto l = value.toInt64(0);
 1877|  1.03k|  if (l == 0)
  ------------------
  |  Branch (1877:7): [True: 68, False: 962]
  ------------------
 1878|     68|    return os << _("Single-frame");
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
 1879|    962|  if (!(l & 0x87))
  ------------------
  |  Branch (1879:7): [True: 366, False: 596]
  ------------------
 1880|    366|    os << _("Single-frame") << ", ";
  ------------------
  |  |   40|    366|#define _(String) (String)
  ------------------
 1881|    962|  bool d70 = false;
 1882|    962|  if (metadata) {
  ------------------
  |  Branch (1882:7): [True: 481, False: 481]
  ------------------
 1883|    481|    ExifKey key("Exif.Image.Model");
 1884|    481|    auto pos = metadata->findKey(key);
 1885|    481|    if (pos != metadata->end() && pos->count() != 0) {
  ------------------
  |  Branch (1885:9): [True: 393, False: 88]
  |  Branch (1885:9): [True: 344, False: 137]
  |  Branch (1885:35): [True: 344, False: 49]
  ------------------
 1886|    344|      std::string model = pos->toString();
 1887|    344|      if (Internal::contains(model, "D70")) {
  ------------------
  |  Branch (1887:11): [True: 158, False: 186]
  ------------------
 1888|    158|        d70 = true;
 1889|    158|      }
 1890|    344|    }
 1891|    481|  }
 1892|    962|  if (d70)
  ------------------
  |  Branch (1892:7): [True: 158, False: 804]
  ------------------
 1893|    158|    return EXV_PRINT_TAG_BITMASK(nikonShootingModeD70)(os, value, nullptr);
  ------------------
  |  |  229|    158|#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
  ------------------
 1894|    804|  return EXV_PRINT_TAG_BITMASK(nikonShootingMode)(os, value, nullptr);
  ------------------
  |  |  229|    804|#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
  ------------------
 1895|    962|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x008bERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1897|     66|std::ostream& Nikon3MakerNote::print0x008b(std::ostream& os, const Value& value, const ExifData*) {
 1898|       |  // Decoded by Robert Rottmerhusen <email@rottmerhusen.com>
 1899|     66|  if (value.size() != 4 || value.typeId() != undefined)
  ------------------
  |  Branch (1899:7): [True: 6, False: 60]
  |  Branch (1899:28): [True: 14, False: 46]
  ------------------
 1900|     20|    return os << "(" << value << ")";
 1901|     46|  float a = value.toFloat(0);
 1902|     46|  const auto b = value.toInt64(1);
 1903|     46|  const auto c = value.toInt64(2);
 1904|     46|  if (c == 0)
  ------------------
  |  Branch (1904:7): [True: 16, False: 30]
  ------------------
 1905|     16|    return os << "(" << value << ")";
 1906|     30|  return os << a * b / c;
 1907|     46|}
_ZN5Exiv28Internal15Nikon3MakerNote12printLensId1ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1921|      6|std::ostream& Nikon3MakerNote::printLensId1(std::ostream& os, const Value& value, const ExifData* metadata) {
 1922|      6|  return testConfigFile(os, value) ? os : printLensId(os, value, metadata, "NikonLd1");
  ------------------
  |  Branch (1922:10): [True: 0, False: 6]
  ------------------
 1923|      6|}
_ZN5Exiv28Internal15Nikon3MakerNote12printLensId2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1925|      8|std::ostream& Nikon3MakerNote::printLensId2(std::ostream& os, const Value& value, const ExifData* metadata) {
 1926|      8|  return testConfigFile(os, value) ? os : printLensId(os, value, metadata, "NikonLd2");
  ------------------
  |  Branch (1926:10): [True: 0, False: 8]
  ------------------
 1927|      8|}
_ZN5Exiv28Internal15Nikon3MakerNote12printLensId3ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1929|      4|std::ostream& Nikon3MakerNote::printLensId3(std::ostream& os, const Value& value, const ExifData* metadata) {
 1930|      4|  return testConfigFile(os, value) ? os : printLensId(os, value, metadata, "NikonLd3");
  ------------------
  |  Branch (1930:10): [True: 0, False: 4]
  ------------------
 1931|      4|}
_ZN5Exiv28Internal15Nikon3MakerNote12printLensId4ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1933|    152|std::ostream& Nikon3MakerNote::printLensId4(std::ostream& os, const Value& value, const ExifData* metadata) {
 1934|    152|  return testConfigFile(os, value) ? os : printLensId(os, value, metadata, "NikonLd4");
  ------------------
  |  Branch (1934:10): [True: 0, False: 152]
  ------------------
 1935|    152|}
_ZN5Exiv28Internal15Nikon3MakerNote11printLensIdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataERKNS2_12basic_stringIcS5_NS2_9allocatorIcEEEE:
 1938|    170|                                           [[maybe_unused]] const std::string& group) {
 1939|    170|#ifdef EXV_HAVE_LENSDATA
 1940|       |// 8< - - - 8< do not remove this line >8 - - - >8
 1941|       |//------------------------------------------------------------------------------
 1942|    170|#ifndef FMOUNTLH
 1943|    170|#define FMOUNTLH
 1944|       |//------------------------------------------------------------------------------
 1945|       |// List of AF F-Mount lenses - Version 4.4.550.02                    2018-03-03
 1946|       |//------------------------------------------------------------------------------
 1947|    170|#define FMLVERSION "4.4.550.02"
 1948|    170|#define FMLDATE "2018-03-03"
 1949|       |  //------------------------------------------------------------------------------
 1950|       |  //
 1951|       |  // Created by Robert Rottmerhusen 2005 - 2018
 1952|       |  // http://www.rottmerhusen.com (lens_id@rottmerhusen.com)
 1953|       |  //
 1954|       |  // Eight misidentified lenses due to double LensIDs:
 1955|       |  //
 1956|       |  // 2F 48 30 44 24 24 29 02.1: Nikon AF Zoom-Nikkor 20-35mm f/2.8D IF
 1957|       |  // 2F 48 30 44 24 24 29 02.2: Tokina AT-X 235 AF PRO (AF 20-35mm f/2.8)
 1958|       |  //
 1959|       |  // 32 54 6A 6A 24 24 35 02.1: Nikon AF Micro-Nikkor 105mm f/2.8D
 1960|       |  // 32 54 6A 6A 24 24 35 02.2: Sigma Macro 105mm F2.8 EX DG
 1961|       |  //
 1962|       |  // 7A 3C 1F 37 30 30 7E 06.1: Nikon AF-S DX Zoom-Nikkor 12-24mm f/4G IF-ED
 1963|       |  // 7A 3C 1F 37 30 30 7E 06.2: Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)
 1964|       |  //
 1965|       |  // 8B 40 2D 80 2C 3C FD 0E.1: Nikon AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED
 1966|       |  // 8B 40 2D 80 2C 3C FD 0E.2: Nikon AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED II
 1967|       |  //
 1968|       |  // 32 53 64 64 24 24 35 02.1: Tamron SP AF 90mm F/2.8 Macro 1:1 (172E)
 1969|       |  // 32 53 64 64 24 24 35 02.2: Tamron SP AF 90mm F/2.8 Di Macro 1:1 (272E)
 1970|       |  //
 1971|       |  // 2F 40 30 44 2C 34 29 02.1: Tokina AF 235 II (AF 20-35mm f/3.5-4.5)
 1972|       |  // 2F 40 30 44 2C 34 29 02.2: Tokina AF 193 (AF 19-35mm f/3.5-4.5)
 1973|       |  //
 1974|       |  // 25 48 3C 5C 24 24 1B 02.1: Tokina AT-X 287 AF PRO SV (AF 28-70mm f/2.8)
 1975|       |  // 25 48 3C 5C 24 24 1B 02.2: Tokina AT-X 270 AF PRO II (AF 28-70mm f/2.6-2.8)
 1976|       |  //
 1977|       |  // 4A 48 24 24 24 0C 4D 02.1: Samyang AE 14mm f/2.8 ED AS IF UMC
 1978|       |  // 4A 48 24 24 24 0C 4D 02.2: Samyang 10mm f/2.8 ED AS NCS CS
 1979|       |  //
 1980|       |  //
 1981|       |  // product number/order code not complete
 1982|       |  //
 1983|       |  // Free use in non-commercial, GPL or open source software only!
 1984|       |  // Please contact me for adding lenses or use in commercial software.
 1985|       |  //
 1986|       |  //"data from TAG 0x98" "ltyp" " "TC" "MID" "maker" "PN" "lens name from manuf";
 1987|       |  //
 1988|       |  //------------------------------------------------------------------------------
 1989|       |  // EXIF data necessary for new entries
 1990|       |  //------------------------------------------------------------------------------
 1991|       |  //
 1992|       |  // lid:   LensIDNumber
 1993|       |  // stps:  LensFStops
 1994|       |  // focs:  MinFocalLength
 1995|       |  // focl:  MaxFocalLength
 1996|       |  // aps:   MaxApertureAtMinFocal
 1997|       |  // apl:   MaxApertureAtMaxFocal
 1998|       |  // lfw:   MCUVersion
 1999|       |  // ltype: LensType
 2000|       |  //
 2001|       |  // The tcinfo, dblid and mid fields are being ignored.
 2002|       |  //
 2003|       |  // Please note that all fields except LensType have to be looked up in the
 2004|       |  // Exif.NikonLd* prefix and not other Exif.Nikon* prefixes. For example: for modern
 2005|       |  // Nikon bodies with modern lenses, there will be both a Exif.Nikon3.LensFStops and a
 2006|       |  // Exif.NikonLd3.LensFStops entry in the EXIF data. You are looking for
 2007|       |  // Exif.NikonLd3.LensFStops.
 2008|       |  //
 2009|       |  // In most cases the necessary hex values should be extracted from a test image using
 2010|       |  // the following command:
 2011|       |  //
 2012|       |  // exiv2 -ph -g NikonLd3.LensIDNumber -g NikonLd3.LensFStops
 2013|       |  // -g NikonLd3.MinFocalLength -g NikonLd3.MaxFocalLength
 2014|       |  // -g NikonLd3.MaxApertureAtMinFocal -g NikonLd3.MaxApertureAtMaxFocal
 2015|       |  // -g NikonLd3.MCUVersion -g Nikon3.LensType test.NEF
 2016|       |  //
 2017|       |  // Please consider, that sequence of output is sligthly different from sequence in
 2018|       |  // data structure: LensType (ltype) is printed first, but has to be entered after
 2019|       |  // MCUVersion (lfw).
 2020|       |  //
 2021|       |  //------------------------------------------------------------------------------
 2022|       |  // Nikkor lenses by their LensID
 2023|       |  //------------------------------------------------------------------------------
 2024|       |
 2025|    170|  static constexpr struct FMntLens {
 2026|    170|    unsigned char lid, stps, focs, focl, aps, apl, lfw, ltype, tcinfo, dblid, mid;
 2027|    170|    std::string_view manuf;
 2028|    170|    std::string_view lnumber;
 2029|    170|    std::string_view lensname;
 2030|       |
 2031|    170|    bool operator==(unsigned char l) const {
 2032|    170|      return lid == l;
 2033|    170|    }
 2034|    170|  } fmountlens[] = {
 2035|    170|      {0x01, 0x58, 0x50, 0x50, 0x14, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA00901", "AF Nikkor 50mm f/1.8"},
 2036|    170|      {0x01, 0x58, 0x50, 0x50, 0x14, 0x14, 0x05, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA00901", "AF Nikkor 50mm f/1.8"},
 2037|    170|      {0x02, 0x42, 0x44, 0x5C, 0x2A, 0x34, 0x02, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA72701",
 2038|    170|       "AF Zoom-Nikkor 35-70mm f/3.3-4.5"},
 2039|    170|      {0x02, 0x42, 0x44, 0x5C, 0x2A, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA72701",
 2040|    170|       "AF Zoom-Nikkor 35-70mm f/3.3-4.5"},
 2041|    170|      {0x03, 0x48, 0x5C, 0x81, 0x30, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA72801",
 2042|    170|       "AF Zoom-Nikkor 70-210mm f/4"},
 2043|    170|      {0x04, 0x48, 0x3C, 0x3C, 0x24, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA12001", "AF Nikkor 28mm f/2.8"},
 2044|    170|      {0x05, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA01001", "AF Nikkor 50mm f/1.4"},
 2045|    170|      {0x06, 0x54, 0x53, 0x53, 0x24, 0x24, 0x06, 0x00, 0x40, 0x00, 0x00, "Nikon", "JAA62101",
 2046|    170|       "AF Micro-Nikkor 55mm f/2.8"},
 2047|    170|      {0x07, 0x40, 0x3C, 0x62, 0x2C, 0x34, 0x03, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA72901",
 2048|    170|       "AF Zoom-Nikkor 28-85mm f/3.5-4.5"},
 2049|    170|      {0x08, 0x40, 0x44, 0x6A, 0x2C, 0x34, 0x04, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73001",
 2050|    170|       "AF Zoom-Nikkor 35-105mm f/3.5-4.5"},
 2051|    170|      {0x09, 0x48, 0x37, 0x37, 0x24, 0x24, 0x04, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA12101", "AF Nikkor 24mm f/2.8"},
 2052|    170|      {0x0A, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA322AA",
 2053|    170|       "AF Nikkor 300mm f/2.8 IF-ED"},
 2054|    170|      {0x0A, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0x05, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA322AB",
 2055|    170|       "AF Nikkor 300mm f/2.8 IF-ED"},
 2056|    170|      {0x0B, 0x48, 0x7C, 0x7C, 0x24, 0x24, 0x05, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA32101",
 2057|    170|       "AF Nikkor 180mm f/2.8 IF-ED"},
 2058|       |      // 0C
 2059|    170|      {0x0D, 0x40, 0x44, 0x72, 0x2C, 0x34, 0x07, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73101",
 2060|    170|       "AF Zoom-Nikkor 35-135mm f/3.5-4.5"},
 2061|    170|      {0x0E, 0x48, 0x5C, 0x81, 0x30, 0x30, 0x05, 0x00, 0x00, 0x00, 0x00, "Nikon", "", "AF Zoom-Nikkor 70-210mm f/4"},
 2062|    170|      {0x0F, 0x58, 0x50, 0x50, 0x14, 0x14, 0x05, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA009AD", "AF Nikkor 50mm f/1.8 N"},
 2063|    170|      {0x10, 0x48, 0x8E, 0x8E, 0x30, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA32301",
 2064|    170|       "AF Nikkor 300mm f/4 IF-ED"},
 2065|    170|      {0x11, 0x48, 0x44, 0x5C, 0x24, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73301",
 2066|    170|       "AF Zoom-Nikkor 35-70mm f/2.8"},
 2067|    170|      {0x11, 0x48, 0x44, 0x5C, 0x24, 0x24, 0x15, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73301",
 2068|    170|       "AF Zoom-Nikkor 35-70mm f/2.8"},
 2069|    170|      {0x12, 0x48, 0x5C, 0x81, 0x30, 0x3C, 0x09, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73201",
 2070|    170|       "AF Nikkor 70-210mm f/4-5.6"},
 2071|    170|      {0x13, 0x42, 0x37, 0x50, 0x2A, 0x34, 0x0B, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73401",
 2072|    170|       "AF Zoom-Nikkor 24-50mm f/3.3-4.5"},
 2073|    170|      {0x14, 0x48, 0x60, 0x80, 0x24, 0x24, 0x0B, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA73501",
 2074|    170|       "AF Zoom-Nikkor 80-200mm f/2.8 ED"},
 2075|    170|      {0x15, 0x4C, 0x62, 0x62, 0x14, 0x14, 0x0C, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA32401", "AF Nikkor 85mm f/1.8"},
 2076|       |      // 16
 2077|    170|      {0x17, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA518AA",
 2078|    170|       "Nikkor 500mm f/4 P ED IF"},
 2079|    170|      {0x17, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0x11, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA518AA",
 2080|    170|       "Nikkor 500mm f/4 P ED IF"},
 2081|    170|      {0x18, 0x40, 0x44, 0x72, 0x2C, 0x34, 0x0E, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA736AA",
 2082|    170|       "AF Zoom-Nikkor 35-135mm f/3.5-4.5 N"},
 2083|       |      // 19
 2084|    170|      {0x1A, 0x54, 0x44, 0x44, 0x18, 0x18, 0x11, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA12201", "AF Nikkor 35mm f/2"},
 2085|    170|      {0x1B, 0x44, 0x5E, 0x8E, 0x34, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA738AA",
 2086|    170|       "AF Zoom-Nikkor 75-300mm f/4.5-5.6"},
 2087|    170|      {0x1C, 0x48, 0x30, 0x30, 0x24, 0x24, 0x12, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA12301", "AF Nikkor 20mm f/2.8"},
 2088|    170|      {0x1D, 0x42, 0x44, 0x5C, 0x2A, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, "Nikon", "",
 2089|    170|       "AF Zoom-Nikkor 35-70mm f/3.3-4.5 N"},
 2090|    170|      {0x1E, 0x54, 0x56, 0x56, 0x24, 0x24, 0x13, 0x00, 0x40, 0x00, 0x00, "Nikon", "JAA62201",
 2091|    170|       "AF Micro-Nikkor 60mm f/2.8"},
 2092|    170|      {0x1F, 0x54, 0x6A, 0x6A, 0x24, 0x24, 0x14, 0x00, 0x40, 0x00, 0x00, "Nikon", "JAA62301",
 2093|    170|       "AF Micro-Nikkor 105mm f/2.8"},
 2094|    170|      {0x20, 0x48, 0x60, 0x80, 0x24, 0x24, 0x15, 0x00, 0x00, 0x00, 0x00, "Nikon", "",
 2095|    170|       "AF Zoom-Nikkor 80-200mm f/2.8 ED"},
 2096|    170|      {0x21, 0x40, 0x3C, 0x5C, 0x2C, 0x34, 0x16, 0x00, 0x00, 0x00, 0x00, "Nikon", "",
 2097|    170|       "AF Zoom-Nikkor 28-70mm f/3.5-4.5"},
 2098|    170|      {0x22, 0x48, 0x72, 0x72, 0x18, 0x18, 0x16, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA32501", "AF DC-Nikkor 135mm f/2"},
 2099|    170|      {0x23, 0x30, 0xBE, 0xCA, 0x3C, 0x48, 0x17, 0x00, 0x00, 0x00, 0x00, "Nikon", "",
 2100|    170|       "Zoom-Nikkor 1200-1700mm f/5.6-8 P ED IF"},
 2101|       |      // - D - lenses from here
 2102|    170|      {0x24, 0x48, 0x60, 0x80, 0x24, 0x24, 0x1A, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA742DA",
 2103|    170|       "AF Zoom-Nikkor 80-200mm f/2.8D ED"},
 2104|    170|      {0x25, 0x48, 0x44, 0x5c, 0x24, 0x24, 0x1B, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA743DA",
 2105|    170|       "AF Zoom-Nikkor 35-70mm f/2.8D"},
 2106|    170|      {0x25, 0x48, 0x44, 0x5C, 0x24, 0x24, 0x3A, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA743DA",
 2107|    170|       "AF Zoom-Nikkor 35-70mm f/2.8D"},
 2108|    170|      {0x25, 0x48, 0x44, 0x5c, 0x24, 0x24, 0x52, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA743DA",
 2109|    170|       "AF Zoom-Nikkor 35-70mm f/2.8D"},
 2110|    170|      {0x26, 0x40, 0x3C, 0x5C, 0x2C, 0x34, 0x1C, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA744DA",
 2111|    170|       "AF Zoom-Nikkor 28-70mm f/3.5-4.5D"},
 2112|       |      // ^- not yet verified
 2113|    170|      {0x27, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0x1D, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA326DA",
 2114|    170|       "AF-I Nikkor 300mm f/2.8D IF-ED"},
 2115|    170|      {0x27, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA326DA",
 2116|    170|       "AF-I Nikkor 300mm f/2.8D IF-ED + TC-14E"},
 2117|    170|      {0x27, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA326DA",
 2118|    170|       "AF-I Nikkor 300mm f/2.8D IF-ED + TC-17E"},
 2119|    170|      {0x27, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA326DA",
 2120|    170|       "AF-I Nikkor 300mm f/2.8D IF-ED + TC-20E"},
 2121|    170|      {0x28, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0x1D, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA519DA",
 2122|    170|       "AF-I Nikkor 600mm f/4D IF-ED"},
 2123|    170|      {0x28, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA519DA",
 2124|    170|       "AF-I Nikkor 600mm f/4D IF-ED + TC-14E"},
 2125|    170|      {0x28, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA519DA",
 2126|    170|       "AF-I Nikkor 600mm f/4D IF-ED + TC-17E"},
 2127|    170|      {0x28, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA519DA",
 2128|    170|       "AF-I Nikkor 600mm f/4D IF-ED + TC-20E"},
 2129|       |      // 29
 2130|    170|      {0x2A, 0x54, 0x3C, 0x3C, 0x0C, 0x0C, 0x26, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA124DA", "AF Nikkor 28mm f/1.4D"},
 2131|    170|      {0x2B, 0x3C, 0x44, 0x60, 0x30, 0x3C, 0x1F, 0x02, 0x00, 0x00, 0x00, "Nikon", "",
 2132|    170|       "AF Zoom-Nikkor 35-80mm f/4-5.6D"},
 2133|    170|      {0x2C, 0x48, 0x6A, 0x6A, 0x18, 0x18, 0x27, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA327DA",
 2134|    170|       "AF DC-Nikkor 105mm f/2D"},
 2135|    170|      {0x2D, 0x48, 0x80, 0x80, 0x30, 0x30, 0x21, 0x02, 0x40, 0x00, 0x00, "Nikon", "JAA624DA",
 2136|    170|       "AF Micro-Nikkor 200mm f/4D IF-ED"},
 2137|    170|      {0x2E, 0x48, 0x5C, 0x82, 0x30, 0x3C, 0x22, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA747DA",
 2138|    170|       "AF Nikkor 70-210mm f/4-5.6D"},
 2139|    170|      {0x2E, 0x48, 0x5C, 0x82, 0x30, 0x3C, 0x28, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA747DA",
 2140|    170|       "AF Nikkor 70-210mm f/4-5.6D"},
 2141|    170|      {0x2F, 0x48, 0x30, 0x44, 0x24, 0x24, 0x29, 0x02, 0x00, 0x01, 0x00, "Nikon", "JAA746DA",
 2142|    170|       "AF Zoom-Nikkor 20-35mm f/2.8D IF"},
 2143|    170|      {0x30, 0x48, 0x98, 0x98, 0x24, 0x24, 0x24, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA520DA",
 2144|    170|       "AF-I Nikkor 400mm f/2.8D IF-ED"},
 2145|    170|      {0x30, 0x48, 0x98, 0x98, 0x24, 0x24, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA520DA",
 2146|    170|       "AF-I Nikkor 400mm f/2.8D IF-ED + TC-14E"},
 2147|    170|      {0x30, 0x48, 0x98, 0x98, 0x24, 0x24, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA520DA",
 2148|    170|       "AF-I Nikkor 400mm f/2.8D IF-ED + TC-17E"},
 2149|    170|      {0x30, 0x48, 0x98, 0x98, 0x24, 0x24, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA520DA",
 2150|    170|       "AF-I Nikkor 400mm f/2.8D IF-ED + TC-20E"},
 2151|    170|      {0x31, 0x54, 0x56, 0x56, 0x24, 0x24, 0x25, 0x02, 0x40, 0x00, 0x00, "Nikon", "JAA625DA",
 2152|    170|       "AF Micro-Nikkor 60mm f/2.8D"},
 2153|    170|      {0x32, 0x54, 0x6A, 0x6A, 0x24, 0x24, 0x35, 0x02, 0x40, 0x01, 0x00, "Nikon", "JAA627DA",
 2154|    170|       "AF Micro-Nikkor 105mm f/2.8D"},
 2155|    170|      {0x33, 0x48, 0x2D, 0x2D, 0x24, 0x24, 0x31, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA126DA", "AF Nikkor 18mm f/2.8D"},
 2156|    170|      {0x34, 0x48, 0x29, 0x29, 0x24, 0x24, 0x32, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA626DA",
 2157|    170|       "AF Fisheye Nikkor 16mm f/2.8D"},
 2158|    170|      {0x35, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0x33, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA521DA",
 2159|    170|       "AF-I Nikkor 500mm f/4D IF-ED"},
 2160|    170|      {0x35, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA521DA",
 2161|    170|       "AF-I Nikkor 500mm f/4D IF-ED + TC-14E"},
 2162|    170|      {0x35, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA521DA",
 2163|    170|       "AF-I Nikkor 500mm f/4D IF-ED + TC-17E"},
 2164|    170|      {0x35, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA521DA",
 2165|    170|       "AF-I Nikkor 500mm f/4D IF-ED + TC-20E"},
 2166|    170|      {0x36, 0x48, 0x37, 0x37, 0x24, 0x24, 0x34, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA125DA", "AF Nikkor 24mm f/2.8D"},
 2167|    170|      {0x37, 0x48, 0x30, 0x30, 0x24, 0x24, 0x36, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA127DA", "AF Nikkor 20mm f/2.8D"},
 2168|    170|      {0x38, 0x4C, 0x62, 0x62, 0x14, 0x14, 0x37, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA328DA", "AF Nikkor 85mm f/1.8D"},
 2169|       |      // 39                38
 2170|    170|      {0x3A, 0x40, 0x3C, 0x5C, 0x2C, 0x34, 0x39, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA744DA",
 2171|    170|       "AF Zoom-Nikkor 28-70mm f/3.5-4.5D"},
 2172|    170|      {0x3B, 0x48, 0x44, 0x5C, 0x24, 0x24, 0x3A, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA743DA",
 2173|    170|       "AF Zoom-Nikkor 35-70mm f/2.8D N"},
 2174|    170|      {0x3C, 0x48, 0x60, 0x80, 0x24, 0x24, 0x3B, 0x02, 0x00, 0x00, 0x00, "Nikon", "",
 2175|    170|       "AF Zoom-Nikkor 80-200mm f/2.8D ED"},
 2176|    170|      {0x3D, 0x3C, 0x44, 0x60, 0x30, 0x3C, 0x3E, 0x02, 0x00, 0x00, 0x00, "Nikon", "",
 2177|    170|       "AF Zoom-Nikkor 35-80mm f/4-5.6D"},
 2178|    170|      {0x3E, 0x48, 0x3C, 0x3C, 0x24, 0x24, 0x3D, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA128DA", "AF Nikkor 28mm f/2.8D"},
 2179|    170|      {0x3F, 0x40, 0x44, 0x6A, 0x2C, 0x34, 0x45, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA748DA",
 2180|    170|       "AF Zoom-Nikkor 35-105mm f/3.5-4.5D"},
 2181|       |      // 40
 2182|    170|      {0x41, 0x48, 0x7c, 0x7c, 0x24, 0x24, 0x43, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA330DA",
 2183|    170|       "AF Nikkor 180mm f/2.8D IF-ED"},
 2184|    170|      {0x42, 0x54, 0x44, 0x44, 0x18, 0x18, 0x44, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA129DA", "AF Nikkor 35mm f/2D"},
 2185|    170|      {0x43, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0x46, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA011DB", "AF Nikkor 50mm f/1.4D"},
 2186|    170|      {0x44, 0x44, 0x60, 0x80, 0x34, 0x3C, 0x47, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA753DB",
 2187|    170|       "AF Zoom-Nikkor 80-200mm f/4.5-5.6D"},
 2188|    170|      {0x45, 0x40, 0x3C, 0x60, 0x2C, 0x3C, 0x48, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA752DA",
 2189|    170|       "AF Zoom-Nikkor 28-80mm f/3.5-5.6D"},
 2190|    170|      {0x46, 0x3C, 0x44, 0x60, 0x30, 0x3C, 0x49, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA754DA",
 2191|    170|       "AF Zoom-Nikkor 35-80mm f/4-5.6D N"},
 2192|    170|      {0x47, 0x42, 0x37, 0x50, 0x2A, 0x34, 0x4A, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA756DA",
 2193|    170|       "AF Zoom-Nikkor 24-50mm f/3.3-4.5D"},
 2194|    170|      {0x48, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0x4B, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA333DA",
 2195|    170|       "AF-S Nikkor 300mm f/2.8D IF-ED"},
 2196|    170|      {0x48, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA333DA",
 2197|    170|       "AF-S Nikkor 300mm f/2.8D IF-ED + TC-14E"},
 2198|    170|      {0x48, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA333DA",
 2199|    170|       "AF-S Nikkor 300mm f/2.8D IF-ED + TC-17E"},
 2200|    170|      {0x48, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA333DA",
 2201|    170|       "AF-S Nikkor 300mm f/2.8D IF-ED + TC-20E"},
 2202|    170|      {0x49, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0x4C, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA522DA",
 2203|    170|       "AF-S Nikkor 600mm f/4D IF-ED"},
 2204|    170|      {0x49, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA522DA",
 2205|    170|       "AF-S Nikkor 600mm f/4D IF-ED + TC-14E"},
 2206|    170|      {0x49, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA522DA",
 2207|    170|       "AF-S Nikkor 600mm f/4D IF-ED + TC-17E"},
 2208|    170|      {0x49, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA522DA",
 2209|    170|       "AF-S Nikkor 600mm f/4D IF-ED + TC-20E"},
 2210|    170|      {0x4A, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA332DA",
 2211|    170|       "AF Nikkor 85mm f/1.4D IF"},
 2212|    170|      {0x4B, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0x4E, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA523DA",
 2213|    170|       "AF-S Nikkor 500mm f/4D IF-ED"},
 2214|    170|      {0x4B, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA523DA",
 2215|    170|       "AF-S Nikkor 500mm f/4D IF-ED + TC-14E"},
 2216|    170|      {0x4B, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA523DA",
 2217|    170|       "AF-S Nikkor 500mm f/4D IF-ED + TC-17E"},
 2218|    170|      {0x4B, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA523DA",
 2219|    170|       "AF-S Nikkor 500mm f/4D IF-ED + TC-20E"},
 2220|    170|      {0x4C, 0x40, 0x37, 0x6E, 0x2C, 0x3C, 0x4F, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA757DA",
 2221|    170|       "AF Zoom-Nikkor 24-120mm f/3.5-5.6D IF"},
 2222|    170|      {0x4D, 0x40, 0x3C, 0x80, 0x2C, 0x3C, 0x62, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA758DA",
 2223|    170|       "AF Zoom-Nikkor 28-200mm f/3.5-5.6D IF"},
 2224|    170|      {0x4E, 0x48, 0x72, 0x72, 0x18, 0x18, 0x51, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA329DA",
 2225|    170|       "AF DC-Nikkor 135mm f/2D"},
 2226|    170|      {0x4F, 0x40, 0x37, 0x5C, 0x2C, 0x3C, 0x53, 0x06, 0x00, 0x00, 0x00, "Nikon", "JBA701AA",
 2227|    170|       "IX-Nikkor 24-70mm f/3.5-5.6"},
 2228|    170|      {0x50, 0x48, 0x56, 0x7C, 0x30, 0x3C, 0x54, 0x06, 0x00, 0x00, 0x00, "Nikon", "JBA702AA",
 2229|    170|       "IX-Nikkor 60-180mm f/4-5.6"},
 2230|       |      //                                                  "JBA703AC" "IX-Nikkor 20-60 mm f/3.5-5.6";
 2231|       |      // 51
 2232|       |      // 52
 2233|    170|      {0x53, 0x48, 0x60, 0x80, 0x24, 0x24, 0x57, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA762DA",
 2234|    170|       "AF Zoom-Nikkor 80-200mm f/2.8D ED"},
 2235|    170|      {0x53, 0x48, 0x60, 0x80, 0x24, 0x24, 0x60, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA762DA",
 2236|    170|       "AF Zoom-Nikkor 80-200mm f/2.8D ED"},
 2237|    170|      {0x54, 0x44, 0x5C, 0x7C, 0x34, 0x3C, 0x58, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA763DA",
 2238|    170|       "AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED"},
 2239|    170|      {0x54, 0x44, 0x5C, 0x7C, 0x34, 0x3C, 0x61, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA763DA",
 2240|    170|       "AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED"},
 2241|       |      // 55
 2242|    170|      {0x56, 0x48, 0x5C, 0x8E, 0x30, 0x3C, 0x5A, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA764DA",
 2243|    170|       "AF Zoom-Nikkor 70-300mm f/4-5.6D ED"},
 2244|       |      // 57
 2245|       |      // 58
 2246|    170|      {0x59, 0x48, 0x98, 0x98, 0x24, 0x24, 0x5D, 0x02, 0x07, 0x00, 0x00, "Nikon", "JAA524DA",
 2247|    170|       "AF-S Nikkor 400mm f/2.8D IF-ED"},
 2248|    170|      {0x59, 0x48, 0x98, 0x98, 0x24, 0x24, 0xF1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA524DA",
 2249|    170|       "AF-S Nikkor 400mm f/2.8D IF-ED + TC-14E"},
 2250|    170|      {0x59, 0x48, 0x98, 0x98, 0x24, 0x24, 0xE1, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA524DA",
 2251|    170|       "AF-S Nikkor 400mm f/2.8D IF-ED + TC-17E"},
 2252|    170|      {0x59, 0x48, 0x98, 0x98, 0x24, 0x24, 0xF2, 0x02, 0x0F, 0x00, 0x00, "Nikon", "JAA524DA",
 2253|    170|       "AF-S Nikkor 400mm f/2.8D IF-ED + TC-20E"},
 2254|    170|      {0x5A, 0x3C, 0x3E, 0x56, 0x30, 0x3C, 0x5E, 0x06, 0x00, 0x00, 0x00, "Nikon", "JBA704AA",
 2255|    170|       "IX-Nikkor 30-60mm f/4-5.6"},
 2256|    170|      {0x5B, 0x44, 0x56, 0x7C, 0x34, 0x3C, 0x5F, 0x06, 0x00, 0x00, 0x00, "Nikon", "JBA705AA",
 2257|    170|       "IX-Nikkor 60-180mm f/4.5-5.6"},
 2258|       |      //                                                  "JBA706AC" "IX-Nikkor 20-60 mm f/3.5-5.6N";
 2259|       |      // 5C
 2260|    170|      {0x5D, 0x48, 0x3C, 0x5C, 0x24, 0x24, 0x63, 0x02, 0x01, 0x00, 0x00, "Nikon", "JAA767DA",
 2261|    170|       "AF-S Zoom-Nikkor 28-70mm f/2.8D IF-ED"},
 2262|    170|      {0x5E, 0x48, 0x60, 0x80, 0x24, 0x24, 0x64, 0x02, 0x03, 0x00, 0x00, "Nikon", "JAA765DA",
 2263|    170|       "AF-S Zoom-Nikkor 80-200mm f/2.8D IF-ED"},
 2264|    170|      {0x5F, 0x40, 0x3C, 0x6A, 0x2C, 0x34, 0x65, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA766DA",
 2265|    170|       "AF Zoom-Nikkor 28-105mm f/3.5-4.5D IF"},
 2266|    170|      {0x60, 0x40, 0x3C, 0x60, 0x2C, 0x3C, 0x66, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA769DA",
 2267|    170|       "AF Zoom-Nikkor 28-80mm f/3.5-5.6D"},
 2268|    170|      {0x61, 0x44, 0x5E, 0x86, 0x34, 0x3C, 0x67, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA768DA",
 2269|    170|       "AF Zoom-Nikkor 75-240mm f/4.5-5.6D"},
 2270|       |      // 62                69
 2271|    170|      {0x63, 0x48, 0x2B, 0x44, 0x24, 0x24, 0x68, 0x02, 0x01, 0x00, 0x00, "Nikon", "JAA770DA",
 2272|    170|       "AF-S Nikkor 17-35mm f/2.8D IF-ED"},
 2273|    170|      {0x64, 0x00, 0x62, 0x62, 0x24, 0x24, 0x6A, 0x02, 0x40, 0x00, 0x00, "Nikon", "JAA628DA",
 2274|    170|       "PC Micro-Nikkor 85mm f/2.8D"},
 2275|    170|      {0x65, 0x44, 0x60, 0x98, 0x34, 0x3C, 0x6B, 0x0A, 0x00, 0x00, 0x00, "Nikon", "JAA771DA",
 2276|    170|       "AF VR Zoom-Nikkor 80-400mm f/4.5-5.6D ED"},
 2277|    170|      {0x66, 0x40, 0x2D, 0x44, 0x2C, 0x34, 0x6C, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA772DA",
 2278|    170|       "AF Zoom-Nikkor 18-35mm f/3.5-4.5D IF-ED"},
 2279|    170|      {0x67, 0x48, 0x37, 0x62, 0x24, 0x30, 0x6D, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA774DA",
 2280|    170|       "AF Zoom-Nikkor 24-85mm f/2.8-4D IF"},
 2281|    170|      {0x68, 0x42, 0x3C, 0x60, 0x2A, 0x3C, 0x6E, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA777DA",
 2282|    170|       "AF Zoom-Nikkor 28-80mm f/3.3-5.6G"},
 2283|    170|      {0x69, 0x48, 0x5C, 0x8E, 0x30, 0x3C, 0x6F, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA776DA",
 2284|    170|       "AF Zoom-Nikkor 70-300mm f/4-5.6G"},
 2285|    170|      {0x6A, 0x48, 0x8E, 0x8E, 0x30, 0x30, 0x70, 0x02, 0x03, 0x00, 0x00, "Nikon", "JAA334DA",
 2286|    170|       "AF-S Nikkor 300mm f/4D IF-ED"},
 2287|    170|      {0x6B, 0x48, 0x24, 0x24, 0x24, 0x24, 0x71, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA130DA",
 2288|    170|       "AF Nikkor ED 14mm f/2.8D"},
 2289|       |      // 6C                72
 2290|    170|      {0x6D, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0x73, 0x02, 0x03, 0x00, 0x00, "Nikon", "JAA335DA",
 2291|    170|       "AF-S Nikkor 300mm f/2.8D IF-ED II"},
 2292|    170|      {0x6E, 0x48, 0x98, 0x98, 0x24, 0x24, 0x74, 0x02, 0x03, 0x00, 0x00, "Nikon", "JAA525DA",
 2293|    170|       "AF-S Nikkor 400mm f/2.8D IF-ED II"},
 2294|    170|      {0x6F, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0x75, 0x02, 0x03, 0x00, 0x00, "Nikon", "JAA526DA",
 2295|    170|       "AF-S Nikkor 500mm f/4D IF-ED II"},
 2296|    170|      {0x70, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0x76, 0x02, 0x03, 0x00, 0x00, "Nikon", "JAA527DA",
 2297|    170|       "AF-S Nikkor 600mm f/4D IF-ED II"},
 2298|       |      // 71
 2299|    170|      {0x72, 0x48, 0x4C, 0x4C, 0x24, 0x24, 0x77, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA012AA", "Nikkor 45mm f/2.8 P"},
 2300|       |      // 73
 2301|    170|      {0x74, 0x40, 0x37, 0x62, 0x2C, 0x34, 0x78, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA780DA",
 2302|    170|       "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"},
 2303|    170|      {0x75, 0x40, 0x3C, 0x68, 0x2C, 0x3C, 0x79, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA778DA",
 2304|    170|       "AF Zoom-Nikkor 28-100mm f/3.5-5.6G"},
 2305|    170|      {0x76, 0x58, 0x50, 0x50, 0x14, 0x14, 0x7A, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA013DA", "AF Nikkor 50mm f/1.8D"},
 2306|    170|      {0x77, 0x48, 0x5C, 0x80, 0x24, 0x24, 0x7B, 0x0E, 0x03, 0x00, 0x00, "Nikon", "JAA781DA",
 2307|    170|       "AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED"},
 2308|    170|      {0x78, 0x40, 0x37, 0x6E, 0x2C, 0x3C, 0x7C, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA782DA",
 2309|    170|       "AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED"},
 2310|    170|      {0x79, 0x40, 0x3C, 0x80, 0x2C, 0x3C, 0x7F, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA783DA",
 2311|    170|       "AF Zoom-Nikkor 28-200mm f/3.5-5.6G IF-ED"},
 2312|    170|      {0x7A, 0x3C, 0x1F, 0x37, 0x30, 0x30, 0x7E, 0x06, 0x01, 0x01, 0x00, "Nikon", "JAA784DA",
 2313|    170|       "AF-S DX Zoom-Nikkor 12-24mm f/4G IF-ED"},
 2314|    170|      {0x7B, 0x48, 0x80, 0x98, 0x30, 0x30, 0x80, 0x0E, 0x03, 0x00, 0x00, "Nikon", "JAA787DA",
 2315|    170|       "AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED"},
 2316|       |      // 7C                81
 2317|    170|      {0x7D, 0x48, 0x2B, 0x53, 0x24, 0x24, 0x82, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA788DA",
 2318|    170|       "AF-S DX Zoom-Nikkor 17-55mm f/2.8G IF-ED"},
 2319|       |      // 7E                83
 2320|    170|      {0x7F, 0x40, 0x2D, 0x5C, 0x2C, 0x34, 0x84, 0x06, 0x11, 0x00, 0x00, "Nikon", "JAA790DA",
 2321|    170|       "AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED"},
 2322|    170|      {0x80, 0x48, 0x1A, 0x1A, 0x24, 0x24, 0x85, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA629DA",
 2323|    170|       "AF DX Fisheye-Nikkor 10.5mm f/2.8G ED"},
 2324|    170|      {0x81, 0x54, 0x80, 0x80, 0x18, 0x18, 0x86, 0x0E, 0x03, 0x00, 0x00, "Nikon", "JAA336DA",
 2325|    170|       "AF-S VR Nikkor 200mm f/2G IF-ED"},
 2326|    170|      {0x82, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0x87, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA337DA",
 2327|    170|       "AF-S VR Nikkor 300mm f/2.8G IF-ED"},
 2328|    170|      {0x83, 0x00, 0xB0, 0xB0, 0x5A, 0x5A, 0x88, 0x04, 0x00, 0x00, 0x00, "Nikon", "", "FSA-L2, EDG 65, 800mm F13 G"},
 2329|       |      // 84
 2330|       |      // 85
 2331|       |      // 86
 2332|       |      // 87
 2333|       |      // 88
 2334|    170|      {0x89, 0x3C, 0x53, 0x80, 0x30, 0x3C, 0x8B, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA793DA",
 2335|    170|       "AF-S DX Zoom-Nikkor 55-200mm f/4-5.6G ED"},
 2336|    170|      {0x8A, 0x54, 0x6A, 0x6A, 0x24, 0x24, 0x8C, 0x0E, 0x53, 0x00, 0x00, "Nikon", "JAA630DA",
 2337|    170|       "AF-S VR Micro-Nikkor 105mm f/2.8G IF-ED"},
 2338|    170|      {0x8B, 0x40, 0x2D, 0x80, 0x2C, 0x3C, 0x8D, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA794DA",
 2339|    170|       "AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED"},
 2340|       |      //{0x8B,0x40,0x2D,0x80,0x2C,0x3C,0xFD,0x0E,0x01,0x01,0x00, "Nikon", "JAA794DA", "AF-S DX VR Zoom-Nikkor
 2341|       |      // 18-200mm f/3.5-5.6G IF-ED"}, // Fix bug #1026.
 2342|    170|      {0x8B, 0x40, 0x2D, 0x80, 0x2C, 0x3C, 0xFD, 0x0E, 0x01, 0x02, 0x00, "Nikon", "JAA813DA",
 2343|    170|       "AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED II"},
 2344|    170|      {0x8C, 0x40, 0x2D, 0x53, 0x2C, 0x3C, 0x8E, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA792DA",
 2345|    170|       "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED"},
 2346|    170|      {0x8D, 0x44, 0x5C, 0x8E, 0x34, 0x3C, 0x8F, 0x0E, 0x31, 0x00, 0x00, "Nikon", "JAA795DA",
 2347|    170|       "AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED"},
 2348|       |      // 8E                90
 2349|    170|      {0x8F, 0x40, 0x2D, 0x72, 0x2C, 0x3C, 0x91, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA796DA",
 2350|    170|       "AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED"},
 2351|    170|      {0x90, 0x3B, 0x53, 0x80, 0x30, 0x3C, 0x92, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA798DA",
 2352|    170|       "AF-S DX VR Zoom-Nikkor 55-200mm f/4-5.6G IF-ED"},
 2353|       |      // 91                93
 2354|    170|      {0x92, 0x48, 0x24, 0x37, 0x24, 0x24, 0x94, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA801DA",
 2355|    170|       "AF-S Zoom-Nikkor 14-24mm f/2.8G ED"},
 2356|    170|      {0x93, 0x48, 0x37, 0x5C, 0x24, 0x24, 0x95, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA802DA",
 2357|    170|       "AF-S Zoom-Nikkor 24-70mm f/2.8G ED"},
 2358|    170|      {0x94, 0x40, 0x2D, 0x53, 0x2C, 0x3C, 0x96, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA797DA",
 2359|    170|       "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II"},
 2360|    170|      {0x95, 0x4C, 0x37, 0x37, 0x2C, 0x2C, 0x97, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA631DA",
 2361|    170|       "PC-E Nikkor 24mm f/3.5D ED"},
 2362|    170|      {0x95, 0x00, 0x37, 0x37, 0x2C, 0x2C, 0x97, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA631DA",
 2363|    170|       "PC-E Nikkor 24mm f/3.5D ED"},
 2364|    170|      {0x96, 0x48, 0x98, 0x98, 0x24, 0x24, 0x98, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA528DA",
 2365|    170|       "AF-S VR Nikkor 400mm f/2.8G ED"},
 2366|    170|      {0x97, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0x99, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA529DA",
 2367|    170|       "AF-S VR Nikkor 500mm f/4G ED"},
 2368|    170|      {0x98, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0x9A, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA530DA",
 2369|    170|       "AF-S VR Nikkor 600mm f/4G ED"},
 2370|    170|      {0x99, 0x40, 0x29, 0x62, 0x2C, 0x3C, 0x9B, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA800DA",
 2371|    170|       "AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED"},
 2372|    170|      {0x9A, 0x40, 0x2D, 0x53, 0x2C, 0x3C, 0x9C, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA803DA",
 2373|    170|       "AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G"},
 2374|    170|      {0x9B, 0x54, 0x4C, 0x4C, 0x24, 0x24, 0x9D, 0x02, 0x00, 0x00, 0x00, "Nikon", "JAA633DA",
 2375|    170|       "PC-E Micro Nikkor 45mm f/2.8D ED"},
 2376|    170|      {0x9B, 0x00, 0x4C, 0x4C, 0x24, 0x24, 0x9D, 0x06, 0x00, 0x00, 0x00, "Nikon", "JAA633DA",
 2377|    170|       "PC-E Micro Nikkor 45mm f/2.8D ED"},
 2378|    170|      {0x9C, 0x54, 0x56, 0x56, 0x24, 0x24, 0x9E, 0x06, 0x41, 0x00, 0x00, "Nikon", "JAA632DA",
 2379|    170|       "AF-S Micro Nikkor 60mm f/2.8G ED"},
 2380|    170|      {0x9D, 0x54, 0x62, 0x62, 0x24, 0x24, 0x9F, 0x02, 0x40, 0x00, 0x00, "Nikon", "JAA634DA",
 2381|    170|       "PC-E Micro Nikkor 85mm f/2.8D"},
 2382|    170|      {0x9D, 0x00, 0x62, 0x62, 0x24, 0x24, 0x9F, 0x06, 0x40, 0x00, 0x00, "Nikon", "JAA634DA",
 2383|    170|       "PC-E Micro Nikkor 85mm f/2.8D"},
 2384|    170|      {0x9E, 0x40, 0x2D, 0x6A, 0x2C, 0x3C, 0xA0, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA805DA",
 2385|    170|       "AF-S DX VR Zoom-Nikkor 18-105mm f/3.5-5.6G ED"},
 2386|    170|      {0x9F, 0x58, 0x44, 0x44, 0x14, 0x14, 0xA1, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA132DA",
 2387|    170|       "AF-S DX Nikkor 35mm f/1.8G"},
 2388|    170|      {0xA0, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0xA2, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA014DA",
 2389|    170|       "AF-S Nikkor 50mm f/1.4G"},
 2390|    170|      {0xA1, 0x40, 0x18, 0x37, 0x2C, 0x34, 0xA3, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA804DA",
 2391|    170|       "AF-S DX Nikkor 10-24mm f/3.5-4.5G ED"},
 2392|    170|      {0xA2, 0x38, 0x5C, 0x8E, 0x34, 0x40, 0xCD, 0x86, 0x00, 0x00, 0x00, "Nikon", "JAA829DA",
 2393|    170|       "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR"},
 2394|    170|      {0xA2, 0x48, 0x5C, 0x80, 0x24, 0x24, 0xA4, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA807DA",
 2395|    170|       "AF-S Nikkor 70-200mm f/2.8G ED VR II"},
 2396|    170|      {0xA3, 0x3C, 0x29, 0x44, 0x30, 0x30, 0xA5, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA806DA",
 2397|    170|       "AF-S Nikkor 16-35mm f/4G ED VR"},
 2398|    170|      {0xA4, 0x54, 0x37, 0x37, 0x0C, 0x0C, 0xA6, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA131DA",
 2399|    170|       "AF-S Nikkor 24mm f/1.4G ED"},
 2400|    170|      {0xA5, 0x40, 0x3C, 0x8E, 0x2C, 0x3C, 0xA7, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA808DA",
 2401|    170|       "AF-S Nikkor 28-300mm f/3.5-5.6G ED VR"},
 2402|    170|      {0xA6, 0x48, 0x8E, 0x8E, 0x24, 0x24, 0xA8, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA339DA",
 2403|    170|       "AF-S Nikkor 300mm f/2.8G IF-ED VR II"},
 2404|    170|      {0xA7, 0x4B, 0x62, 0x62, 0x2C, 0x2C, 0xA9, 0x0E, 0x41, 0x00, 0x00, "Nikon", "JAA637DA",
 2405|    170|       "AF-S DX Micro Nikkor 85mm f/3.5G ED VR"},
 2406|    170|      {0xA8, 0x48, 0x80, 0x98, 0x30, 0x30, 0xAA, 0x0E, 0x03, 0x00, 0x00, "Nikon", "JAA809DA",
 2407|    170|       "AF-S Zoom-Nikkor 200-400mm f/4G IF-ED VR II"},
 2408|    170|      {0xA9, 0x54, 0x80, 0x80, 0x18, 0x18, 0xAB, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA340DA",
 2409|    170|       "AF-S Nikkor 200mm f/2G ED VR II"},
 2410|    170|      {0xAA, 0x3C, 0x37, 0x6E, 0x30, 0x30, 0xAC, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA811DA",
 2411|    170|       "AF-S Nikkor 24-120mm f/4G ED VR"},
 2412|       |      // AB                AD                                          -- no lens --
 2413|    170|      {0xAC, 0x38, 0x53, 0x8E, 0x34, 0x3C, 0xAE, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA814DA",
 2414|    170|       "AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR"},
 2415|    170|      {0xAD, 0x3C, 0x2D, 0x8E, 0x2C, 0x3C, 0xAF, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA812DA",
 2416|    170|       "AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR"},
 2417|    170|      {0xAD, 0x3C, 0xA0, 0xA0, 0x3C, 0x3C, 0xD8, 0x4E, 0x00, 0x00, 0x00, "Nikon", "JAA535DA",
 2418|    170|       "AF-S Nikkor 500mm f/5.6E PF ED VR"},
 2419|    170|      {0xAE, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0xB0, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA338DA",
 2420|    170|       "AF-S Nikkor 85mm f/1.4G"},
 2421|    170|      {0xAF, 0x54, 0x44, 0x44, 0x0C, 0x0C, 0xB1, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA134DA",
 2422|    170|       "AF-S Nikkor 35mm f/1.4G"},
 2423|    170|      {0xB0, 0x4C, 0x50, 0x50, 0x14, 0x14, 0xB2, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA015DA",
 2424|    170|       "AF-S Nikkor 50mm f/1.8G"},
 2425|    170|      {0xB1, 0x48, 0x48, 0x48, 0x24, 0x24, 0xB3, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA638DA",
 2426|    170|       "AF-S DX Micro Nikkor 40mm f/2.8G"},
 2427|    170|      {0xB2, 0x48, 0x5C, 0x80, 0x30, 0x30, 0xB4, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA815DA",
 2428|    170|       "AF-S Nikkor 70-200mm f/4G ED VR"},
 2429|    170|      {0xB3, 0x4C, 0x62, 0x62, 0x14, 0x14, 0xB5, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA341DA",
 2430|    170|       "AF-S Nikkor 85mm f/1.8G"},
 2431|    170|      {0xB4, 0x40, 0x37, 0x62, 0x2C, 0x34, 0xB6, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA816DA",
 2432|    170|       "AF-S Nikkor 24-85mm f/3.5-4.5G ED VR"},
 2433|    170|      {0xB5, 0x4C, 0x3C, 0x3C, 0x14, 0x14, 0xB7, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA135DA",
 2434|    170|       "AF-S Nikkor 28mm f/1.8G"},
 2435|    170|      {0xB6, 0x3C, 0xB0, 0xB0, 0x3C, 0x3C, 0xB8, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA531DA",
 2436|    170|       "AF-S VR Nikkor 800mm f/5.6E FL ED"},
 2437|    170|      {0xB6, 0x3C, 0xB0, 0xB0, 0x3C, 0x3C, 0xB8, 0x4E, 0x01, 0x00, 0x00, "Nikon", "JAA531DA",
 2438|    170|       "AF-S VR Nikkor 800mm f/5.6E FL ED"},
 2439|    170|      {0xB7, 0x44, 0x60, 0x98, 0x34, 0x3C, 0xB9, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA817DA",
 2440|    170|       "AF-S Nikkor 80-400mm f/4.5-5.6G ED VR"},
 2441|    170|      {0xB8, 0x40, 0x2D, 0x44, 0x2C, 0x34, 0xBA, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA818DA",
 2442|    170|       "AF-S Nikkor 18-35mm f/3.5-4.5G ED"},
 2443|    170|      {0xA0, 0x40, 0x2D, 0x74, 0x2C, 0x3C, 0xBB, 0x0E, 0x01, 0x00, 0x01, "Nikon", "JAA819DA",
 2444|    170|       "AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR"},
 2445|    170|      {0xA1, 0x54, 0x55, 0x55, 0x0C, 0x0C, 0xBC, 0x06, 0x01, 0x00, 0x01, "Nikon", "JAA136DA",
 2446|    170|       "AF-S Nikkor 58mm f/1.4G"},
 2447|    170|      {0xA2, 0x40, 0x2D, 0x53, 0x2C, 0x3C, 0xBD, 0x0E, 0x01, 0x00, 0x01, "Nikon", "JAA820DA",
 2448|    170|       "AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II"},
 2449|    170|      {0xA4, 0x40, 0x2D, 0x8E, 0x2C, 0x40, 0xBF, 0x0E, 0x01, 0x00, 0x01, "Nikon", "JAA821DA",
 2450|    170|       "AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR"},
 2451|    170|      {0xA5, 0x4C, 0x44, 0x44, 0x14, 0x14, 0xC0, 0x06, 0x01, 0x00, 0x01, "Nikon", "JAA137DA",
 2452|    170|       "AF-S Nikkor 35mm f/1.8G ED"},
 2453|    170|      {0xA6, 0x48, 0x98, 0x98, 0x24, 0x24, 0xC1, 0x0E, 0x01, 0x00, 0x01, "Nikon", "JAA532DA",
 2454|    170|       "AF-S Nikkor 400mm f/2.8E FL ED VR"},
 2455|    170|      {0xA7, 0x3C, 0x53, 0x80, 0x30, 0x3C, 0xC2, 0x0E, 0x01, 0x00, 0x01, "Nikon", "JAA823DA",
 2456|    170|       "AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II"},
 2457|    170|      {0xA8, 0x48, 0x8E, 0x8E, 0x30, 0x30, 0xC3, 0x4E, 0x01, 0x00, 0x01, "Nikon", "JAA342DA",
 2458|    170|       "AF-S Nikkor 300mm f/4E PF ED VR"},
 2459|    170|      {0xA8, 0x48, 0x8E, 0x8E, 0x30, 0x30, 0xC3, 0x0E, 0x01, 0x00, 0x01, "Nikon", "JAA342DA",
 2460|    170|       "AF-S Nikkor 300mm f/4E PF ED VR"},
 2461|    170|      {0xA9, 0x4C, 0x31, 0x31, 0x14, 0x14, 0xC4, 0x06, 0x01, 0x00, 0x01, "Nikon", "JAA138DA",
 2462|    170|       "AF-S Nikkor 20mm f/1.8G ED"},
 2463|    170|      {0xAA, 0x48, 0x37, 0x5C, 0x24, 0x24, 0xC5, 0x4E, 0x01, 0x00, 0x02, "Nikon", "JAA824DA",
 2464|    170|       "AF-S Nikkor 24-70mm f/2.8E ED VR"},
 2465|    170|      {0xAA, 0x48, 0x37, 0x5C, 0x24, 0x24, 0xC5, 0x0E, 0x01, 0x00, 0x02, "Nikon", "JAA824DA",
 2466|    170|       "AF-S Nikkor 24-70mm f/2.8E ED VR"},
 2467|    170|      {0xAB, 0x3C, 0xA0, 0xA0, 0x30, 0x30, 0xC6, 0x4E, 0x01, 0x00, 0x02, "Nikon", "JAA533DA",
 2468|    170|       "AF-S Nikkor 500mm f/4E FL ED VR"},
 2469|    170|      {0xAC, 0x3C, 0xA6, 0xA6, 0x30, 0x30, 0xC7, 0x4E, 0x01, 0x00, 0x02, "Nikon", "JAA534DA",
 2470|    170|       "AF-S Nikkor 600mm f/4E FL ED VR"},
 2471|    170|      {0xAD, 0x48, 0x28, 0x60, 0x24, 0x30, 0xC8, 0x4E, 0x01, 0x00, 0x02, "Nikon", "JAA825DA",
 2472|    170|       "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"},
 2473|    170|      {0xAD, 0x48, 0x28, 0x60, 0x24, 0x30, 0xC8, 0x0E, 0x01, 0x00, 0x02, "Nikon", "JAA825DA",
 2474|    170|       "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"},
 2475|    170|      {0xAE, 0x3C, 0x80, 0xA0, 0x3C, 0x3C, 0xC9, 0x4E, 0x01, 0x00, 0x02, "Nikon", "JAA822DA",
 2476|    170|       "AF-S Nikkor 200-500mm f/5.6E ED VR"},
 2477|    170|      {0xAE, 0x3C, 0x80, 0xA0, 0x3C, 0x3C, 0xC9, 0x0E, 0x01, 0x00, 0x02, "Nikon", "JAA822DA",
 2478|    170|       "AF-S Nikkor 200-500mm f/5.6E ED VR"},
 2479|    170|      {0xA0, 0x40, 0x2D, 0x53, 0x2C, 0x3C, 0xCA, 0x8E, 0x01, 0x00, 0x03, "Nikon", "JAA826DA",
 2480|    170|       "AF-P DX Nikkor 18-55mm f/3.5-5.6G VR"},
 2481|    170|      {0xA0, 0x40, 0x2D, 0x53, 0x2C, 0x3C, 0xCA, 0x0E, 0x01, 0x00, 0x03, "Nikon", "JAA827DA",
 2482|    170|       "AF-P DX Nikkor 18-55mm f/3.5-5.6G"},
 2483|       |      //                  CB
 2484|    170|      {0xAF, 0x4C, 0x37, 0x37, 0x14, 0x14, 0xCC, 0x06, 0x01, 0x00, 0x03, "Nikon", "JAA139DA",
 2485|    170|       "AF-S Nikkor 24mm f/1.8G ED"},
 2486|    170|      {0xA3, 0x38, 0x5C, 0x8E, 0x34, 0x40, 0xCE, 0x8E, 0x01, 0x00, 0x03, "Nikon", "JAA829DA",
 2487|    170|       "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR"},
 2488|    170|      {0xA3, 0x38, 0x5C, 0x8E, 0x34, 0x40, 0xCE, 0x0E, 0x01, 0x00, 0x03, "Nikon", "JAA828DA",
 2489|    170|       "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED"},
 2490|    170|      {0xA4, 0x48, 0x5C, 0x80, 0x24, 0x24, 0xCF, 0x4E, 0x01, 0x00, 0x03, "Nikon", "JAA830DA",
 2491|    170|       "AF-S Nikkor 70-200mm f/2.8E FL ED VR"},
 2492|    170|      {0xA4, 0x48, 0x5C, 0x80, 0x24, 0x24, 0xCF, 0x0E, 0x01, 0x00, 0x03, "Nikon", "JAA830DA",
 2493|    170|       "AF-S Nikkor 70-200mm f/2.8E FL ED VR"},
 2494|    170|      {0xA5, 0x54, 0x6A, 0x6A, 0x0C, 0x0C, 0xD0, 0x46, 0x01, 0x00, 0x03, "Nikon", "JAA343DA",
 2495|    170|       "AF-S Nikkor 105mm f/1.4E ED"},
 2496|    170|      {0xA5, 0x54, 0x6A, 0x6A, 0x0C, 0x0C, 0xD0, 0x06, 0x01, 0x00, 0x03, "Nikon", "JAA343DA",
 2497|    170|       "AF-S Nikkor 105mm f/1.4E ED"},
 2498|    170|      {0xA6, 0x48, 0x2F, 0x2F, 0x30, 0x30, 0xD1, 0x46, 0x01, 0x00, 0x03, "Nikon", "JAA639DA", "PC Nikkor 19mm f/4E ED"},
 2499|    170|      {0xA6, 0x48, 0x2F, 0x2F, 0x30, 0x30, 0xD1, 0x06, 0x01, 0x00, 0x03, "Nikon", "JAA639DA", "PC Nikkor 19mm f/4E ED"},
 2500|    170|      {0xA7, 0x40, 0x11, 0x26, 0x2C, 0x34, 0xD2, 0x46, 0x01, 0x00, 0x03, "Nikon", "JAA831DA",
 2501|    170|       "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"},
 2502|    170|      {0xA7, 0x40, 0x11, 0x26, 0x2C, 0x34, 0xD2, 0x06, 0x01, 0x00, 0x03, "Nikon", "JAA831DA",
 2503|    170|       "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"},
 2504|    170|      {0xA8, 0x38, 0x18, 0x30, 0x34, 0x3C, 0xD3, 0x8E, 0x01, 0x00, 0x03, "Nikon", "JAA832DA",
 2505|    170|       "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"},
 2506|    170|      {0xA8, 0x38, 0x18, 0x30, 0x34, 0x3C, 0xD3, 0x0E, 0x01, 0x00, 0x03, "Nikon", "JAA832DA",
 2507|    170|       "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"},
 2508|       |      // A9                D4
 2509|       |      // AA                D5
 2510|    170|      {0xAB, 0x44, 0x5C, 0x8E, 0x34, 0x3C, 0xD6, 0xCE, 0x01, 0x00, 0x03, "Nikon", "JAA833DA",
 2511|    170|       "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"},
 2512|    170|      {0xAB, 0x44, 0x5C, 0x8E, 0x34, 0x3C, 0xD6, 0x0E, 0x01, 0x00, 0x03, "Nikon", "JAA833DA",
 2513|    170|       "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"},
 2514|    170|      {0xAC, 0x54, 0x3C, 0x3C, 0x0C, 0x0C, 0xD7, 0x46, 0x01, 0x00, 0x03, "Nikon", "JAA140DA",
 2515|    170|       "AF-S Nikkor 28mm f/1.4E ED"},
 2516|    170|      {0xAC, 0x54, 0x3C, 0x3C, 0x0C, 0x0C, 0xD7, 0x06, 0x01, 0x00, 0x03, "Nikon", "JAA140DA",
 2517|    170|       "AF-S Nikkor 28mm f/1.4E ED"},
 2518|       |      //
 2519|       |      //
 2520|       |      //
 2521|       |      //
 2522|       |      //   "AF-S DX Nikkor 18-200mm f/3.5-5.6G ED VR II"
 2523|       |      //
 2524|    170|      {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA90701", "TC-16A"},
 2525|    170|      {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA90701", "TC-16A"},
 2526|       |      //
 2527|       |      //------------------------------------------------------------------------------
 2528|       |      // Sigma lenses by focal length, first fixed then zoom lenses
 2529|       |      //------------------------------------------------------------------------------
 2530|       |      //
 2531|    170|      {0xFE, 0x47, 0x00, 0x00, 0x24, 0x24, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "486556",
 2532|    170|       "4.5mm F2.8 EX DC HSM Circular Fisheye"},
 2533|    170|      {0x26, 0x48, 0x11, 0x11, 0x30, 0x30, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "483", "8mm F4 EX Circular Fisheye"},
 2534|    170|      {0x79, 0x40, 0x11, 0x11, 0x2C, 0x2C, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "485597",
 2535|    170|       "8mm F3.5 EX Circular Fisheye"},
 2536|    170|      {0xDC, 0x48, 0x19, 0x19, 0x24, 0x24, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "477554",
 2537|    170|       "10mm F2.8 EX DC HSM Fisheye"},
 2538|    170|      {0x02, 0x3F, 0x24, 0x24, 0x2C, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "468", "14mm F3.5"},
 2539|    170|      {0x48, 0x48, 0x24, 0x24, 0x24, 0x24, 0x4B, 0x02, 0x01, 0x00, 0x00, "Sigma", "", "14mm F2.8 EX Aspherical HSM"},
 2540|    170|      {0x26, 0x48, 0x27, 0x27, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "476441",
 2541|    170|       "15mm F2.8 EX Diagonal Fisheye"},
 2542|    170|      {0xEA, 0x48, 0x27, 0x27, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "15mm F2.8 EX Diagonal Fisheye"},
 2543|       |      // M                                         "Sigma" "410"    "18mm F3.5";
 2544|    170|      {0x26, 0x58, 0x31, 0x31, 0x14, 0x14, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "411442",
 2545|    170|       "20mm F1.8 EX DG Aspherical RF"},
 2546|    170|      {0x79, 0x54, 0x31, 0x31, 0x0C, 0x0C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "412555", "20mm F1.4 DG HSM | A"},
 2547|    170|      {0x7E, 0x54, 0x37, 0x37, 0x0C, 0x0C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "401559", "24mm F1.4 DG HSM | A"},
 2548|    170|      {0x26, 0x58, 0x37, 0x37, 0x14, 0x14, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "432447",
 2549|    170|       "24mm F1.8 EX DG Aspherical Macro"},
 2550|    170|      {0xE1, 0x58, 0x37, 0x37, 0x14, 0x14, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "432447",
 2551|    170|       "24mm F1.8 EX DG Aspherical Macro"},
 2552|    170|      {0x02, 0x46, 0x37, 0x37, 0x25, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "438",
 2553|    170|       "24mm F2.8 Super Wide II Macro"},
 2554|    170|      {0xBC, 0x54, 0x3C, 0x3C, 0x0C, 0x0C, 0x4B, 0x46, 0x00, 0x00, 0x00, "Sigma", "441555", "28mm F1.4 DG HSM | A"},
 2555|    170|      {0x26, 0x58, 0x3C, 0x3C, 0x14, 0x14, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "440442",
 2556|    170|       "28mm F1.8 EX DG Aspherical Macro"},
 2557|    170|      {0x48, 0x54, 0x3E, 0x3E, 0x0C, 0x0C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "477554", "30mm F1.4 EX DC HSM"},
 2558|    170|      {0xF8, 0x54, 0x3E, 0x3E, 0x0C, 0x0C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "477554", "30mm F1.4 EX DC HSM"},
 2559|    170|      {0x91, 0x54, 0x44, 0x44, 0x0C, 0x0C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "", "35mm F1.4 DG HSM"},
 2560|    170|      {0xDE, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "310554", "50mm F1.4 EX DG HSM"},
 2561|    170|      {0x88, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "311551", "50mm F1.4 DG HSM | A"},
 2562|    170|      {0x02, 0x48, 0x50, 0x50, 0x24, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "Macro 50mm F2.8"},
 2563|    170|      {0x32, 0x54, 0x50, 0x50, 0x24, 0x24, 0x35, 0x02, 0x00, 0x00, 0x00, "Sigma", "346447", "Macro 50mm F2.8 EX DG"},
 2564|    170|      {0xE3, 0x54, 0x50, 0x50, 0x24, 0x24, 0x35, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "Macro 50mm F2.8 EX DG"},
 2565|    170|      {0x79, 0x48, 0x5C, 0x5C, 0x24, 0x24, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "270599", "Macro 70mm F2.8 EX DG"},
 2566|    170|      {0x9B, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "85mm F1.4 EX DG HSM"},
 2567|    170|      {0x02, 0x48, 0x65, 0x65, 0x24, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "Macro 90mm F2.8"},
 2568|    170|      {0x32, 0x54, 0x6A, 0x6A, 0x24, 0x24, 0x35, 0x02, 0x00, 0x02, 0x00, "Sigma", "256", "Macro 105mm F2.8 EX DG"},
 2569|    170|      {0xE5, 0x54, 0x6A, 0x6A, 0x24, 0x24, 0x35, 0x02, 0x40, 0x00, 0x00, "Sigma", "257446", "Macro 105mm F2.8 EX DG"},
 2570|    170|      {0x97, 0x48, 0x6A, 0x6A, 0x24, 0x24, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "", "Macro 105mm F2.8 EX DG OS HSM"},
 2571|    170|      {0x48, 0x48, 0x76, 0x76, 0x24, 0x24, 0x4B, 0x06, 0x43, 0x00, 0x00, "Sigma", "104559",
 2572|    170|       "APO Macro 150mm F2.8 EX DG HSM"},
 2573|    170|      {0xF5, 0x48, 0x76, 0x76, 0x24, 0x24, 0x4B, 0x06, 0x43, 0x00, 0x00, "Sigma", "104559",
 2574|    170|       "APO Macro 150mm F2.8 EX DG HSM"},
 2575|    170|      {0x99, 0x48, 0x76, 0x76, 0x24, 0x24, 0x4B, 0x0E, 0x43, 0x00, 0x00, "Sigma", "",
 2576|    170|       "APO Macro 150mm F2.8 EX DG OS HSM"},
 2577|    170|      {0x48, 0x4C, 0x7C, 0x7C, 0x2C, 0x2C, 0x4B, 0x02, 0x43, 0x00, 0x00, "Sigma", "", "APO Macro 180mm F3.5 EX DG HSM"},
 2578|    170|      {0x48, 0x4C, 0x7D, 0x7D, 0x2C, 0x2C, 0x4B, 0x02, 0x43, 0x00, 0x00, "Sigma", "105556",
 2579|    170|       "APO Macro 180mm F3.5 EX DG HSM"},
 2580|    170|      {0x94, 0x48, 0x7C, 0x7C, 0x24, 0x24, 0x4B, 0x0E, 0x43, 0x00, 0x00, "Sigma", "",
 2581|    170|       "APO Macro 180mm F2.8 EX DG OS HSM"},
 2582|       |      // M                                         "Sigma" ""       "APO 300mm F2.8";
 2583|    170|      {0x48, 0x54, 0x8E, 0x8E, 0x24, 0x24, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "", "APO 300mm F2.8 EX DG HSM"},
 2584|    170|      {0xFB, 0x54, 0x8E, 0x8E, 0x24, 0x24, 0x4B, 0x02, 0x13, 0x00, 0x00, "Sigma", "195557", "APO 300mm F2.8 EX DG HSM"},
 2585|    170|      {0x26, 0x48, 0x8E, 0x8E, 0x30, 0x30, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "APO Tele Macro 300mm F4"},
 2586|    170|      {0x02, 0x2F, 0x98, 0x98, 0x3D, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "APO 400mm F5.6"},
 2587|    170|      {0x26, 0x3C, 0x98, 0x98, 0x3C, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "APO Tele Macro 400mm F5.6"},
 2588|    170|      {0x02, 0x37, 0xA0, 0xA0, 0x34, 0x34, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "APO 500mm F4.5"},
 2589|    170|      {0x48, 0x44, 0xA0, 0xA0, 0x34, 0x34, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "", "APO 500mm F4.5 EX HSM"},
 2590|    170|      {0xF1, 0x44, 0xA0, 0xA0, 0x34, 0x34, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "184551", "APO 500mm F4.5 EX DG HSM"},
 2591|    170|      {0x02, 0x34, 0xA0, 0xA0, 0x44, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "APO 500mm F7.2"},
 2592|    170|      {0x02, 0x3C, 0xB0, 0xB0, 0x3C, 0x3C, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "APO 800mm F5.6"},
 2593|    170|      {0x48, 0x3C, 0xB0, 0xB0, 0x3C, 0x3C, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "", "APO 800mm F5.6 EX HSM"},
 2594|       |      // M                                         "Sigma" "152550" "APO 800mm F5.6 EX DG HSM";
 2595|       |      // M2    B8 B8 49 49 02" "00" "00" "00" "00" "Sigma" ""       "APO 1000mm F8.0";
 2596|       |      //
 2597|    170|      {0x9E, 0x38, 0x11, 0x29, 0x34, 0x3C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "", "8-16mm F4.5-5.6 DC HSM"},
 2598|    170|      {0xA1, 0x41, 0x19, 0x31, 0x2C, 0x2C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "", "10-20mm F3.5 EX DC HSM"},
 2599|    170|      {0x48, 0x3C, 0x19, 0x31, 0x30, 0x3C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "201555", "10-20mm F4-5.6 EX DC HSM"},
 2600|    170|      {0xF9, 0x3C, 0x19, 0x31, 0x30, 0x3C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "201555", "10-20mm F4-5.6 EX DC HSM"},
 2601|    170|      {0xCA, 0x3C, 0x1F, 0x37, 0x30, 0x30, 0x4B, 0x46, 0x01, 0x00, 0x00, "Sigma", "205955", "12-24mm F4 DG HSM | A"},
 2602|    170|      {0x48, 0x38, 0x1F, 0x37, 0x34, 0x3C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "200558",
 2603|    170|       "12-24mm F4.5-5.6 EX DG Aspherical HSM"},
 2604|    170|      {0xF0, 0x38, 0x1F, 0x37, 0x34, 0x3C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "200558",
 2605|    170|       "12-24mm F4.5-5.6 EX DG Aspherical HSM"},
 2606|    170|      {0x96, 0x38, 0x1F, 0x37, 0x34, 0x3C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "12-24mm F4.5-5.6 II DG HSM"},
 2607|    170|      {0xC1, 0x48, 0x24, 0x37, 0x24, 0x24, 0x4B, 0x46, 0x00, 0x00, 0x00, "Sigma", "", "14-24mm F2.8 DG HSM | A"},
 2608|    170|      {0x26, 0x40, 0x27, 0x3F, 0x2C, 0x34, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2609|    170|       "15-30mm F3.5-4.5 EX DG Aspherical DF"},
 2610|    170|      {0x48, 0x48, 0x2B, 0x44, 0x24, 0x30, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "",
 2611|    170|       "17-35mm F2.8-4 EX DG Aspherical HSM"},
 2612|    170|      {0x26, 0x54, 0x2B, 0x44, 0x24, 0x30, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "17-35mm F2.8-4 EX Aspherical"},
 2613|    170|      {0x9D, 0x48, 0x2B, 0x50, 0x24, 0x24, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "", "17-50mm F2.8 EX DC OS HSM"},
 2614|    170|      {0x8F, 0x48, 0x2B, 0x50, 0x24, 0x24, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "", "17-50mm F2.8 EX DC OS HSM"},
 2615|    170|      {0x7A, 0x47, 0x2B, 0x5C, 0x24, 0x34, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "689599",
 2616|    170|       "17-70mm F2.8-4.5 DC Macro Asp. IF HSM"},
 2617|    170|      {0x7A, 0x48, 0x2B, 0x5C, 0x24, 0x34, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "689599",
 2618|    170|       "17-70mm F2.8-4.5 DC Macro Asp. IF HSM"},
 2619|    170|      {0x7F, 0x48, 0x2B, 0x5C, 0x24, 0x34, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "",
 2620|    170|       "17-70mm F2.8-4.5 DC Macro Asp. IF"},
 2621|    170|      {0x8E, 0x3C, 0x2B, 0x5C, 0x24, 0x30, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "",
 2622|    170|       "17-70mm F2.8-4 DC Macro OS HSM | C"},
 2623|    170|      {0xA0, 0x48, 0x2A, 0x5C, 0x24, 0x30, 0x4B, 0x0E, 0x00, 0x00, 0xFE, "Sigma", "", "17-70mm F2.8-4 DC Macro OS HSM"},
 2624|    170|      {0x8B, 0x4C, 0x2D, 0x44, 0x14, 0x14, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "18-35mm F1.8 DC HSM"},
 2625|    170|      {0x26, 0x40, 0x2D, 0x44, 0x2B, 0x34, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "18-35mm F3.5-4.5 Aspherical"},
 2626|    170|      {0x26, 0x48, 0x2D, 0x50, 0x24, 0x24, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "18-50mm F2.8 EX DC"},
 2627|    170|      {0x7F, 0x48, 0x2D, 0x50, 0x24, 0x24, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "18-50mm F2.8 EX DC Macro"},
 2628|    170|      {0x7A, 0x48, 0x2D, 0x50, 0x24, 0x24, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "582593", "18-50mm F2.8 EX DC Macro"},
 2629|    170|      {0xF6, 0x48, 0x2D, 0x50, 0x24, 0x24, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "582593", "18-50mm F2.8 EX DC Macro"},
 2630|    170|      {0xA4, 0x47, 0x2D, 0x50, 0x24, 0x34, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "", "18-50mm F2.8-4.5 DC OS HSM"},
 2631|    170|      {0x26, 0x40, 0x2D, 0x50, 0x2C, 0x3C, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "18-50mm F3.5-5.6 DC"},
 2632|    170|      {0x7A, 0x40, 0x2D, 0x50, 0x2C, 0x3C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "551551", "18-50mm F3.5-5.6 DC HSM"},
 2633|    170|      {0x26, 0x40, 0x2D, 0x70, 0x2B, 0x3C, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "18-125mm F3.5-5.6 DC"},
 2634|    170|      {0xCD, 0x3D, 0x2D, 0x70, 0x2E, 0x3C, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "853556",
 2635|    170|       "18-125mm F3.8-5.6 DC OS HSM"},
 2636|    170|      {0x26, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "777555", "18-200mm F3.5-6.3 DC"},
 2637|    170|      {0xFF, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "18-200mm F3.5-6.3 DC"},
 2638|    170|      {0x7A, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "888558",
 2639|    170|       "18-200mm F3.5-6.3 DC OS HSM"},
 2640|    170|      {0xED, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "888558",
 2641|    170|       "18-200mm F3.5-6.3 DC OS HSM"},
 2642|    170|      {0x90, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "", "18-200mm F3.5-6.3 II DC OS HSM"},
 2643|    170|      {0xA5, 0x40, 0x2D, 0x88, 0x2C, 0x40, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "", "18-250mm F3.5-6.3 DC OS HSM"},
 2644|    170|      {0x92, 0x39, 0x2D, 0x88, 0x2C, 0x40, 0x4B, 0x0E, 0x01, 0x00, 0x00, "Sigma", "",
 2645|    170|       "18-250mm F3.5-6.3 DC OS Macro HSM"},
 2646|    170|      {0x26, 0x48, 0x31, 0x49, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "20-40mm F2.8"},
 2647|    170|      {0x02, 0x3A, 0x37, 0x50, 0x31, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "24-50mm F4-5.6 UC"},
 2648|    170|      {0x26, 0x48, 0x37, 0x56, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "547448", "24-60mm F2.8 EX DG"},
 2649|    170|      {0xB6, 0x48, 0x37, 0x56, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "547448", "24-60mm F2.8 EX DG"},
 2650|    170|      {0xA6, 0x48, 0x37, 0x5C, 0x24, 0x24, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "571559",
 2651|    170|       "24-70mm F2.8 IF EX DG HSM"},
 2652|    170|      {0x26, 0x54, 0x37, 0x5C, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "24-70mm F2.8 EX DG Macro"},
 2653|    170|      {0x67, 0x54, 0x37, 0x5C, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "548445", "24-70mm F2.8 EX DG Macro"},
 2654|    170|      {0xE9, 0x54, 0x37, 0x5C, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "548445", "24-70mm F2.8 EX DG Macro"},
 2655|    170|      {0x26, 0x40, 0x37, 0x5C, 0x2C, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "24-70mm F3.5-5.6 Aspherical HF"},
 2656|    170|      {0x8A, 0x3C, 0x37, 0x6A, 0x30, 0x30, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "", "24-105mm F4 DG OS HSM"},
 2657|    170|      {0x26, 0x54, 0x37, 0x73, 0x24, 0x34, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "24-135mm F2.8-4.5"},
 2658|    170|      {0x02, 0x46, 0x3C, 0x5C, 0x25, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "28-70mm F2.8"},
 2659|    170|      {0x26, 0x54, 0x3C, 0x5C, 0x24, 0x24, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "28-70mm F2.8 EX"},
 2660|    170|      {0x26, 0x48, 0x3C, 0x5C, 0x24, 0x24, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "549442", "28-70mm F2.8 EX DG"},
 2661|    170|      {0x79, 0x48, 0x3C, 0x5C, 0x24, 0x24, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "28-70mm F2.8 EX DG"},
 2662|    170|      {0x26, 0x48, 0x3C, 0x5C, 0x24, 0x30, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "634445", "28-70mm F2.8-4 DG"},
 2663|    170|      {0x02, 0x3F, 0x3C, 0x5C, 0x2D, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "28-70mm F3.5-4.5 UC"},
 2664|    170|      {0x26, 0x40, 0x3C, 0x60, 0x2C, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2665|    170|       "28-80mm F3.5-5.6 Mini Zoom Macro II Aspherical"},
 2666|    170|      {0x26, 0x40, 0x3C, 0x65, 0x2C, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "28-90mm F3.5-5.6 Macro"},
 2667|    170|      {0x26, 0x48, 0x3C, 0x6A, 0x24, 0x30, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "28-105mm F2.8-4 Aspherical"},
 2668|    170|      {0x26, 0x3E, 0x3C, 0x6A, 0x2E, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2669|    170|       "28-105mm F3.8-5.6 UC-III Aspherical IF"},
 2670|    170|      {0x26, 0x40, 0x3C, 0x80, 0x2C, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2671|    170|       "28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro"},
 2672|    170|      {0x26, 0x40, 0x3C, 0x80, 0x2B, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2673|    170|       "28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro"},
 2674|    170|      {0x26, 0x3D, 0x3C, 0x80, 0x2F, 0x3D, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "28-300mm F3.8-5.6 Aspherical"},
 2675|    170|      {0x26, 0x41, 0x3C, 0x8E, 0x2C, 0x40, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "795443",
 2676|    170|       "28-300mm F3.5-6.3 DG Macro"},
 2677|    170|      {0xE6, 0x41, 0x3C, 0x8E, 0x2C, 0x40, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "28-300mm F3.5-6.3 DG Macro"},
 2678|    170|      {0x26, 0x40, 0x3C, 0x8E, 0x2C, 0x40, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "28-300mm F3.5-6.3 Macro"},
 2679|    170|      {0x02, 0x3B, 0x44, 0x61, 0x30, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "35-80mm F4-5.6"},
 2680|    170|      {0x02, 0x40, 0x44, 0x73, 0x2B, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "35-135mm F3.5-4.5 a"},
 2681|    170|      {0xCC, 0x4C, 0x50, 0x68, 0x14, 0x14, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "50-100mm F1.8 DC HSM | A"},
 2682|    170|      {0x7A, 0x47, 0x50, 0x76, 0x24, 0x24, 0x4B, 0x06, 0x03, 0x00, 0x00, "Sigma", "", "50-150mm F2.8 EX APO DC HSM"},
 2683|    170|      {0xFD, 0x47, 0x50, 0x76, 0x24, 0x24, 0x4B, 0x06, 0x03, 0x00, 0x00, "Sigma", "691554",
 2684|    170|       "50-150mm F2.8 EX APO DC HSM II"},
 2685|    170|      {0x98, 0x48, 0x50, 0x76, 0x24, 0x24, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "", "50-150mm F2.8 EX DC APO OS HSM"},
 2686|    170|      {0x48, 0x3C, 0x50, 0xA0, 0x30, 0x40, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "736552",
 2687|    170|       "APO 50-500mm F4-6.3 EX HSM"},
 2688|    170|      {0x9F, 0x37, 0x50, 0xA0, 0x34, 0x40, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "",
 2689|    170|       "50-500mm F4.5-6.3 APO DG OS HSM"},
 2690|       |      // M                                         "Sigma" "686550" "50-200mm F4-5.6 DC OS HSM";
 2691|    170|      {0x26, 0x3C, 0x54, 0x80, 0x30, 0x3C, 0x1C, 0x06, 0x00, 0x00, 0x00, "Sigma", "", "55-200mm F4-5.6 DC"},
 2692|    170|      {0x7A, 0x3B, 0x53, 0x80, 0x30, 0x3C, 0x4B, 0x06, 0x01, 0x00, 0x00, "Sigma", "", "55-200mm F4-5.6 DC HSM"},
 2693|    170|      {0xBF, 0x38, 0x56, 0xA6, 0x34, 0x40, 0x4B, 0x4E, 0x00, 0x00, 0x00, "Sigma", "",
 2694|    170|       "60-600mm F4.5-6.3 DG OS HSM | S"},
 2695|    170|      {0x48, 0x54, 0x5C, 0x80, 0x24, 0x24, 0x4B, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "70-200mm F2.8 EX APO IF HSM"},
 2696|    170|      {0x7A, 0x48, 0x5C, 0x80, 0x24, 0x24, 0x4B, 0x06, 0x03, 0x00, 0x00, "Sigma", "",
 2697|    170|       "70-200mm F2.8 EX APO DG Macro HSM II"},
 2698|    170|      {0xEE, 0x48, 0x5C, 0x80, 0x24, 0x24, 0x4B, 0x06, 0x03, 0x00, 0x00, "Sigma", "579555",
 2699|    170|       "70-200mm F2.8 EX APO DG Macro HSM II"},
 2700|    170|      {0x9C, 0x48, 0x5C, 0x80, 0x24, 0x24, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "", "70-200mm F2.8 EX DG OS HSM"},
 2701|    170|      {0x02, 0x46, 0x5C, 0x82, 0x25, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "70-210mm F2.8 APO"},
 2702|    170|      {0x02, 0x40, 0x5C, 0x82, 0x2C, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "APO 70-210mm F3.5-4.5"},
 2703|    170|      {0x26, 0x3C, 0x5C, 0x82, 0x30, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "70-210mm F4-5.6 UC-II"},
 2704|    170|      {0x26, 0x3C, 0x5C, 0x8E, 0x30, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "70-300mm F4-5.6 DG Macro"},
 2705|    170|      {0x56, 0x3C, 0x5C, 0x8E, 0x30, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2706|    170|       "70-300mm F4-5.6 APO Macro Super II"},
 2707|    170|      {0xE0, 0x3C, 0x5C, 0x8E, 0x30, 0x3C, 0x4B, 0x06, 0x00, 0x00, 0x00, "Sigma", "508555",
 2708|    170|       "APO 70-300mm F4-5.6 DG Macro"},
 2709|    170|      {0xA3, 0x3C, 0x5C, 0x8E, 0x30, 0x3C, 0x4B, 0x0E, 0x00, 0x00, 0x00, "Sigma", "572556", "70-300mm F4-5.6 DG OS"},
 2710|    170|      {0x02, 0x37, 0x5E, 0x8E, 0x35, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "75-300mm F4.5-5.6 APO"},
 2711|    170|      {0x02, 0x3A, 0x5E, 0x8E, 0x32, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x00, "Sigma", "", "75-300mm F4.0-5.6"},
 2712|    170|      {0x77, 0x44, 0x61, 0x98, 0x34, 0x3C, 0x7B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "", "80-400mm f4.5-5.6 EX OS"},
 2713|    170|      {0x77, 0x44, 0x60, 0x98, 0x34, 0x3C, 0x7B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "", "80-400mm f4.5-5.6 APO DG D OS"},
 2714|    170|      {0x48, 0x48, 0x68, 0x8E, 0x30, 0x30, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "134556",
 2715|    170|       "APO 100-300mm F4 EX IF HSM"},
 2716|    170|      {0xF3, 0x48, 0x68, 0x8E, 0x30, 0x30, 0x4B, 0x02, 0x13, 0x00, 0x00, "Sigma", "134556",
 2717|    170|       "APO 100-300mm F4 EX IF HSM"},
 2718|    170|      {0x48, 0x54, 0x6F, 0x8E, 0x24, 0x24, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "", "APO 120-300mm F2.8 EX DG HSM"},
 2719|    170|      {0x7A, 0x54, 0x6E, 0x8E, 0x24, 0x24, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "135553",
 2720|    170|       "APO 120-300mm F2.8 EX DG HSM"},
 2721|    170|      {0xFA, 0x54, 0x6E, 0x8E, 0x24, 0x24, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "135553",
 2722|    170|       "APO 120-300mm F2.8 EX DG HSM"},
 2723|    170|      {0xCF, 0x38, 0x6E, 0x98, 0x34, 0x3C, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "728557",
 2724|    170|       "APO 120-400mm F4.5-5.6 DG OS HSM"},
 2725|    170|      {0xC3, 0x34, 0x68, 0x98, 0x38, 0x40, 0x4B, 0x4E, 0x03, 0x00, 0x00, "Sigma", "", "100-400mm F5-6.3 DG OS HSM | C"},
 2726|    170|      {0x8D, 0x48, 0x6E, 0x8E, 0x24, 0x24, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "", "120-300mm F2.8 DG OS HSM | S"},
 2727|    170|      {0x26, 0x44, 0x73, 0x98, 0x34, 0x3C, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2728|    170|       "135-400mm F4.5-5.6 APO Aspherical"},
 2729|    170|      {0xCE, 0x34, 0x76, 0xA0, 0x38, 0x40, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "737559",
 2730|    170|       "APO 150-500mm F5-6.3 DG OS HSM"},
 2731|    170|      {0x81, 0x34, 0x76, 0xA6, 0x38, 0x40, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "", "150-600mm F5-6.3 DG OS HSM | S"},
 2732|    170|      {0x82, 0x34, 0x76, 0xA6, 0x38, 0x40, 0x4B, 0x0E, 0x03, 0x00, 0x00, "Sigma", "", "150-600mm F5-6.3 DG OS HSM | C"},
 2733|    170|      {0x26, 0x40, 0x7B, 0xA0, 0x34, 0x40, 0x1C, 0x02, 0x00, 0x00, 0x00, "Sigma", "",
 2734|    170|       "APO 170-500mm F5-6.3 Aspherical RF"},
 2735|    170|      {0xA7, 0x49, 0x80, 0xA0, 0x24, 0x24, 0x4B, 0x06, 0x03, 0x00, 0x00, "Sigma", "", "APO 200-500mm F2.8 EX DG"},
 2736|    170|      {0x48, 0x3C, 0x8E, 0xB0, 0x3C, 0x3C, 0x4B, 0x02, 0x03, 0x00, 0x00, "Sigma", "595555",
 2737|    170|       "APO 300-800mm F5.6 EX DG HSM"},
 2738|       |      //
 2739|       |      //------------------------------------------------------------------------------
 2740|       |      // Tamron lenses by focal length, first fixed then zoom lenses
 2741|       |      //------------------------------------------------------------------------------
 2742|       |      //
 2743|    170|      {0x00, 0x47, 0x25, 0x25, 0x24, 0x24, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "69E",
 2744|    170|       "SP AF 14mm F/2.8 Aspherical (IF)"},
 2745|    170|      {0xE8, 0x4C, 0x44, 0x44, 0x14, 0x14, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "F012", "SP 35mm F/1.8 Di VC USD"},
 2746|    170|      {0xE7, 0x4C, 0x4C, 0x4C, 0x14, 0x14, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "F013", "SP 45mm F/1.8 Di VC USD"},
 2747|    170|      {0xF4, 0x54, 0x56, 0x56, 0x18, 0x18, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "G005",
 2748|    170|       "SP AF 60mm F/2 Di II LD (IF) Macro 1:1"},
 2749|    170|      {0x1E, 0x5D, 0x64, 0x64, 0x20, 0x20, 0x13, 0x00, 0x40, 0x00, 0x00, "Tamron", "52E", "SP AF 90mm F/2.5"},
 2750|    170|      {0x20, 0x5A, 0x64, 0x64, 0x20, 0x20, 0x14, 0x00, 0x40, 0x00, 0x00, "Tamron", "152E", "SP AF 90mm F/2.5 Macro"},
 2751|    170|      {0x22, 0x53, 0x64, 0x64, 0x24, 0x24, 0xE0, 0x02, 0x40, 0x00, 0x00, "Tamron", "72E", "SP AF 90mm F/2.8 Macro 1:1"},
 2752|    170|      {0x32, 0x53, 0x64, 0x64, 0x24, 0x24, 0x35, 0x02, 0x40, 0x01, 0x00, "Tamron", "172E",
 2753|    170|       "SP AF 90mm F/2.8 Macro 1:1"},
 2754|    170|      {0x32, 0x53, 0x64, 0x64, 0x24, 0x24, 0x35, 0x02, 0x40, 0x02, 0x00, "Tamron", "272E",
 2755|    170|       "SP AF 90mm F/2.8 Di Macro 1:1"},
 2756|    170|      {0xF8, 0x55, 0x64, 0x64, 0x24, 0x24, 0x84, 0x06, 0x41, 0x00, 0x00, "Tamron", "272NII",
 2757|    170|       "SP AF 90mm F/2.8 Di Macro 1:1"},
 2758|    170|      {0xF8, 0x54, 0x64, 0x64, 0x24, 0x24, 0xDF, 0x06, 0x41, 0x00, 0x00, "Tamron", "272NII",
 2759|    170|       "SP AF 90mm F/2.8 Di Macro 1:1"},
 2760|    170|      {0xFE, 0x54, 0x64, 0x64, 0x24, 0x24, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "F004",
 2761|    170|       "SP 90mm F/2.8 Di VC USD Macro 1:1"},
 2762|    170|      {0xE4, 0x54, 0x64, 0x64, 0x24, 0x24, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "F017",
 2763|    170|       "SP 90mm F/2.8 Di VC USD Macro 1:1"},
 2764|    170|      {0x00, 0x4C, 0x7C, 0x7C, 0x2C, 0x2C, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "B01", "SP AF 180mm F/3.5 Di Model"},
 2765|    170|      {0x21, 0x56, 0x8E, 0x8E, 0x24, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00, "Tamron", "60E", "SP AF 300mm F/2.8 LD-IF"},
 2766|    170|      {0x27, 0x54, 0x8E, 0x8E, 0x24, 0x24, 0x1D, 0x02, 0x00, 0x00, 0x00, "Tamron", "360E", "SP AF 300mm F/2.8 LD-IF"},
 2767|       |      //
 2768|    170|      {0xF6, 0x3F, 0x18, 0x37, 0x2C, 0x34, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "B001",
 2769|    170|       "SP AF 10-24mm F/3.5-4.5 Di II LD Aspherical (IF)"},
 2770|    170|      {0xF6, 0x3F, 0x18, 0x37, 0x2C, 0x34, 0xDF, 0x06, 0x01, 0x00, 0x00, "Tamron", "B001",
 2771|    170|       "SP AF 10-24mm F/3.5-4.5 Di II LD Aspherical (IF)"},
 2772|    170|      {0x00, 0x36, 0x1C, 0x2D, 0x34, 0x3C, 0x00, 0x06, 0x00, 0x00, 0x00, "Tamron", "A13",
 2773|    170|       "SP AF 11-18mm F/4.5-5.6 Di II LD Aspherical (IF)"},
 2774|    170|      {0xCA, 0x48, 0x27, 0x3E, 0x24, 0x24, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A041",
 2775|    170|       "SP 15-30mm F/2.8 Di VC USD G2"},
 2776|    170|      {0xE9, 0x48, 0x27, 0x3E, 0x24, 0x24, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "A012",
 2777|    170|       "SP 15-30mm F/2.8 Di VC USD"},
 2778|    170|      {0xEA, 0x40, 0x29, 0x8E, 0x2C, 0x40, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "B016",
 2779|    170|       "16-300mm F/3.5-6.3 Di II VC PZD Macro"},
 2780|    170|      {0x07, 0x46, 0x2B, 0x44, 0x24, 0x30, 0x03, 0x02, 0x00, 0x00, 0x00, "Tamron", "A05",
 2781|    170|       "SP AF 17-35mm F/2.8-4 Di LD Aspherical (IF)"},
 2782|    170|      {0x00, 0x53, 0x2B, 0x50, 0x24, 0x24, 0x00, 0x06, 0x00, 0x00, 0x00, "Tamron", "A16",
 2783|    170|       "SP AF 17-50mm F/2.8 XR Di II LD Aspherical (IF)"},
 2784|    170|      {0x00, 0x54, 0x2B, 0x50, 0x24, 0x24, 0x00, 0x06, 0x01, 0x00, 0x00, "Tamron", "A16NII",
 2785|    170|       "SP AF 17-50mm F/2.8 XR Di II LD Aspherical (IF)"},
 2786|    170|      {0xFB, 0x54, 0x2B, 0x50, 0x24, 0x24, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "A16NII",
 2787|    170|       "SP AF 17-50mm F/2.8 XR Di II LD Aspherical (IF)"},
 2788|    170|      {0xF3, 0x54, 0x2B, 0x50, 0x24, 0x24, 0x84, 0x0E, 0x01, 0x00, 0x00, "Tamron", "B005",
 2789|    170|       "SP AF 17-50mm F/2.8 XR Di II VC LD Aspherical (IF)"},
 2790|    170|      {0x00, 0x3F, 0x2D, 0x80, 0x2B, 0x40, 0x00, 0x06, 0x00, 0x00, 0x00, "Tamron", "A14",
 2791|    170|       "AF 18-200mm F/3.5-6.3 XR Di II LD Aspherical (IF)"},
 2792|    170|      {0x00, 0x3F, 0x2D, 0x80, 0x2C, 0x40, 0x00, 0x06, 0x00, 0x00, 0x00, "Tamron", "A14",
 2793|    170|       "AF 18-200mm F/3.5-6.3 XR Di II LD Aspherical (IF) Macro"},
 2794|    170|      {0x00, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0x00, 0x06, 0x01, 0x00, 0x00, "Tamron", "A14NII",
 2795|    170|       "AF 18-200mm F/3.5-6.3 XR Di II LD Aspherical (IF) Macro"},
 2796|    170|      {0xFC, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0xDF, 0x06, 0x01, 0x00, 0x00, "Tamron", "A14NII",
 2797|    170|       "AF 18-200mm F/3.5-6.3 XR Di II LD Aspherical (IF) Macro"},
 2798|    170|      {0xE6, 0x40, 0x2D, 0x80, 0x2C, 0x40, 0xDF, 0x0E, 0x01, 0x00, 0x00, "Tamron", "B018",
 2799|    170|       "18-200mm F/3.5-6.3 Di II VC"},
 2800|    170|      {0x00, 0x40, 0x2D, 0x88, 0x2C, 0x40, 0x62, 0x06, 0x00, 0x00, 0x00, "Tamron", "A18",
 2801|    170|       "AF 18-250mm F/3.5-6.3 Di II LD Aspherical (IF) Macro"},
 2802|    170|      {0x00, 0x40, 0x2D, 0x88, 0x2C, 0x40, 0x00, 0x06, 0x01, 0x00, 0x00, "Tamron", "A18NII",
 2803|    170|       "AF 18-250mm F/3.5-6.3 Di II LD Aspherical (IF) Macro "},
 2804|    170|      {0xF5, 0x40, 0x2C, 0x8A, 0x2C, 0x40, 0x40, 0x0E, 0x01, 0x00, 0x00, "Tamron", "B003",
 2805|    170|       "AF 18-270mm F/3.5-6.3 Di II VC LD Aspherical (IF) Macro"},
 2806|    170|      {0xF0, 0x3F, 0x2D, 0x8A, 0x2C, 0x40, 0xDF, 0x0E, 0x01, 0x00, 0x00, "Tamron", "B008",
 2807|    170|       "AF 18-270mm F/3.5-6.3 Di II VC PZD"},
 2808|    170|      {0xE0, 0x40, 0x2D, 0x98, 0x2C, 0x41, 0xDF, 0x4E, 0x01, 0x00, 0x00, "Tamron", "B028",
 2809|    170|       "18-400mm F/3.5-6.3 Di II VC HLD"},
 2810|    170|      {0xE0, 0x40, 0x2D, 0x98, 0x2C, 0x41, 0xDF, 0x0E, 0x01, 0x00, 0x00, "Tamron", "B028",
 2811|    170|       "18-400mm F/3.5-6.3 Di II VC HLD"},
 2812|    170|      {0x07, 0x40, 0x2F, 0x44, 0x2C, 0x34, 0x03, 0x02, 0x00, 0x00, 0x00, "Tamron", "A10", "AF 19-35mm F/3.5-4.5"},
 2813|    170|      {0x07, 0x40, 0x30, 0x45, 0x2D, 0x35, 0x03, 0x02, 0x00, 0x00, 0x00, "Tamron", "A10", "AF 19-35mm F/3.5-4.5"},
 2814|    170|      {0x00, 0x49, 0x30, 0x48, 0x22, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "166D", "SP AF 20-40mm F/2.7-3.5"},
 2815|    170|      {0x0E, 0x4A, 0x31, 0x48, 0x23, 0x2D, 0x0E, 0x02, 0x00, 0x00, 0x00, "Tamron", "166D", "SP AF 20-40mm F/2.7-3.5"},
 2816|       |      // M                                         "Tamron" "266D"   "SP AF 20-40mm F/2.7-3.5 Aspherical-IF";
 2817|    170|      {0xFE, 0x48, 0x37, 0x5C, 0x24, 0x24, 0xDF, 0x0E, 0x01, 0x00, 0x00, "Tamron", "A007",
 2818|    170|       "SP 24-70mm F/2.8 Di VC USD"},
 2819|       |      // M                                         "Tamron" "73D"    "AF 24-70mm F/3.3-5.6 Aspherical";
 2820|    170|      {0xCE, 0x47, 0x37, 0x5C, 0x25, 0x25, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A032",
 2821|    170|       "SP 24-70mm F/2.8 Di VC USD G2"},
 2822|    170|      {0xCE, 0x47, 0x37, 0x5C, 0x25, 0x25, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "A032",
 2823|    170|       "SP 24-70mm F/2.8 Di VC USD G2"},
 2824|    170|      {0x45, 0x41, 0x37, 0x72, 0x2C, 0x3C, 0x48, 0x02, 0x00, 0x00, 0x00, "Tamron", "190D",
 2825|    170|       "SP AF 24-135mm F/3.5-5.6 AD Aspherical (IF) Macro"},
 2826|       |      // M                                         "Tamron" "159D"   "AF 28-70mm F/3.5-4.5";
 2827|       |      // M                                         "Tamron" "259D"   "AF 28-70mm F/3.5-4.5";
 2828|    170|      {0x33, 0x54, 0x3C, 0x5E, 0x24, 0x24, 0x62, 0x02, 0x00, 0x00, 0x00, "Tamron", "A09",
 2829|    170|       "SP AF 28-75mm F/2.8 XR Di LD Aspherical (IF) Macro"},
 2830|    170|      {0xFA, 0x54, 0x3C, 0x5E, 0x24, 0x24, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "A09NII",
 2831|    170|       "SP AF 28-75mm F/2.8 XR Di LD Aspherical (IF) Macro"},
 2832|    170|      {0xFA, 0x54, 0x3C, 0x5E, 0x24, 0x24, 0xDF, 0x06, 0x01, 0x00, 0x00, "Tamron", "A09NII",
 2833|    170|       "SP AF 28-75mm F/2.8 XR Di LD Aspherical (IF) Macro"},
 2834|    170|      {0x10, 0x3D, 0x3C, 0x60, 0x2C, 0x3C, 0xD2, 0x02, 0x00, 0x00, 0x00, "Tamron", "177D",
 2835|    170|       "AF 28-80mm F/3.5-5.6 Aspherical"},
 2836|    170|      {0x45, 0x3D, 0x3C, 0x60, 0x2C, 0x3C, 0x48, 0x02, 0x00, 0x00, 0x00, "Tamron", "177D",
 2837|    170|       "AF 28-80mm F/3.5-5.6 Aspherical"},
 2838|    170|      {0x00, 0x48, 0x3C, 0x6A, 0x24, 0x24, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "176D",
 2839|    170|       "SP AF 28-105mm F/2.8 LD Aspherical IF"},
 2840|       |      // M                                         "Tamron" "276D"   "SP AF 28-105mm F/2.8 LD Aspherical IF";
 2841|       |      // M                                         "Tamron" "179D"   "AF 28-105mm F4.0-5.6 IF";
 2842|    170|      {0x4D, 0x3E, 0x3C, 0x80, 0x2E, 0x3C, 0x62, 0x02, 0x00, 0x00, 0x00, "Tamron", "A03N",
 2843|    170|       "AF 28-200mm F/3.8-5.6 XR Aspherical (IF) Macro"},
 2844|       |      // M                                         "Tamron" "471D"   "AF 28-200mm F/3.8-5.6 Aspherical IF Super2
 2845|       |      // Silver";
 2846|    170|      {0x0B, 0x3E, 0x3D, 0x7F, 0x2F, 0x3D, 0x0E, 0x00, 0x00, 0x00, 0x00, "Tamron", "71D", "AF 28-200mm F/3.8-5.6"},
 2847|    170|      {0x0B, 0x3E, 0x3D, 0x7F, 0x2F, 0x3D, 0x0E, 0x02, 0x00, 0x00, 0x00, "Tamron", "171D", "AF 28-200mm F/3.8-5.6D"},
 2848|    170|      {0x12, 0x3D, 0x3C, 0x80, 0x2E, 0x3C, 0xDF, 0x02, 0x00, 0x00, 0x00, "Tamron", "271D",
 2849|    170|       "AF 28-200mm F/3.8-5.6 LD Aspherical (IF)"},
 2850|    170|      {0x4D, 0x41, 0x3C, 0x8E, 0x2B, 0x40, 0x62, 0x02, 0x00, 0x00, 0x00, "Tamron", "A061",
 2851|    170|       "AF 28-300mm F/3.5-6.3 XR Di LD Aspherical (IF)"},
 2852|    170|      {0x4D, 0x41, 0x3C, 0x8E, 0x2C, 0x40, 0x62, 0x02, 0x00, 0x00, 0x00, "Tamron", "185D",
 2853|    170|       "AF 28-300mm F/3.5-6.3 XR LD Aspherical (IF)"},
 2854|       |      // M                                         "Tamron" "285D"   "AF 28-300mm F/3.8-6.3 LD Aspherical IF
 2855|       |      // Silver";
 2856|    170|      {0xF9, 0x40, 0x3C, 0x8E, 0x2C, 0x40, 0x40, 0x0E, 0x01, 0x00, 0x00, "Tamron", "A20",
 2857|    170|       "AF 28-300mm F/3.5-6.3 XR Di VC LD Aspherical (IF) Macro"},
 2858|       |      // M                                         "Tamron" "63D"    "AF 35-90mm F/4-5.6";
 2859|       |      // M                                         "Tamron" "65D"    "SP AF 35-105mm F/2.8 Aspherical";
 2860|       |      // M                                         "Tamron" ""       "AF 35-135mm F/3.5-4.5";
 2861|    170|      {0xC9, 0x3C, 0x44, 0x76, 0x25, 0x31, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A043",
 2862|    170|       "35-150mm F/2.8-4 Di VC OSD"},
 2863|    170|      {0x00, 0x47, 0x53, 0x80, 0x30, 0x3C, 0x00, 0x06, 0x00, 0x00, 0x00, "Tamron", "A15",
 2864|    170|       "AF 55-200mm F/4-5.6 Di II LD"},
 2865|    170|      {0xF7, 0x53, 0x5C, 0x80, 0x24, 0x24, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "A001",
 2866|    170|       "SP AF 70-200mm F/2.8 Di LD (IF) Macro"},
 2867|    170|      {0xFE, 0x53, 0x5C, 0x80, 0x24, 0x24, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "A001",
 2868|    170|       "SP AF 70-200mm F/2.8 Di LD (IF) Macro"},
 2869|    170|      {0xF7, 0x53, 0x5C, 0x80, 0x24, 0x24, 0x40, 0x06, 0x01, 0x00, 0x00, "Tamron", "A001",
 2870|    170|       "SP AF 70-200mm F/2.8 Di LD (IF) Macro"},
 2871|    170|      {0xFE, 0x54, 0x5C, 0x80, 0x24, 0x24, 0xDF, 0x0E, 0x01, 0x00, 0x00, "Tamron", "A009",
 2872|    170|       "SP 70-200mm F/2.8 Di VC USD"},
 2873|    170|      {0xE2, 0x47, 0x5C, 0x80, 0x24, 0x24, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A025",
 2874|    170|       "SP 70-200mm F/2.8 Di VC USD G2"},
 2875|    170|      {0xCD, 0x47, 0x5C, 0x82, 0x31, 0x31, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A034", "70-210mm F/4 Di VC USD"},
 2876|       |      // M                                         "Tamron" "67D"    "SP AF 70-210mm f/2.8 LD";
 2877|       |      // M                                         "Tamron" ""       "AF 70-210mm F/3.5-4.5";
 2878|       |      // M                                         "Tamron" "158D"   "AF 70-210mm F/4-5.6";
 2879|       |      // M                                         "Tamron" "258D"   "AF 70-210mm F/4-5.6";
 2880|       |      // M                                         "Tamron" "172D"   "AF 70-300mm F/4-5.6";
 2881|       |      // M                                         "Tamron" "472D"   "AF 70-300mm F/4-5.6 LD";
 2882|    170|      {0x69, 0x48, 0x5C, 0x8E, 0x30, 0x3C, 0x6F, 0x02, 0x00, 0x00, 0x00, "Tamron", "572D/772D",
 2883|    170|       "AF 70-300mm F/4-5.6 LD Macro 1:2"},
 2884|    170|      {0x69, 0x47, 0x5C, 0x8E, 0x30, 0x3C, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "A17N",
 2885|    170|       "AF 70-300mm F/4-5.6 Di LD Macro 1:2"},
 2886|    170|      {0x00, 0x48, 0x5C, 0x8E, 0x30, 0x3C, 0x00, 0x06, 0x01, 0x00, 0x00, "Tamron", "A17NII",
 2887|    170|       "AF 70-300mm F/4-5.6 Di LD Macro 1:2"},
 2888|    170|      {0xF1, 0x47, 0x5C, 0x8E, 0x30, 0x3C, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "A005",
 2889|    170|       "SP 70-300mm F4-5.6 Di VC USD"},
 2890|       |      // M                                         "Tamron" "872D"   "AF 75-300mm F/4-5.6 LD";
 2891|       |      // M                                         "Tamron" "278D"   "AF 80-210mm F/4.5-5.6";
 2892|       |      // M                                         "Tamron" "62D"    "AF 90-300mm F/4.5-5.6";
 2893|       |      // M                                         "Tamron" "186D"   "AF 100-300mm F/5-6.3";
 2894|    170|      {0xEB, 0x40, 0x76, 0xA6, 0x38, 0x40, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "A011",
 2895|    170|       "SP AF 150-600mm F/5-6.3 VC USD"},
 2896|    170|      {0xE3, 0x40, 0x76, 0xA6, 0x38, 0x40, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A022",
 2897|    170|       "SP AF 150-600mm F/5-6.3 Di VC USD G2"},
 2898|    170|      {0x20, 0x3C, 0x80, 0x98, 0x3D, 0x3D, 0x1E, 0x02, 0x00, 0x00, 0x00, "Tamron", "75D", "AF 200-400mm F/5.6 LD IF"},
 2899|    170|      {0x00, 0x3E, 0x80, 0xA0, 0x38, 0x3F, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "A08",
 2900|    170|       "SP AF 200-500mm F/5-6.3 Di LD (IF)"},
 2901|    170|      {0x00, 0x3F, 0x80, 0xA0, 0x38, 0x3F, 0x00, 0x02, 0x00, 0x00, 0x00, "Tamron", "A08", "SP AF 200-500mm F/5-6.3 Di"},
 2902|       |      //
 2903|       |      //------------------------------------------------------------------------------
 2904|       |      // Tokina Lenses by focal length, first fixed then zoom lenses
 2905|       |      //------------------------------------------------------------------------------
 2906|       |      //
 2907|    170|      {0x00, 0x40, 0x2B, 0x2B, 0x2C, 0x2C, 0x00, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2908|    170|       "AT-X 17 AF PRO (AF 17mm f/3.5)"},
 2909|    170|      {0x00, 0x47, 0x44, 0x44, 0x24, 0x24, 0x00, 0x06, 0x40, 0x00, 0x00, "Tokina", "T303503",
 2910|    170|       "AT-X M35 PRO DX (AF 35mm f/2.8 Macro)"},
 2911|    170|      {0x00, 0x54, 0x68, 0x68, 0x24, 0x24, 0x00, 0x02, 0x40, 0x00, 0x00, "Tokina", "T310003N",
 2912|    170|       "AT-X M100 AF PRO D (AF 100mm f/2.8 Macro)"},
 2913|    170|      {0x27, 0x48, 0x8E, 0x8E, 0x30, 0x30, 0x1D, 0x02, 0x00, 0x00, 0x00, "Tokina", "", "AT-X 304 AF (AF 300mm f/4)"},
 2914|    170|      {0x00, 0x54, 0x8E, 0x8E, 0x24, 0x24, 0x00, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2915|    170|       "AT-X 300 AF PRO (AF 300mm f/2.8)"},
 2916|    170|      {0x12, 0x3B, 0x98, 0x98, 0x3D, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2917|    170|       "AT-X 400 AF SD (AF 400mm f/5.6)"},
 2918|       |      //
 2919|    170|      {0x00, 0x40, 0x18, 0x2B, 0x2C, 0x34, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "T4101703",
 2920|    170|       "AT-X 107 AF DX Fisheye (AF 10-17mm f/3.5-4.5)"},
 2921|    170|      {0x00, 0x48, 0x1C, 0x29, 0x24, 0x24, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "T4111603",
 2922|    170|       "AT-X 116 PRO DX (AF 11-16mm f/2.8)"},
 2923|    170|      {0x7A, 0x48, 0x1C, 0x29, 0x24, 0x24, 0x7E, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2924|    170|       "AT-X 116 PRO DX II (AF 11-16mm f/2.8)"},
 2925|    170|      {0x7A, 0x48, 0x1C, 0x30, 0x24, 0x24, 0x7E, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2926|    170|       "AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)"},
 2927|    170|      {0x8B, 0x48, 0x1C, 0x30, 0x24, 0x24, 0x85, 0x06, 0x00, 0x00, 0x00, "Tokina", "", "ATX-i 11-20mm F2.8 CF"},
 2928|    170|      {0x00, 0x3C, 0x1F, 0x37, 0x30, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "T4122403",
 2929|    170|       "AT-X 124 AF PRO DX (AF 12-24mm f/4)"},
 2930|    170|      {0x7A, 0x3C, 0x1F, 0x37, 0x30, 0x30, 0x7E, 0x06, 0x01, 0x02, 0x00, "Tokina", "T4122423",
 2931|    170|       "AT-X 124 AF PRO DX II (AF 12-24mm f/4)"},
 2932|    170|      {0x7A, 0x3C, 0x1F, 0x3C, 0x30, 0x30, 0x7E, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2933|    170|       "AT-X 12-28 PRO DX (AF 12-28mm f/4)"},
 2934|    170|      {0x94, 0x54, 0x24, 0x30, 0x18, 0x18, 0x4a, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2935|    170|       "AT-X 14-20 F2 PRO DX (AF 14-20mm f/2)"},
 2936|    170|      {0x00, 0x48, 0x29, 0x3C, 0x24, 0x24, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2937|    170|       "AT-X 16-28 AF PRO FX (AF 16-28mm f/2.8)"},
 2938|    170|      {0x00, 0x48, 0x29, 0x50, 0x24, 0x24, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2939|    170|       "AT-X 165 PRO DX (AF 16-50mm f/2.8)"},
 2940|    170|      {0x00, 0x40, 0x2A, 0x72, 0x2C, 0x3C, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2941|    170|       "AT-X 16.5-135 DX (AF 16.5-135mm f/3.5-5.6)"},
 2942|    170|      {0x00, 0x3C, 0x2B, 0x44, 0x30, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2943|    170|       "AT-X 17-35 F4 PRO FX (AF 17-35mm f/4)"},
 2944|    170|      {0x2F, 0x40, 0x30, 0x44, 0x2C, 0x34, 0x29, 0x02, 0x00, 0x02, 0x00, "Tokina", "", "AF 193 (AF 19-35mm f/3.5-4.5)"},
 2945|    170|      {0x2F, 0x48, 0x30, 0x44, 0x24, 0x24, 0x29, 0x02, 0x00, 0x02, 0x00, "Tokina", "",
 2946|    170|       "AT-X 235 AF PRO (AF 20-35mm f/2.8)"},
 2947|       |      // M                                         "Tokina" ""          "AF 235 (AF 20-35mm f/3.5-4.5)"
 2948|    170|      {0x2F, 0x40, 0x30, 0x44, 0x2C, 0x34, 0x29, 0x02, 0x00, 0x01, 0x00, "Tokina", "",
 2949|    170|       "AF 235 II (AF 20-35mm f/3.5-4.5)"},
 2950|       |      // M                                         "Tokina" ""          "AT-X 240 AF (AF 24-40mm f/2.8)"
 2951|    170|      {0x00, 0x48, 0x37, 0x5C, 0x24, 0x24, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2952|    170|       "AT-X 24-70MM F2.8 PRO FX (AF 24-70mm f/2.8)"},
 2953|    170|      {0x00, 0x40, 0x37, 0x80, 0x2C, 0x3C, 0x00, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2954|    170|       "AT-X 242 AF (AF 24-200mm f/3.5-5.6)"},
 2955|    170|      {0x25, 0x48, 0x3C, 0x5C, 0x24, 0x24, 0x1B, 0x02, 0x00, 0x02, 0x00, "Tokina", "",
 2956|    170|       "AT-X 270 AF PRO II (AF 28-70mm f/2.6-2.8)"},
 2957|    170|      {0x25, 0x48, 0x3C, 0x5C, 0x24, 0x24, 0x1B, 0x02, 0x00, 0x01, 0x00, "Tokina", "",
 2958|    170|       "AT-X 287 AF PRO SV (AF 28-70mm f/2.8)"},
 2959|    170|      {0x07, 0x48, 0x3C, 0x5C, 0x24, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2960|    170|       "AT-X 287 AF (AF 28-70mm f/2.8)"},
 2961|    170|      {0x07, 0x47, 0x3C, 0x5C, 0x25, 0x35, 0x03, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2962|    170|       "AF 287 SD (AF 28-70mm f/2.8-4.5)"},
 2963|    170|      {0x07, 0x40, 0x3C, 0x5C, 0x2C, 0x35, 0x03, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2964|    170|       "AF 270 II (AF 28-70mm f/3.5-4.5)"},
 2965|    170|      {0x00, 0x48, 0x3C, 0x60, 0x24, 0x24, 0x00, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2966|    170|       "AT-X 280 AF PRO (AF 28-80mm f/2.8)"},
 2967|       |      // M                                         "Tokina" ""          "AF 280 II EMZ (AF 28-80mm f/3.5-5.6)"
 2968|       |      // M                                         "Tokina" ""          "AF 205 (AF 28-105mm f/3.5-4.5)"
 2969|       |      // M                                         "Tokina" ""          "AF 282 (AF 28-200mm 3.5-5.6)"
 2970|       |      // M                                         "Tokina" ""          "AF 282 EMZ II (AF 28-210mm f/4.2-6.5)"
 2971|       |      // M                                         "Tokina" ""          "AF 370 (AF 35-70mm f/3.5-4.6)"
 2972|       |      // M                                         "Tokina" ""          "AF 370 II (AF 35-70mm f/3.5-4.6)"
 2973|    170|      {0x25, 0x44, 0x44, 0x8E, 0x34, 0x42, 0x1B, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2974|    170|       "AF 353 (AF 35-300mm f/4.5-6.7)"},
 2975|    170|      {0x00, 0x48, 0x50, 0x72, 0x24, 0x24, 0x00, 0x06, 0x00, 0x00, 0x00, "Tokina", "",
 2976|    170|       "AT-X 535 PRO DX (AF 50-135mm f/2.8)"},
 2977|    170|      {0x00, 0x3C, 0x5C, 0x80, 0x30, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x00, "Tokina", "",
 2978|    170|       "AT-X 70-200 F4 FX VCM-S (AF 70-200mm f/4)"},
 2979|    170|      {0x00, 0x48, 0x5C, 0x80, 0x30, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x00, "Tokina", "",
 2980|    170|       "AT-X 70-200 F4 FX VCM-S (AF 70-200mm f/4)"},
 2981|       |      // M                                         "Tokina" ""          "AF 745 (AF 70-210mm f/4.5)"
 2982|       |      // M                                         "Tokina" ""          "AF 210 (AF 70-210mm f/4.0-5.6)"
 2983|       |      // M                                         "Tokina" ""          "AF 210 II SD (AF 70-210mm f/4.0-5.6)"
 2984|    170|      {0x12, 0x44, 0x5E, 0x8E, 0x34, 0x3C, 0x09, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2985|    170|       "AF 730 (AF 75-300mm f/4.5-5.6)"},
 2986|       |      // M                                         "Tokina" ""          "AF 730 II (AF 75-300mm f/4.5-5.6)"
 2987|    170|      {0x14, 0x54, 0x60, 0x80, 0x24, 0x24, 0x0B, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2988|    170|       "AT-X 828 AF (AF 80-200mm f/2.8)"},
 2989|    170|      {0x24, 0x54, 0x60, 0x80, 0x24, 0x24, 0x1A, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2990|    170|       "AT-X 828 AF PRO (AF 80-200mm f/2.8)"},
 2991|       |      // M                                         "Tokina" ""          "AT-X 840 AF (AF 80-400mm f/4.5-5.6)"
 2992|    170|      {0x24, 0x44, 0x60, 0x98, 0x34, 0x3C, 0x1A, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2993|    170|       "AT-X 840 AF-II (AF 80-400mm f/4.5-5.6)"},
 2994|    170|      {0x00, 0x44, 0x60, 0x98, 0x34, 0x3C, 0x00, 0x02, 0x00, 0x00, 0x00, "Tokina", "",
 2995|    170|       "AT-X 840 D (AF 80-400mm f/4.5-5.6)"},
 2996|    170|      {0x14, 0x48, 0x68, 0x8E, 0x30, 0x30, 0x0B, 0x00, 0x00, 0x00, 0x00, "Tokina", "",
 2997|    170|       "AT-X 340 AF (AF 100-300mm f/4)"},
 2998|       |      // M                                         "Tokina" ""          "AT-X 340 AF-II (AF 100-300mm f/4)"
 2999|       |      // M                                         "Tokina" ""          "AF 130 EMZ II (AF 100-300mm f/5.6-6.7)"
 3000|       |      // M                                         "Tokina" ""          "AF 140 EMZ (AF 100-400mm f/4.5-6.3)"
 3001|       |      //
 3002|       |      //------------------------------------------------------------------------------
 3003|       |      // Lenses from various other brands
 3004|       |      //------------------------------------------------------------------------------
 3005|       |      //
 3006|    170|      {0x06, 0x3F, 0x68, 0x68, 0x2C, 0x2C, 0x06, 0x00, 0x00, 0x00, 0x00, "Cosina", "", "AF 100mm F3.5 Macro"},
 3007|    170|      {0x07, 0x36, 0x3D, 0x5F, 0x2C, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, "Cosina", "",
 3008|    170|       "AF Zoom 28-80mm F3.5-5.6 MC Macro"},
 3009|    170|      {0x07, 0x46, 0x3D, 0x6A, 0x25, 0x2F, 0x03, 0x00, 0x00, 0x00, 0x00, "Cosina", "", "AF Zoom 28-105mm F2.8-3.8 MC"},
 3010|       |      // M                                         "Cosina" "" "AF Zoom 28-210mm F3.5-5.6";
 3011|       |      // M                                         "Cosina" "" "AF Zoom 28-210mm F4.2-6.5 Aspherical IF";
 3012|       |      // M                                         "Cosina" "" "AF Zoom 28-300mm F4.0-6.3";
 3013|       |      // M                                         "Cosina" "" "AF Zoom 70-210mm F2.8-4.0";
 3014|    170|      {0x12, 0x36, 0x5C, 0x81, 0x35, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x00, "Cosina", "",
 3015|    170|       "AF Zoom 70-210mm F4.5-5.6 MC Macro"},
 3016|    170|      {0x12, 0x39, 0x5C, 0x8E, 0x34, 0x3D, 0x08, 0x02, 0x00, 0x00, 0x00, "Cosina", "",
 3017|    170|       "AF Zoom 70-300mm F4.5-5.6 MC Macro"},
 3018|    170|      {0x12, 0x3B, 0x68, 0x8D, 0x3D, 0x43, 0x09, 0x02, 0x00, 0x00, 0x00, "Cosina", "",
 3019|    170|       "AF Zoom 100-300mm F5.6-6.7 MC Macro"},
 3020|       |      // M                                         "Cosina" "" "AF Zoom 100-400mm F5.6-6.7 MC";
 3021|       |      //
 3022|    170|      {0x12, 0x38, 0x69, 0x97, 0x35, 0x42, 0x09, 0x02, 0x00, 0x00, 0x00, "Promaster", "",
 3023|    170|       "Spectrum 7 100-400mm 1:4.5-6.7"},
 3024|       |      //
 3025|    170|      {0x00, 0x40, 0x31, 0x31, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, "Voigtlander", "BA295AN",
 3026|    170|       "Color Skopar 20mm F3.5 SLII Aspherical"},
 3027|    170|      {0x00, 0x48, 0x3C, 0x3C, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, "Voigtlander", "",
 3028|    170|       "Color Skopar 28mm F2.8 SL II"},
 3029|    170|      {0x00, 0x54, 0x48, 0x48, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Voigtlander", "BA229DN",
 3030|    170|       "Ultron 40mm F2 SLII Aspherical"},
 3031|    170|      {0x00, 0x54, 0x55, 0x55, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Voigtlander", "BA239BN",
 3032|    170|       "Nokton 58mm F1.4 SLII"},
 3033|    170|      {0x00, 0x40, 0x64, 0x64, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, "Voigtlander", "",
 3034|    170|       "APO-Lanthar 90mm F3.5 SLII Close Focus"},
 3035|       |      //
 3036|    170|      {0x00, 0x40, 0x2D, 0x2D, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Distagon T* 3,5/18 ZF.2"},
 3037|    170|      {0x00, 0x48, 0x32, 0x32, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Distagon T* 2,8/21 ZF.2"},
 3038|    170|      {0x00, 0x54, 0x38, 0x38, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Distagon T* 2/25 ZF.2"},
 3039|    170|      {0x00, 0x54, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Distagon T* 2/28 ZF.2"},
 3040|    170|      {0x00, 0x54, 0x44, 0x44, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Distagon T* 1.4/35 ZF.2"},
 3041|    170|      {0x00, 0x54, 0x44, 0x44, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Distagon T* 2/35 ZF.2"},
 3042|    170|      {0x00, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Planar T* 1,4/50 ZF.2"},
 3043|    170|      {0x00, 0x54, 0x50, 0x50, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Makro-Planar T* 2/50 ZF.2"},
 3044|    170|      {0x00, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Planar T* 1,4/85 ZF.2"},
 3045|    170|      {0x00, 0x54, 0x68, 0x68, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "",
 3046|    170|       "Makro-Planar T* 2/100 ZF.2"},
 3047|    170|      {0x00, 0x54, 0x72, 0x72, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Carl Zeiss", "", "Apo Sonnar T* 2/135 ZF.2"},
 3048|    170|      {0x02, 0x54, 0x3C, 0x3C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Otus 1.4/28"},
 3049|    170|      {0x00, 0x54, 0x53, 0x53, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Otus 1.4/55"},
 3050|    170|      {0x01, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Otus 1.4/85"},
 3051|    170|      {0x03, 0x54, 0x68, 0x68, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Otus 1.4/100"},
 3052|       |      //                    " "00" "00" "00" "00" "Zeiss" "" "Milvus 2.8/15"
 3053|       |      //                    " "00" "00" "00" "00" "Zeiss" "" "Milvus 2.8/18"
 3054|       |      //                    " "00" "00" "00" "00" "Zeiss" "" "Milvus 2.8/21"
 3055|       |      //                    " "00" "00" "00" "00" "Zeiss" "" "Milvus 1.4/25"
 3056|    170|      {0x52, 0x54, 0x44, 0x44, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Milvus 2/35"},
 3057|    170|      {0x53, 0x54, 0x50, 0x50, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Milvus 1.4/50"},
 3058|    170|      {0x54, 0x54, 0x50, 0x50, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Milvus 2/50M"},
 3059|    170|      {0x55, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Milvus 1.4/85"},
 3060|    170|      {0x56, 0x54, 0x68, 0x68, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Zeiss", "", "Milvus 2/100M"},
 3061|       |      //                    " "00" "00" "00" "00" "Zeiss" "" "Milvus 2/135"
 3062|       |      //
 3063|    170|      {0x00, 0x54, 0x56, 0x56, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, "Coastal Optical Systems", "",
 3064|    170|       "60mm 1:4 UV-VIS-IR Macro Apo"},
 3065|       |      //
 3066|    170|      {0xBF, 0x4E, 0x26, 0x26, 0x1E, 0x1E, 0x01, 0x04, 0x00, 0x00, 0x00, "Irix", "", "15mm f/2.4 Firefly"},
 3067|    170|      {0xBF, 0x3C, 0x1B, 0x1B, 0x30, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, "Irix", "", "11mm f/4.0 Blackstone/Firefly"},
 3068|       |      //
 3069|    170|      {0x4A, 0x40, 0x11, 0x11, 0x2C, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Samyang", "", "8mm f/3.5 Fish-Eye CS"},
 3070|    170|      {0x4A, 0x48, 0x24, 0x24, 0x24, 0x0C, 0x4D, 0x02, 0x00, 0x02, 0x00, "Samyang", "", "10mm f/2.8 ED AS NCS CS"},
 3071|    170|      {0x4A, 0x48, 0x1E, 0x1E, 0x24, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Samyang", "",
 3072|    170|       "12mm f/2.8 ED AS NCS Fish-eye"},
 3073|    170|      {0x4A, 0x4C, 0x24, 0x24, 0x1E, 0x6C, 0x4D, 0x06, 0x00, 0x00, 0x00, "Samyang", "", "14mm f/2.4 Premium"},
 3074|    170|      {0x4A, 0x48, 0x24, 0x24, 0x24, 0x0C, 0x4D, 0x02, 0x00, 0x01, 0x00, "Samyang", "", "AE 14mm f/2.8 ED AS IF UMC"},
 3075|    170|      {0x4A, 0x54, 0x29, 0x29, 0x18, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Samyang", "", "16mm F2.0 ED AS UMC CS"},
 3076|    170|      {0x4A, 0x60, 0x36, 0x36, 0x0C, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Samyang", "", "24mm f/1.4 ED AS UMC"},
 3077|    170|      {0x4A, 0x60, 0x44, 0x44, 0x0C, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Samyang", "", "35mm f/1.4 AS UMC"},
 3078|    170|      {0x4A, 0x60, 0x62, 0x62, 0x0C, 0x0C, 0x4D, 0x02, 0x00, 0x00, 0x00, "Samyang", "", "AE 85mm f/1.4 AS IF UMC"},
 3079|       |      //
 3080|    170|      {0x9F, 0x48, 0x23, 0x23, 0x24, 0x24, 0xA1, 0x06, 0x00, 0x00, 0x00, "Yongnuo", "", "YN14mm F2.8N"},
 3081|    170|      {0x9F, 0x4C, 0x44, 0x44, 0x18, 0x18, 0xA1, 0x06, 0x00, 0x00, 0x00, "Yongnuo", "", "YN35mm F2N"},
 3082|    170|      {0x9F, 0x48, 0x48, 0x48, 0x24, 0x24, 0xA1, 0x06, 0x00, 0x00, 0x00, "Yongnuo", "", "YN40mm F2.8N"},
 3083|    170|      {0x9A, 0x4C, 0x50, 0x50, 0x14, 0x14, 0x9C, 0x06, 0x00, 0x00, 0x00, "Yongnuo", "", "YN50mm F1.8N"},
 3084|    170|      {0x9F, 0x4D, 0x50, 0x50, 0x14, 0x14, 0xA0, 0x06, 0x00, 0x00, 0x00, "Yongnuo", "", "YN50mm F1.8N"},
 3085|    170|      {0x9F, 0x54, 0x68, 0x68, 0x18, 0x18, 0xA2, 0x06, 0x00, 0x00, 0x00, "Yongnuo", "", "YN100mm F2N"},
 3086|       |      //
 3087|    170|      {0x02, 0x40, 0x44, 0x5C, 0x2C, 0x34, 0x02, 0x00, 0x00, 0x00, 0x00, "Exakta", "", "AF 35-70mm 1:3.5-4.5 MC"},
 3088|    170|      {0x07, 0x3E, 0x30, 0x43, 0x2D, 0x35, 0x03, 0x00, 0x00, 0x00, 0x00, "Soligor", "", "AF Zoom 19-35mm 1:3.5-4.5 MC"},
 3089|    170|      {0x03, 0x43, 0x5C, 0x81, 0x35, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, "Soligor", "",
 3090|    170|       "AF C/D Zoom UMCS 70-210mm 1:4.5"},
 3091|    170|      {0x12, 0x4A, 0x5C, 0x81, 0x31, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x00, "Soligor", "",
 3092|    170|       "AF C/D Auto Zoom+Macro 70-210mm 1:4-5.6 UMCS"},
 3093|    170|      {0x12, 0x36, 0x69, 0x97, 0x35, 0x42, 0x09, 0x00, 0x00, 0x00, 0x00, "Soligor", "",
 3094|    170|       "AF Zoom 100-400mm 1:4.5-6.7 MC"},
 3095|       |      //
 3096|    170|      {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, "Manual Lens", "", "No CPU"},
 3097|    170|      {0x00, 0x00, 0x48, 0x48, 0x53, 0x53, 0x00, 0x01, 0x00, 0x00, 0x00, "Loreo", "",
 3098|    170|       "40mm F11-22 3D Lens in a Cap 9005"},
 3099|       |      //
 3100|       |      //------------------------------------------------------------------------------
 3101|       |      //
 3102|       |      // Lenses, that were upgraded with custom CPU
 3103|       |      //
 3104|    170|      {0x00, 0x47, 0x10, 0x10, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA604AC",
 3105|    170|       "Fisheye Nikkor 8mm f/2.8 AiS"},
 3106|    170|      {0x00, 0x47, 0x3C, 0x3C, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "", "Nikkor 28mm f/2.8 AiS"},
 3107|       |      //"00 54 44 44 0C 0C 00" "00" "00" "00" "00" "Nikon"   "JAA115AD" "Nikkor 35mm f/1.4 AiS" double ID with
 3108|       |      // Zeiss
 3109|    170|      {0x00, 0x57, 0x50, 0x50, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "", "Nikkor 50mm f/1.8 AI"},
 3110|    170|      {0x00, 0x48, 0x50, 0x50, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "", "Nikkor H 50mm f/2"},
 3111|    170|      {0x00, 0x48, 0x68, 0x68, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA304AA", "Series E 100mm f/2.8"},
 3112|    170|      {0x00, 0x4C, 0x6A, 0x6A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA305AA", "Nikkor 105mm f/2.5 AiS"},
 3113|    170|      {0x00, 0x48, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, "Nikon", "JAA313AA", "Nikkor 200mm f/4 AiS"},
 3114|    170|      {0x00, 0x40, 0x11, 0x11, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, "Samyang", "", "8mm f/3.5 Fish-Eye"},
 3115|    170|      {0x00, 0x58, 0x64, 0x64, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, "Soligor", "", "C/D Macro MC 90mm f/2.5"},
 3116|       |      // https://github.com/Exiv2/exiv2/issues/743
 3117|    170|      {0xc9, 0x48, 0x37, 0x5c, 0x24, 0x24, 0x4b, 0x4e, 0x01, 0x00, 0x00, "Sigma", "", "24-70mm F2.8 DG OS HSM Art"},
 3118|       |      //  https://github.com/Exiv2/exiv2/issues/598 , https://github.com/Exiv2/exiv2/pull/891
 3119|    170|      {0xCF, 0x47, 0x5C, 0x8E, 0x31, 0x3D, 0xDF, 0x0E, 0x00, 0x00, 0x00, "Tamron", "A030",
 3120|    170|       "SP 70-300mm F/4-5.6 Di VC USD"},
 3121|       |      //
 3122|    170|      {0xf4, 0x4c, 0x7c, 0x7c, 0x2c, 0x2c, 0x4b, 0x02, 0x00, 0x00, 0x00, "Sigma", "", "APO Macro 180mm F3.5 EX DG HSM"},
 3123|       |      // https://github.com/Exiv2/exiv2/issues/1078
 3124|    170|      {0x80, 0x48, 0x1C, 0x29, 0x24, 0x24, 0x7A, 0x06, 0x00, 0x00, 0x00, "Tokina", "", "atx-i 11-16mm F2.8 CF"},
 3125|       |      // https://github.com/Exiv2/exiv2/issues/1069
 3126|    170|      {0xc8, 0x54, 0x44, 0x44, 0x0d, 0x0d, 0xdf, 0x46, 0x00, 0x00, 0x00, "Tamron", "F045", "SP 35mm f/1.4 Di USD"},
 3127|       |      // https://github.com/Exiv2/exiv2/pull/1105
 3128|    170|      {0xCB, 0x3C, 0x2B, 0x44, 0x24, 0x31, 0xDF, 0x46, 0x00, 0x00, 0x00, "Tamron", "A037", "17-35mm F/2.8-4 Di OSD"},
 3129|       |      // https://github.com/Exiv2/exiv2/issues/1208
 3130|    170|      {0xC8, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0x4B, 0x46, 0x00, 0x00, 0x00, "Sigma", "321550", "85mm F1.4 DG HSM | A"},
 3131|    170|  };
 3132|       |//------------------------------------------------------------------------------
 3133|    170|#endif
 3134|       |  // 8< - - - 8< do not remove this line >8 - - - >8
 3135|       |
 3136|       |  /* if no meta obj is provided, try to use the value param that *may*
 3137|       |   * be the pre-parsed lensid
 3138|       |   */
 3139|    170|  if (!metadata) {
  ------------------
  |  Branch (3139:7): [True: 85, False: 85]
  ------------------
 3140|     85|    const auto vid = static_cast<unsigned char>(value.toInt64(0));
 3141|       |
 3142|       |    /* the 'FMntLens' name is added to the anonymous struct for
 3143|       |     * fmountlens[]
 3144|       |     *
 3145|       |     * remember to name the struct when importing/updating the lens info
 3146|       |     * from:
 3147|       |     *
 3148|       |     * www.rottmerhusen.com/objektives/lensid/files/c-header/fmountlens4.h
 3149|       |     */
 3150|     85|    if (auto pf = Exiv2::find(fmountlens, vid))
  ------------------
  |  Branch (3150:14): [True: 82, False: 3]
  ------------------
 3151|     82|      return os << pf->manuf << " " << pf->lensname;
 3152|      3|    return os << "(" << value << ")";
 3153|     85|  }
 3154|       |
 3155|     85|  byte raw[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
 3156|       |
 3157|     85|  static constexpr auto tags = std::array{
 3158|     85|      "LensIDNumber",          "LensFStops", "MinFocalLength", "MaxFocalLength", "MaxApertureAtMinFocal",
 3159|     85|      "MaxApertureAtMaxFocal", "MCUVersion",
 3160|     85|  };
 3161|       |
 3162|     85|  const std::string pre = std::string("Exif.") + group + std::string(".");
 3163|    665|  for (unsigned int i = 0; i < 7; ++i) {
  ------------------
  |  Branch (3163:28): [True: 583, False: 82]
  ------------------
 3164|    583|    ExifKey key(pre + std::string(tags[i]));
 3165|    583|    auto md = metadata->findKey(key);
 3166|    583|    if (md == metadata->end() || md->typeId() != unsignedByte || md->count() == 0) {
  ------------------
  |  Branch (3166:9): [True: 3, False: 580]
  |  Branch (3166:9): [True: 3, False: 580]
  |  Branch (3166:34): [True: 0, False: 580]
  |  Branch (3166:66): [True: 0, False: 580]
  ------------------
 3167|      3|      return os << "(" << value << ")";
 3168|      3|    }
 3169|    580|    raw[i] = static_cast<byte>(md->toInt64());
 3170|    580|  }
 3171|       |
 3172|     82|  auto md = metadata->findKey(ExifKey("Exif.Nikon3.LensType"));
 3173|     82|  if (md == metadata->end() || md->typeId() != unsignedByte || md->count() == 0) {
  ------------------
  |  Branch (3173:7): [True: 45, False: 37]
  |  Branch (3173:7): [True: 50, False: 32]
  |  Branch (3173:32): [True: 1, False: 36]
  |  Branch (3173:64): [True: 4, False: 32]
  ------------------
 3174|     50|    return os << "(" << value << ")";
 3175|     50|  }
 3176|     32|  raw[7] = static_cast<byte>(md->toInt64());
 3177|       |
 3178|  18.1k|  for (const auto& f : fmountlens) {
  ------------------
  |  Branch (3178:22): [True: 18.1k, False: 31]
  ------------------
 3179|  18.1k|    if (raw[0] == f.lid) {
  ------------------
  |  Branch (3179:9): [True: 674, False: 17.5k]
  ------------------
 3180|       |      // #1034
 3181|    674|      const std::string undefined("undefined");
 3182|    674|      const std::string section("nikon");
 3183|    674|      auto lensIDStream = std::to_string(raw[7]);
 3184|    674|      if (Internal::readExiv2Config(section, lensIDStream, undefined) != undefined) {
  ------------------
  |  Branch (3184:11): [True: 0, False: 674]
  ------------------
 3185|      0|        return os << Internal::readExiv2Config(section, lensIDStream, undefined);
 3186|      0|      }
 3187|    674|    }
 3188|       |
 3189|  18.1k|    if (raw[0] == f.lid
  ------------------
  |  Branch (3189:9): [True: 674, False: 17.5k]
  ------------------
 3190|       |        // stps varies with focal length for some Sigma zoom lenses.
 3191|    674|        && (raw[1] == f.stps || f.manuf == "Sigma") && raw[2] == f.focs && raw[3] == f.focl && raw[4] == f.aps &&
  ------------------
  |  Branch (3191:13): [True: 57, False: 617]
  |  Branch (3191:33): [True: 83, False: 534]
  |  Branch (3191:56): [True: 20, False: 120]
  |  Branch (3191:76): [True: 14, False: 6]
  |  Branch (3191:96): [True: 9, False: 5]
  ------------------
 3192|      9|        raw[5] == f.apl && raw[6] == f.lfw && raw[7] == f.ltype) {
  ------------------
  |  Branch (3192:9): [True: 6, False: 3]
  |  Branch (3192:28): [True: 2, False: 4]
  |  Branch (3192:47): [True: 1, False: 1]
  ------------------
 3193|       |      // Lens found in database
 3194|      1|      return os << f.manuf << " " << f.lensname;
 3195|      1|    }
 3196|  18.1k|  }
 3197|       |  // Lens not found in database
 3198|     31|  return os << "(" << value << ")";
 3199|       |#else
 3200|       |  return os << "(" << value << ")";
 3201|       |#endif  // EXV_HAVE_LENSDATA
 3202|     32|}
_ZN5Exiv28Internal15Nikon3MakerNote18printFocusDistanceERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3204|    168|std::ostream& Nikon3MakerNote::printFocusDistance(std::ostream& os, const Value& value, const ExifData*) {
 3205|    168|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3205:7): [True: 0, False: 168]
  |  Branch (3205:29): [True: 0, False: 168]
  ------------------
 3206|      0|    return os << "(" << value << ")";
 3207|    168|  auto val = value.toInt64();
 3208|    168|  if (val == 0)
  ------------------
  |  Branch (3208:7): [True: 42, False: 126]
  ------------------
 3209|     42|    return os << _("n/a");
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
 3210|       |
 3211|    126|  return os << stringFormat("{:.2f} m", std::pow(10.0, (val / 40.0) - 2.0));
  ------------------
  |  |   18|    126|#define stringFormat std::format
  ------------------
 3212|    168|}
_ZN5Exiv28Internal15Nikon3MakerNote13printApertureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3214|    660|std::ostream& Nikon3MakerNote::printAperture(std::ostream& os, const Value& value, const ExifData*) {
 3215|    660|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3215:7): [True: 0, False: 660]
  |  Branch (3215:29): [True: 0, False: 660]
  ------------------
 3216|      0|    return os << "(" << value << ")";
 3217|       |
 3218|    660|  auto val = value.toInt64();
 3219|    660|  if (val == 0)
  ------------------
  |  Branch (3219:7): [True: 206, False: 454]
  ------------------
 3220|    206|    return os << _("n/a");
  ------------------
  |  |   40|    206|#define _(String) (String)
  ------------------
 3221|       |
 3222|    454|  return os << stringFormat("F{:.1f}", std::exp2(val / 24.0));
  ------------------
  |  |   18|    454|#define stringFormat std::format
  ------------------
 3223|    660|}
_ZN5Exiv28Internal15Nikon3MakerNote10printFocalERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3225|    498|std::ostream& Nikon3MakerNote::printFocal(std::ostream& os, const Value& value, const ExifData*) {
 3226|    498|  if (value.count() != 1 || value.typeId() != unsignedByte) {
  ------------------
  |  Branch (3226:7): [True: 0, False: 498]
  |  Branch (3226:29): [True: 0, False: 498]
  ------------------
 3227|      0|    return os << "(" << value << ")";
 3228|      0|  }
 3229|    498|  auto val = value.toInt64();
 3230|    498|  if (val == 0)
  ------------------
  |  Branch (3230:7): [True: 204, False: 294]
  ------------------
 3231|    204|    return os << _("n/a");
  ------------------
  |  |   40|    204|#define _(String) (String)
  ------------------
 3232|       |
 3233|    294|  return os << stringFormat("{:.1f} mm", 5.0 * std::exp2(val / 24.0));
  ------------------
  |  |   18|    294|#define stringFormat std::format
  ------------------
 3234|    498|}
_ZN5Exiv28Internal15Nikon3MakerNote11printFStopsERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3236|    168|std::ostream& Nikon3MakerNote::printFStops(std::ostream& os, const Value& value, const ExifData*) {
 3237|    168|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3237:7): [True: 0, False: 168]
  |  Branch (3237:29): [True: 0, False: 168]
  ------------------
 3238|      0|    return os << "(" << value << ")";
 3239|    168|  return os << stringFormat("F{:.1f}", value.toInt64() / 12.0);
  ------------------
  |  |   18|    168|#define stringFormat std::format
  ------------------
 3240|    168|}
_ZN5Exiv28Internal15Nikon3MakerNote22printExitPupilPositionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3242|    178|std::ostream& Nikon3MakerNote::printExitPupilPosition(std::ostream& os, const Value& value, const ExifData*) {
 3243|    178|  if (value.count() != 1 || value.typeId() != unsignedByte || value.toInt64() == 0)
  ------------------
  |  Branch (3243:7): [True: 0, False: 178]
  |  Branch (3243:29): [True: 0, False: 178]
  |  Branch (3243:63): [True: 10, False: 168]
  ------------------
 3244|     10|    return os << "(" << value << ")";
 3245|    168|  return os << stringFormat("{:.1f} mm", 2048.0 / value.toInt64());
  ------------------
  |  |   18|    168|#define stringFormat std::format
  ------------------
 3246|    178|}
_ZN5Exiv28Internal15Nikon3MakerNote21printFlashFocalLengthERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3248|     84|std::ostream& Nikon3MakerNote::printFlashFocalLength(std::ostream& os, const Value& value, const ExifData*) {
 3249|     84|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3249:7): [True: 0, False: 84]
  |  Branch (3249:29): [True: 0, False: 84]
  ------------------
 3250|      0|    return os << "(" << value << ")";
 3251|       |
 3252|     84|  auto temp = value.toInt64();
 3253|     84|  if (temp == 0 || temp == 255)
  ------------------
  |  Branch (3253:7): [True: 6, False: 78]
  |  Branch (3253:20): [True: 2, False: 76]
  ------------------
 3254|      8|    return os << _("n/a");
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
 3255|     76|  return os << stringFormat("{:1} mm", temp);
  ------------------
  |  |   18|     76|#define stringFormat std::format
  ------------------
 3256|     84|}
_ZN5Exiv28Internal15Nikon3MakerNote23printRepeatingFlashRateERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3258|     84|std::ostream& Nikon3MakerNote::printRepeatingFlashRate(std::ostream& os, const Value& value, const ExifData*) {
 3259|     84|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3259:7): [True: 0, False: 84]
  |  Branch (3259:29): [True: 0, False: 84]
  ------------------
 3260|      0|    return os << "(" << value << ")";
 3261|       |
 3262|     84|  auto temp = value.toInt64();
 3263|     84|  if (temp == 0 || temp == 255)
  ------------------
  |  Branch (3263:7): [True: 2, False: 82]
  |  Branch (3263:20): [True: 8, False: 74]
  ------------------
 3264|     10|    return os << _("n/a");
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
 3265|     74|  return os << stringFormat("{:2} Hz", temp);
  ------------------
  |  |   18|     74|#define stringFormat std::format
  ------------------
 3266|     84|}
_ZN5Exiv28Internal15Nikon3MakerNote24printRepeatingFlashCountERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3268|     84|std::ostream& Nikon3MakerNote::printRepeatingFlashCount(std::ostream& os, const Value& value, const ExifData*) {
 3269|     84|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3269:7): [True: 0, False: 84]
  |  Branch (3269:29): [True: 0, False: 84]
  ------------------
 3270|      0|    return os << "(" << value << ")";
 3271|       |
 3272|     84|  auto temp = value.toInt64();
 3273|     84|  if (temp == 0 || temp == 255)
  ------------------
  |  Branch (3273:7): [True: 4, False: 80]
  |  Branch (3273:20): [True: 6, False: 74]
  ------------------
 3274|     10|    return os << _("n/a");
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
 3275|       |
 3276|     74|  return os << stringFormat("{:1}", temp);
  ------------------
  |  |   18|     74|#define stringFormat std::format
  ------------------
 3277|     84|}
_ZN5Exiv28Internal15Nikon3MakerNote26printExternalFlashData1Fl6ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3280|     42|                                                          const ExifData* metadata) {
 3281|     42|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3281:7): [True: 0, False: 42]
  |  Branch (3281:29): [True: 0, False: 42]
  ------------------
 3282|      0|    return os << "(" << value << ")";
 3283|       |
 3284|     42|  const auto v0 = value.toUint32(0);
 3285|     42|  if (!(v0 & 0x01))
  ------------------
  |  Branch (3285:7): [True: 22, False: 20]
  ------------------
 3286|     22|    return os << _("Did not fire");
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
 3287|       |
 3288|     20|  os << _("Fired");
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
 3289|       |
 3290|     20|  std::ostringstream ossTemp;
 3291|     20|  EXV_PRINT_TAG_BITMASK(nikonFlashAdaptors)(ossTemp, value, metadata);
  ------------------
  |  |  229|     20|#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
  ------------------
 3292|     20|  std::string tempStr = ossTemp.str();
 3293|     20|  if (!tempStr.empty())
  ------------------
  |  Branch (3293:7): [True: 14, False: 6]
  ------------------
 3294|     14|    return os << ", " << tempStr;
 3295|      6|  return os;
 3296|     20|}
_ZN5Exiv28Internal15Nikon3MakerNote26printExternalFlashData2Fl6ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3299|     40|                                                          const ExifData* metadata) {
 3300|     40|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3300:7): [True: 0, False: 40]
  |  Branch (3300:29): [True: 0, False: 40]
  ------------------
 3301|      0|    return os << "(" << value << ")";
 3302|       |
 3303|     40|  const auto v0 = value.toUint32(0);
 3304|     40|  if (!(v0 & 0x80))
  ------------------
  |  Branch (3304:7): [True: 22, False: 18]
  ------------------
 3305|     22|    return os << _("External flash off");
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
 3306|       |
 3307|     18|  os << _("External flash on") << ", ";
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
 3308|     18|  return EXV_PRINT_TAG(nikonFlashControlMode)(os, (v0 & 0x0F), metadata);
  ------------------
  |  |  199|     18|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3309|     40|}
_ZN5Exiv28Internal15Nikon3MakerNote26printExternalFlashData1Fl7ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3312|     28|                                                          const ExifData* metadata) {
 3313|     28|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3313:7): [True: 0, False: 28]
  |  Branch (3313:29): [True: 0, False: 28]
  ------------------
 3314|      0|    return os << "(" << value << ")";
 3315|       |
 3316|     28|  const auto v0 = value.toUint32();
 3317|     28|  if (!(v0 & 0x01))
  ------------------
  |  Branch (3317:7): [True: 10, False: 18]
  ------------------
 3318|     10|    return os << _("External flash off");
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
 3319|       |
 3320|     18|  os << _("External flash on") << ", ";
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
 3321|     18|  if (v0 & 0x80)
  ------------------
  |  Branch (3321:7): [True: 4, False: 14]
  ------------------
 3322|      4|    os << _("External flash zoom override");
  ------------------
  |  |   40|      4|#define _(String) (String)
  ------------------
 3323|     14|  else
 3324|     14|    os << _("No external flash zoom override");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 3325|       |
 3326|     18|  std::ostringstream ossTemp;
 3327|     18|  EXV_PRINT_TAG_BITMASK(nikonFlashAdaptors)(ossTemp, value, metadata);
  ------------------
  |  |  229|     18|#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
  ------------------
 3328|     18|  std::string tempStr = ossTemp.str();
 3329|     18|  if (!tempStr.empty())
  ------------------
  |  Branch (3329:7): [True: 12, False: 6]
  ------------------
 3330|     12|    return os << ", " << tempStr;
 3331|      6|  return os;
 3332|     18|}
_ZN5Exiv28Internal15Nikon3MakerNote23printExternalFlashData2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3334|     28|std::ostream& Nikon3MakerNote::printExternalFlashData2(std::ostream& os, const Value& value, const ExifData* metadata) {
 3335|     28|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3335:7): [True: 0, False: 28]
  |  Branch (3335:29): [True: 0, False: 28]
  ------------------
 3336|      0|    return os << "(" << value << ")";
 3337|     28|  return EXV_PRINT_TAG(nikonFlashControlMode)(os, (value.toUint32() & 0x0F), metadata);
  ------------------
  |  |  199|     28|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3338|     28|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashMasterDataFl6ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3340|     64|std::ostream& Nikon3MakerNote::printFlashMasterDataFl6(std::ostream& os, const Value& value, const ExifData* metadata) {
 3341|     64|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3341:7): [True: 0, False: 64]
  |  Branch (3341:29): [True: 0, False: 64]
  |  Branch (3341:63): [True: 32, False: 32]
  ------------------
 3342|     32|    return os << "(" << value << ")";
 3343|       |
 3344|       |  // Check if using an automated or manual mode
 3345|     32|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl6.ExternalFlashData1"));
 3346|     32|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3346:7): [True: 0, False: 32]
  |  Branch (3346:7): [True: 0, False: 32]
  |  Branch (3346:33): [True: 0, False: 32]
  |  Branch (3346:54): [True: 0, False: 32]
  ------------------
 3347|      0|    return os << "(" << value << ")";
 3348|       |
 3349|     32|  if (auto mode = pos->toUint32(0) & 0x0F)
  ------------------
  |  Branch (3349:12): [True: 19, False: 13]
  ------------------
 3350|     19|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3351|     19|                                       flashModeUsesManualScale(mode));
 3352|     13|  return os << _("n/a");
  ------------------
  |  |   40|     13|#define _(String) (String)
  ------------------
 3353|     32|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashMasterDataFl7ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3355|     42|std::ostream& Nikon3MakerNote::printFlashMasterDataFl7(std::ostream& os, const Value& value, const ExifData* metadata) {
 3356|     42|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3356:7): [True: 0, False: 42]
  |  Branch (3356:29): [True: 0, False: 42]
  |  Branch (3356:63): [True: 21, False: 21]
  ------------------
 3357|     21|    return os << "(" << value << ")";
 3358|       |
 3359|       |  // Check if using an automated or manual mode
 3360|     21|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.ExternalFlashData2"));
 3361|     21|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3361:7): [True: 0, False: 21]
  |  Branch (3361:7): [True: 0, False: 21]
  |  Branch (3361:33): [True: 0, False: 21]
  |  Branch (3361:54): [True: 0, False: 21]
  ------------------
 3362|      0|    return os << "(" << value << ")";
 3363|       |
 3364|     21|  if (auto mode = pos->toUint32(0) & 0x0F)
  ------------------
  |  Branch (3364:12): [True: 21, False: 0]
  ------------------
 3365|     21|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3366|     21|                                       flashModeUsesManualScale(mode));
 3367|      0|  return os << _("n/a");
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
 3368|     21|}
_ZN5Exiv28Internal15Nikon3MakerNote27printFlashGroupAControlDataERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3370|     64|std::ostream& Nikon3MakerNote::printFlashGroupAControlData(std::ostream& os, const Value& value, const ExifData* data) {
 3371|     64|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3371:7): [True: 0, False: 64]
  |  Branch (3371:29): [True: 0, False: 64]
  ------------------
 3372|      0|    return os << "(" << value << ")";
 3373|     64|  return EXV_PRINT_TAG(nikonFlashControlMode)(os, (value.toUint32() & 0x0F), data);
  ------------------
  |  |  199|     64|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3374|     64|}
_ZN5Exiv28Internal15Nikon3MakerNote28printFlashGroupBCControlDataERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3377|     64|                                                            const ExifData* data) {
 3378|     64|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3378:7): [True: 0, False: 64]
  |  Branch (3378:29): [True: 0, False: 64]
  ------------------
 3379|      0|    return os << "(" << value << ")";
 3380|       |
 3381|     64|  const auto temp = value.toUint32();
 3382|     64|  EXV_PRINT_TAG(nikonFlashControlMode)(os, (temp >> 4), data);
  ------------------
  |  |  199|     64|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3383|     64|  os << ", ";
 3384|     64|  return EXV_PRINT_TAG(nikonFlashControlMode)(os, (temp & 0x0f), data);
  ------------------
  |  |  199|     64|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3385|     64|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashGroupADataFl6ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3387|     60|std::ostream& Nikon3MakerNote::printFlashGroupADataFl6(std::ostream& os, const Value& value, const ExifData* metadata) {
 3388|     60|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3388:7): [True: 0, False: 60]
  |  Branch (3388:29): [True: 0, False: 60]
  |  Branch (3388:63): [True: 30, False: 30]
  ------------------
 3389|     30|    return os << "(" << value << ")";
 3390|       |
 3391|       |  // Check if using an automated or manual mode
 3392|     30|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl6.FlashGroupAControlData"));
 3393|     30|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3393:7): [True: 0, False: 30]
  |  Branch (3393:7): [True: 0, False: 30]
  |  Branch (3393:33): [True: 0, False: 30]
  |  Branch (3393:54): [True: 0, False: 30]
  ------------------
 3394|      0|    return os << "(" << value << ")";
 3395|       |
 3396|     30|  if (auto mode = pos->toUint32(0) & 0x0F)
  ------------------
  |  Branch (3396:12): [True: 27, False: 3]
  ------------------
 3397|     27|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3398|     27|                                       flashModeUsesManualScale(mode));
 3399|      3|  return os << _("n/a");
  ------------------
  |  |   40|      3|#define _(String) (String)
  ------------------
 3400|     30|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashGroupADataFl7ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3402|     42|std::ostream& Nikon3MakerNote::printFlashGroupADataFl7(std::ostream& os, const Value& value, const ExifData* metadata) {
 3403|     42|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3403:7): [True: 0, False: 42]
  |  Branch (3403:29): [True: 0, False: 42]
  |  Branch (3403:63): [True: 21, False: 21]
  ------------------
 3404|     21|    return os << "(" << value << ")";
 3405|       |
 3406|       |  // Check if using an automated or manual mode
 3407|     21|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.FlashGroupAControlData"));
 3408|     21|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3408:7): [True: 0, False: 21]
  |  Branch (3408:7): [True: 0, False: 21]
  |  Branch (3408:33): [True: 0, False: 21]
  |  Branch (3408:54): [True: 0, False: 21]
  ------------------
 3409|      0|    return os << "(" << value << ")";
 3410|       |
 3411|     21|  if (auto mode = pos->toUint32(0) & 0x0F)
  ------------------
  |  Branch (3411:12): [True: 15, False: 6]
  ------------------
 3412|     15|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3413|     15|                                       flashModeUsesManualScale(mode));
 3414|      6|  return os << _("n/a");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 3415|     21|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashGroupBDataFl6ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3417|     60|std::ostream& Nikon3MakerNote::printFlashGroupBDataFl6(std::ostream& os, const Value& value, const ExifData* metadata) {
 3418|     60|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3418:7): [True: 0, False: 60]
  |  Branch (3418:29): [True: 0, False: 60]
  |  Branch (3418:63): [True: 30, False: 30]
  ------------------
 3419|     30|    return os << "(" << value << ")";
 3420|       |
 3421|       |  // Check if using an automated or manual mode
 3422|     30|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl6.FlashGroupBCControlData"));
 3423|     30|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3423:7): [True: 0, False: 30]
  |  Branch (3423:7): [True: 0, False: 30]
  |  Branch (3423:33): [True: 0, False: 30]
  |  Branch (3423:54): [True: 0, False: 30]
  ------------------
 3424|      0|    return os << "(" << value << ")";
 3425|       |
 3426|     30|  if (auto mode = pos->toUint32(0) >> 4)
  ------------------
  |  Branch (3426:12): [True: 24, False: 6]
  ------------------
 3427|     24|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3428|     24|                                       flashModeUsesManualScale(mode));
 3429|      6|  return os << _("n/a");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 3430|     30|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashGroupBDataFl7ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3432|     42|std::ostream& Nikon3MakerNote::printFlashGroupBDataFl7(std::ostream& os, const Value& value, const ExifData* metadata) {
 3433|     42|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3433:7): [True: 0, False: 42]
  |  Branch (3433:29): [True: 0, False: 42]
  |  Branch (3433:63): [True: 21, False: 21]
  ------------------
 3434|     21|    return os << "(" << value << ")";
 3435|       |
 3436|       |  // Check if using an automated or manual mode
 3437|     21|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.FlashGroupBCControlData"));
 3438|     21|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3438:7): [True: 0, False: 21]
  |  Branch (3438:7): [True: 0, False: 21]
  |  Branch (3438:33): [True: 0, False: 21]
  |  Branch (3438:54): [True: 0, False: 21]
  ------------------
 3439|      0|    return os << "(" << value << ")";
 3440|       |
 3441|     21|  if (auto mode = pos->toUint32(0) >> 4)
  ------------------
  |  Branch (3441:12): [True: 16, False: 5]
  ------------------
 3442|     16|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3443|     16|                                       flashModeUsesManualScale(mode));
 3444|      5|  return os << _("n/a");
  ------------------
  |  |   40|      5|#define _(String) (String)
  ------------------
 3445|     21|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashGroupCDataFl6ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3447|     60|std::ostream& Nikon3MakerNote::printFlashGroupCDataFl6(std::ostream& os, const Value& value, const ExifData* metadata) {
 3448|     60|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3448:7): [True: 0, False: 60]
  |  Branch (3448:29): [True: 0, False: 60]
  |  Branch (3448:63): [True: 30, False: 30]
  ------------------
 3449|     30|    return os << "(" << value << ")";
 3450|       |
 3451|       |  // Check if using an automated or manual mode
 3452|     30|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl6.FlashGroupBCControlData"));
 3453|     30|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3453:7): [True: 0, False: 30]
  |  Branch (3453:7): [True: 0, False: 30]
  |  Branch (3453:33): [True: 0, False: 30]
  |  Branch (3453:54): [True: 0, False: 30]
  ------------------
 3454|      0|    return os << "(" << value << ")";
 3455|       |
 3456|     30|  if (auto mode = pos->toUint32(0) & 0x000F)
  ------------------
  |  Branch (3456:12): [True: 27, False: 3]
  ------------------
 3457|     27|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3458|     27|                                       flashModeUsesManualScale(mode));
 3459|      3|  return os << _("n/a");
  ------------------
  |  |   40|      3|#define _(String) (String)
  ------------------
 3460|     30|}
_ZN5Exiv28Internal15Nikon3MakerNote23printFlashGroupCDataFl7ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3462|     42|std::ostream& Nikon3MakerNote::printFlashGroupCDataFl7(std::ostream& os, const Value& value, const ExifData* metadata) {
 3463|     42|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (3463:7): [True: 0, False: 42]
  |  Branch (3463:29): [True: 0, False: 42]
  |  Branch (3463:63): [True: 21, False: 21]
  ------------------
 3464|     21|    return os << "(" << value << ")";
 3465|       |
 3466|       |  // Check if using an automated or manual mode
 3467|     21|  auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.FlashGroupBCControlData"));
 3468|     21|  if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte)
  ------------------
  |  Branch (3468:7): [True: 0, False: 21]
  |  Branch (3468:7): [True: 0, False: 21]
  |  Branch (3468:33): [True: 0, False: 21]
  |  Branch (3468:54): [True: 0, False: 21]
  ------------------
 3469|      0|    return os << "(" << value << ")";
 3470|       |
 3471|     21|  if (auto mode = pos->toUint32(0) & 0x000F)
  ------------------
  |  Branch (3471:12): [True: 18, False: 3]
  ------------------
 3472|     18|    return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)),
 3473|     18|                                       flashModeUsesManualScale(mode));
 3474|      3|  return os << _("n/a");
  ------------------
  |  |   40|      3|#define _(String) (String)
  ------------------
 3475|     21|}
_ZN5Exiv28Internal15Nikon3MakerNote23printExternalFlashData3ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3477|     28|std::ostream& Nikon3MakerNote::printExternalFlashData3(std::ostream& os, const Value& value, const ExifData* data) {
 3478|     28|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3478:7): [True: 0, False: 28]
  |  Branch (3478:29): [True: 0, False: 28]
  ------------------
 3479|      0|    return os << "(" << value << ")";
 3480|     28|  return EXV_PRINT_TAG(nikonFlashExposureComp)(os, (value.toUint32(0) & 0x04), data);
  ------------------
  |  |  199|     28|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3481|     28|}
_ZN5Exiv28Internal15Nikon3MakerNote31printCameraExposureCompensationERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3483|     92|std::ostream& Nikon3MakerNote::printCameraExposureCompensation(std::ostream& os, const Value& value, const ExifData*) {
 3484|     92|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3484:7): [True: 0, False: 92]
  |  Branch (3484:29): [True: 0, False: 92]
  ------------------
 3485|      0|    return os << "(" << value << ")";
 3486|     92|  return printFlashCompensationValue(os, static_cast<unsigned char>(value.toUint32(0)), false);
 3487|     92|}
_ZN5Exiv28Internal15Nikon3MakerNote23printExternalFlashData4ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3489|     14|std::ostream& Nikon3MakerNote::printExternalFlashData4(std::ostream& os, const Value& value, const ExifData* metadata) {
 3490|     14|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3490:7): [True: 0, False: 14]
  |  Branch (3490:29): [True: 0, False: 14]
  ------------------
 3491|      0|    return os << "(" << value << ")";
 3492|     14|  return EXV_PRINT_TAG(nikonFlashIlluminationPat)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|     14|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3493|     14|}
_ZN5Exiv28Internal15Nikon3MakerNote26printFlashZoomHeadPositionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3495|     14|std::ostream& Nikon3MakerNote::printFlashZoomHeadPosition(std::ostream& os, const Value& value, const ExifData*) {
 3496|     14|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3496:7): [True: 0, False: 14]
  |  Branch (3496:29): [True: 0, False: 14]
  ------------------
 3497|      0|    return os << "(" << value << ")";
 3498|     14|  if (auto v0 = value.toUint32(0))
  ------------------
  |  Branch (3498:12): [True: 12, False: 2]
  ------------------
 3499|     12|    return os << stringFormat("{} mm", v0);
  ------------------
  |  |   18|     12|#define stringFormat std::format
  ------------------
 3500|      2|  return os << _("n/a");
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
 3501|     14|}
_ZN5Exiv28Internal15Nikon3MakerNote13printTimeZoneERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3503|     68|std::ostream& Nikon3MakerNote::printTimeZone(std::ostream& os, const Value& value, const ExifData*) {
 3504|     68|  if (value.count() != 1 || value.typeId() != signedShort)
  ------------------
  |  Branch (3504:7): [True: 0, False: 68]
  |  Branch (3504:29): [True: 0, False: 68]
  ------------------
 3505|      0|    return os << "(" << value << ")";
 3506|     68|  char sign = value.toInt64() < 0 ? '-' : '+';
  ------------------
  |  Branch (3506:15): [True: 32, False: 36]
  ------------------
 3507|     68|  long h = static_cast<long>(std::fabs(value.toFloat() / 60.0F)) % 24;
 3508|     68|  long min = static_cast<long>(std::fabs(value.toFloat() - (h * 60))) % 60;
 3509|     68|  return os << stringFormat("UTC {}{:02}:{:02}", sign, h, min);
  ------------------
  |  |   18|     68|#define stringFormat std::format
  ------------------
 3510|     68|}
_ZN5Exiv28Internal15Nikon3MakerNote19printPictureControlERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3512|    426|std::ostream& Nikon3MakerNote::printPictureControl(std::ostream& os, const Value& value, const ExifData*) {
 3513|    426|  if (value.count() != 1 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (3513:7): [True: 0, False: 426]
  |  Branch (3513:29): [True: 0, False: 426]
  ------------------
 3514|      0|    return os << "(" << value << ")";
 3515|    426|  const auto pcval = value.toInt64() - 0x80;
 3516|    426|  if (pcval == 0)
  ------------------
  |  Branch (3516:7): [True: 54, False: 372]
  ------------------
 3517|     54|    return os << _("Normal");
  ------------------
  |  |   40|     54|#define _(String) (String)
  ------------------
 3518|    372|  if (pcval == 127)
  ------------------
  |  Branch (3518:7): [True: 22, False: 350]
  ------------------
 3519|     22|    return os << _("n/a");
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
 3520|    350|  if (pcval == -127)
  ------------------
  |  Branch (3520:7): [True: 16, False: 334]
  ------------------
 3521|     16|    return os << _("User");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
 3522|    334|  if (pcval == -128)
  ------------------
  |  Branch (3522:7): [True: 136, False: 198]
  ------------------
 3523|    136|    return os << _("Auto");
  ------------------
  |  |   40|    136|#define _(String) (String)
  ------------------
 3524|    198|  return os << pcval;
 3525|    334|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x009aERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3527|     82|std::ostream& Nikon3MakerNote::print0x009a(std::ostream& os, const Value& value, const ExifData*) {
 3528|     82|  if (value.count() != 2 || value.typeId() != unsignedRational)
  ------------------
  |  Branch (3528:7): [True: 16, False: 66]
  |  Branch (3528:29): [True: 6, False: 60]
  ------------------
 3529|     22|    return os << value;
 3530|     60|  float f1 = value.toFloat(0);
 3531|     60|  float f2 = value.toFloat(1);
 3532|     60|  return os << f1 << " x " << f2 << " um";
 3533|     82|}
_ZN5Exiv28Internal15Nikon3MakerNote11print0x009eERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3535|    700|std::ostream& Nikon3MakerNote::print0x009e(std::ostream& os, const Value& value, const ExifData*) {
 3536|    700|  if (value.count() != 10 || value.typeId() != unsignedShort)
  ------------------
  |  Branch (3536:7): [True: 50, False: 650]
  |  Branch (3536:30): [True: 24, False: 626]
  ------------------
 3537|     74|    return os << value;
 3538|       |
 3539|    626|  std::vector<std::string> sv;
 3540|    626|  bool trim = true;
 3541|       |
 3542|  6.88k|  for (int i = 9; i >= 0; --i) {
  ------------------
  |  Branch (3542:19): [True: 6.26k, False: 626]
  ------------------
 3543|  6.26k|    const auto l = value.toInt64(i);
 3544|  6.26k|    if (i > 0 && l == 0 && trim)
  ------------------
  |  Branch (3544:9): [True: 5.63k, False: 626]
  |  Branch (3544:18): [True: 1.49k, False: 4.14k]
  |  Branch (3544:28): [True: 610, False: 884]
  ------------------
 3545|    610|      continue;
 3546|  5.65k|    if (l != 0)
  ------------------
  |  Branch (3546:9): [True: 4.54k, False: 1.10k]
  ------------------
 3547|  4.54k|      trim = false;
 3548|       |
 3549|  5.65k|    if (auto td = Exiv2::find(nikonRetouchHistory, l))
  ------------------
  |  Branch (3549:14): [True: 1.96k, False: 3.68k]
  ------------------
 3550|  1.96k|      sv.emplace_back(_(td->label_));
  ------------------
  |  |   40|  1.96k|#define _(String) (String)
  ------------------
 3551|  3.68k|    else
 3552|  3.68k|      sv.emplace_back(stringFormat("{} ({})", _("Unknown"), l));
  ------------------
  |  |   18|  3.68k|#define stringFormat std::format
  ------------------
                    sv.emplace_back(stringFormat("{} ({})", _("Unknown"), l));
  ------------------
  |  |   40|  3.68k|#define _(String) (String)
  ------------------
 3553|  5.65k|  }
 3554|       |
 3555|    626|  if (!sv.empty()) {
  ------------------
  |  Branch (3555:7): [True: 626, False: 0]
  ------------------
 3556|    626|    std::copy(sv.begin(), sv.end() - 1, std::ostream_iterator<std::string>(os, "; "));
 3557|    626|    os << sv.back();
 3558|    626|  }
 3559|       |
 3560|    626|  return os;
 3561|    700|}
_ZN5Exiv28Internal15Nikon3MakerNote16printApertureLd4ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3563|    210|std::ostream& Nikon3MakerNote::printApertureLd4(std::ostream& os, const Value& value, const ExifData*) {
 3564|    210|  if (value.count() != 1 || value.typeId() != unsignedShort)
  ------------------
  |  Branch (3564:7): [True: 0, False: 210]
  |  Branch (3564:29): [True: 0, False: 210]
  ------------------
 3565|      0|    return os << "(" << value << ")";
 3566|    210|  auto temp = value.toInt64();
 3567|    210|  if (temp == 0)
  ------------------
  |  Branch (3567:7): [True: 24, False: 186]
  ------------------
 3568|     24|    return os << _("n/a");
  ------------------
  |  |   40|     24|#define _(String) (String)
  ------------------
 3569|    186|  return os << stringFormat("F{:.1f}", std::exp2((temp / 384.0) - 1.0));
  ------------------
  |  |   18|    186|#define stringFormat std::format
  ------------------
 3570|    210|}
_ZN5Exiv28Internal15Nikon3MakerNote13printFocalLd4ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3571|     58|std::ostream& Nikon3MakerNote::printFocalLd4(std::ostream& os, const Value& value, const ExifData*) {
 3572|     58|  if (value.count() != 1 || value.typeId() != unsignedShort)
  ------------------
  |  Branch (3572:7): [True: 0, False: 58]
  |  Branch (3572:29): [True: 0, False: 58]
  ------------------
 3573|      0|    return os << "(" << value << ")";
 3574|     58|  auto temp = value.toInt64();
 3575|     58|  if (temp == 0)
  ------------------
  |  Branch (3575:7): [True: 8, False: 50]
  ------------------
 3576|      8|    return os << _("n/a");
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
 3577|     50|  return os << stringFormat("{} mm", temp);
  ------------------
  |  |   18|     50|#define stringFormat std::format
  ------------------
 3578|     58|}
_ZN5Exiv28Internal15Nikon3MakerNote21printFocusDistanceLd4ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3580|     48|std::ostream& Nikon3MakerNote::printFocusDistanceLd4(std::ostream& os, const Value& value, const ExifData*) {
 3581|     48|  if (value.count() != 1 || value.typeId() != unsignedShort)
  ------------------
  |  Branch (3581:7): [True: 0, False: 48]
  |  Branch (3581:29): [True: 0, False: 48]
  ------------------
 3582|      0|    return os << "(" << value << ")";
 3583|     48|  auto temp = value.toInt64();
 3584|     48|  if (temp == 0)
  ------------------
  |  Branch (3584:7): [True: 6, False: 42]
  ------------------
 3585|      6|    return os << _("n/a");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 3586|     42|  return os << stringFormat("{:.2f} m", std::pow(10.0, (temp / (256.0 * 40.0)) - 2.0));
  ------------------
  |  |   18|     42|#define stringFormat std::format
  ------------------
 3587|     48|}
nikonmn_int.cpp:_ZN5Exiv28InternalL12getKeyStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKNS_8ExifDataE:
  179|     20|static std::string getKeyString(const std::string& key, const ExifData* metadata) {
  180|     20|  std::string result;
  181|     20|  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
  ------------------
  |  Branch (181:7): [True: 20, False: 0]
  ------------------
  182|     20|    result = metadata->findKey(ExifKey(key))->toString();
  183|     20|  }
  184|     20|  return result;
  185|     20|}
nikonmn_int.cpp:_ZN5Exiv28InternalL14testConfigFileERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueE:
 1910|    170|static bool testConfigFile(std::ostream& os, const Value& value) {
 1911|    170|  bool result = false;
 1912|    170|  const std::string undefined("undefined");
 1913|    170|  const std::string section("nikon");
 1914|    170|  if (Internal::readExiv2Config(section, value.toString(), undefined) != undefined) {
  ------------------
  |  Branch (1914:7): [True: 0, False: 170]
  ------------------
 1915|      0|    os << Internal::readExiv2Config(section, value.toString(), undefined);
 1916|      0|    result = true;
 1917|      0|  }
 1918|    170|  return result;
 1919|    170|}
nikonmn_int.cpp:_ZN5Exiv28InternalL27printFlashCompensationValueERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEhb:
  963|    259|static std::ostream& printFlashCompensationValue(std::ostream& os, const unsigned char value, const bool manualScale) {
  964|    259|  std::ios::fmtflags f(os.flags());
  965|    259|  std::ostringstream oss;
  966|    259|  oss.copyfmt(os);
  967|       |
  968|    259|  if (manualScale) {
  ------------------
  |  Branch (968:7): [True: 67, False: 192]
  ------------------
  969|       |    /*
  970|       |       // Format:
  971|       |       0 = "1/1"
  972|       |       1 = "1/1 (-1/6EV)"
  973|       |       2 = "1/1 (-1/3EV)"
  974|       |       3 = "1/1 (-1/2EV)"
  975|       |       4 = "1/1 (-2/3EV)"
  976|       |       5 = "1/1 (-5/6EV)"
  977|       |       6 = "1/2"
  978|       |       7 = "1/2 (-1/6EV)"
  979|       |       ...
  980|       |       48 = "1/256"
  981|       |    */
  982|     67|    if (value > 48) {
  ------------------
  |  Branch (982:9): [True: 37, False: 30]
  ------------------
  983|     37|      os << "(" << value << ")";
  984|     37|      os.flags(f);
  985|     37|      return os;
  986|     37|    }
  987|     30|    const auto mod = value % 6;
  988|     30|    auto temp = (value < 6) ? 0 : (value - mod) / 6;
  ------------------
  |  Branch (988:17): [True: 14, False: 16]
  ------------------
  989|     30|    os << "1/" << std::exp2(temp);
  990|     30|    if (mod != 0) {
  ------------------
  |  Branch (990:9): [True: 16, False: 14]
  ------------------
  991|     16|      os << " (-";
  992|     16|      switch (mod) {
  ------------------
  |  Branch (992:15): [True: 16, False: 0]
  ------------------
  993|      0|        case 1:
  ------------------
  |  Branch (993:9): [True: 0, False: 16]
  ------------------
  994|      0|          os << "1/6 EV)";
  995|      0|          break;
  996|      3|        case 2:
  ------------------
  |  Branch (996:9): [True: 3, False: 13]
  ------------------
  997|      3|          os << "1/3 EV)";
  998|      3|          break;
  999|      9|        case 3:
  ------------------
  |  Branch (999:9): [True: 9, False: 7]
  ------------------
 1000|      9|          os << "1/2 EV)";
 1001|      9|          break;
 1002|      0|        case 4:
  ------------------
  |  Branch (1002:9): [True: 0, False: 16]
  ------------------
 1003|      0|          os << "2/3 EV)";
 1004|      0|          break;
 1005|      4|        case 5:
  ------------------
  |  Branch (1005:9): [True: 4, False: 12]
  ------------------
 1006|      4|          os << "5/6 EV)";
 1007|      4|          break;
 1008|     16|      }
 1009|     16|    }
 1010|    192|  } else {
 1011|       |    /*
 1012|       |    // Format uses 127 as boundary between +/- then values descend:
 1013|       |    0   = "0.0EV"
 1014|       |    1   = "-0.2EV"
 1015|       |    2   = "-0.3EV"
 1016|       |    3   = "-0.5EV"
 1017|       |    4   = "-0.7EV"
 1018|       |    5   = "-0.8EV"
 1019|       |    6   = "-1.0EV"
 1020|       |    7   = "-1.2EV"
 1021|       |    ...
 1022|       |    127 = "-21.2EV"
 1023|       |    128 = "+21.3EV"
 1024|       |    129 = "+21.2EV"
 1025|       |    130 = "+21.0EV"
 1026|       |    ...
 1027|       |    255 = "+0.2"
 1028|       |     */
 1029|    192|    auto output = 0.0f;
 1030|    192|    if (value < 128) {
  ------------------
  |  Branch (1030:9): [True: 121, False: 71]
  ------------------
 1031|    121|      if (value != 0)
  ------------------
  |  Branch (1031:11): [True: 78, False: 43]
  ------------------
 1032|     78|        output = static_cast<float>(value) * -1.0f;
 1033|    121|    } else {
 1034|     71|      output = 256.0f - static_cast<float>(value);
 1035|     71|    }
 1036|    192|    os.precision(1);
 1037|    192|    if (value != 0)
  ------------------
  |  Branch (1037:9): [True: 149, False: 43]
  ------------------
 1038|    149|      os << std::showpos;
 1039|    192|    os << std::fixed << (output / 6) << " EV";
 1040|    192|  }
 1041|    222|  os.copyfmt(os);
 1042|    222|  os.flags(f);
 1043|    222|  return os;
 1044|    259|}
nikonmn_int.cpp:_ZN5Exiv28InternalL24flashModeUsesManualScaleEl:
  910|    167|static constexpr bool flashModeUsesManualScale(const int64_t mode) {
  911|    167|  return (mode == 6 || mode == 7);
  ------------------
  |  Branch (911:11): [True: 41, False: 126]
  |  Branch (911:24): [True: 26, False: 100]
  ------------------
  912|    167|}
nikonmn_int.cpp:_ZZN5Exiv28Internal15Nikon3MakerNote11printLensIdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataERKNS2_12basic_stringIcS5_NS2_9allocatorIcEEEEENK8FMntLenseqEh:
 2031|  19.6k|    bool operator==(unsigned char l) const {
 2032|  19.6k|      return lid == l;
 2033|  19.6k|    }

_ZN5Exiv28Internal15Nikon1MakerNote7tagListEv:
   38|  13.8k|  static constexpr auto tagList() {
   39|  13.8k|    return tagInfo_;
   40|  13.8k|  }
_ZN5Exiv28Internal15Nikon2MakerNote7tagListEv:
   71|  8.15k|  static constexpr auto tagList() {
   72|  8.15k|    return tagInfo_;
   73|  8.15k|  }
_ZN5Exiv28Internal15Nikon3MakerNote7tagListEv:
   91|  51.9k|  static constexpr auto tagList() {
   92|  51.9k|    return tagInfo_;
   93|  51.9k|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListVrEv:
   95|    713|  static constexpr auto tagListVr() {
   96|    713|    return tagInfoVr_;
   97|    713|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListPcEv:
   99|  1.73k|  static constexpr auto tagListPc() {
  100|  1.73k|    return tagInfoPc_;
  101|  1.73k|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListWtEv:
  103|  2.19k|  static constexpr auto tagListWt() {
  104|  2.19k|    return tagInfoWt_;
  105|  2.19k|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListIiEv:
  107|  1.71k|  static constexpr auto tagListIi() {
  108|  1.71k|    return tagInfoIi_;
  109|  1.71k|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListAfEv:
  111|  1.33k|  static constexpr auto tagListAf() {
  112|  1.33k|    return tagInfoAf_;
  113|  1.33k|  }
_ZN5Exiv28Internal15Nikon3MakerNote11tagListAf21Ev:
  115|  4.04k|  static constexpr auto tagListAf21() {
  116|  4.04k|    return tagInfoAf21_;
  117|  4.04k|  }
_ZN5Exiv28Internal15Nikon3MakerNote11tagListAf22Ev:
  119|    383|  static constexpr auto tagListAf22() {
  120|    383|    return tagInfoAf22_;
  121|    383|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListAFTEv:
  123|  2.36k|  static constexpr auto tagListAFT() {
  124|  2.36k|    return tagInfoAFT_;
  125|  2.36k|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListFiEv:
  127|    114|  static constexpr auto tagListFi() {
  128|    114|    return tagInfoFi_;
  129|    114|  }
_ZN5Exiv28Internal15Nikon3MakerNote9tagListMeEv:
  131|     76|  static constexpr auto tagListMe() {
  132|     76|    return tagInfoMe_;
  133|     76|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListFl1Ev:
  135|     80|  static constexpr auto tagListFl1() {
  136|     80|    return tagInfoFl1_;
  137|     80|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListFl2Ev:
  139|     65|  static constexpr auto tagListFl2() {
  140|     65|    return tagInfoFl2_;
  141|     65|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListFl3Ev:
  143|    169|  static constexpr auto tagListFl3() {
  144|    169|    return tagInfoFl3_;
  145|    169|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListFl6Ev:
  147|  1.47k|  static constexpr auto tagListFl6() {
  148|  1.47k|    return tagInfoFl6_;
  149|  1.47k|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListFl7Ev:
  151|  1.16k|  static constexpr auto tagListFl7() {
  152|  1.16k|    return tagInfoFl7_;
  153|  1.16k|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListSi1Ev:
  155|     28|  static constexpr auto tagListSi1() {
  156|     28|    return tagInfoSi1_;
  157|     28|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListSi2Ev:
  159|     16|  static constexpr auto tagListSi2() {
  160|     16|    return tagInfoSi2_;
  161|     16|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListSi5Ev:
  171|    529|  static constexpr auto tagListSi5() {
  172|    529|    return tagInfoSi5_;
  173|    529|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListCb1Ev:
  175|     30|  static constexpr auto tagListCb1() {
  176|     30|    return tagInfoCb1_;
  177|     30|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListCb2Ev:
  179|     34|  static constexpr auto tagListCb2() {
  180|     34|    return tagInfoCb2_;
  181|     34|  }
_ZN5Exiv28Internal15Nikon3MakerNote11tagListCb2aEv:
  183|     52|  static constexpr auto tagListCb2a() {
  184|     52|    return tagInfoCb2a_;
  185|     52|  }
_ZN5Exiv28Internal15Nikon3MakerNote11tagListCb2bEv:
  187|    155|  static constexpr auto tagListCb2b() {
  188|    155|    return tagInfoCb2b_;
  189|    155|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListCb3Ev:
  191|     33|  static constexpr auto tagListCb3() {
  192|     33|    return tagInfoCb3_;
  193|     33|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListCb4Ev:
  195|     56|  static constexpr auto tagListCb4() {
  196|     56|    return tagInfoCb4_;
  197|     56|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListLd1Ev:
  199|    239|  static constexpr auto tagListLd1() {
  200|    239|    return tagInfoLd1_;
  201|    239|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListLd2Ev:
  203|    338|  static constexpr auto tagListLd2() {
  204|    338|    return tagInfoLd2_;
  205|    338|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListLd3Ev:
  207|    246|  static constexpr auto tagListLd3() {
  208|    246|    return tagInfoLd3_;
  209|    246|  }
_ZN5Exiv28Internal15Nikon3MakerNote10tagListLd4Ev:
  211|  9.57k|  static constexpr auto tagListLd4() {
  212|  9.57k|    return tagInfoLd4_;
  213|  9.57k|  }

_ZN5Exiv28Internal16OlympusMakerNote11print0x050fERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1136|    652|std::ostream& OlympusMakerNote::print0x050f(std::ostream& os, const Value& value, const ExifData*) {
 1137|    652|  if ((value.count() != 3 && value.count() != 4) || value.typeId() != signedShort) {
  ------------------
  |  Branch (1137:8): [True: 646, False: 6]
  |  Branch (1137:30): [True: 44, False: 602]
  |  Branch (1137:53): [True: 28, False: 580]
  ------------------
 1138|     72|    return os << value;
 1139|     72|  }
 1140|       |
 1141|    580|  if (value.toInt64(0) == -1 && value.toInt64(1) == -1 && value.toInt64(2) == 1)
  ------------------
  |  Branch (1141:7): [True: 138, False: 442]
  |  Branch (1141:33): [True: 92, False: 46]
  |  Branch (1141:59): [True: 14, False: 78]
  ------------------
 1142|     14|    os << _("Low Key");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1143|    566|  else if (value.toInt64(0) == 0 && value.toInt64(1) == -1 && value.toInt64(2) == 1)
  ------------------
  |  Branch (1143:12): [True: 192, False: 374]
  |  Branch (1143:37): [True: 28, False: 164]
  |  Branch (1143:63): [True: 14, False: 14]
  ------------------
 1144|     14|    os << _("Normal");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1145|    552|  else if (value.toInt64(0) == 1 && value.toInt64(1) == -1 && value.toInt64(2) == 1)
  ------------------
  |  Branch (1145:12): [True: 54, False: 498]
  |  Branch (1145:37): [True: 36, False: 18]
  |  Branch (1145:63): [True: 18, False: 18]
  ------------------
 1146|     18|    os << _("High Key");
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
 1147|    534|  else
 1148|    534|    os << value.toInt64(0) << " " << value.toInt64(1) << " " << value.toInt64(2);
 1149|       |
 1150|    580|  if (value.count() == 4) {
  ------------------
  |  Branch (1150:7): [True: 574, False: 6]
  ------------------
 1151|    574|    switch (value.toInt64(3)) {
 1152|    252|      case 0:
  ------------------
  |  Branch (1152:7): [True: 252, False: 322]
  ------------------
 1153|    252|        os << ", " << _("User-Selected");
  ------------------
  |  |   40|    252|#define _(String) (String)
  ------------------
 1154|    252|        break;
 1155|     34|      case 1:
  ------------------
  |  Branch (1155:7): [True: 34, False: 540]
  ------------------
 1156|     34|        os << ", " << _("Auto-Override");
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
 1157|     34|        break;
 1158|    288|      default:
  ------------------
  |  Branch (1158:7): [True: 288, False: 286]
  ------------------
 1159|    288|        os << value.toInt64(3);
 1160|    288|        break;
 1161|    574|    }
 1162|    574|  }
 1163|    580|  return os;
 1164|    580|}
_ZN5Exiv28Internal16OlympusMakerNote11print0x0527ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1167|     90|std::ostream& OlympusMakerNote::print0x0527(std::ostream& os, const Value& value, const ExifData*) {
 1168|     90|  if (value.count() != 3 || value.typeId() != signedShort || value.toInt64(1) != -2 || value.toInt64(2) != 1) {
  ------------------
  |  Branch (1168:7): [True: 44, False: 46]
  |  Branch (1168:29): [True: 24, False: 22]
  |  Branch (1168:62): [True: 10, False: 12]
  |  Branch (1168:88): [True: 2, False: 10]
  ------------------
 1169|     80|    return os << value;
 1170|     80|  }
 1171|       |
 1172|     10|  switch (value.toInt64(0)) {
 1173|      2|    case -2:
  ------------------
  |  Branch (1173:5): [True: 2, False: 8]
  ------------------
 1174|      2|      os << _("Off");
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
 1175|      2|      break;
 1176|      2|    case -1:
  ------------------
  |  Branch (1176:5): [True: 2, False: 8]
  ------------------
 1177|      2|      os << _("Low");
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
 1178|      2|      break;
 1179|      2|    case 0:
  ------------------
  |  Branch (1179:5): [True: 2, False: 8]
  ------------------
 1180|      2|      os << _("Standard");
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
 1181|      2|      break;
 1182|      2|    case 1:
  ------------------
  |  Branch (1182:5): [True: 2, False: 8]
  ------------------
 1183|      2|      os << _("High");
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
 1184|      2|      break;
 1185|      2|    default:
  ------------------
  |  Branch (1185:5): [True: 2, False: 8]
  ------------------
 1186|      2|      os << value.toInt64(0);
 1187|      2|      break;
 1188|     10|  }
 1189|       |
 1190|     10|  return os;
 1191|     10|}
_ZN5Exiv28Internal16OlympusMakerNote11print0x0200ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1193|    672|std::ostream& OlympusMakerNote::print0x0200(std::ostream& os, const Value& value, const ExifData*) {
 1194|    672|  if (value.count() != 3 || value.typeId() != unsignedLong) {
  ------------------
  |  Branch (1194:7): [True: 508, False: 164]
  |  Branch (1194:29): [True: 10, False: 154]
  ------------------
 1195|    518|    return os << value;
 1196|    518|  }
 1197|    154|  const auto l0 = value.toInt64(0);
 1198|    154|  switch (l0) {
 1199|     40|    case 0:
  ------------------
  |  Branch (1199:5): [True: 40, False: 114]
  ------------------
 1200|     40|      os << _("Normal");
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
 1201|     40|      break;
 1202|     18|    case 2:
  ------------------
  |  Branch (1202:5): [True: 18, False: 136]
  ------------------
 1203|     18|      os << _("Fast");
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
 1204|     18|      break;
 1205|     14|    case 3:
  ------------------
  |  Branch (1205:5): [True: 14, False: 140]
  ------------------
 1206|     14|      os << _("Panorama");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1207|     14|      break;
 1208|     82|    default:
  ------------------
  |  Branch (1208:5): [True: 82, False: 72]
  ------------------
 1209|     82|      os << "(" << l0 << ")";
 1210|     82|      break;
 1211|    154|  }
 1212|    154|  if (l0 != 0) {
  ------------------
  |  Branch (1212:7): [True: 114, False: 40]
  ------------------
 1213|    114|    os << ", ";
 1214|    114|    const auto l1 = value.toInt64(1);
 1215|    114|    os << _("Sequence number") << " " << l1;
  ------------------
  |  |   40|    114|#define _(String) (String)
  ------------------
 1216|    114|  }
 1217|    154|  if (l0 != 0 && l0 != 2) {
  ------------------
  |  Branch (1217:7): [True: 114, False: 40]
  |  Branch (1217:18): [True: 96, False: 18]
  ------------------
 1218|     96|    os << ", ";
 1219|     96|    const auto l2 = value.toInt64(2);
 1220|     96|    switch (l2) {
 1221|      6|      case 1:
  ------------------
  |  Branch (1221:7): [True: 6, False: 90]
  ------------------
 1222|      6|        os << _("Left to right");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1223|      6|        break;
 1224|     14|      case 2:
  ------------------
  |  Branch (1224:7): [True: 14, False: 82]
  ------------------
 1225|     14|        os << _("Right to left");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1226|     14|        break;
 1227|     14|      case 3:
  ------------------
  |  Branch (1227:7): [True: 14, False: 82]
  ------------------
 1228|     14|        os << _("Bottom to top");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1229|     14|        break;
 1230|     12|      case 4:
  ------------------
  |  Branch (1230:7): [True: 12, False: 84]
  ------------------
 1231|     12|        os << _("Top to bottom");
  ------------------
  |  |   40|     12|#define _(String) (String)
  ------------------
 1232|     12|        break;
 1233|     50|      default:
  ------------------
  |  Branch (1233:7): [True: 50, False: 46]
  ------------------
 1234|     50|        os << "(" << l2 << ")";
 1235|     50|        break;
 1236|     96|    }
 1237|     96|  }
 1238|    154|  return os;
 1239|    154|}  // OlympusMakerNote::print0x0200
_ZN5Exiv28Internal16OlympusMakerNote11print0x0204ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1241|    242|std::ostream& OlympusMakerNote::print0x0204(std::ostream& os, const Value& value, const ExifData*) {
 1242|    242|  if (value.count() == 0 || value.toRational().second == 0) {
  ------------------
  |  Branch (1242:7): [True: 0, False: 242]
  |  Branch (1242:7): [True: 8, False: 234]
  |  Branch (1242:29): [True: 8, False: 234]
  ------------------
 1243|      8|    return os << "(" << value << ")";
 1244|      8|  }
 1245|    234|  float f = value.toFloat();
 1246|    234|  if (f == 0.0F || f == 1.0F)
  ------------------
  |  Branch (1246:7): [True: 84, False: 150]
  |  Branch (1246:20): [True: 32, False: 118]
  ------------------
 1247|    116|    return os << _("None");
  ------------------
  |  |   40|    116|#define _(String) (String)
  ------------------
 1248|    118|  return os << stringFormat("{:.1f}x", f);
  ------------------
  |  |   18|    118|#define stringFormat std::format
  ------------------
 1249|    234|}  // OlympusMakerNote::print0x0204
_ZN5Exiv28Internal16OlympusMakerNote11print0x1015ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1251|    342|std::ostream& OlympusMakerNote::print0x1015(std::ostream& os, const Value& value, const ExifData*) {
 1252|    342|  if (value.typeId() != unsignedShort) {
  ------------------
  |  Branch (1252:7): [True: 70, False: 272]
  ------------------
 1253|     70|    return os << value;
 1254|     70|  }
 1255|    272|  if (value.count() == 1) {
  ------------------
  |  Branch (1255:7): [True: 44, False: 228]
  ------------------
 1256|     44|    auto l0 = value.toInt64(0);
 1257|     44|    if (l0 == 1) {
  ------------------
  |  Branch (1257:9): [True: 8, False: 36]
  ------------------
 1258|      8|      os << _("Auto");
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
 1259|     36|    } else {
 1260|     36|      return os << value;
 1261|     36|    }
 1262|    228|  } else if (value.count() == 2) {
  ------------------
  |  Branch (1262:14): [True: 190, False: 38]
  ------------------
 1263|    190|    auto l0 = value.toInt64(0);
 1264|    190|    auto l1 = value.toInt64(1);
 1265|    190|    if (l0 == 1) {
  ------------------
  |  Branch (1265:9): [True: 22, False: 168]
  ------------------
 1266|     22|      if (l1 == 0)
  ------------------
  |  Branch (1266:11): [True: 16, False: 6]
  ------------------
 1267|     16|        os << _("Auto");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
 1268|      6|      else
 1269|      6|        os << _("Auto") << " (" << l1 << ")";
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1270|    168|    } else if (l0 == 2) {
  ------------------
  |  Branch (1270:16): [True: 122, False: 46]
  ------------------
 1271|    122|      switch (l1) {
 1272|     28|        case 2:
  ------------------
  |  Branch (1272:9): [True: 28, False: 94]
  ------------------
 1273|     28|          os << _("3000 Kelvin");
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
 1274|     28|          break;
 1275|      6|        case 3:
  ------------------
  |  Branch (1275:9): [True: 6, False: 116]
  ------------------
 1276|      6|          os << _("3700 Kelvin");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1277|      6|          break;
 1278|     14|        case 4:
  ------------------
  |  Branch (1278:9): [True: 14, False: 108]
  ------------------
 1279|     14|          os << _("4000 Kelvin");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1280|     14|          break;
 1281|      6|        case 5:
  ------------------
  |  Branch (1281:9): [True: 6, False: 116]
  ------------------
 1282|      6|          os << _("4500 Kelvin");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1283|      6|          break;
 1284|      6|        case 6:
  ------------------
  |  Branch (1284:9): [True: 6, False: 116]
  ------------------
 1285|      6|          os << _("5500 Kelvin");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1286|      6|          break;
 1287|     32|        case 7:
  ------------------
  |  Branch (1287:9): [True: 32, False: 90]
  ------------------
 1288|     32|          os << _("6500 Kelvin");
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
 1289|     32|          break;
 1290|     14|        case 8:
  ------------------
  |  Branch (1290:9): [True: 14, False: 108]
  ------------------
 1291|     14|          os << _("7500 Kelvin");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1292|     14|          break;
 1293|     16|        default:
  ------------------
  |  Branch (1293:9): [True: 16, False: 106]
  ------------------
 1294|     16|          os << value;
 1295|     16|          break;
 1296|    122|      }
 1297|    122|    } else if (l0 == 3) {
  ------------------
  |  Branch (1297:16): [True: 22, False: 24]
  ------------------
 1298|     22|      if (l1 == 0)
  ------------------
  |  Branch (1298:11): [True: 8, False: 14]
  ------------------
 1299|      8|        os << _("One-touch");
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
 1300|     14|      else
 1301|     14|        os << value;
 1302|     22|    } else
 1303|     24|      return os << value;
 1304|    190|  } else {
 1305|     38|    return os << value;
 1306|     38|  }
 1307|    174|  return os;
 1308|    272|}  // OlympusMakerNote::print0x1015
_ZN5Exiv28Internal16OlympusMakerNote11print0x0201ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1311|    334|std::ostream& OlympusMakerNote::print0x0201(std::ostream& os, const Value& value, const ExifData*) {
 1312|       |  // #1034
 1313|    334|  const std::string undefined("undefined");
 1314|    334|  const std::string section("olympus");
 1315|    334|  if (Internal::readExiv2Config(section, value.toString(), undefined) != undefined) {
  ------------------
  |  Branch (1315:7): [True: 0, False: 334]
  ------------------
 1316|      0|    return os << Internal::readExiv2Config(section, value.toString(), undefined);
 1317|      0|  }
 1318|       |
 1319|       |  // 6 numbers: 0. Make, 1. Unknown, 2. Model, 3. Sub-model, 4-5. Unknown.
 1320|       |  // Only the Make, Model and Sub-model are used to determine the lens model
 1321|    334|  static constexpr struct {
 1322|    334|    byte val[3];
 1323|    334|    const char* label;
 1324|    334|  } lensTypes[] = {
 1325|    334|      {{0, 0, 0}, N_("None")},
  ------------------
  |  |   41|    334|#define N_(String) String
  ------------------
 1326|    334|      {{0, 1, 0}, "Olympus Zuiko Digital ED 50mm F2.0 Macro"},
 1327|    334|      {{0, 1, 1}, "Olympus Zuiko Digital 40-150mm F3.5-4.5"},
 1328|    334|      {{0, 1, 16}, "Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6"},
 1329|    334|      {{0, 2, 0}, "Olympus Zuiko Digital ED 150mm F2.0"},
 1330|    334|      {{0, 2, 16}, "Olympus M.Zuiko Digital 17mm F2.8 Pancake"},
 1331|    334|      {{0, 3, 0}, "Olympus Zuiko Digital ED 300mm F2.8"},
 1332|    334|      {{0, 3, 16}, "Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6"},
 1333|    334|      {{0, 4, 16}, "Olympus M.Zuiko Digital ED 9-18mm F4.0-5.6"},
 1334|    334|      {{0, 5, 0}, "Olympus Zuiko Digital 14-54mm F2.8-3.5"},
 1335|    334|      {{0, 5, 1}, "Olympus Zuiko Digital Pro ED 90-250mm F2.8"},
 1336|    334|      {{0, 5, 16}, "Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 L"},
 1337|    334|      {{0, 6, 0}, "Olympus Zuiko Digital ED 50-200mm F2.8-3.5"},
 1338|    334|      {{0, 6, 1}, "Olympus Zuiko Digital ED 8mm F3.5 Fisheye"},
 1339|    334|      {{0, 6, 16}, "Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6"},
 1340|    334|      {{0, 7, 0}, "Olympus Zuiko Digital 11-22mm F2.8-3.5"},
 1341|    334|      {{0, 7, 1}, "Olympus Zuiko Digital 18-180mm F3.5-6.3"},
 1342|    334|      {{0, 7, 16}, "Olympus M.Zuiko Digital ED 12mm F2.0"},
 1343|    334|      {{0, 8, 1}, "Olympus Zuiko Digital 70-300mm F4.0-5.6"},
 1344|    334|      {{0, 8, 16}, "Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7"},
 1345|    334|      {{0, 9, 16}, "Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II"},
 1346|    334|      {{0, 16, 1}, "Kenko Tokina Reflex 300mm F6.3 MF Macro"},
 1347|    334|      {{0, 16, 16}, "Olympus M.Zuiko Digital ED 12-50mm F3.5-6.3 EZ"},
 1348|    334|      {{0, 17, 16}, "Olympus M.Zuiko Digital 45mm F1.8"},
 1349|    334|      {{0, 18, 16}, "Olympus M.Zuiko Digital ED 60mm F2.8 Macro"},
 1350|    334|      {{0, 19, 16}, "Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II R"},
 1351|    334|      {{0, 20, 16}, "Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6 R"},
 1352|    334|      {{0, 21, 0}, "Olympus Zuiko Digital ED 7-14mm F4.0"},
 1353|    334|      {{0, 21, 16}, "Olympus M.Zuiko Digital ED 75mm F1.8"},
 1354|    334|      {{0, 22, 16}, "Olympus M.Zuiko Digital 17mm F1.8"},
 1355|    334|      {{0, 23, 0}, "Olympus Zuiko Digital Pro ED 35-100mm F2.0"},
 1356|    334|      {{0, 24, 0}, "Olympus Zuiko Digital 14-45mm F3.5-5.6"},
 1357|    334|      {{0, 24, 16}, "Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7 II"},
 1358|    334|      {{0, 25, 16}, "Olympus M.Zuiko Digital ED 12-40mm F2.8 Pro"},
 1359|    334|      {{0, 32, 0}, "Olympus Zuiko Digital 35mm F3.5 Macro"},
 1360|    334|      {{0, 32, 16}, "Olympus M.Zuiko Digital ED 40-150mm F2.8 Pro"},
 1361|    334|      {{0, 33, 16}, "Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 EZ"},
 1362|    334|      {{0, 34, 0}, "Olympus Zuiko Digital 17.5-45mm F3.5-5.6"},
 1363|    334|      {{0, 34, 16}, "Olympus M.Zuiko Digital 25mm F1.8"},
 1364|    334|      {{0, 35, 0}, "Olympus Zuiko Digital ED 14-42mm F3.5-5.6"},
 1365|    334|      {{0, 35, 16}, "Olympus M.Zuiko Digital ED 7-14mm F2.8 Pro"},
 1366|    334|      {{0, 36, 0}, "Olympus Zuiko Digital ED 40-150mm F4.0-5.6"},
 1367|    334|      {{0, 36, 16}, "Olympus M.Zuiko Digital ED 300mm F4.0 IS Pro"},
 1368|    334|      {{0, 37, 16}, "Olympus M.Zuiko Digital ED 8mm F1.8 Fisheye Pro"},
 1369|    334|      {{0, 38, 16}, "Olympus M.Zuiko Digital ED 12-100mm F4.0 IS Pro"},
 1370|    334|      {{0, 39, 16}, "Olympus M.Zuiko Digital ED 30mm F3.5 Macro"},
 1371|    334|      {{0, 40, 16}, "Olympus M.Zuiko Digital ED 25mm F1.2 Pro"},
 1372|    334|      {{0, 41, 16}, "Olympus M.Zuiko Digital ED 17mm F1.2 Pro"},
 1373|    334|      {{0, 48, 0}, "Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD"},
 1374|    334|      {{0, 49, 0}, "Olympus Zuiko Digital ED 12-60mm F2.8-4.0 SWD"},
 1375|    334|      {{0, 50, 0}, "Olympus Zuiko Digital ED 14-35mm F2.0 SWD"},
 1376|    334|      {{0, 51, 0}, "Olympus Zuiko Digital 25mm F2.8"},
 1377|    334|      {{0, 52, 0}, "Olympus Zuiko Digital ED 9-18mm F4.0-5.6"},
 1378|    334|      {{0, 52, 16}, "Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro"},
 1379|    334|      {{0, 53, 0}, "Olympus Zuiko Digital 14-54mm F2.8-3.5 II"},
 1380|    334|      {{1, 1, 0}, "Sigma 18-50mm F3.5-5.6 DC"},
 1381|    334|      {{1, 1, 16}, "Sigma 30mm F2.8 EX DN"},
 1382|    334|      {{1, 2, 0}, "Sigma 55-200mm F4.0-5.6 DC"},
 1383|    334|      {{1, 2, 16}, "Sigma 19mm F2.8 EX DN"},
 1384|    334|      {{1, 3, 0}, "Sigma 18-125mm F3.5-5.6 DC"},
 1385|    334|      {{1, 3, 16}, "Sigma 30mm F2.8 DN | A"},
 1386|    334|      {{1, 4, 0}, "Sigma 18-125mm F3.5-5.6"},
 1387|    334|      {{1, 4, 16}, "Sigma 19mm F2.8 DN | A"},
 1388|    334|      {{1, 5, 0}, "Sigma 30mm F1.4"},
 1389|    334|      {{1, 5, 16}, "Sigma 60mm F2.8 DN | A"},
 1390|    334|      {{1, 6, 0}, "Sigma 50-500mm F4.0-6.3 EX DG APO HSM RF"},
 1391|    334|      {{1, 6, 16}, "Sigma 30mm F1.4 DC DN | C"},
 1392|    334|      {{1, 7, 0}, "Sigma 105mm F2.8 DG"},
 1393|    334|      {{1, 8, 0}, "Sigma 150mm F2.8 DG HSM"},
 1394|    334|      {{1, 9, 0}, "Sigma 18-50mm F2.8 EX DC Macro"},
 1395|    334|      {{1, 16, 0}, "Sigma 24mm F1.8 EX DG Aspherical Macro"},
 1396|    334|      {{1, 17, 0}, "Sigma 135-400mm F4.5-5.6 DG ASP APO RF"},
 1397|    334|      {{1, 18, 0}, "Sigma 300-800mm F5.6 EX DG APO"},
 1398|    334|      {{1, 19, 0}, "Sigma 30mm F1.4 EX DC HSM"},
 1399|    334|      {{1, 20, 0}, "Sigma 50-500mm F4.0-6.3 EX DG APO HSM RF"},
 1400|    334|      {{1, 21, 0}, "Sigma 10-20mm F4.0-5.6 EX DC HSM"},
 1401|    334|      {{1, 22, 0}, "Sigma 70-200mm F2.8 EX DG Macro HSM II"},
 1402|    334|      {{1, 23, 0}, "Sigma 50mm F1.4 EX DG HSM"},
 1403|    334|      {{2, 1, 0}, "Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph."},
 1404|    334|      {{2, 1, 16}, "Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS"},
 1405|    334|      {{2, 2, 0}, "Leica D Summilux 25mm F1.4 Asph."},
 1406|    334|      {{2, 2, 16}, "Lumix G Vario 45-200mm F4.0-5.6 Mega OIS"},
 1407|    334|      {{2, 3, 0}, "Leica D Vario Elmar 14-50mm F3.8-5.6 Asph. Mega OIS"},
 1408|    334|      {{2, 3, 1}, "Leica D Vario Elmar 14-50mm F3.8-5.6 Asph."},
 1409|    334|      {{2, 3, 16}, "Lumix G Vario HD 14-140mm F4.0-5.8 Asph. Mega OIS"},
 1410|    334|      {{2, 4, 0}, "Leica D Vario Elmar 14-150mm F3.5-5.6"},
 1411|    334|      {{2, 4, 16}, "Lumix G Vario 7-14mm F4.0 Asph."},
 1412|    334|      {{2, 5, 16}, "Lumix G 20mm F1.7 Asph."},
 1413|    334|      {{2, 6, 16}, "Leica DG Macro-Elmarit 45mm F2.8 Asph. Mega OIS"},
 1414|    334|      {{2, 7, 16}, "Lumix G Vario 14-42mm F3.5-5.6 Asph. Mega OIS"},
 1415|    334|      {{2, 8, 16}, "Lumix G Fisheye 8mm F3.5"},
 1416|    334|      {{2, 9, 16}, "Lumix G Vario 100-300mm F4.0-5.6 Mega OIS"},
 1417|    334|      {{2, 16, 16}, "Lumix G 14mm F2.5 Asph."},
 1418|    334|      {{2, 17, 16}, "Lumix G 3D 12.5mm F12"},
 1419|    334|      {{2, 18, 16}, "Leica DG Summilux 25mm F1.4 Asph."},
 1420|    334|      {{2, 19, 16}, "Lumix G X Vario PZ 45-175mm F4.0-5.6 Asph. Power OIS"},
 1421|    334|      {{2, 20, 16}, "Lumix G X Vario PZ 14-42mm F3.5-5.6 Asph. Power OIS"},
 1422|    334|      {{2, 21, 16}, "Lumix G X Vario 12-35mm F2.8 Asph. Power OIS"},
 1423|    334|      {{2, 22, 16}, "Lumix G Vario 45-150mm F4.0-5.6 Asph. Mega OIS"},
 1424|    334|      {{2, 23, 16}, "Lumix G X Vario 35-100mm F2.8 Power OIS"},
 1425|    334|      {{2, 24, 16}, "Lumix G Vario 14-42mm F3.5-5.6 II Asph. Mega OIS"},
 1426|    334|      {{2, 25, 16}, "Lumix G Vario 14-140mm F3.5-5.6 Asph. Power OIS"},
 1427|    334|      {{2, 32, 16}, "Lumix G Vario 12-32mm F3.5-5.6 Asph. Mega OIS"},
 1428|    334|      {{2, 33, 16}, "Leica DG Nocticron 42.5mm F1.2 Asph. Power OIS"},
 1429|    334|      {{2, 34, 16}, "Leica DG Summilux 15mm F1.7 Asph."},
 1430|    334|      {{2, 35, 16}, "Lumix G Vario 35-100mm F4.0-5.6 Asph. Mega OIS"},
 1431|    334|      {{2, 36, 16}, "Lumix G Macro 30mm F2.8 Asph. Mega OIS"},
 1432|    334|      {{2, 37, 16}, "Lumix G 42.5mm F1.7 Asph. Power OIS"},
 1433|    334|      {{2, 38, 16}, "Lumix G 25mm F1.7 Asph."},
 1434|    334|      {{2, 39, 16}, "Leica DG Vario-Elmar 100-400mm F4.0-6.3 Asph. Power OIS"},
 1435|    334|      {{2, 40, 16}, "Lumix G Vario 12-60mm F3.5-5.6 Asph. Power OIS"},
 1436|    334|      {{3, 1, 0}, "Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph."},
 1437|    334|      {{3, 2, 0}, "Leica D Summilux 25mm F1.4 Asph."},
 1438|    334|      {{5, 1, 16}, "Tamron 14-150mm F3.5-5.8 Di III"},
 1439|    334|  };
 1440|       |
 1441|    334|  if (value.count() != 6 || value.typeId() != unsignedByte) {
  ------------------
  |  Branch (1441:7): [True: 84, False: 250]
  |  Branch (1441:29): [True: 76, False: 174]
  ------------------
 1442|    160|    return os << value;
 1443|    160|  }
 1444|       |
 1445|    174|  auto v0 = static_cast<byte>(value.toInt64(0));
 1446|    174|  auto v2 = static_cast<byte>(value.toInt64(2));
 1447|    174|  auto v3 = static_cast<byte>(value.toInt64(3));
 1448|       |
 1449|  15.4k|  for (const auto& type : lensTypes) {
  ------------------
  |  Branch (1449:25): [True: 15.4k, False: 132]
  ------------------
 1450|  15.4k|    if (type.val[0] == v0 && type.val[1] == v2 && type.val[2] == v3) {
  ------------------
  |  Branch (1450:9): [True: 4.10k, False: 11.3k]
  |  Branch (1450:30): [True: 162, False: 3.93k]
  |  Branch (1450:51): [True: 42, False: 120]
  ------------------
 1451|     42|      return os << type.label;
 1452|     42|    }
 1453|  15.4k|  }
 1454|    132|  return os << value;
 1455|    174|}  // OlympusMakerNote::print0x0201
_ZN5Exiv28Internal16OlympusMakerNote11print0x0209ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1458|     92|std::ostream& OlympusMakerNote::print0x0209(std::ostream& os, const Value& value, const ExifData*) {
 1459|     92|  if (value.typeId() != asciiString && value.typeId() != undefined) {
  ------------------
  |  Branch (1459:7): [True: 64, False: 28]
  |  Branch (1459:40): [True: 22, False: 42]
  ------------------
 1460|     22|    return os << value;
 1461|     22|  }
 1462|       |
 1463|     70|  char ch;
 1464|     70|  size_t size = value.size();
 1465|  1.37k|  for (size_t i = 0; i < size && ((ch = static_cast<char>(value.toInt64(i))) != '\0'); i++) {
  ------------------
  |  Branch (1465:22): [True: 1.36k, False: 8]
  |  Branch (1465:34): [True: 1.30k, False: 62]
  ------------------
 1466|  1.30k|    os << ch;
 1467|  1.30k|  }
 1468|     70|  return os;
 1469|     92|}  // OlympusMakerNote::print0x0209
_ZN5Exiv28Internal16OlympusMakerNote13printEq0x0301ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1472|    166|std::ostream& OlympusMakerNote::printEq0x0301(std::ostream& os, const Value& value, const ExifData*) {
 1473|       |  // 6 numbers: 0. Make, 1. Unknown, 2. Model, 3. Sub-model, 4-5. Unknown.
 1474|       |  // Only the Make and Model are used to determine the extender model
 1475|    166|  static constexpr struct {
 1476|    166|    byte val[2];
 1477|    166|    const char* label;
 1478|    166|  } extenderModels[] = {
 1479|    166|      {{0, 0}, N_("None")},
  ------------------
  |  |   41|    166|#define N_(String) String
  ------------------
 1480|    166|      {{0, 4}, "Olympus Zuiko Digital EC-14 1.4x Teleconverter"},
 1481|    166|      {{0, 8}, "Olympus EX-25 Extension Tube"},
 1482|    166|      {{0, 16}, "Olympus Zuiko Digital EC-20 2.0x Teleconverter"},
 1483|    166|  };
 1484|       |
 1485|    166|  if (value.count() != 6 || value.typeId() != unsignedByte) {
  ------------------
  |  Branch (1485:7): [True: 36, False: 130]
  |  Branch (1485:29): [True: 20, False: 110]
  ------------------
 1486|     56|    return os << value;
 1487|     56|  }
 1488|       |
 1489|    110|  auto v0 = static_cast<byte>(value.toInt64(0));
 1490|    110|  auto v2 = static_cast<byte>(value.toInt64(2));
 1491|       |
 1492|    326|  for (const auto& model : extenderModels) {
  ------------------
  |  Branch (1492:26): [True: 326, False: 52]
  ------------------
 1493|    326|    if (model.val[0] == v0 && model.val[1] == v2) {
  ------------------
  |  Branch (1493:9): [True: 198, False: 128]
  |  Branch (1493:31): [True: 58, False: 140]
  ------------------
 1494|     58|      return os << model.label;
 1495|     58|    }
 1496|    326|  }
 1497|     52|  return os << value;
 1498|    110|}  // OlympusMakerNote::printEq0x0301
_ZN5Exiv28Internal16OlympusMakerNote13printCs0x0301ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1502|    448|std::ostream& OlympusMakerNote::printCs0x0301(std::ostream& os, const Value& value, const ExifData*) {
 1503|    448|  using mode = std::pair<uint16_t, const char*>;
 1504|    448|  static constexpr mode focusModes0[] = {
 1505|    448|      {0, N_("Single AF")},     {1, N_("Sequential shooting AF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {0, N_("Single AF")},     {1, N_("Sequential shooting AF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
 1506|    448|      {2, N_("Continuous AF")}, {3, N_("Multi AF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {2, N_("Continuous AF")}, {3, N_("Multi AF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
 1507|    448|      {4, N_("Face detect")},   {10, N_("MF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {4, N_("Face detect")},   {10, N_("MF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
 1508|    448|  };
 1509|       |
 1510|    448|  static constexpr mode focusModes1[] = {
 1511|    448|      {0x0001, N_("S-AF")},        {0x0004, N_("C-AF")},      {0x0010, N_("MF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {0x0001, N_("S-AF")},        {0x0004, N_("C-AF")},      {0x0010, N_("MF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {0x0001, N_("S-AF")},        {0x0004, N_("C-AF")},      {0x0010, N_("MF")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
 1512|    448|      {0x0020, N_("Face detect")}, {0x0040, N_("Imager AF")}, {0x0100, N_("AF sensor")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {0x0020, N_("Face detect")}, {0x0040, N_("Imager AF")}, {0x0100, N_("AF sensor")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
                    {0x0020, N_("Face detect")}, {0x0040, N_("Imager AF")}, {0x0100, N_("AF sensor")},
  ------------------
  |  |   41|    448|#define N_(String) String
  ------------------
 1513|    448|  };
 1514|       |
 1515|    448|  if (value.count() < 1 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (1515:7): [True: 0, False: 448]
  |  Branch (1515:28): [True: 38, False: 410]
  ------------------
 1516|     38|    return os << "(" << value << ")";
 1517|     38|  }
 1518|    410|  auto v = static_cast<uint16_t>(value.toInt64(0));
 1519|       |
 1520|       |  // If value 2 is present, it is used instead of value 1.
 1521|    410|  if (value.count() > 1) {
  ------------------
  |  Branch (1521:7): [True: 268, False: 142]
  ------------------
 1522|    268|    std::string p;  // Used to enable ',' separation
 1523|       |
 1524|    268|    v = static_cast<uint16_t>(value.toInt64(1));
 1525|  1.60k|    for (auto&& [val, label] : focusModes1) {
  ------------------
  |  Branch (1525:30): [True: 1.60k, False: 268]
  ------------------
 1526|  1.60k|      if ((v & val) != 0) {
  ------------------
  |  Branch (1526:11): [True: 710, False: 898]
  ------------------
 1527|    710|        if (!p.empty()) {
  ------------------
  |  Branch (1527:13): [True: 464, False: 246]
  ------------------
 1528|    464|          os << ", ";
 1529|    464|        }
 1530|    710|        p = label;
 1531|    710|        os << p;
 1532|    710|      }
 1533|  1.60k|    }
 1534|    268|  } else {
 1535|    400|    for (auto&& [val, label] : focusModes0) {
  ------------------
  |  Branch (1535:30): [True: 400, False: 26]
  ------------------
 1536|    400|      if (val == v) {
  ------------------
  |  Branch (1536:11): [True: 116, False: 284]
  ------------------
 1537|    116|        os << label;
 1538|    116|        break;
 1539|    116|      }
 1540|    400|    }
 1541|    142|  }
 1542|    410|  return os << v;
 1543|       |
 1544|    448|}  // OlympusMakerNote::printCs0x0301
_ZN5Exiv28Internal16OlympusMakerNote11print0x0529ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1547|  1.29k|std::ostream& OlympusMakerNote::print0x0529(std::ostream& os, const Value& value, const ExifData* metadata) {
 1548|  1.29k|  if (value.count() != 4 || value.typeId() != unsignedShort)
  ------------------
  |  Branch (1548:7): [True: 344, False: 952]
  |  Branch (1548:29): [True: 20, False: 932]
  ------------------
 1549|    364|    return os << "(" << value << ")";
 1550|       |
 1551|    932|  const auto v0 = value.toInt64(0);
 1552|    932|  EXV_PRINT_TAG(artFilters)(os, v0, metadata);
  ------------------
  |  |  199|    932|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1553|       |
 1554|    932|  if (v0 == 39) {  // The "Partial color" option also has a color choice
  ------------------
  |  Branch (1554:7): [True: 10, False: 922]
  ------------------
 1555|     10|    const auto v3 = value.toInt64(3);
 1556|     10|    return os << " (" << _("position") << " " << (v3 + 1) << ")";
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
 1557|     10|  }
 1558|       |
 1559|    922|  return os;
 1560|    932|}  // OlympusMakerNote::print0x0529
_ZN5Exiv28Internal16OlympusMakerNote11print0x1209ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1563|    110|std::ostream& OlympusMakerNote::print0x1209(std::ostream& os, const Value& value, const ExifData*) {
 1564|    110|  if (value.count() != 2 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (1564:7): [True: 44, False: 66]
  |  Branch (1564:29): [True: 18, False: 48]
  ------------------
 1565|     62|    return os << value;
 1566|     62|  }
 1567|       |
 1568|     48|  switch (value.toInt64(0)) {
 1569|      8|    case 0:
  ------------------
  |  Branch (1569:5): [True: 8, False: 40]
  ------------------
 1570|      8|      os << _("Off");
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
 1571|      8|      break;
 1572|      6|    case 1:
  ------------------
  |  Branch (1572:5): [True: 6, False: 42]
  ------------------
 1573|      6|      os << _("On");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1574|      6|      break;
 1575|     34|    default:
  ------------------
  |  Branch (1575:5): [True: 34, False: 14]
  ------------------
 1576|     34|      os << value.toInt64(0);
 1577|     34|      break;
 1578|     48|  }
 1579|     48|  os << " ";
 1580|     48|  os << value.toInt64(1);
 1581|       |
 1582|     48|  return os;
 1583|     48|}  // OlympusMakerNote::print0x1209
_ZN5Exiv28Internal16OlympusMakerNote11print0x0305ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1586|     46|std::ostream& OlympusMakerNote::print0x0305(std::ostream& os, const Value& value, const ExifData*) {
 1587|     46|  if (value.count() != 1 || value.typeId() != unsignedRational) {
  ------------------
  |  Branch (1587:7): [True: 10, False: 36]
  |  Branch (1587:29): [True: 16, False: 20]
  ------------------
 1588|     26|    return os << value;
 1589|     26|  }
 1590|       |
 1591|     20|  auto [r, s] = value.toRational();
 1592|     20|  if (static_cast<uint32_t>(r) == 0xffffffff) {
  ------------------
  |  Branch (1592:7): [True: 4, False: 16]
  ------------------
 1593|      4|    return os << _("Infinity");
  ------------------
  |  |   40|      4|#define _(String) (String)
  ------------------
 1594|      4|  }
 1595|     16|  return os << stringFormat("{:.2f} m", static_cast<float>(r) / 1000);
  ------------------
  |  |   18|     16|#define stringFormat std::format
  ------------------
 1596|     20|}
_ZN5Exiv28Internal16OlympusMakerNote11print0x0308ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1599|  1.37k|std::ostream& OlympusMakerNote::print0x0308(std::ostream& os, const Value& value, const ExifData* metadata) {
 1600|  1.37k|  static constexpr std::pair<uint16_t, const char*> afPoints[] = {
 1601|  1.37k|      {0, N_("Left (or n/a)")}, {1, N_("Center (horizontal)")}, {2, N_("Right")}, {3, N_("Center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
                    {0, N_("Left (or n/a)")}, {1, N_("Center (horizontal)")}, {2, N_("Right")}, {3, N_("Center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
                    {0, N_("Left (or n/a)")}, {1, N_("Center (horizontal)")}, {2, N_("Right")}, {3, N_("Center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
                    {0, N_("Left (or n/a)")}, {1, N_("Center (horizontal)")}, {2, N_("Right")}, {3, N_("Center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1602|  1.37k|      {255, N_("None")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1603|  1.37k|  };
 1604|       |
 1605|  1.37k|  static constexpr std::pair<byte, const char*> afPointsE3[] = {
 1606|  1.37k|      {0x00, N_("None")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1607|  1.37k|      {0x01, N_("Top-left (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1608|  1.37k|      {0x02, N_("Top-center (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1609|  1.37k|      {0x03, N_("Top-right (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1610|  1.37k|      {0x04, N_("Left (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1611|  1.37k|      {0x05, N_("Mid-left (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1612|  1.37k|      {0x06, N_("Center (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1613|  1.37k|      {0x07, N_("Mid-right (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1614|  1.37k|      {0x08, N_("Right (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1615|  1.37k|      {0x09, N_("Bottom-left (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1616|  1.37k|      {0x0a, N_("Bottom-center (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1617|  1.37k|      {0x0b, N_("Bottom-right (horizontal)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1618|  1.37k|      {0x0c, N_("Top-left (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1619|  1.37k|      {0x0d, N_("Top-center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1620|  1.37k|      {0x0e, N_("Top-right (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1621|  1.37k|      {0x0f, N_("Left (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1622|  1.37k|      {0x10, N_("Mid-left (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1623|  1.37k|      {0x11, N_("Center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1624|  1.37k|      {0x12, N_("Mid-right (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1625|  1.37k|      {0x13, N_("Right (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1626|  1.37k|      {0x14, N_("Bottom-left (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1627|  1.37k|      {0x15, N_("Bottom-center (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1628|  1.37k|      {0x16, N_("Bottom-right (vertical)")},
  ------------------
  |  |   41|  1.37k|#define N_(String) String
  ------------------
 1629|  1.37k|  };
 1630|       |
 1631|  1.37k|  if (value.count() != 1 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (1631:7): [True: 18, False: 1.35k]
  |  Branch (1631:29): [True: 48, False: 1.31k]
  ------------------
 1632|     66|    return os << value;
 1633|     66|  }
 1634|       |
 1635|  1.31k|  bool E3_E30model = false;
 1636|       |
 1637|  1.31k|  if (metadata) {
  ------------------
  |  Branch (1637:7): [True: 655, False: 655]
  ------------------
 1638|    655|    auto pos = metadata->findKey(ExifKey("Exif.Image.Model"));
 1639|    655|    if (pos != metadata->end() && pos->count() != 0) {
  ------------------
  |  Branch (1639:9): [True: 618, False: 37]
  |  Branch (1639:9): [True: 584, False: 71]
  |  Branch (1639:35): [True: 584, False: 34]
  ------------------
 1640|    584|      std::string model = pos->toString();
 1641|    584|      if (Internal::contains(model, "E-3 ") || Internal::contains(model, "E-30 ")) {
  ------------------
  |  Branch (1641:11): [True: 63, False: 521]
  |  Branch (1641:48): [True: 429, False: 92]
  ------------------
 1642|    492|        E3_E30model = true;
 1643|    492|      }
 1644|    584|    }
 1645|    655|  }
 1646|       |
 1647|  1.31k|  auto v = static_cast<uint16_t>(value.toInt64(0));
 1648|       |
 1649|  1.31k|  if (!E3_E30model) {
  ------------------
  |  Branch (1649:7): [True: 818, False: 492]
  ------------------
 1650|  3.64k|    for (auto&& [val, label] : afPoints) {
  ------------------
  |  Branch (1650:30): [True: 3.64k, False: 662]
  ------------------
 1651|  3.64k|      if (val == v) {
  ------------------
  |  Branch (1651:11): [True: 156, False: 3.49k]
  ------------------
 1652|    156|        return os << label;
 1653|    156|      }
 1654|  3.64k|    }
 1655|    818|  } else {
 1656|       |    // E-3 and E-30
 1657|  6.11k|    for (auto&& [val, label] : afPointsE3) {
  ------------------
  |  Branch (1657:30): [True: 6.11k, False: 33]
  ------------------
 1658|  6.11k|      if (val == (v & 0x1f)) {
  ------------------
  |  Branch (1658:11): [True: 471, False: 5.64k]
  ------------------
 1659|    471|        os << label;
 1660|    471|        os << ", ";
 1661|    471|        if ((v & 0xe0) == 0)
  ------------------
  |  Branch (1661:13): [True: 190, False: 281]
  ------------------
 1662|    190|          return os << N_("Single Target");
  ------------------
  |  |   41|    190|#define N_(String) String
  ------------------
 1663|    281|        if (v & 0x40)
  ------------------
  |  Branch (1663:13): [True: 254, False: 27]
  ------------------
 1664|    254|          return os << N_("All Target");
  ------------------
  |  |   41|    254|#define N_(String) String
  ------------------
 1665|     27|        if (v & 0x80)
  ------------------
  |  Branch (1665:13): [True: 15, False: 12]
  ------------------
 1666|     15|          return os << N_("Dynamic Single Target");
  ------------------
  |  |   41|     15|#define N_(String) String
  ------------------
 1667|     27|      }
 1668|  6.11k|    }
 1669|    492|  }
 1670|    695|  return os << v;
 1671|  1.31k|}  // OlympusMakerNote::print0x0308

_ZN5Exiv28Internal16OlympusMakerNote7tagListEv:
   33|   220k|  static constexpr auto tagList() {
   34|   220k|    return tagInfo_;
   35|   220k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListCsEv:
   37|  96.5k|  static constexpr auto tagListCs() {
   38|  96.5k|    return tagInfoCs_;
   39|  96.5k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListEqEv:
   41|  11.7k|  static constexpr auto tagListEq() {
   42|  11.7k|    return tagInfoEq_;
   43|  11.7k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListRdEv:
   45|  7.54k|  static constexpr auto tagListRd() {
   46|  7.54k|    return tagInfoRd_;
   47|  7.54k|  }
_ZN5Exiv28Internal16OlympusMakerNote10tagListRd2Ev:
   49|  9.91k|  static constexpr auto tagListRd2() {
   50|  9.91k|    return tagInfoRd2_;
   51|  9.91k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListIpEv:
   53|  6.17k|  static constexpr auto tagListIp() {
   54|  6.17k|    return tagInfoIp_;
   55|  6.17k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListFiEv:
   57|  8.55k|  static constexpr auto tagListFi() {
   58|  8.55k|    return tagInfoFi_;
   59|  8.55k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListFeEv:
   61|  6.30k|  static constexpr auto tagListFe() {
   62|  6.30k|    return tagInfoFe_;
   63|  6.30k|  }
_ZN5Exiv28Internal16OlympusMakerNote9tagListRiEv:
   65|  11.6k|  static constexpr auto tagListRi() {
   66|  11.6k|    return tagInfoRi_;
   67|  11.6k|  }

_ZN5Exiv28OrfImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   25|     62|    TiffImage(/*ImageType::orf, mdExif | mdIptc | mdXmp,*/ std::move(io), params) {
   26|     62|  setTypeSupported(ImageType::orf, mdExif | mdIptc | mdXmp);
   27|     62|}  // OrfImage::OrfImage
_ZNK5Exiv28OrfImage10pixelWidthEv:
   33|     24|uint32_t OrfImage::pixelWidth() const {
   34|     24|  auto imageWidth = exifData_.findKey(Exiv2::ExifKey("Exif.Image.ImageWidth"));
   35|     24|  if (imageWidth != exifData_.end() && imageWidth->count() > 0) {
  ------------------
  |  Branch (35:7): [True: 12, False: 12]
  |  Branch (35:7): [True: 6, False: 18]
  |  Branch (35:40): [True: 6, False: 6]
  ------------------
   36|      6|    return imageWidth->toUint32();
   37|      6|  }
   38|     18|  return 0;
   39|     24|}
_ZNK5Exiv28OrfImage11pixelHeightEv:
   41|     24|uint32_t OrfImage::pixelHeight() const {
   42|     24|  auto imageHeight = exifData_.findKey(Exiv2::ExifKey("Exif.Image.ImageLength"));
   43|     24|  if (imageHeight != exifData_.end() && imageHeight->count() > 0) {
  ------------------
  |  Branch (43:7): [True: 11, False: 13]
  |  Branch (43:7): [True: 5, False: 19]
  |  Branch (43:41): [True: 5, False: 6]
  ------------------
   44|      5|    return imageHeight->toUint32();
   45|      5|  }
   46|     19|  return 0;
   47|     24|}
_ZN5Exiv28OrfImage14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
   54|     54|void OrfImage::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
   55|     54|  out << "ORF IMAGE" << '\n';
   56|     54|  if (io_->open() != 0)
  ------------------
  |  Branch (56:7): [True: 0, False: 54]
  ------------------
   57|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   58|       |  // Ensure that this is the correct image type
   59|     54|  if (imageType() == ImageType::none && !isOrfType(*io_, false)) {
  ------------------
  |  Branch (59:7): [True: 0, False: 54]
  |  Branch (59:41): [True: 0, False: 0]
  ------------------
   60|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (60:9): [True: 0, False: 0]
  |  Branch (60:25): [True: 0, False: 0]
  ------------------
   61|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   62|      0|    throw Error(ErrorCode::kerNotAJpeg);
   63|      0|  }
   64|       |
   65|     54|  io_->seek(0, BasicIo::beg);
   66|       |
   67|     54|  printTiffStructure(io(), out, option, depth);
   68|     54|}  // OrfImage::printStructure
_ZN5Exiv28OrfImage12readMetadataEv:
   70|     62|void OrfImage::readMetadata() {
   71|       |#ifdef EXIV2_DEBUG_MESSAGES
   72|       |  std::cerr << "Reading ORF file " << io_->path() << "\n";
   73|       |#endif
   74|     62|  if (io_->open() != 0) {
  ------------------
  |  Branch (74:7): [True: 0, False: 62]
  ------------------
   75|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   76|      0|  }
   77|     62|  IoCloser closer(*io_);
   78|       |  // Ensure that this is the correct image type
   79|     62|  if (!isOrfType(*io_, false)) {
  ------------------
  |  Branch (79:7): [True: 0, False: 62]
  ------------------
   80|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (80:9): [True: 0, False: 0]
  |  Branch (80:25): [True: 0, False: 0]
  ------------------
   81|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   82|      0|    throw Error(ErrorCode::kerNotAnImage, "ORF");
   83|      0|  }
   84|     62|  clearMetadata();
   85|     62|  const DecodeParams dp(max_recursion_depth_);
   86|     62|  ByteOrder bo = OrfParser::decode(exifData_, iptcData_, xmpData_, io_->mmap(), io_->size(), dp);
   87|     62|  setByteOrder(bo);
   88|     62|}
_ZN5Exiv29OrfParser6decodeERNS_8ExifDataERNS_8IptcDataERNS_7XmpDataEPKhmRKNS_12DecodeParamsE:
  115|     62|                            const DecodeParams& dp) {
  116|     62|  OrfHeader orfHeader;
  117|     62|  return TiffParserWorker::decode(exifData, iptcData, xmpData, pData, size, Tag::root, TiffMapping::findDecoder, dp,
  118|     62|                                  &orfHeader);
  119|     62|}
_ZN5Exiv214newOrfInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  141|     62|Image::UniquePtr newOrfInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  142|     62|  auto image = std::make_unique<OrfImage>(std::move(io), params);
  143|     62|  if (!image->good()) {
  ------------------
  |  Branch (143:7): [True: 0, False: 62]
  ------------------
  144|      0|    return nullptr;
  145|      0|  }
  146|     62|  return image;
  147|     62|}
_ZN5Exiv29isOrfTypeERNS_7BasicIoEb:
  149|  13.8k|bool isOrfType(BasicIo& iIo, bool advance) {
  150|  13.8k|  const int32_t len = 8;
  151|  13.8k|  byte buf[len];
  152|  13.8k|  iIo.read(buf, len);
  153|  13.8k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (153:7): [True: 0, False: 13.8k]
  |  Branch (153:22): [True: 132, False: 13.7k]
  ------------------
  154|    132|    return false;
  155|    132|  }
  156|  13.7k|  OrfHeader orfHeader;
  157|  13.7k|  bool rc = orfHeader.read(buf, len);
  158|  13.7k|  if (!advance || !rc) {
  ------------------
  |  Branch (158:7): [True: 13.7k, False: 0]
  |  Branch (158:19): [True: 0, False: 0]
  ------------------
  159|  13.7k|    iIo.seek(-len, BasicIo::cur);
  160|  13.7k|  }
  161|  13.7k|  return rc;
  162|  13.8k|}

_ZN5Exiv28Internal9OrfHeaderC2ENS_9ByteOrderE:
    6|  13.7k|OrfHeader::OrfHeader(ByteOrder byteOrder) : TiffHeaderBase(0x4f52, 8, byteOrder, 0x00000008) {
    7|  13.7k|}
_ZN5Exiv28Internal9OrfHeader4readEPKhm:
    9|  13.7k|bool OrfHeader::read(const byte* pData, size_t size) {
   10|  13.7k|  if (size < 8)
  ------------------
  |  Branch (10:7): [True: 0, False: 13.7k]
  ------------------
   11|      0|    return false;
   12|       |
   13|  13.7k|  if (pData[0] == 'I' && pData[0] == pData[1]) {
  ------------------
  |  Branch (13:7): [True: 259, False: 13.5k]
  |  Branch (13:26): [True: 244, False: 15]
  ------------------
   14|    244|    setByteOrder(littleEndian);
   15|  13.5k|  } else if (pData[0] == 'M' && pData[0] == pData[1]) {
  ------------------
  |  Branch (15:14): [True: 43, False: 13.4k]
  |  Branch (15:33): [True: 31, False: 12]
  ------------------
   16|     31|    setByteOrder(bigEndian);
   17|  13.4k|  } else {
   18|  13.4k|    return false;
   19|  13.4k|  }
   20|       |
   21|    275|  uint16_t sig = getUShort(pData + 2, byteOrder());
   22|    275|  if (tag() != sig && 0x5352 != sig)
  ------------------
  |  Branch (22:7): [True: 259, False: 16]
  |  Branch (22:23): [True: 27, False: 232]
  ------------------
   23|     27|    return false;  // #658: Added 0x5352 "SR" for SP-560UZ
   24|    248|  sig_ = sig;
   25|    248|  setOffset(getULong(pData + 4, byteOrder()));
   26|    248|  return true;
   27|    275|}

_ZN5Exiv28Internal18PanasonicMakerNote11print0x000fERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  559|  1.54k|std::ostream& PanasonicMakerNote::print0x000f(std::ostream& os, const Value& value, const ExifData*) {
  560|  1.54k|  if (value.count() < 2 || value.typeId() != unsignedByte) {
  ------------------
  |  Branch (560:7): [True: 542, False: 1.00k]
  |  Branch (560:28): [True: 86, False: 916]
  ------------------
  561|    628|    return os << value;
  562|    628|  }
  563|    916|  const auto l0 = value.toInt64(0);
  564|    916|  const auto l1 = value.toInt64(1);
  565|    916|  if (l0 == 0 && l1 == 1)
  ------------------
  |  Branch (565:7): [True: 216, False: 700]
  |  Branch (565:18): [True: 64, False: 152]
  ------------------
  566|     64|    os << _("Spot mode on or 9 area");
  ------------------
  |  |   40|     64|#define _(String) (String)
  ------------------
  567|    852|  else if (l0 == 0 && l1 == 16)
  ------------------
  |  Branch (567:12): [True: 152, False: 700]
  |  Branch (567:23): [True: 42, False: 110]
  ------------------
  568|     42|    os << _("Spot mode off or 3-area (high speed)");
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  569|    810|  else if (l0 == 0 && l1 == 23)
  ------------------
  |  Branch (569:12): [True: 110, False: 700]
  |  Branch (569:23): [True: 22, False: 88]
  ------------------
  570|     22|    os << _("23-area");
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  571|    788|  else if (l0 == 0 && l1 == 49)
  ------------------
  |  Branch (571:12): [True: 88, False: 700]
  |  Branch (571:23): [True: 32, False: 56]
  ------------------
  572|     32|    os << _("49-area");
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  573|    756|  else if (l0 == 0 && l1 == 225)
  ------------------
  |  Branch (573:12): [True: 56, False: 700]
  |  Branch (573:23): [True: 18, False: 38]
  ------------------
  574|     18|    os << _("225-area");
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  575|    738|  else if (l0 == 1 && l1 == 0)
  ------------------
  |  Branch (575:12): [True: 94, False: 644]
  |  Branch (575:23): [True: 36, False: 58]
  ------------------
  576|     36|    os << _("Spot focusing");
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  577|    702|  else if (l0 == 1 && l1 == 1)
  ------------------
  |  Branch (577:12): [True: 58, False: 644]
  |  Branch (577:23): [True: 16, False: 42]
  ------------------
  578|     16|    os << _("5-area");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
  579|    686|  else if (l0 == 16 && l1 == 0)
  ------------------
  |  Branch (579:12): [True: 134, False: 552]
  |  Branch (579:24): [True: 64, False: 70]
  ------------------
  580|     64|    os << _("1-area");
  ------------------
  |  |   40|     64|#define _(String) (String)
  ------------------
  581|    622|  else if (l0 == 16 && l1 == 16)
  ------------------
  |  Branch (581:12): [True: 70, False: 552]
  |  Branch (581:24): [True: 66, False: 4]
  ------------------
  582|     66|    os << _("1-area (high speed)");
  ------------------
  |  |   40|     66|#define _(String) (String)
  ------------------
  583|    556|  else if (l0 == 32 && l1 == 0)
  ------------------
  |  Branch (583:12): [True: 220, False: 336]
  |  Branch (583:24): [True: 34, False: 186]
  ------------------
  584|     34|    os << _("3-area (auto)");
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
  585|    522|  else if (l0 == 32 && l1 == 1)
  ------------------
  |  Branch (585:12): [True: 186, False: 336]
  |  Branch (585:24): [True: 26, False: 160]
  ------------------
  586|     26|    os << _("3-area (left)");
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  587|    496|  else if (l0 == 32 && l1 == 2)
  ------------------
  |  Branch (587:12): [True: 160, False: 336]
  |  Branch (587:24): [True: 78, False: 82]
  ------------------
  588|     78|    os << _("3-area (center)");
  ------------------
  |  |   40|     78|#define _(String) (String)
  ------------------
  589|    418|  else if (l0 == 32 && l1 == 3)
  ------------------
  |  Branch (589:12): [True: 82, False: 336]
  |  Branch (589:24): [True: 16, False: 66]
  ------------------
  590|     16|    os << _("3-area (right)");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
  591|    402|  else if (l0 == 64 && l1 == 0)
  ------------------
  |  Branch (591:12): [True: 88, False: 314]
  |  Branch (591:24): [True: 74, False: 14]
  ------------------
  592|     74|    os << _("Face Detect");
  ------------------
  |  |   40|     74|#define _(String) (String)
  ------------------
  593|    328|  else if (l0 == 128 && l1 == 0)
  ------------------
  |  Branch (593:12): [True: 78, False: 250]
  |  Branch (593:25): [True: 50, False: 28]
  ------------------
  594|     50|    os << _("Spot Focusing 2");
  ------------------
  |  |   40|     50|#define _(String) (String)
  ------------------
  595|    278|  else if (l0 == 240 && l1 == 0)
  ------------------
  |  Branch (595:12): [True: 28, False: 250]
  |  Branch (595:25): [True: 14, False: 14]
  ------------------
  596|     14|    os << _("Tracking");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  597|    264|  else
  598|    264|    os << value;
  599|    916|  return os;
  600|  1.54k|}  // PanasonicMakerNote::print0x000f
_ZN5Exiv28Internal18PanasonicMakerNote11print0x0023ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  603|    132|std::ostream& PanasonicMakerNote::print0x0023(std::ostream& os, const Value& value, const ExifData*) {
  604|    132|  return os << stringFormat("{:1}{}", value.toInt64() / 3, _(" EV"));
  ------------------
  |  |   18|    132|#define stringFormat std::format
  ------------------
                return os << stringFormat("{:1}{}", value.toInt64() / 3, _(" EV"));
  ------------------
  |  |   40|    132|#define _(String) (String)
  ------------------
  605|    132|}  // PanasonicMakerNote::print0x0023
_ZN5Exiv28Internal18PanasonicMakerNote11print0x0029ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  608|    266|std::ostream& PanasonicMakerNote::print0x0029(std::ostream& os, const Value& value, const ExifData*) {
  609|    266|  auto time = value.toInt64();
  610|    266|  return os << stringFormat("{:02}:{:02}:{:02}.{:02}", time / 360000, (time % 360000) / 6000, (time % 6000) / 100,
  ------------------
  |  |   18|    266|#define stringFormat std::format
  ------------------
  611|    266|                            time % 100);
  612|       |
  613|    266|}  // PanasonicMakerNote::print0x0029
_ZN5Exiv28Internal18PanasonicMakerNote11print0x0033ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  616|    316|std::ostream& PanasonicMakerNote::print0x0033(std::ostream& os, const Value& value, const ExifData*) {
  617|    316|  if (value.toString() == "9999:99:99 00:00:00") {
  ------------------
  |  Branch (617:7): [True: 0, False: 316]
  ------------------
  618|      0|    os << N_("not set");
  ------------------
  |  |   41|      0|#define N_(String) String
  ------------------
  619|    316|  } else {
  620|    316|    os << value;
  621|    316|  }
  622|    316|  return os;
  623|    316|}  // PanasonicMakerNote::print0x0033
_ZN5Exiv28Internal18PanasonicMakerNote11print0x0036ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  626|     52|std::ostream& PanasonicMakerNote::print0x0036(std::ostream& os, const Value& value, const ExifData*) {
  627|     52|  if (value.toInt64() == 65535)
  ------------------
  |  Branch (627:7): [True: 16, False: 36]
  ------------------
  628|     16|    os << N_("not set");
  ------------------
  |  |   41|     16|#define N_(String) String
  ------------------
  629|     36|  else
  630|     36|    os << value;
  631|     52|  return os;
  632|     52|}  // PanasonicMakerNote::print0x0036
_ZN5Exiv28Internal18PanasonicMakerNote11print0x003cERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  635|     94|std::ostream& PanasonicMakerNote::print0x003c(std::ostream& os, const Value& value, const ExifData*) {
  636|     94|  switch (value.toInt64()) {
  637|     30|    case 65534:
  ------------------
  |  Branch (637:5): [True: 30, False: 64]
  ------------------
  638|     30|      os << N_("Intelligent ISO");
  ------------------
  |  |   41|     30|#define N_(String) String
  ------------------
  639|     30|      break;
  640|     18|    case 65535:
  ------------------
  |  Branch (640:5): [True: 18, False: 76]
  ------------------
  641|     18|      os << N_("n/a");
  ------------------
  |  |   41|     18|#define N_(String) String
  ------------------
  642|     18|      break;
  643|     46|    default:
  ------------------
  |  Branch (643:5): [True: 46, False: 48]
  ------------------
  644|     46|      os << value;
  645|     46|      break;
  646|     94|  }
  647|     94|  return os;
  648|     94|}  // PanasonicMakerNote::print0x003c
_ZN5Exiv28Internal18PanasonicMakerNote18printPanasonicTextERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  650|    222|std::ostream& PanasonicMakerNote::printPanasonicText(std::ostream& os, const Value& value, const ExifData*) {
  651|    222|  if (value.size() > 0 && value.typeId() == undefined) {
  ------------------
  |  Branch (651:7): [True: 222, False: 0]
  |  Branch (651:27): [True: 56, False: 166]
  ------------------
  652|    654|    for (size_t i = 0; i < value.size(); i++) {
  ------------------
  |  Branch (652:24): [True: 642, False: 12]
  ------------------
  653|    642|      if (value.toInt64(i) == 0) {
  ------------------
  |  Branch (653:11): [True: 44, False: 598]
  ------------------
  654|     44|        break;
  655|     44|      }
  656|    598|      os << static_cast<char>(value.toInt64(i));
  657|    598|    }
  658|     56|    return os;
  659|     56|  }
  660|       |
  661|    166|  return os << value;
  662|    222|}  // PanasonicMakerNote::printPanasonicText
_ZN5Exiv28Internal18PanasonicMakerNote13printPressureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  665|    128|std::ostream& PanasonicMakerNote::printPressure(std::ostream& os, const Value& value, const ExifData*) {
  666|    128|  if (value.toInt64() == 65535)
  ------------------
  |  Branch (666:7): [True: 74, False: 54]
  ------------------
  667|     74|    os << N_("infinite");
  ------------------
  |  |   41|     74|#define N_(String) String
  ------------------
  668|     54|  else
  669|     54|    os << value << N_(" hPa");
  ------------------
  |  |   41|     54|#define N_(String) String
  ------------------
  670|    128|  return os;
  671|    128|}  // PanasonicMakerNote::printPressure
_ZN5Exiv28Internal18PanasonicMakerNote18printAccelerometerERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  673|     68|std::ostream& PanasonicMakerNote::printAccelerometer(std::ostream& os, const Value& value, const ExifData*) {
  674|       |  // value is stored as unsigned int, but should be read as int16_t.
  675|     68|  const auto i = static_cast<int16_t>(value.toInt64());
  676|     68|  return os << i;
  677|     68|}  // PanasonicMakerNote::printAccelerometer
_ZN5Exiv28Internal18PanasonicMakerNote14printRollAngleERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  679|     62|std::ostream& PanasonicMakerNote::printRollAngle(std::ostream& os, const Value& value, const ExifData*) {
  680|       |  // value is stored as unsigned int, but should be read as int16_t.
  681|     62|  const auto i = static_cast<int16_t>(value.toInt64());
  682|     62|  return os << stringFormat("{:.1f}", i / 10.0);
  ------------------
  |  |   18|     62|#define stringFormat std::format
  ------------------
  683|     62|}  // PanasonicMakerNote::printRollAngle
_ZN5Exiv28Internal18PanasonicMakerNote15printPitchAngleERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  685|     20|std::ostream& PanasonicMakerNote::printPitchAngle(std::ostream& os, const Value& value, const ExifData*) {
  686|       |  // value is stored as unsigned int, but should be read as int16_t.
  687|     20|  const auto i = static_cast<int16_t>(value.toInt64());
  688|     20|  return os << stringFormat("{:.1f}", -i / 10.0);
  ------------------
  |  |   18|     20|#define stringFormat std::format
  ------------------
  689|     20|}  // PanasonicMakerNote::printPitchAngle

_ZN5Exiv28Internal18PanasonicMakerNote10tagListRawEv:
   29|  68.0k|  static constexpr auto tagListRaw() {
   30|  68.0k|    return tagInfoRaw_;
   31|  68.0k|  }
_ZN5Exiv28Internal18PanasonicMakerNote7tagListEv:
   25|  91.4k|  static constexpr auto tagList() {
   26|  91.4k|    return tagInfo_;
   27|  91.4k|  }

_ZN5Exiv28Internal15PentaxMakerNote12printVersionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  953|  4.46k|std::ostream& PentaxMakerNote::printVersion(std::ostream& os, const Value& value, const ExifData*) {
  954|  4.46k|  std::string val = value.toString();
  955|  4.46k|  std::replace(val.begin(), val.end(), ' ', '.');
  956|  4.46k|  os << val;
  957|  4.46k|  return os;
  958|  4.46k|}
_ZN5Exiv28Internal15PentaxMakerNote15printResolutionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  960|  1.26k|std::ostream& PentaxMakerNote::printResolution(std::ostream& os, const Value& value, const ExifData*) {
  961|  1.26k|  std::string val = value.toString();
  962|  1.26k|  std::replace(val.begin(), val.end(), ' ', 'x');
  963|  1.26k|  os << val;
  964|  1.26k|  return os;
  965|  1.26k|}
_ZN5Exiv28Internal15PentaxMakerNote9printDateERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  967|    366|std::ostream& PentaxMakerNote::printDate(std::ostream& os, const Value& value, const ExifData*) {
  968|       |  /* I choose same format as is used inside EXIF itself */
  969|    366|  return os << stringFormat("{}:{:02}:{:02}", ((static_cast<uint16_t>(value.toInt64(0)) << 8) + value.toInt64(1)),
  ------------------
  |  |   18|    366|#define stringFormat std::format
  ------------------
  970|    366|                            value.toInt64(2), value.toInt64(3));
  971|    366|}
_ZN5Exiv28Internal15PentaxMakerNote9printTimeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  973|    404|std::ostream& PentaxMakerNote::printTime(std::ostream& os, const Value& value, const ExifData*) {
  974|    404|  return os << stringFormat("{:02}:{:02}:{:02}", value.toInt64(0), value.toInt64(1), value.toInt64(2));
  ------------------
  |  |   18|    404|#define stringFormat std::format
  ------------------
  975|    404|}
_ZN5Exiv28Internal15PentaxMakerNote13printExposureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  977|     48|std::ostream& PentaxMakerNote::printExposure(std::ostream& os, const Value& value, const ExifData*) {
  978|     48|  return os << stringFormat("{:g} ms", static_cast<float>(value.toInt64()) / 100);
  ------------------
  |  |   18|     48|#define stringFormat std::format
  ------------------
  979|     48|}
_ZN5Exiv28Internal15PentaxMakerNote11printFValueERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  981|     36|std::ostream& PentaxMakerNote::printFValue(std::ostream& os, const Value& value, const ExifData*) {
  982|     36|  return os << stringFormat("F{:.2g}", static_cast<float>(value.toInt64()) / 10);
  ------------------
  |  |   18|     36|#define stringFormat std::format
  ------------------
  983|     36|}
_ZN5Exiv28Internal15PentaxMakerNote16printFocalLengthERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  985|     46|std::ostream& PentaxMakerNote::printFocalLength(std::ostream& os, const Value& value, const ExifData*) {
  986|     46|  return os << stringFormat("{:.1f} mm", static_cast<float>(value.toInt64()) / 100);
  ------------------
  |  |   18|     46|#define stringFormat std::format
  ------------------
  987|     46|}
_ZN5Exiv28Internal15PentaxMakerNote17printCompensationERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  989|    150|std::ostream& PentaxMakerNote::printCompensation(std::ostream& os, const Value& value, const ExifData*) {
  990|    150|  return os << stringFormat("{:.2g} EV", (static_cast<float>(value.toInt64()) - 50) / 10);
  ------------------
  |  |   18|    150|#define stringFormat std::format
  ------------------
  991|    150|}
_ZN5Exiv28Internal15PentaxMakerNote16printTemperatureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  993|     76|std::ostream& PentaxMakerNote::printTemperature(std::ostream& os, const Value& value, const ExifData*) {
  994|     76|  return os << stringFormat("{} C", value.toInt64());
  ------------------
  |  |   18|     76|#define stringFormat std::format
  ------------------
  995|     76|}
_ZN5Exiv28Internal15PentaxMakerNote22printFlashCompensationERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  997|    102|std::ostream& PentaxMakerNote::printFlashCompensation(std::ostream& os, const Value& value, const ExifData*) {
  998|    102|  return os << stringFormat("{:.2g} EV", static_cast<float>(value.toInt64()) / 256);
  ------------------
  |  |   18|    102|#define stringFormat std::format
  ------------------
  999|    102|}
_ZN5Exiv28Internal15PentaxMakerNote15printBracketingERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1001|    434|std::ostream& PentaxMakerNote::printBracketing(std::ostream& os, const Value& value, const ExifData*) {
 1002|    434|  std::ios::fmtflags f(os.flags());
 1003|    434|  if (auto l0 = value.toUint32(0); l0 < 10) {
  ------------------
  |  Branch (1003:36): [True: 252, False: 182]
  ------------------
 1004|    252|    os << std::setprecision(2) << static_cast<float>(l0) / 3 << " EV";
 1005|    252|  } else {
 1006|    182|    os << std::setprecision(2) << static_cast<float>(l0) - 9.5F << " EV";
 1007|    182|  }
 1008|       |
 1009|    434|  if (value.count() == 2) {
  ------------------
  |  Branch (1009:7): [True: 376, False: 58]
  ------------------
 1010|    376|    const auto l1 = value.toUint32(1);
 1011|    376|    os << " (";
 1012|    376|    if (l1 == 0) {
  ------------------
  |  Branch (1012:9): [True: 64, False: 312]
  ------------------
 1013|     64|      os << _("No extended bracketing");
  ------------------
  |  |   40|     64|#define _(String) (String)
  ------------------
 1014|    312|    } else {
 1015|    312|      auto type = l1 >> 8;
 1016|    312|      auto range = static_cast<byte>(l1);
 1017|    312|      switch (type) {
 1018|     16|        case 1:
  ------------------
  |  Branch (1018:9): [True: 16, False: 296]
  ------------------
 1019|     16|          os << _("WB-BA");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
 1020|     16|          break;
 1021|     62|        case 2:
  ------------------
  |  Branch (1021:9): [True: 62, False: 250]
  ------------------
 1022|     62|          os << _("WB-GM");
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
 1023|     62|          break;
 1024|     78|        case 3:
  ------------------
  |  Branch (1024:9): [True: 78, False: 234]
  ------------------
 1025|     78|          os << _("Saturation");
  ------------------
  |  |   40|     78|#define _(String) (String)
  ------------------
 1026|     78|          break;
 1027|     16|        case 4:
  ------------------
  |  Branch (1027:9): [True: 16, False: 296]
  ------------------
 1028|     16|          os << _("Sharpness");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
 1029|     16|          break;
 1030|     18|        case 5:
  ------------------
  |  Branch (1030:9): [True: 18, False: 294]
  ------------------
 1031|     18|          os << _("Contrast");
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
 1032|     18|          break;
 1033|    122|        default:
  ------------------
  |  Branch (1033:9): [True: 122, False: 190]
  ------------------
 1034|    122|          os << _("Unknown ") << type;
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
 1035|    122|          break;
 1036|    312|      }
 1037|    312|      os << " " << +range;
 1038|    312|    }
 1039|    376|    os << ")";
 1040|    376|  }
 1041|    434|  os.flags(f);
 1042|    434|  return os;
 1043|    434|}
_ZN5Exiv28Internal15PentaxMakerNote17printShutterCountERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1045|    498|std::ostream& PentaxMakerNote::printShutterCount(std::ostream& os, const Value& value, const ExifData* metadata) {
 1046|    498|  if (!metadata)
  ------------------
  |  Branch (1046:7): [True: 249, False: 249]
  ------------------
 1047|    249|    return os << "undefined";
 1048|       |
 1049|    249|  auto dateIt = metadata->findKey(ExifKey("Exif.PentaxDng.Date"));
 1050|    249|  if (dateIt == metadata->end()) {
  ------------------
  |  Branch (1050:7): [True: 51, False: 198]
  ------------------
 1051|     51|    dateIt = metadata->findKey(ExifKey("Exif.Pentax.Date"));
 1052|     51|  }
 1053|       |
 1054|    249|  auto timeIt = metadata->findKey(ExifKey("Exif.PentaxDng.Time"));
 1055|    249|  if (timeIt == metadata->end()) {
  ------------------
  |  Branch (1055:7): [True: 140, False: 109]
  ------------------
 1056|    140|    timeIt = metadata->findKey(ExifKey("Exif.Pentax.Time"));
 1057|    140|  }
 1058|       |
 1059|    249|  if (dateIt == metadata->end() || dateIt->size() != 4 || timeIt == metadata->end() || timeIt->size() != 3 ||
  ------------------
  |  Branch (1059:7): [True: 51, False: 198]
  |  Branch (1059:7): [True: 206, False: 43]
  |  Branch (1059:36): [True: 69, False: 129]
  |  Branch (1059:59): [True: 36, False: 93]
  |  Branch (1059:88): [True: 15, False: 78]
  ------------------
 1060|    206|      value.size() != 4) {
  ------------------
  |  Branch (1060:7): [True: 35, False: 43]
  ------------------
 1061|    206|    os << "undefined";
 1062|    206|    return os;
 1063|    206|  }
 1064|     43|  const uint32_t date = (dateIt->toUint32(0) << 24) + (dateIt->toUint32(1) << 16) + (dateIt->toUint32(2) << 8) +
 1065|     43|                        (dateIt->toUint32(3) << 0);
 1066|     43|  const uint32_t time = (timeIt->toUint32(0) << 24) + (timeIt->toUint32(1) << 16) + (timeIt->toUint32(2) << 8);
 1067|     43|  const uint32_t countEnc =
 1068|     43|      (value.toUint32(0) << 24) + (value.toUint32(1) << 16) + (value.toUint32(2) << 8) + (value.toUint32(3) << 0);
 1069|       |  // The shutter count is encoded using date and time values stored
 1070|       |  // in Pentax-specific tags.  The prototype for the encoding/decoding
 1071|       |  // function is taken from Phil Harvey's ExifTool: Pentax.pm file,
 1072|       |  // CryptShutterCount() routine.
 1073|     43|  const uint32_t count = countEnc ^ date ^ (~time);
 1074|     43|  os << count;
 1075|     43|  return os;
 1076|    249|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL13printLensTypeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1259|  2.37k|static std::ostream& printLensType(std::ostream& os, const Value& value, const ExifData* metadata) {
 1260|       |  //! List of lens ids which require special treatment using resolveLensType
 1261|  2.37k|  static constexpr struct LensIdFct {
 1262|  2.37k|    uint32_t id_;   //!< Lens id
 1263|  2.37k|    PrintFct fct_;  //!< Pretty-print function
 1264|       |    //! Comparison operator for find template
 1265|  2.37k|    bool operator==(uint32_t id) const {
 1266|  2.37k|      return id_ == id;
 1267|  2.37k|    }
 1268|  2.37k|  } lensIdFct[] = {
 1269|  2.37k|      {0x0317, resolveLensType}, {0x0319, resolveLens0x319}, {0x031b, resolveLensType},  {0x031c, resolveLensType},
 1270|  2.37k|      {0x031d, resolveLensType}, {0x031f, resolveLensType},  {0x0329, resolveLensType},  {0x032c, resolveLens0x32c},
 1271|  2.37k|      {0x032e, resolveLensType}, {0x0334, resolveLensType},  {0x03ff, resolveLens0x3ff}, {0x041a, resolveLensType},
 1272|  2.37k|      {0x042d, resolveLensType}, {0x08ff, resolveLens0x8ff},
 1273|  2.37k|  };
 1274|       |  // #1034
 1275|  2.37k|  const std::string undefined("undefined");
 1276|  2.37k|  const std::string section("pentax");
 1277|  2.37k|  if (Internal::readExiv2Config(section, value.toString(), undefined) != undefined) {
  ------------------
  |  Branch (1277:7): [True: 0, False: 2.37k]
  ------------------
 1278|      0|    return os << Internal::readExiv2Config(section, value.toString(), undefined);
 1279|      0|  }
 1280|       |
 1281|  2.37k|  const auto index = (value.toUint32(0) * 256) + value.toUint32(1);
 1282|       |
 1283|       |  // std::cout << '\n' << "printLensType value =" << value.toLong() << " index = " << index << '\n';
 1284|  2.37k|  auto lif = Exiv2::find(lensIdFct, index);
 1285|  2.37k|  if (!lif)
  ------------------
  |  Branch (1285:7): [True: 798, False: 1.57k]
  ------------------
 1286|    798|    return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|    798|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1287|  1.57k|  if (metadata && lif->fct_)
  ------------------
  |  Branch (1287:7): [True: 663, False: 915]
  |  Branch (1287:19): [True: 663, False: 0]
  ------------------
 1288|    663|    return lif->fct_(os, value, metadata);
 1289|    915|  if (value.typeId() != unsignedShort || value.count() == 0)
  ------------------
  |  Branch (1289:7): [True: 849, False: 66]
  |  Branch (1289:42): [True: 0, False: 66]
  ------------------
 1290|    597|    return os << "(" << value << ")";
 1291|    318|  return os << value;
 1292|    915|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL15resolveLensTypeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1254|    106|static std::ostream& resolveLensType(std::ostream& os, const Value& value, const ExifData* metadata) {
 1255|    106|  return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|    106|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1256|    106|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL16resolveLens0x319ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1224|     77|{
 1225|     77|  try {
 1226|     77|    unsigned long index = 0;
 1227|       |
 1228|     77|    const auto lensInfo = findLensInfo(metadata);
 1229|     77|    if (value.count() == 4) {
  ------------------
  |  Branch (1229:9): [True: 24, False: 53]
  ------------------
 1230|     24|      std::string model = getKeyString("Exif.Image.Model", metadata);
 1231|     24|      if (model.starts_with("PENTAX K-3") && lensInfo->count() == 128 && lensInfo->toUint32(1) == 131 &&
  ------------------
  |  Branch (1231:11): [True: 0, False: 24]
  |  Branch (1231:46): [True: 0, False: 0]
  |  Branch (1231:74): [True: 0, False: 0]
  ------------------
 1232|      0|          lensInfo->toUint32(2) == 128)
  ------------------
  |  Branch (1232:11): [True: 0, False: 0]
  ------------------
 1233|      0|        index = 6;
 1234|     24|    }
 1235|     77|    if (value.count() == 2) {
  ------------------
  |  Branch (1235:9): [True: 32, False: 45]
  ------------------
 1236|     32|      std::string model = getKeyString("Exif.Image.Model", metadata);
 1237|     32|      if (model.starts_with("PENTAX K100D") && lensInfo->count() == 44)
  ------------------
  |  Branch (1237:11): [True: 10, False: 22]
  |  Branch (1237:48): [True: 0, False: 10]
  ------------------
 1238|      0|        index = 6;
 1239|     32|      if (model.starts_with("PENTAX *ist DL") && lensInfo->count() == 36)
  ------------------
  |  Branch (1239:11): [True: 5, False: 27]
  |  Branch (1239:50): [True: 0, False: 5]
  ------------------
 1240|      0|        index = 6;
 1241|     32|    }
 1242|       |
 1243|     77|    if (index > 0) {
  ------------------
  |  Branch (1243:9): [True: 0, False: 77]
  ------------------
 1244|      0|      const unsigned long lensID = 0x319;
 1245|      0|      auto td = Exiv2::find(pentaxLensType, lensID);
 1246|      0|      return os << _(td[index].label_);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
 1247|      0|    }
 1248|     77|  } catch (...) {
 1249|     20|  }
 1250|     77|  return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|     77|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1251|     77|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL12findLensInfoEPKNS_8ExifDataE:
 1096|    539|static ExifData::const_iterator findLensInfo(const ExifData* metadata) {
 1097|    539|  const auto dngLensInfo = metadata->findKey(ExifKey("Exif.PentaxDng.LensInfo"));
 1098|    539|  if (dngLensInfo != metadata->end()) {
  ------------------
  |  Branch (1098:7): [True: 455, False: 84]
  ------------------
 1099|    455|    return dngLensInfo;
 1100|    455|  }
 1101|     84|  const auto lensInfo = metadata->findKey(ExifKey("Exif.Pentax.LensInfo"));
 1102|     84|  if (lensInfo != metadata->end()) {
  ------------------
  |  Branch (1102:7): [True: 25, False: 59]
  ------------------
 1103|     25|    return lensInfo;
 1104|     25|  }
 1105|     59|  throw LensInfoNotFound();
 1106|     84|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL12getKeyStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKNS_8ExifDataE:
 1079|    150|static std::string getKeyString(const std::string& key, const ExifData* metadata) {
 1080|    150|  std::string result;
 1081|    150|  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
  ------------------
  |  Branch (1081:7): [True: 111, False: 39]
  ------------------
 1082|    111|    result = metadata->findKey(ExifKey(key))->toString();
 1083|    111|  }
 1084|    150|  return result;
 1085|    150|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL16resolveLens0x32cERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1109|     18|static std::ostream& resolveLens0x32c(std::ostream& os, const Value& value, const ExifData* metadata) {
 1110|     18|  try {
 1111|     18|    unsigned long index = 0;
 1112|       |
 1113|     18|    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
 1114|     18|    bool bFL10_20 = 10 <= focalLength && focalLength <= 20;
  ------------------
  |  Branch (1114:21): [True: 0, False: 18]
  |  Branch (1114:42): [True: 0, False: 0]
  ------------------
 1115|       |
 1116|       |    // std::cout << "model,focalLength = " << model << "," << focalLength << '\n';
 1117|     18|    if (bFL10_20) {
  ------------------
  |  Branch (1117:9): [True: 0, False: 18]
  ------------------
 1118|      0|      index = 1;
 1119|      0|    }
 1120|       |
 1121|     18|    if (index > 0) {
  ------------------
  |  Branch (1121:9): [True: 0, False: 18]
  ------------------
 1122|      0|      const unsigned long lensID = 0x32c;
 1123|      0|      auto td = Exiv2::find(pentaxLensType, lensID);
 1124|      0|      return os << _(td[index].label_);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
 1125|      0|    }
 1126|     18|  } catch (...) {
 1127|      0|  }
 1128|     18|  return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|     18|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1129|     18|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL10getKeyLongERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKNS_8ExifDataE:
 1087|     18|static long getKeyLong(const std::string& key, const ExifData* metadata) {
 1088|     18|  long result = -1;
 1089|     18|  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
  ------------------
  |  Branch (1089:7): [True: 0, False: 18]
  ------------------
 1090|      0|    result = static_cast<long>(metadata->findKey(ExifKey(key))->toFloat(0));
 1091|      0|  }
 1092|     18|  return result;
 1093|     18|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL16resolveLens0x3ffERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1136|    338|{
 1137|    338|  try {
 1138|    338|    unsigned long index = 0;
 1139|       |
 1140|       |    // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensData
 1141|    338|    const auto lensInfo = findLensInfo(metadata);
 1142|    338|    if (lensInfo->count() < 5)
  ------------------
  |  Branch (1142:9): [True: 36, False: 302]
  ------------------
 1143|     36|      return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|     36|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1144|       |
 1145|    302|    if (value.count() == 2) {
  ------------------
  |  Branch (1145:9): [True: 141, False: 161]
  ------------------
 1146|       |      // http://dev.exiv2.org/attachments/download/326/IMGP4432.PEF
 1147|       |      // exiv2 -pv --grep Lens ~/Downloads/IMGP4432.PEF
 1148|       |      // 0x003f Pentax       LensType  Byte        2 3 255
 1149|       |      // 0x0207 Pentax       LensInfo  Undefined  36 3 255 0 0 40 148 71 152 80 6 241 65 237 153 88 36 1 76
 1150|       |      // 107 251 255 255 255 0 0 80 6 241 0 0 0 0 0 0 0 0
 1151|    141|      unsigned long base = 1;
 1152|       |
 1153|    141|      unsigned int autoAperture = lensInfo->toUint32(base + 1) & 0x01;
 1154|    141|      unsigned int minAperture = lensInfo->toUint32(base + 2) & 0x06;
 1155|    141|      unsigned int minFocusDistance = lensInfo->toUint32(base + 3) & 0xf8;
 1156|       |
 1157|    141|      if (autoAperture == 0x0 && minAperture == 0x0 && minFocusDistance == 0x28 && lensInfo->toUint32(base + 4) == 148)
  ------------------
  |  Branch (1157:11): [True: 90, False: 51]
  |  Branch (1157:34): [True: 60, False: 30]
  |  Branch (1157:56): [True: 30, False: 30]
  |  Branch (1157:84): [True: 5, False: 25]
  ------------------
 1158|      5|        index = 8;
 1159|    141|      if (autoAperture == 0x0 && minAperture == 0x0 && minFocusDistance == 0x28 && lensInfo->toUint32(base + 5) == 110)
  ------------------
  |  Branch (1159:11): [True: 90, False: 51]
  |  Branch (1159:34): [True: 60, False: 30]
  |  Branch (1159:56): [True: 30, False: 30]
  |  Branch (1159:84): [True: 7, False: 23]
  ------------------
 1160|      7|        index = 7;
 1161|    141|      if (autoAperture == 0x0 && minAperture == 0x0 && minFocusDistance == 0x28 && lensInfo->toUint32(base + 4) == 110)
  ------------------
  |  Branch (1161:11): [True: 90, False: 51]
  |  Branch (1161:34): [True: 60, False: 30]
  |  Branch (1161:56): [True: 30, False: 30]
  |  Branch (1161:84): [True: 7, False: 23]
  ------------------
 1162|      7|        index = 7;
 1163|       |
 1164|    161|    } else if (value.count() == 3) {
  ------------------
  |  Branch (1164:16): [True: 57, False: 104]
  ------------------
 1165|       |      // http://dev.exiv2.org/attachments/download/858/_IGP9032.DNG
 1166|       |      // $ exiv2 -pv --grep Lens ~/Downloads/_IGP9032.DNG
 1167|       |      // 0x003f PentaxDng    LensType  Byte        3    3 255   0
 1168|       |      // 0x0207 PentaxDng    LensInfo  Undefined  69  131   0   0 255 0  40 148  68 244 ...
 1169|       |      //                                                0   1   2   3 4   5   6
 1170|     57|      if (lensInfo->toUint32(4) == 0 && lensInfo->toUint32(5) == 40 && lensInfo->toUint32(6) == 148)
  ------------------
  |  Branch (1170:11): [True: 39, False: 18]
  |  Branch (1170:41): [True: 19, False: 20]
  |  Branch (1170:72): [True: 9, False: 10]
  ------------------
 1171|      9|        index = 8;
 1172|       |
 1173|    104|    } else if (value.count() == 4) {
  ------------------
  |  Branch (1173:16): [True: 72, False: 32]
  ------------------
 1174|       |      // http://dev.exiv2.org/attachments/download/868/IMGP2221.JPG
 1175|       |      // 0x0207 PentaxDng    LensInfo  Undefined 128    0 131 128   0 0 255   1 184   0 0 0 0 0
 1176|       |      //                                                0   1   2   3 4   5   6
 1177|     72|      if (lensInfo->count() == 128 && lensInfo->toUint32(1) == 131 && lensInfo->toUint32(2) == 128)
  ------------------
  |  Branch (1177:11): [True: 43, False: 29]
  |  Branch (1177:39): [True: 20, False: 23]
  |  Branch (1177:71): [True: 10, False: 10]
  ------------------
 1178|     10|        index = 8;
 1179|       |      // #1155
 1180|     72|      if (lensInfo->toUint32(6) == 5)
  ------------------
  |  Branch (1180:11): [True: 6, False: 66]
  ------------------
 1181|      6|        index = 7;
 1182|     72|    }
 1183|       |
 1184|    302|    if (index > 0) {
  ------------------
  |  Branch (1184:9): [True: 37, False: 265]
  ------------------
 1185|     37|      const unsigned long lensID = 0x3ff;
 1186|     37|      auto td = Exiv2::find(pentaxLensType, lensID);
 1187|     37|      return os << _(td[index].label_);
  ------------------
  |  |   40|     37|#define _(String) (String)
  ------------------
 1188|     37|    }
 1189|    302|  } catch (...) {
 1190|     33|  }
 1191|    265|  return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|    265|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1192|    338|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL16resolveLens0x8ffERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1198|    124|{
 1199|    124|  try {
 1200|    124|    unsigned long index = 0;
 1201|       |
 1202|    124|    const auto lensInfo = findLensInfo(metadata);
 1203|    124|    if (value.count() == 4) {
  ------------------
  |  Branch (1203:9): [True: 94, False: 30]
  ------------------
 1204|     94|      std::string model = getKeyString("Exif.Image.Model", metadata);
 1205|     94|      if (model.starts_with("PENTAX K-3") && lensInfo->count() == 128 && lensInfo->toUint32(1) == 168 &&
  ------------------
  |  Branch (1205:11): [True: 40, False: 54]
  |  Branch (1205:46): [True: 30, False: 10]
  |  Branch (1205:74): [True: 13, False: 17]
  ------------------
 1206|     13|          lensInfo->toUint32(2) == 144)
  ------------------
  |  Branch (1206:11): [True: 10, False: 3]
  ------------------
 1207|     10|        index = 7;
 1208|     94|    }
 1209|       |
 1210|    124|    if (index > 0) {
  ------------------
  |  Branch (1210:9): [True: 10, False: 114]
  ------------------
 1211|     10|      const unsigned long lensID = 0x8ff;
 1212|     10|      auto td = Exiv2::find(pentaxLensType, lensID);
 1213|     10|      return os << _(td[index].label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
 1214|     10|    }
 1215|    124|  } catch (...) {
 1216|     27|  }
 1217|    114|  return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata);
  ------------------
  |  |   63|    114|  printCombiTag<std::size(array), array, count, ignoredcount, ignoredcountmax>
  ------------------
 1218|    124|}
pentaxmn_int.cpp:_ZZN5Exiv28InternalL13printLensTypeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK9LensIdFcteqEj:
 1265|  24.3k|    bool operator==(uint32_t id) const {
 1266|  24.3k|      return id_ == id;
 1267|  24.3k|    }
pentaxmn_int.cpp:_ZN5Exiv28InternalL13printCombiTagILm298ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14pentaxLensTypeEELi2ELi1ELi2EEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
   32|  1.41k|static std::ostream& printCombiTag(std::ostream& os, const Value& value, const ExifData* metadata) {
   33|  1.41k|  static_assert(N > 0, "Passed zero length printCombiTag");
   34|  1.41k|  std::ios::fmtflags f(os.flags());
   35|  1.41k|  if ((value.count() != count &&
  ------------------
  |  Branch (35:8): [True: 964, False: 450]
  ------------------
   36|    964|       (value.count() < (count + ignoredcount) || value.count() > (count + ignoredcountmax))) ||
  ------------------
  |  Branch (36:9): [True: 0, False: 964]
  |  Branch (36:51): [True: 86, False: 878]
  ------------------
   37|     86|      count > 4) {
  ------------------
  |  Branch (37:7): [Folded, False: 0]
  ------------------
   38|     86|    return printValue(os, value, metadata);
   39|     86|  }
   40|  1.32k|  uint32_t l = 0;
   41|  2.84k|  for (int c = 0; c < count; ++c) {
  ------------------
  |  Branch (41:19): [True: 2.22k, False: 626]
  ------------------
   42|  2.22k|    if (value.toInt64(c) < 0 || value.toInt64(c) > 255) {
  ------------------
  |  Branch (42:9): [True: 117, False: 2.10k]
  |  Branch (42:33): [True: 585, False: 1.51k]
  ------------------
   43|    702|      return printValue(os, value, metadata);
   44|    702|    }
   45|  1.51k|    l += (value.toUint32(c) << ((count - c - 1) * 8));
   46|  1.51k|  }
   47|       |
   48|    626|  if (auto td = Exiv2::find(array, l)) {
  ------------------
  |  Branch (48:12): [True: 526, False: 100]
  ------------------
   49|    526|    os << _(td->label_);
  ------------------
  |  |   40|    526|#define _(String) (String)
  ------------------
   50|    526|  } else {
   51|    100|    os << _("Unknown") << " (0x" << std::setw(2 * count) << std::setfill('0') << std::hex << l << std::dec << ")";
  ------------------
  |  |   40|    100|#define _(String) (String)
  ------------------
   52|    100|  }
   53|       |
   54|    626|  os.flags(f);
   55|    626|  return os;
   56|  1.32k|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL13printCombiTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21pentaxImageProcessingEELi4ELi0ELi0EEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
   32|  1.71k|static std::ostream& printCombiTag(std::ostream& os, const Value& value, const ExifData* metadata) {
   33|  1.71k|  static_assert(N > 0, "Passed zero length printCombiTag");
   34|  1.71k|  std::ios::fmtflags f(os.flags());
   35|  1.71k|  if ((value.count() != count &&
  ------------------
  |  Branch (35:8): [True: 128, False: 1.58k]
  ------------------
   36|    128|       (value.count() < (count + ignoredcount) || value.count() > (count + ignoredcountmax))) ||
  ------------------
  |  Branch (36:9): [True: 84, False: 44]
  |  Branch (36:51): [True: 44, False: 0]
  ------------------
   37|    128|      count > 4) {
  ------------------
  |  Branch (37:7): [Folded, False: 0]
  ------------------
   38|    128|    return printValue(os, value, metadata);
   39|    128|  }
   40|  1.58k|  uint32_t l = 0;
   41|  6.26k|  for (int c = 0; c < count; ++c) {
  ------------------
  |  Branch (41:19): [True: 5.31k, False: 950]
  ------------------
   42|  5.31k|    if (value.toInt64(c) < 0 || value.toInt64(c) > 255) {
  ------------------
  |  Branch (42:9): [True: 284, False: 5.02k]
  |  Branch (42:33): [True: 354, False: 4.67k]
  ------------------
   43|    638|      return printValue(os, value, metadata);
   44|    638|    }
   45|  4.67k|    l += (value.toUint32(c) << ((count - c - 1) * 8));
   46|  4.67k|  }
   47|       |
   48|    950|  if (auto td = Exiv2::find(array, l)) {
  ------------------
  |  Branch (48:12): [True: 744, False: 206]
  ------------------
   49|    744|    os << _(td->label_);
  ------------------
  |  |   40|    744|#define _(String) (String)
  ------------------
   50|    744|  } else {
   51|    206|    os << _("Unknown") << " (0x" << std::setw(2 * count) << std::setfill('0') << std::hex << l << std::dec << ")";
  ------------------
  |  |   40|    206|#define _(String) (String)
  ------------------
   52|    206|  }
   53|       |
   54|    950|  os.flags(f);
   55|    950|  return os;
   56|  1.58k|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL13printCombiTagILm71ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17pentaxPictureModeEELi3ELi0ELi0EEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
   32|  5.00k|static std::ostream& printCombiTag(std::ostream& os, const Value& value, const ExifData* metadata) {
   33|  5.00k|  static_assert(N > 0, "Passed zero length printCombiTag");
   34|  5.00k|  std::ios::fmtflags f(os.flags());
   35|  5.00k|  if ((value.count() != count &&
  ------------------
  |  Branch (35:8): [True: 198, False: 4.80k]
  ------------------
   36|    198|       (value.count() < (count + ignoredcount) || value.count() > (count + ignoredcountmax))) ||
  ------------------
  |  Branch (36:9): [True: 114, False: 84]
  |  Branch (36:51): [True: 84, False: 0]
  ------------------
   37|    198|      count > 4) {
  ------------------
  |  Branch (37:7): [Folded, False: 0]
  ------------------
   38|    198|    return printValue(os, value, metadata);
   39|    198|  }
   40|  4.80k|  uint32_t l = 0;
   41|  18.0k|  for (int c = 0; c < count; ++c) {
  ------------------
  |  Branch (41:19): [True: 13.8k, False: 4.23k]
  ------------------
   42|  13.8k|    if (value.toInt64(c) < 0 || value.toInt64(c) > 255) {
  ------------------
  |  Branch (42:9): [True: 292, False: 13.5k]
  |  Branch (42:33): [True: 278, False: 13.2k]
  ------------------
   43|    570|      return printValue(os, value, metadata);
   44|    570|    }
   45|  13.2k|    l += (value.toUint32(c) << ((count - c - 1) * 8));
   46|  13.2k|  }
   47|       |
   48|  4.23k|  if (auto td = Exiv2::find(array, l)) {
  ------------------
  |  Branch (48:12): [True: 3.78k, False: 452]
  ------------------
   49|  3.78k|    os << _(td->label_);
  ------------------
  |  |   40|  3.78k|#define _(String) (String)
  ------------------
   50|  3.78k|  } else {
   51|    452|    os << _("Unknown") << " (0x" << std::setw(2 * count) << std::setfill('0') << std::hex << l << std::dec << ")";
  ------------------
  |  |   40|    452|#define _(String) (String)
  ------------------
   52|    452|  }
   53|       |
   54|  4.23k|  os.flags(f);
   55|  4.23k|  return os;
   56|  4.80k|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL13printCombiTagILm20ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15pentaxDriveModeEELi4ELi0ELi0EEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
   32|  3.92k|static std::ostream& printCombiTag(std::ostream& os, const Value& value, const ExifData* metadata) {
   33|  3.92k|  static_assert(N > 0, "Passed zero length printCombiTag");
   34|  3.92k|  std::ios::fmtflags f(os.flags());
   35|  3.92k|  if ((value.count() != count &&
  ------------------
  |  Branch (35:8): [True: 226, False: 3.69k]
  ------------------
   36|    226|       (value.count() < (count + ignoredcount) || value.count() > (count + ignoredcountmax))) ||
  ------------------
  |  Branch (36:9): [True: 126, False: 100]
  |  Branch (36:51): [True: 100, False: 0]
  ------------------
   37|    226|      count > 4) {
  ------------------
  |  Branch (37:7): [Folded, False: 0]
  ------------------
   38|    226|    return printValue(os, value, metadata);
   39|    226|  }
   40|  3.69k|  uint32_t l = 0;
   41|  13.8k|  for (int c = 0; c < count; ++c) {
  ------------------
  |  Branch (41:19): [True: 11.9k, False: 1.94k]
  ------------------
   42|  11.9k|    if (value.toInt64(c) < 0 || value.toInt64(c) > 255) {
  ------------------
  |  Branch (42:9): [True: 852, False: 11.0k]
  |  Branch (42:33): [True: 904, False: 10.1k]
  ------------------
   43|  1.75k|      return printValue(os, value, metadata);
   44|  1.75k|    }
   45|  10.1k|    l += (value.toUint32(c) << ((count - c - 1) * 8));
   46|  10.1k|  }
   47|       |
   48|  1.94k|  if (auto td = Exiv2::find(array, l)) {
  ------------------
  |  Branch (48:12): [True: 1.65k, False: 286]
  ------------------
   49|  1.65k|    os << _(td->label_);
  ------------------
  |  |   40|  1.65k|#define _(String) (String)
  ------------------
   50|  1.65k|  } else {
   51|    286|    os << _("Unknown") << " (0x" << std::setw(2 * count) << std::setfill('0') << std::hex << l << std::dec << ")";
  ------------------
  |  |   40|    286|#define _(String) (String)
  ------------------
   52|    286|  }
   53|       |
   54|  1.94k|  os.flags(f);
   55|  1.94k|  return os;
   56|  3.69k|}
pentaxmn_int.cpp:_ZN5Exiv28InternalL13printCombiTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27pentaxDynamicRangeExpansionEELi4ELi0ELi0EEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
   32|  1.47k|static std::ostream& printCombiTag(std::ostream& os, const Value& value, const ExifData* metadata) {
   33|  1.47k|  static_assert(N > 0, "Passed zero length printCombiTag");
   34|  1.47k|  std::ios::fmtflags f(os.flags());
   35|  1.47k|  if ((value.count() != count &&
  ------------------
  |  Branch (35:8): [True: 118, False: 1.35k]
  ------------------
   36|    118|       (value.count() < (count + ignoredcount) || value.count() > (count + ignoredcountmax))) ||
  ------------------
  |  Branch (36:9): [True: 52, False: 66]
  |  Branch (36:51): [True: 66, False: 0]
  ------------------
   37|    118|      count > 4) {
  ------------------
  |  Branch (37:7): [Folded, False: 0]
  ------------------
   38|    118|    return printValue(os, value, metadata);
   39|    118|  }
   40|  1.35k|  uint32_t l = 0;
   41|  3.83k|  for (int c = 0; c < count; ++c) {
  ------------------
  |  Branch (41:19): [True: 3.49k, False: 342]
  ------------------
   42|  3.49k|    if (value.toInt64(c) < 0 || value.toInt64(c) > 255) {
  ------------------
  |  Branch (42:9): [True: 416, False: 3.08k]
  |  Branch (42:33): [True: 600, False: 2.48k]
  ------------------
   43|  1.01k|      return printValue(os, value, metadata);
   44|  1.01k|    }
   45|  2.48k|    l += (value.toUint32(c) << ((count - c - 1) * 8));
   46|  2.48k|  }
   47|       |
   48|    342|  if (auto td = Exiv2::find(array, l)) {
  ------------------
  |  Branch (48:12): [True: 58, False: 284]
  ------------------
   49|     58|    os << _(td->label_);
  ------------------
  |  |   40|     58|#define _(String) (String)
  ------------------
   50|    284|  } else {
   51|    284|    os << _("Unknown") << " (0x" << std::setw(2 * count) << std::setfill('0') << std::hex << l << std::dec << ")";
  ------------------
  |  |   40|    284|#define _(String) (String)
  ------------------
   52|    284|  }
   53|       |
   54|    342|  os.flags(f);
   55|    342|  return os;
   56|  1.35k|}

_ZN5Exiv28Internal15PentaxMakerNote7tagListEv:
   23|   176k|  static constexpr auto tagList() {
   24|   176k|    return tagInfo_;
   25|   176k|  }

_ZN5Exiv28PgfImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   53|    142|    Image(ImageType::pgf, mdExif | mdIptc | mdXmp | mdComment, std::move(io), params), bSwap_(isBigEndianPlatform()) {
   54|    142|  if (params.create() && io_->open() == 0) {
  ------------------
  |  Branch (54:7): [True: 0, False: 142]
  |  Branch (54:26): [True: 0, False: 0]
  ------------------
   55|       |#ifdef EXIV2_DEBUG_MESSAGES
   56|       |    std::cerr << "Exiv2::PgfImage:: Creating PGF image to memory\n";
   57|       |#endif
   58|      0|    IoCloser closer(*io_);
   59|      0|    if (io_->write(pgfBlank, sizeof(pgfBlank)) != sizeof(pgfBlank)) {
  ------------------
  |  Branch (59:9): [True: 0, False: 0]
  ------------------
   60|       |#ifdef EXIV2_DEBUG_MESSAGES
   61|       |      std::cerr << "Exiv2::PgfImage:: Failed to create PGF image on memory\n";
   62|       |#endif
   63|      0|    }
   64|      0|  }
   65|    142|}  // PgfImage::PgfImage
_ZN5Exiv28PgfImage12readMetadataEv:
   67|    142|void PgfImage::readMetadata() {
   68|       |#ifdef EXIV2_DEBUG_MESSAGES
   69|       |  std::cerr << "Exiv2::PgfImage::readMetadata: Reading PGF file " << io_->path() << "\n";
   70|       |#endif
   71|    142|  if (io_->open() != 0) {
  ------------------
  |  Branch (71:7): [True: 0, False: 142]
  ------------------
   72|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   73|      0|  }
   74|    142|  IoCloser closer(*io_);
   75|       |  // Ensure that this is the correct image type
   76|    142|  if (!isPgfType(*io_, true)) {
  ------------------
  |  Branch (76:7): [True: 0, False: 142]
  ------------------
   77|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (77:9): [True: 0, False: 0]
  |  Branch (77:25): [True: 0, False: 0]
  ------------------
   78|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   79|      0|    throw Error(ErrorCode::kerNotAnImage, "PGF");
   80|      0|  }
   81|    142|  clearMetadata();
   82|       |
   83|    142|  readPgfMagicNumber(*io_);
   84|       |
   85|    142|  size_t headerSize = readPgfHeaderSize(*io_);
   86|    142|  readPgfHeaderStructure(*io_, pixelWidth_, pixelHeight_);
   87|       |
   88|       |  // And now, the most interesting, the user data byte array where metadata are stored as small image.
   89|       |
   90|    142|  Internal::enforce(headerSize <= std::numeric_limits<size_t>::max() - 8, ErrorCode::kerCorruptedMetadata);
   91|    142|  size_t size = headerSize + 8 - io_->tell();
   92|       |
   93|       |#ifdef EXIV2_DEBUG_MESSAGES
   94|       |  std::cout << "Exiv2::PgfImage::readMetadata: Found Image data (" << size << " bytes)\n";
   95|       |#endif
   96|       |
   97|    142|  const size_t offset = io_->tell();
   98|    142|  assert(offset <= io_->size());
   99|    142|  if (size > io_->size() - offset)
  ------------------
  |  Branch (99:7): [True: 53, False: 89]
  ------------------
  100|     53|    throw Error(ErrorCode::kerInputDataReadFailed);
  101|     89|  if (size == 0)
  ------------------
  |  Branch (101:7): [True: 10, False: 79]
  ------------------
  102|     10|    return;
  103|       |
  104|     79|  const Exiv2::byte* base = io_->mmap();
  105|     79|  if (io_->error())
  ------------------
  |  Branch (105:7): [True: 0, False: 79]
  ------------------
  106|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  107|       |
  108|     79|  auto image = Exiv2::ImageFactory::open(base + offset, size);
  109|     79|  image->readMetadata();
  110|     79|  exifData() = image->exifData();
  111|     79|  iptcData() = image->iptcData();
  112|     79|  xmpData() = image->xmpData();
  113|     79|}
_ZN5Exiv28PgfImage18readPgfMagicNumberERNS_7BasicIoE:
  217|    142|byte PgfImage::readPgfMagicNumber(BasicIo& iIo) {
  218|    142|  auto b = static_cast<byte>(iIo.getb());
  219|    142|  if (iIo.error())
  ------------------
  |  Branch (219:7): [True: 0, False: 142]
  ------------------
  220|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  221|       |
  222|    142|  if (b < 0x36)  // 0x36 = '6'.
  ------------------
  |  Branch (222:7): [True: 40, False: 102]
  ------------------
  223|     40|  {
  224|       |    // Not right Magick version.
  225|       |#ifdef EXIV2_DEBUG_MESSAGES
  226|       |    std::cout << "Exiv2::PgfImage::readMetadata: wrong Magick number\n";
  227|       |#endif
  228|     40|  }
  229|       |
  230|    142|  return b;
  231|    142|}  // PgfImage::readPgfMagicNumber
_ZNK5Exiv28PgfImage17readPgfHeaderSizeERNS_7BasicIoE:
  233|    142|size_t PgfImage::readPgfHeaderSize(BasicIo& iIo) const {
  234|    142|  DataBuf buffer(4);
  235|    142|  const size_t bufRead = iIo.read(buffer.data(), buffer.size());
  236|    142|  if (iIo.error())
  ------------------
  |  Branch (236:7): [True: 0, False: 142]
  ------------------
  237|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  238|    142|  if (bufRead != buffer.size())
  ------------------
  |  Branch (238:7): [True: 0, False: 142]
  ------------------
  239|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  240|       |
  241|    142|  auto headerSize = static_cast<size_t>(byteSwap_(buffer, 0, bSwap_));
  242|    142|  if (headerSize == 0)
  ------------------
  |  Branch (242:7): [True: 10, False: 132]
  ------------------
  243|     10|    throw Error(ErrorCode::kerNoImageInInputData);
  244|       |
  245|       |#ifdef EXIV2_DEBUG_MESSAGES
  246|       |  std::cout << "Exiv2::PgfImage: PGF header size : " << headerSize << " bytes\n";
  247|       |#endif
  248|       |
  249|    132|  return headerSize;
  250|    142|}
_ZNK5Exiv28PgfImage22readPgfHeaderStructureERNS_7BasicIoERjS3_:
  252|    132|DataBuf PgfImage::readPgfHeaderStructure(BasicIo& iIo, uint32_t& width, uint32_t& height) const {
  253|    132|  DataBuf header(16);
  254|    132|  size_t bufRead = iIo.read(header.data(), header.size());
  255|    132|  if (iIo.error())
  ------------------
  |  Branch (255:7): [True: 0, False: 132]
  ------------------
  256|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  257|    132|  if (bufRead != header.size())
  ------------------
  |  Branch (257:7): [True: 0, False: 132]
  ------------------
  258|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  259|       |
  260|    132|  DataBuf work(header.data(), 8);  // don't disturb the binary data - doWriteMetadata reuses it
  261|    132|  width = byteSwap_(work, 0, bSwap_);
  262|    132|  height = byteSwap_(work, 4, bSwap_);
  263|       |
  264|       |  /* NOTE: properties not yet used
  265|       |  byte nLevels  = buffer.pData_[8];
  266|       |  byte quality  = buffer.pData_[9];
  267|       |  byte bpp      = buffer.pData_[10];
  268|       |  byte channels = buffer.pData_[11];
  269|       |  */
  270|       |
  271|    132|  if (header.read_uint8(12) == 2)  // Indexed color image. We pass color table (256 * 3 bytes).
  ------------------
  |  Branch (271:7): [True: 7, False: 125]
  ------------------
  272|      7|  {
  273|      7|    header.alloc(16 + (256 * 3));
  274|       |
  275|      7|    bufRead = iIo.read(header.data(16), 256 * 3);
  276|      7|    if (iIo.error())
  ------------------
  |  Branch (276:9): [True: 0, False: 7]
  ------------------
  277|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  278|      7|    if (bufRead != 256 * 3)
  ------------------
  |  Branch (278:9): [True: 6, False: 1]
  ------------------
  279|      6|      throw Error(ErrorCode::kerInputDataReadFailed);
  280|      7|  }
  281|       |
  282|    126|  return header;
  283|    132|}  // PgfImage::readPgfHeaderStructure
_ZN5Exiv214newPgfInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  287|    142|Image::UniquePtr newPgfInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  288|    142|  auto image = std::make_unique<PgfImage>(std::move(io), params);
  289|    142|  if (!image->good()) {
  ------------------
  |  Branch (289:7): [True: 0, False: 142]
  ------------------
  290|      0|    return nullptr;
  291|      0|  }
  292|    142|  return image;
  293|    142|}
_ZN5Exiv29isPgfTypeERNS_7BasicIoEb:
  295|  12.9k|bool isPgfType(BasicIo& iIo, bool advance) {
  296|  12.9k|  const int32_t len = 3;
  297|  12.9k|  std::array<byte, len> buf;
  298|  12.9k|  iIo.read(buf.data(), len);
  299|  12.9k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (299:7): [True: 0, False: 12.9k]
  |  Branch (299:22): [True: 0, False: 12.9k]
  ------------------
  300|      0|    return false;
  301|      0|  }
  302|  12.9k|  bool rc = buf == pgfSignature;
  303|  12.9k|  if (!advance || !rc) {
  ------------------
  |  Branch (303:7): [True: 12.7k, False: 142]
  |  Branch (303:19): [True: 0, False: 142]
  ------------------
  304|  12.7k|    iIo.seek(-len, BasicIo::cur);
  305|  12.7k|  }
  306|       |
  307|  12.9k|  return rc;
  308|  12.9k|}
pgfimage.cpp:_ZN5Exiv2L9byteSwap_ERNS_7DataBufEmb:
   39|    406|static uint32_t byteSwap_(Exiv2::DataBuf& buf, size_t offset, bool bSwap) {
   40|    406|  uint32_t v = 0;
   41|    406|  auto p = reinterpret_cast<byte*>(&v);
   42|    406|  int i;
   43|  2.03k|  for (i = 0; i < 4; i++)
  ------------------
  |  Branch (43:15): [True: 1.62k, False: 406]
  ------------------
   44|  1.62k|    p[i] = buf.read_uint8(offset + i);
   45|    406|  uint32_t result = Image::byteSwap(v, bSwap);
   46|    406|  p = reinterpret_cast<byte*>(&result);
   47|  2.03k|  for (i = 0; i < 4; i++)
  ------------------
  |  Branch (47:15): [True: 1.62k, False: 406]
  ------------------
   48|  1.62k|    buf.write_uint8(offset + i, p[i]);
   49|    406|  return result;
   50|    406|}

_ZN5Exiv29Photoshop5isIrbEPKh:
   27|  34.9M|bool Photoshop::isIrb(const byte* pPsData) {
   28|  34.9M|  if (pPsData == nullptr)
  ------------------
  |  Branch (28:7): [True: 0, False: 34.9M]
  ------------------
   29|      0|    return false;
   30|       |
   31|  34.9M|  for (auto id : irbId_)
  ------------------
  |  Branch (31:16): [True: 34.9M, False: 4.92k]
  ------------------
   32|  34.9M|    if (std::equal(id, id + 4, pPsData))
  ------------------
  |  Branch (32:9): [True: 34.9M, False: 22.2k]
  ------------------
   33|  34.9M|      return true;
   34|       |
   35|  4.92k|  return false;
   36|  34.9M|}
_ZN5Exiv29Photoshop5validEPKhm:
   38|  43.8k|bool Photoshop::valid(const byte* pPsData, size_t sizePsData) {
   39|  43.8k|  const byte* record = nullptr;
   40|  43.8k|  uint32_t sizeIptc = 0;
   41|  43.8k|  uint32_t sizeHdr = 0;
   42|  43.8k|  const byte* pCur = pPsData;
   43|  43.8k|  const byte* pEnd = pPsData + sizePsData;
   44|  43.8k|  int ret = 0;
   45|  33.9M|  while (pCur < pEnd && 0 == (ret = Photoshop::locateIptcIrb(pCur, (pEnd - pCur), &record, sizeHdr, sizeIptc))) {
  ------------------
  |  Branch (45:10): [True: 33.9M, False: 15]
  |  Branch (45:25): [True: 33.8M, False: 43.8k]
  ------------------
   46|  33.8M|    pCur = record + sizeHdr + sizeIptc + (sizeIptc & 1);
   47|  33.8M|  }
   48|  43.8k|  return ret >= 0;
   49|  43.8k|}
_ZN5Exiv29Photoshop9locateIrbEPKhmtPS2_RjS4_:
   55|  33.9M|                         uint32_t& sizeData) {
   56|  33.9M|  if (sizePsData < 12) {
  ------------------
  |  Branch (56:7): [True: 648, False: 33.9M]
  ------------------
   57|    648|    return 3;
   58|    648|  }
   59|       |
   60|       |  // Used for error checking
   61|  33.9M|  size_t position = 0;
   62|       |#ifdef EXIV2_DEBUG_MESSAGES
   63|       |  std::cerr << "Photoshop::locateIrb: ";
   64|       |#endif
   65|       |  // Data should follow Photoshop format, if not exit
   66|  34.9M|  while (position <= (sizePsData - 12) && isIrb(pPsData + position)) {
  ------------------
  |  Branch (66:10): [True: 34.9M, False: 332]
  |  Branch (66:43): [True: 34.9M, False: 4.83k]
  ------------------
   67|  34.9M|    const byte* hrd = pPsData + position;
   68|  34.9M|    position += 4;
   69|  34.9M|    uint16_t type = getUShort(pPsData + position, bigEndian);
   70|  34.9M|    position += 2;
   71|       |#ifdef EXIV2_DEBUG_MESSAGES
   72|       |    std::cerr << "0x" << std::hex << type << std::dec << " ";
   73|       |#endif
   74|       |    // Pascal string is padded to have an even size (including size byte)
   75|  34.9M|    byte psSize = pPsData[position] + 1;
   76|  34.9M|    psSize += (psSize & 1);
   77|  34.9M|    position += psSize;
   78|  34.9M|    if (position + 4 > sizePsData) {
  ------------------
  |  Branch (78:9): [True: 308, False: 34.9M]
  ------------------
   79|       |#ifdef EXIV2_DEBUG_MESSAGES
   80|       |      std::cerr << "Warning: "
   81|       |                << "Invalid or extended Photoshop IRB\n";
   82|       |#endif
   83|    308|      return -2;
   84|    308|    }
   85|  34.9M|    uint32_t dataSize = getULong(pPsData + position, bigEndian);
   86|  34.9M|    position += 4;
   87|  34.9M|    if (dataSize > (sizePsData - position)) {
  ------------------
  |  Branch (87:9): [True: 38.9k, False: 34.8M]
  ------------------
   88|       |#ifdef EXIV2_DEBUG_MESSAGES
   89|       |      std::cerr << "Warning: "
   90|       |                << "Invalid Photoshop IRB data size " << dataSize << " or extended Photoshop IRB\n";
   91|       |#endif
   92|  38.9k|      return -2;
   93|  38.9k|    }
   94|       |#ifdef EXIV2_DEBUG_MESSAGES
   95|       |    if ((dataSize & 1) && position + dataSize == sizePsData) {
   96|       |      std::cerr << "Warning: "
   97|       |                << "Photoshop IRB data is not padded to even size\n";
   98|       |    }
   99|       |#endif
  100|  34.8M|    if (type == psTag) {
  ------------------
  |  Branch (100:9): [True: 33.9M, False: 959k]
  ------------------
  101|       |#ifdef EXIV2_DEBUG_MESSAGES
  102|       |      std::cerr << "ok\n";
  103|       |#endif
  104|  33.9M|      sizeData = dataSize;
  105|  33.9M|      sizeHdr = psSize + 10;
  106|  33.9M|      *record = hrd;
  107|  33.9M|      return 0;
  108|  33.9M|    }
  109|       |    // Data size is also padded to be even
  110|   959k|    position += dataSize + (dataSize & 1);
  111|   959k|  }
  112|       |#ifdef EXIV2_DEBUG_MESSAGES
  113|       |  std::cerr << "pPsData doesn't start with '8BIM'\n";
  114|       |#endif
  115|  5.17k|  if (position < sizePsData) {
  ------------------
  |  Branch (115:7): [True: 5.01k, False: 158]
  ------------------
  116|       |#ifdef EXIV2_DEBUG_MESSAGES
  117|       |    std::cerr << "Warning: "
  118|       |              << "Invalid or extended Photoshop IRB\n";
  119|       |#endif
  120|  5.01k|    return -2;
  121|  5.01k|  }
  122|    158|  return 3;
  123|  5.17k|}
_ZN5Exiv29Photoshop13locateIptcIrbEPKhmPS2_RjS4_:
  126|  33.9M|                             uint32_t& sizeData) {
  127|  33.9M|  return locateIrb(pPsData, sizePsData, iptc_, record, sizeHdr, sizeData);
  128|  33.9M|}
_ZN5Exiv29Photoshop10setIptcIrbEPKhmRKNS_8IptcDataE:
  135|    398|DataBuf Photoshop::setIptcIrb(const byte* pPsData, size_t sizePsData, const IptcData& iptcData) {
  136|       |#ifdef EXIV2_DEBUG_MESSAGES
  137|       |  std::cerr << "IRB block at the beginning of Photoshop::setIptcIrb\n";
  138|       |  if (sizePsData == 0)
  139|       |    std::cerr << "  None.\n";
  140|       |  else
  141|       |    hexdump(std::cerr, pPsData, sizePsData);
  142|       |#endif
  143|    398|  const byte* record = pPsData;
  144|    398|  uint32_t sizeIptc = 0;
  145|    398|  uint32_t sizeHdr = 0;
  146|    398|  DataBuf rc;
  147|    398|  if (0 > Photoshop::locateIptcIrb(pPsData, sizePsData, &record, sizeHdr, sizeIptc)) {
  ------------------
  |  Branch (147:7): [True: 83, False: 315]
  ------------------
  148|     83|    return rc;
  149|     83|  }
  150|       |
  151|    315|  Blob psBlob;
  152|    315|  const auto sizeFront = static_cast<size_t>(record - pPsData);
  153|       |  // Write data before old record.
  154|    315|  if (sizePsData > 0 && sizeFront > 0) {
  ------------------
  |  Branch (154:7): [True: 168, False: 147]
  |  Branch (154:25): [True: 42, False: 126]
  ------------------
  155|     42|    append(psBlob, pPsData, sizeFront);
  156|     42|  }
  157|       |
  158|       |  // Write new iptc record if we have it
  159|    315|  if (DataBuf rawIptc = IptcParser::encode(iptcData); !rawIptc.empty()) {
  ------------------
  |  Branch (159:55): [True: 36, False: 279]
  ------------------
  160|     36|    std::array<byte, 12> tmpBuf;
  161|     36|    std::copy_n(Photoshop::irbId_[0], 4, tmpBuf.begin());
  162|     36|    us2Data(tmpBuf.data() + 4, iptc_, bigEndian);
  163|     36|    tmpBuf[6] = 0;
  164|     36|    tmpBuf[7] = 0;
  165|     36|    ul2Data(tmpBuf.data() + 8, static_cast<uint32_t>(rawIptc.size()), bigEndian);
  166|     36|    append(psBlob, tmpBuf.data(), 12);
  167|     36|    append(psBlob, rawIptc.c_data(), rawIptc.size());
  168|       |    // Data is padded to be even (but not included in size)
  169|     36|    if (rawIptc.size() & 1)
  ------------------
  |  Branch (169:9): [True: 21, False: 15]
  ------------------
  170|     21|      psBlob.push_back(0x00);
  171|     36|  }
  172|       |
  173|       |  // Write existing stuff after record, skip the current and all remaining IPTC blocks
  174|    315|  size_t pos = sizeFront;
  175|    315|  auto nextSizeData = Safe::add<long>(static_cast<long>(sizePsData), -static_cast<long>(pos));
  176|    315|  Internal::enforce(nextSizeData >= 0, ErrorCode::kerCorruptedMetadata);
  177|  18.3k|  while (0 == Photoshop::locateIptcIrb(pPsData + pos, nextSizeData, &record, sizeHdr, sizeIptc)) {
  ------------------
  |  Branch (177:10): [True: 18.0k, False: 315]
  ------------------
  178|  18.0k|    const auto newPos = static_cast<size_t>(record - pPsData);
  179|  18.0k|    if (newPos > pos) {  // Copy data up to the IPTC IRB
  ------------------
  |  Branch (179:9): [True: 489, False: 17.5k]
  ------------------
  180|    489|      append(psBlob, pPsData + pos, newPos - pos);
  181|    489|    }
  182|  18.0k|    pos = newPos + sizeHdr + sizeIptc + (sizeIptc & 1);  // Skip the IPTC IRB
  183|  18.0k|    nextSizeData = Safe::add<long>(static_cast<long>(sizePsData), -static_cast<long>(pos));
  184|  18.0k|    Internal::enforce(nextSizeData >= 0, ErrorCode::kerCorruptedMetadata);
  185|  18.0k|  }
  186|    315|  if (pos < sizePsData) {
  ------------------
  |  Branch (186:7): [True: 165, False: 150]
  ------------------
  187|    165|    append(psBlob, pPsData + pos, sizePsData - pos);
  188|    165|  }
  189|       |
  190|       |  // Data is rounded to be even
  191|    315|  if (!psBlob.empty())
  ------------------
  |  Branch (191:7): [True: 166, False: 149]
  ------------------
  192|    166|    rc = DataBuf(psBlob.data(), psBlob.size());
  193|       |#ifdef EXIV2_DEBUG_MESSAGES
  194|       |  std::cerr << "IRB block at the end of Photoshop::setIptcIrb\n";
  195|       |  if (rc.empty())
  196|       |    std::cerr << "  None.\n";
  197|       |  else
  198|       |    hexdump(std::cerr, rc.c_data(), rc.size());
  199|       |#endif
  200|    315|  return rc;
  201|    398|}

_ZN5Exiv28Internal8PngChunk15decodeIHDRChunkERKNS_7DataBufEPjS5_:
   45|     79|void PngChunk::decodeIHDRChunk(const DataBuf& data, uint32_t* outWidth, uint32_t* outHeight) {
   46|       |  // Extract image width and height from IHDR chunk.
   47|     79|  *outWidth = data.read_uint32(0, bigEndian);
   48|     79|  *outHeight = data.read_uint32(4, bigEndian);
   49|     79|}
_ZN5Exiv28Internal8PngChunk14decodeTXTChunkEPNS_5ImageERKNS_7DataBufENS1_12TxtChunkTypeERKNS_12DecodeParamsE:
   51|    928|void PngChunk::decodeTXTChunk(Image* pImage, const DataBuf& data, TxtChunkType type, const DecodeParams& dp) {
   52|    928|  DataBuf key = keyTXTChunk(data);
   53|    928|  DataBuf arr = parseTXTChunk(data, key.size(), type);
   54|       |
   55|       |#ifdef EXIV2_DEBUG_MESSAGES
   56|       |  std::cout << "Exiv2::PngChunk::decodeTXTChunk: TXT chunk data: " << std::string(arr.c_str(), arr.size()) << '\n';
   57|       |#endif
   58|    928|  if (!key.empty())
  ------------------
  |  Branch (58:7): [True: 717, False: 211]
  ------------------
   59|    717|    parseChunkContent(pImage, key.c_data(), key.size(), arr, dp);
   60|    928|}
_ZN5Exiv28Internal8PngChunk14decodeTXTChunkERKNS_7DataBufENS1_12TxtChunkTypeE:
   62|     11|DataBuf PngChunk::decodeTXTChunk(const DataBuf& data, TxtChunkType type) {
   63|     11|  DataBuf key = keyTXTChunk(data);
   64|       |
   65|       |#ifdef EXIV2_DEBUG_MESSAGES
   66|       |  std::cout << "Exiv2::PngChunk::decodeTXTChunk: TXT chunk key: " << std::string(key.c_str(), key.size()) << '\n';
   67|       |#endif
   68|     11|  return parseTXTChunk(data, key.size(), type);
   69|     11|}
_ZN5Exiv28Internal8PngChunk11keyTXTChunkERKNS_7DataBufEb:
   71|  1.19k|DataBuf PngChunk::keyTXTChunk(const DataBuf& data, bool stripHeader) {
   72|       |  // From a tEXt, zTXt, or iTXt chunk, we get the keyword which is null terminated.
   73|  1.19k|  const size_t offset = stripHeader ? 8ul : 0ul;
  ------------------
  |  Branch (73:25): [True: 258, False: 939]
  ------------------
   74|  1.19k|  if (data.size() <= offset)
  ------------------
  |  Branch (74:7): [True: 10, False: 1.18k]
  ------------------
   75|     10|    throw Error(ErrorCode::kerFailedToReadImageData);
   76|       |
   77|  1.18k|  auto it = std::find(data.begin() + offset, data.end(), 0);
   78|  1.18k|  if (it == data.end())
  ------------------
  |  Branch (78:7): [True: 8, False: 1.17k]
  ------------------
   79|      8|    throw Error(ErrorCode::kerFailedToReadImageData);
   80|       |
   81|  1.17k|  return {data.c_data() + offset, std::distance(data.begin(), it) - offset};
   82|  1.18k|}
_ZN5Exiv28Internal8PngChunk13parseTXTChunkERKNS_7DataBufEmNS1_12TxtChunkTypeE:
   84|    921|DataBuf PngChunk::parseTXTChunk(const DataBuf& data, size_t keysize, TxtChunkType type) {
   85|    921|  DataBuf arr;
   86|       |
   87|    921|  if (type == zTXt_Chunk) {
  ------------------
  |  Branch (87:7): [True: 92, False: 829]
  ------------------
   88|     92|    enforce(data.size() >= Safe::add(keysize, nullSeparators), ErrorCode::kerCorruptedMetadata);
   89|       |
   90|       |    // Extract a deflate compressed Latin-1 text chunk
   91|       |
   92|       |    // we get the compression method after the key
   93|     92|    if (*data.c_data(keysize + 1) != 0x00) {
  ------------------
  |  Branch (93:9): [True: 12, False: 80]
  ------------------
   94|       |      // then it isn't zlib compressed and we are sunk
   95|       |#ifdef EXIV2_DEBUG_MESSAGES
   96|       |      std::cerr << "Exiv2::PngChunk::parseTXTChunk: Non-standard zTXt compression method.\n";
   97|       |#endif
   98|     12|      throw Error(ErrorCode::kerFailedToReadImageData);
   99|     12|    }
  100|       |
  101|       |    // compressed string after the compression technique spec
  102|     80|    size_t compressedTextSize = data.size() - keysize - nullSeparators;
  103|     80|    if (compressedTextSize) {
  ------------------
  |  Branch (103:9): [True: 10, False: 70]
  ------------------
  104|     10|      const byte* compressedText = data.c_data(keysize + nullSeparators);
  105|     10|      enforce(compressedTextSize < data.size(), ErrorCode::kerCorruptedMetadata);
  106|       |
  107|     10|      zlibUncompress(compressedText, static_cast<uint32_t>(compressedTextSize), arr);
  108|     10|    }
  109|    829|  } else if (type == tEXt_Chunk) {
  ------------------
  |  Branch (109:14): [True: 468, False: 361]
  ------------------
  110|    468|    enforce(data.size() >= Safe::add(keysize, std::size_t{1}), ErrorCode::kerCorruptedMetadata);
  111|       |    // Extract a non-compressed Latin-1 text chunk
  112|       |
  113|       |    // the text comes after the key, but isn't null terminated
  114|    468|    size_t textsize = data.size() - keysize - 1;
  115|    468|    if (textsize) {
  ------------------
  |  Branch (115:9): [True: 454, False: 14]
  ------------------
  116|    454|      const byte* text = data.c_data(keysize + 1);
  117|       |
  118|    454|      arr = DataBuf(text, textsize);
  119|    454|    }
  120|    468|  } else if (type == iTXt_Chunk) {
  ------------------
  |  Branch (120:14): [True: 361, False: 0]
  ------------------
  121|    361|    enforce(data.size() > Safe::add(keysize, std::size_t{3}), ErrorCode::kerCorruptedMetadata);
  122|    361|    const size_t nullCount = std::count(data.c_data(keysize + 3), data.c_data(data.size() - 1), '\0');
  123|    361|    enforce(nullCount >= nullSeparators, ErrorCode::kerCorruptedMetadata);
  124|       |
  125|       |    // Extract a deflate compressed or uncompressed UTF-8 text chunk
  126|       |
  127|       |    // we get the compression flag after the key
  128|    361|    const byte compressionFlag = data.read_uint8(keysize + 1);
  129|       |    // we get the compression method after the compression flag
  130|    361|    const byte compressionMethod = data.read_uint8(keysize + 2);
  131|       |
  132|    361|    enforce(compressionFlag == 0x00 || compressionFlag == 0x01, ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (132:13): [True: 316, False: 45]
  |  Branch (132:40): [True: 30, False: 15]
  ------------------
  133|    361|    if (compressionFlag == 0x01)
  ------------------
  |  Branch (133:9): [True: 30, False: 331]
  ------------------
  134|     30|      enforce(compressionMethod == 0x00, ErrorCode::kerFailedToReadImageData);
  135|       |
  136|       |    // language description string after the compression technique spec
  137|    361|    const size_t languageTextMaxSize = data.size() - keysize - 3;
  138|    361|    std::string languageText = string_from_unterminated(data.c_str(keysize + 3), languageTextMaxSize);
  139|    361|    const size_t languageTextSize = languageText.size();
  140|       |
  141|    361|    enforce(data.size() >= Safe::add(Safe::add(keysize, std::size_t{4}), languageTextSize),
  142|    361|            ErrorCode::kerCorruptedMetadata);
  143|       |    // translated keyword string after the language description
  144|    361|    std::string translatedKeyText = string_from_unterminated(data.c_str(keysize + 3 + languageTextSize + 1),
  145|    361|                                                             data.size() - (keysize + 3 + languageTextSize + 1));
  146|    361|    const size_t translatedKeyTextSize = translatedKeyText.size();
  147|       |
  148|    361|    enforce(Safe::add(keysize + 3 + languageTextSize + 1, Safe::add(translatedKeyTextSize, size_t{1})) <= data.size(),
  149|    361|            ErrorCode::kerCorruptedMetadata);
  150|       |
  151|    361|    const auto textsize =
  152|    361|        static_cast<long>(data.size() - (keysize + 3 + languageTextSize + 1 + translatedKeyTextSize + 1));
  153|    361|    if (textsize) {
  ------------------
  |  Branch (153:9): [True: 296, False: 65]
  ------------------
  154|    296|      const byte* text = data.c_data(keysize + 3 + languageTextSize + 1 + translatedKeyTextSize + 1);
  155|       |
  156|    296|      if (compressionFlag == 0x00) {
  ------------------
  |  Branch (156:11): [True: 276, False: 20]
  ------------------
  157|       |        // then it's an uncompressed iTXt chunk
  158|       |#ifdef EXIV2_DEBUG_MESSAGES
  159|       |        std::cout << "Exiv2::PngChunk::parseTXTChunk: We found an uncompressed iTXt field\n";
  160|       |#endif
  161|    276|        arr = DataBuf(text, textsize);
  162|    276|      } else {
  163|       |        // then it's a zlib compressed iTXt chunk
  164|       |#ifdef EXIV2_DEBUG_MESSAGES
  165|       |        std::cout << "Exiv2::PngChunk::parseTXTChunk: We found a zlib compressed iTXt field\n";
  166|       |#endif
  167|       |
  168|       |        // the compressed text comes after the translated keyword, but isn't null terminated
  169|     20|        zlibUncompress(text, textsize, arr);
  170|     20|      }
  171|    296|    }
  172|    361|  } else {
  173|       |#ifdef DEBUG
  174|       |    std::cerr << "Exiv2::PngChunk::parseTXTChunk: We found a field, not expected though\n";
  175|       |#endif
  176|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  177|      0|  }
  178|       |
  179|    909|  return arr;
  180|    921|}
_ZN5Exiv28Internal8PngChunk17parseChunkContentEPNS_5ImageEPKhmRKNS_7DataBufERKNS_12DecodeParamsE:
  183|    717|                                 const DecodeParams& dp) {
  184|       |  // We look if an ImageMagick EXIF raw profile exist.
  185|       |
  186|    717|  if (keySize >= 21 &&
  ------------------
  |  Branch (186:7): [True: 413, False: 304]
  ------------------
  187|    413|      (memcmp("Raw profile type exif", key, 21) == 0 || memcmp("Raw profile type APP1", key, 21) == 0) &&
  ------------------
  |  Branch (187:8): [True: 80, False: 333]
  |  Branch (187:57): [True: 18, False: 315]
  ------------------
  188|     98|      pImage->exifData().empty()) {
  ------------------
  |  Branch (188:7): [True: 98, False: 0]
  ------------------
  189|     98|    DataBuf exifData = readRawProfile(arr, false);
  190|     98|    size_t length = exifData.size();
  191|       |
  192|     98|    if (length >= 4) {  // length should have at least the size of TIFF header
  ------------------
  |  Branch (192:9): [True: 17, False: 81]
  ------------------
  193|       |      // Find the position of TIFF header in bytes array.
  194|       |      // Forgives the absence of the expected Exif\0 APP1 prefix.
  195|     17|      const std::array<byte, 4> tiffHeaderLE{0x49, 0x49, 0x2A, 0x00};  // "II*\0"
  196|     17|      const std::array<byte, 4> tiffHeaderBE{0x4D, 0x4D, 0x00, 0x2A};  // "MM\0*"
  197|     17|      size_t pos = std::numeric_limits<size_t>::max();
  198|       |
  199|       |      /// \todo Find substring inside an string
  200|    122|      for (size_t i = 0; i < length - tiffHeaderLE.size(); i++) {
  ------------------
  |  Branch (200:26): [True: 105, False: 17]
  ------------------
  201|    105|        if (0 == exifData.cmpBytes(i, tiffHeaderLE.data(), tiffHeaderLE.size()) ||
  ------------------
  |  Branch (201:13): [True: 0, False: 105]
  ------------------
  202|    105|            0 == exifData.cmpBytes(i, tiffHeaderBE.data(), tiffHeaderBE.size())) {
  ------------------
  |  Branch (202:13): [True: 0, False: 105]
  ------------------
  203|      0|          pos = i;
  204|      0|          break;
  205|      0|        }
  206|    105|      }
  207|       |
  208|       |      // If found it, store only these data at from this place.
  209|       |
  210|     17|      if (pos != std::numeric_limits<size_t>::max()) {
  ------------------
  |  Branch (210:11): [True: 0, False: 17]
  ------------------
  211|       |#ifdef EXIV2_DEBUG_MESSAGES
  212|       |        std::cout << "Exiv2::PngChunk::parseChunkContent: TIFF header found at position " << pos << "\n";
  213|       |#endif
  214|      0|        ByteOrder bo = TiffParser::decode(pImage->exifData(), pImage->iptcData(), pImage->xmpData(),
  215|      0|                                          exifData.c_data(pos), length - pos, dp);
  216|      0|        pImage->setByteOrder(bo);
  217|     17|      } else {
  218|     17|#ifndef SUPPRESS_WARNINGS
  219|     17|        EXV_WARNING << "Failed to decode Exif metadata.\n";
  ------------------
  |  |  138|     17|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 17]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     17|  LogMsg(LogMsg::warn).os()
  ------------------
  220|     17|#endif
  221|     17|        pImage->exifData().clear();
  222|     17|      }
  223|     17|    }
  224|     98|  }
  225|       |
  226|       |  // We look if an ImageMagick IPTC raw profile exist.
  227|       |
  228|    717|  if (keySize >= 21 && memcmp("Raw profile type iptc", key, 21) == 0 && pImage->iptcData().empty()) {
  ------------------
  |  Branch (228:7): [True: 390, False: 327]
  |  Branch (228:24): [True: 42, False: 348]
  |  Branch (228:73): [True: 42, False: 0]
  ------------------
  229|     42|    DataBuf psData = readRawProfile(arr, false);
  230|     42|    if (!psData.empty()) {
  ------------------
  |  Branch (230:9): [True: 7, False: 35]
  ------------------
  231|      7|      Blob iptcBlob;
  232|      7|      const byte* record = nullptr;
  233|      7|      uint32_t sizeIptc = 0;
  234|      7|      uint32_t sizeHdr = 0;
  235|       |
  236|      7|      const byte* pEnd = psData.c_data(psData.size() - 1);
  237|      7|      const byte* pCur = psData.c_data();
  238|      7|      while (pCur < pEnd && 0 == Photoshop::locateIptcIrb(pCur, pEnd - pCur, &record, sizeHdr, sizeIptc)) {
  ------------------
  |  Branch (238:14): [True: 4, False: 3]
  |  Branch (238:29): [True: 0, False: 4]
  ------------------
  239|      0|        if (sizeIptc) {
  ------------------
  |  Branch (239:13): [True: 0, False: 0]
  ------------------
  240|       |#ifdef EXIV2_DEBUG_MESSAGES
  241|       |          std::cerr << "Found IPTC IRB, size = " << sizeIptc << "\n";
  242|       |#endif
  243|      0|          append(iptcBlob, record + sizeHdr, sizeIptc);
  244|      0|        }
  245|      0|        pCur = record + sizeHdr + sizeIptc;
  246|      0|        pCur += (sizeIptc & 1);
  247|      0|      }
  248|      7|      if (!iptcBlob.empty() && IptcParser::decode(pImage->iptcData(), iptcBlob.data(), iptcBlob.size())) {
  ------------------
  |  Branch (248:11): [True: 0, False: 7]
  |  Branch (248:32): [True: 0, False: 0]
  ------------------
  249|      0|#ifndef SUPPRESS_WARNINGS
  250|      0|        EXV_WARNING << "Failed to decode IPTC metadata.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  251|      0|#endif
  252|      0|        pImage->clearIptcData();
  253|      0|      }
  254|       |      // If there is no IRB, try to decode the complete chunk data
  255|      7|      if (iptcBlob.empty() && IptcParser::decode(pImage->iptcData(), psData.c_data(), psData.size())) {
  ------------------
  |  Branch (255:11): [True: 7, False: 0]
  |  Branch (255:31): [True: 0, False: 7]
  ------------------
  256|      0|#ifndef SUPPRESS_WARNINGS
  257|      0|        EXV_WARNING << "Failed to decode IPTC metadata.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  258|      0|#endif
  259|      0|        pImage->clearIptcData();
  260|      0|      }
  261|      7|    }  // if (psData.size() > 0)
  262|     42|  }
  263|       |
  264|       |  // We look if an ImageMagick XMP raw profile exist.
  265|       |
  266|    717|  if (keySize >= 20 && memcmp("Raw profile type xmp", key, 20) == 0 && pImage->xmpData().empty()) {
  ------------------
  |  Branch (266:7): [True: 395, False: 322]
  |  Branch (266:24): [True: 41, False: 354]
  |  Branch (266:72): [True: 41, False: 0]
  ------------------
  267|     41|    DataBuf xmpBuf = readRawProfile(arr, false);
  268|     41|    size_t length = xmpBuf.size();
  269|       |
  270|     41|    if (length > 0) {
  ------------------
  |  Branch (270:9): [True: 12, False: 29]
  ------------------
  271|     12|      std::string& xmpPacket = pImage->xmpPacket();
  272|     12|      xmpPacket.assign(xmpBuf.c_str(), length);
  273|     12|      if (auto idx = xmpPacket.find_first_of('<'); idx != std::string::npos && idx > 0) {
  ------------------
  |  Branch (273:52): [True: 7, False: 5]
  |  Branch (273:80): [True: 6, False: 1]
  ------------------
  274|      6|#ifndef SUPPRESS_WARNINGS
  275|      6|        EXV_WARNING << "Removing " << idx << " characters from the beginning of the XMP packet\n";
  ------------------
  |  |  138|      6|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 6]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      6|  LogMsg(LogMsg::warn).os()
  ------------------
  276|      6|#endif
  277|      6|        xmpPacket = xmpPacket.substr(idx);
  278|      6|      }
  279|     12|      if (XmpParser::decode(pImage->xmpData(), xmpPacket, dp)) {
  ------------------
  |  Branch (279:11): [True: 12, False: 0]
  ------------------
  280|     12|#ifndef SUPPRESS_WARNINGS
  281|     12|        EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|     12|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 12]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     12|  LogMsg(LogMsg::warn).os()
  ------------------
  282|     12|#endif
  283|     12|      }
  284|     12|    }
  285|     41|  }
  286|       |
  287|       |  // We look if an Adobe XMP string exist.
  288|       |
  289|    717|  if (keySize >= 17 && memcmp("XML:com.adobe.xmp", key, 17) == 0 && pImage->xmpData().empty() && !arr.empty()) {
  ------------------
  |  Branch (289:7): [True: 453, False: 264]
  |  Branch (289:24): [True: 96, False: 357]
  |  Branch (289:69): [True: 88, False: 8]
  |  Branch (289:98): [True: 87, False: 1]
  ------------------
  290|     87|    std::string& xmpPacket = pImage->xmpPacket();
  291|     87|    xmpPacket.assign(arr.c_str(), arr.size());
  292|     87|    if (auto idx = xmpPacket.find_first_of('<'); idx != std::string::npos && idx > 0) {
  ------------------
  |  Branch (292:50): [True: 48, False: 39]
  |  Branch (292:78): [True: 47, False: 1]
  ------------------
  293|     47|#ifndef SUPPRESS_WARNINGS
  294|     47|      EXV_WARNING << "Removing " << idx << " characters "
  ------------------
  |  |  138|     47|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 47]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     47|  LogMsg(LogMsg::warn).os()
  ------------------
  295|      0|                  << "from the beginning of the XMP packet\n";
  296|     47|#endif
  297|     47|      xmpPacket = xmpPacket.substr(idx);
  298|     47|    }
  299|     87|    if (XmpParser::decode(pImage->xmpData(), xmpPacket, dp)) {
  ------------------
  |  Branch (299:9): [True: 66, False: 21]
  ------------------
  300|     66|#ifndef SUPPRESS_WARNINGS
  301|     66|      EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|     66|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 66]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     66|  LogMsg(LogMsg::warn).os()
  ------------------
  302|     66|#endif
  303|     66|    }
  304|     87|  }
  305|       |
  306|       |  // We look if a comments string exist. Note than we use only 'Description' keyword which
  307|       |  // is dedicated to store long comments. 'Comment' keyword is ignored.
  308|       |
  309|    717|  if (keySize >= 11 && memcmp("Description", key, 11) == 0 && pImage->comment().empty()) {
  ------------------
  |  Branch (309:7): [True: 592, False: 125]
  |  Branch (309:7): [True: 60, False: 657]
  |  Branch (309:24): [True: 174, False: 418]
  |  Branch (309:63): [True: 60, False: 114]
  ------------------
  310|     60|    pImage->setComment(std::string(arr.c_str(), arr.size()));
  311|     60|  }
  312|       |
  313|    717|}  // PngChunk::parseChunkContent
_ZN5Exiv28Internal8PngChunk17makeMetadataChunkENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEENS_10MetadataIdE:
  315|     93|std::string PngChunk::makeMetadataChunk(std::string_view metadata, MetadataId type) {
  316|     93|  std::string rawProfile;
  317|       |
  318|     93|  switch (type) {
  ------------------
  |  Branch (318:11): [True: 93, False: 0]
  ------------------
  319|     51|    case mdComment:
  ------------------
  |  Branch (319:5): [True: 51, False: 42]
  ------------------
  320|     51|      return makeUtf8TxtChunk("Description", metadata, true);
  321|      0|    case mdIptc:
  ------------------
  |  Branch (321:5): [True: 0, False: 93]
  ------------------
  322|      0|      rawProfile = writeRawProfile(metadata, "iptc");
  323|      0|      return makeAsciiTxtChunk("Raw profile type iptc", rawProfile, true);
  324|     42|    case mdXmp:
  ------------------
  |  Branch (324:5): [True: 42, False: 51]
  ------------------
  325|     42|      return makeUtf8TxtChunk("XML:com.adobe.xmp", metadata, false);
  326|      0|    case mdExif:
  ------------------
  |  Branch (326:5): [True: 0, False: 93]
  ------------------
  327|      0|    case mdIccProfile:
  ------------------
  |  Branch (327:5): [True: 0, False: 93]
  ------------------
  328|      0|    case mdNone:
  ------------------
  |  Branch (328:5): [True: 0, False: 93]
  ------------------
  329|      0|      return {};
  330|     93|  }
  331|       |
  332|      0|  return {};
  333|       |
  334|     93|}  // PngChunk::makeMetadataChunk
_ZN5Exiv28Internal8PngChunk14zlibUncompressEPKhjRNS_7DataBufE:
  336|     30|void PngChunk::zlibUncompress(const byte* compressedText, unsigned int compressedTextSize, DataBuf& arr) {
  337|     30|  uLongf uncompressedLen = compressedTextSize * 2;  // just a starting point
  338|     30|  int zlibResult = Z_BUF_ERROR;
  339|     30|  int dos = 0;
  340|       |
  341|     41|  while (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (341:10): [True: 40, False: 1]
  ------------------
  342|     40|    arr.alloc(uncompressedLen);
  343|     40|    zlibResult = uncompress(arr.data(), &uncompressedLen, compressedText, compressedTextSize);
  344|     40|    if (zlibResult == Z_OK) {
  ------------------
  |  Branch (344:9): [True: 1, False: 39]
  ------------------
  345|      1|      arr.resize(uncompressedLen);
  346|     39|    } else if (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (346:16): [True: 10, False: 29]
  ------------------
  347|       |      // the uncompressedArray needs to be larger
  348|     10|      uncompressedLen *= 2;
  349|       |      // DoS protection. can't be bigger than 64k
  350|     10|      if (uncompressedLen > 131072) {
  ------------------
  |  Branch (350:11): [True: 0, False: 10]
  ------------------
  351|      0|        if (++dos > 1)
  ------------------
  |  Branch (351:13): [True: 0, False: 0]
  ------------------
  352|      0|          break;
  353|      0|        uncompressedLen = 131072;
  354|      0|      }
  355|     29|    } else {
  356|       |      // something bad happened
  357|     29|      throw Error(ErrorCode::kerFailedToReadImageData);
  358|     29|    }
  359|     40|  }
  360|       |
  361|      1|  if (zlibResult != Z_OK) {
  ------------------
  |  Branch (361:7): [True: 0, False: 1]
  ------------------
  362|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  363|      0|  }
  364|      1|}  // PngChunk::zlibUncompress
_ZN5Exiv28Internal8PngChunk12zlibCompressENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEE:
  366|     51|std::string PngChunk::zlibCompress(std::string_view text) {
  367|     51|  auto compressedLen = static_cast<uLongf>(text.size() * 2);  // just a starting point
  368|     51|  int zlibResult = Z_BUF_ERROR;
  369|       |
  370|     51|  DataBuf arr;
  371|    135|  while (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (371:10): [True: 84, False: 51]
  ------------------
  372|     84|    arr.resize(compressedLen);
  373|     84|    zlibResult = compress2(arr.data(), &compressedLen, reinterpret_cast<const Bytef*>(text.data()),
  374|     84|                           static_cast<uLong>(text.size()), Z_BEST_COMPRESSION);
  375|       |
  376|     84|    switch (zlibResult) {
  377|     51|      case Z_OK:
  ------------------
  |  Branch (377:7): [True: 51, False: 33]
  ------------------
  378|     51|        arr.resize(compressedLen);
  379|     51|        break;
  380|     33|      case Z_BUF_ERROR:
  ------------------
  |  Branch (380:7): [True: 33, False: 51]
  ------------------
  381|       |        // The compressed array needs to be larger
  382|       |#ifdef EXIV2_DEBUG_MESSAGES
  383|       |        std::cout << "Exiv2::PngChunk::parsePngChunk: doubling size for compression.\n";
  384|       |#endif
  385|     33|        compressedLen *= 2;
  386|       |        // DoS protection. Cap max compressed size
  387|     33|        if (compressedLen > 131072)
  ------------------
  |  Branch (387:13): [True: 0, False: 33]
  ------------------
  388|      0|          throw Error(ErrorCode::kerFailedToReadImageData);
  389|     33|        break;
  390|     33|      default:
  ------------------
  |  Branch (390:7): [True: 0, False: 84]
  ------------------
  391|       |        // Something bad happened
  392|      0|        throw Error(ErrorCode::kerFailedToReadImageData);
  393|     84|    }
  394|     84|  }
  395|       |
  396|     51|  return {arr.c_str(), arr.size()};
  397|       |
  398|     51|}  // PngChunk::zlibCompress
_ZN5Exiv28Internal8PngChunk16makeUtf8TxtChunkENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEES6_b:
  436|     93|std::string PngChunk::makeUtf8TxtChunk(std::string_view keyword, std::string_view text, bool compress) {
  437|       |  // Chunk structure: length (4 bytes) + chunk type + chunk data + CRC (4 bytes)
  438|       |  // Length is the size of the chunk data
  439|       |  // CRC is calculated on chunk type + chunk data
  440|       |
  441|       |  // Chunk data format : keyword + 0x00 + compression flag (0x00: uncompressed - 0x01: compressed)
  442|       |  //                     + compression method (0x00: zlib format) + language tag (null) + 0x00
  443|       |  //                     + translated keyword (null) + 0x00 + text (compressed or not)
  444|       |
  445|       |  // Build chunk data, determine chunk type
  446|     93|  auto chunkData = std::string(keyword);
  447|     93|  if (compress) {
  ------------------
  |  Branch (447:7): [True: 51, False: 42]
  ------------------
  448|     51|    static const char flags[] = {0x00, 0x01, 0x00, 0x00, 0x00};
  449|     51|    chunkData += std::string(flags, 5) + zlibCompress(text);
  450|     51|  } else {
  451|     42|    static const char flags[] = {0x00, 0x00, 0x00, 0x00, 0x00};
  452|     42|    chunkData += std::string(flags, 5) + text.data();
  453|     42|  }
  454|       |  // Determine length of the chunk data
  455|     93|  byte length[4];
  456|     93|  ul2Data(length, static_cast<uint32_t>(chunkData.size()), bigEndian);
  457|       |  // Calculate CRC on chunk type and chunk data
  458|     93|  std::string chunkType = "iTXt";
  459|     93|  std::string crcData = chunkType + chunkData;
  460|     93|  uLong tmp = crc32(0L, Z_NULL, 0);
  461|     93|  tmp = crc32(tmp, reinterpret_cast<const Bytef*>(crcData.data()), static_cast<uInt>(crcData.size()));
  462|     93|  byte crc[4];
  463|     93|  ul2Data(crc, tmp, bigEndian);
  464|       |  // Assemble the chunk
  465|     93|  return std::string(reinterpret_cast<const char*>(length), 4) + chunkType + chunkData +
  466|     93|         std::string(reinterpret_cast<const char*>(crc), 4);
  467|       |
  468|     93|}  // PngChunk::makeUtf8TxtChunk
_ZN5Exiv28Internal8PngChunk14readRawProfileERKNS_7DataBufEb:
  470|    208|DataBuf PngChunk::readRawProfile(const DataBuf& text, bool iTXt) {
  471|    208|  DataBuf info;
  472|    208|  if (text.size() <= 1) {
  ------------------
  |  Branch (472:7): [True: 24, False: 184]
  ------------------
  473|     24|    return info;
  474|     24|  }
  475|       |
  476|    184|  const unsigned char unhex[103] = {
  477|    184|      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0, 0,
  478|    184|      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0, 0,
  479|    184|      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15,
  480|    184|  };
  481|       |
  482|    184|  if (iTXt) {
  ------------------
  |  Branch (482:7): [True: 12, False: 172]
  ------------------
  483|     12|    info.alloc(text.size());
  484|     12|    std::copy(text.begin(), text.end(), info.begin());
  485|     12|    return info;
  486|     12|  }
  487|       |
  488|    172|  const char* sp = text.c_str(1);                 // current byte (space pointer)
  489|    172|  const char* eot = text.c_str(text.size() - 1);  // end of text
  490|       |
  491|    172|  if (sp >= eot) {
  ------------------
  |  Branch (491:7): [True: 5, False: 167]
  ------------------
  492|      5|    return info;
  493|      5|  }
  494|       |
  495|       |  // Look for newline
  496|  9.18k|  while (*sp != '\n') {
  ------------------
  |  Branch (496:10): [True: 9.03k, False: 153]
  ------------------
  497|  9.03k|    sp++;
  498|  9.03k|    if (sp == eot) {
  ------------------
  |  Branch (498:9): [True: 14, False: 9.01k]
  ------------------
  499|     14|      return info;
  500|     14|    }
  501|  9.03k|  }
  502|    153|  sp++;  // step over '\n'
  503|    153|  if (sp == eot) {
  ------------------
  |  Branch (503:7): [True: 8, False: 145]
  ------------------
  504|      8|    return info;
  505|      8|  }
  506|       |
  507|       |  // Look for length
  508|  1.16k|  while (*sp == '\0' || *sp == ' ' || *sp == '\n') {
  ------------------
  |  Branch (508:10): [True: 449, False: 712]
  |  Branch (508:25): [True: 368, False: 344]
  |  Branch (508:39): [True: 209, False: 135]
  ------------------
  509|  1.02k|    sp++;
  510|  1.02k|    if (sp == eot) {
  ------------------
  |  Branch (510:9): [True: 10, False: 1.01k]
  ------------------
  511|     10|      return info;
  512|     10|    }
  513|  1.02k|  }
  514|       |
  515|       |  // Parse the length.
  516|    135|  size_t length = 0;
  517|    702|  while ('0' <= *sp && *sp <= '9') {
  ------------------
  |  Branch (517:10): [True: 650, False: 52]
  |  Branch (517:24): [True: 579, False: 71]
  ------------------
  518|       |    // Compute the new length using unsigned long, so that we can check for overflow.
  519|    579|    const size_t newlength = (10 * length) + (*sp - '0');
  520|    579|    length = newlength;
  521|    579|    sp++;
  522|    579|    if (sp == eot) {
  ------------------
  |  Branch (522:9): [True: 12, False: 567]
  ------------------
  523|     12|      return info;
  524|     12|    }
  525|    579|  }
  526|    123|  sp++;  // step over '\n'
  527|    123|  if (sp == eot) {
  ------------------
  |  Branch (527:7): [True: 5, False: 118]
  ------------------
  528|      5|    return info;
  529|      5|  }
  530|       |
  531|    118|  enforce(length <= static_cast<size_t>(eot - sp) / 2, Exiv2::ErrorCode::kerCorruptedMetadata);
  532|       |
  533|       |  // Allocate space
  534|    118|  if (length == 0) {
  ------------------
  |  Branch (534:7): [True: 25, False: 93]
  ------------------
  535|       |#ifdef EXIV2_DEBUG_MESSAGES
  536|       |    std::cerr << "Exiv2::PngChunk::readRawProfile: Unable To Copy Raw Profile: invalid profile length\n";
  537|       |#endif
  538|     25|  }
  539|    118|  info.alloc(length);
  540|    118|  if (info.size() != length) {
  ------------------
  |  Branch (540:7): [True: 0, False: 118]
  ------------------
  541|       |#ifdef EXIV2_DEBUG_MESSAGES
  542|       |    std::cerr << "Exiv2::PngChunk::readRawProfile: Unable To Copy Raw Profile: cannot allocate memory\n";
  543|       |#endif
  544|      0|    return info;
  545|      0|  }
  546|       |
  547|    118|  if (info.empty())  // Early return
  ------------------
  |  Branch (547:7): [True: 25, False: 93]
  ------------------
  548|     25|    return info;
  549|       |
  550|       |  // Copy profile, skipping white space and column 1 "=" signs
  551|     93|  unsigned char* dp = info.data();  // decode pointer
  552|     93|  size_t nibbles = length * 2;
  553|       |
  554|  1.34k|  for (size_t i = 0; i < nibbles; i++) {
  ------------------
  |  Branch (554:22): [True: 1.27k, False: 72]
  ------------------
  555|  1.27k|    enforce(sp < eot, Exiv2::ErrorCode::kerCorruptedMetadata);
  556|  4.23k|    while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f') {
  ------------------
  |  Branch (556:12): [True: 1.27k, False: 2.95k]
  |  Branch (556:26): [True: 2.28k, False: 676]
  |  Branch (556:39): [True: 722, False: 1.55k]
  |  Branch (556:53): [True: 1.00k, False: 1.23k]
  ------------------
  557|  2.98k|      if (*sp == '\0') {
  ------------------
  |  Branch (557:11): [True: 21, False: 2.95k]
  ------------------
  558|       |#ifdef EXIV2_DEBUG_MESSAGES
  559|       |        std::cerr << "Exiv2::PngChunk::readRawProfile: Unable To Copy Raw Profile: ran out of data\n";
  560|       |#endif
  561|     21|        return {};
  562|     21|      }
  563|       |
  564|  2.95k|      sp++;
  565|  2.95k|      enforce(sp < eot, Exiv2::ErrorCode::kerCorruptedMetadata);
  566|  2.95k|    }
  567|       |
  568|  1.25k|    if (i % 2 == 0)
  ------------------
  |  Branch (568:9): [True: 623, False: 627]
  ------------------
  569|    623|      *dp = static_cast<unsigned char>(16 * unhex[static_cast<size_t>(*sp++)]);
  570|    627|    else
  571|    627|      (*dp++) += unhex[static_cast<size_t>(*sp++)];
  572|  1.25k|  }
  573|       |
  574|     72|  return info;
  575|       |
  576|     93|}  // PngChunk::readRawProfile

_ZN5Exiv28PngImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   56|    888|    Image(ImageType::png, mdExif | mdIptc | mdXmp | mdComment, std::move(io), params) {
   57|    888|  if (params.create() && io_->open() == 0) {
  ------------------
  |  Branch (57:7): [True: 0, False: 888]
  |  Branch (57:26): [True: 0, False: 0]
  ------------------
   58|       |#ifdef EXIV2_DEBUG_MESSAGES
   59|       |    std::cerr << "Exiv2::PngImage:: Creating PNG image to memory\n";
   60|       |#endif
   61|      0|    IoCloser closer(*io_);
   62|      0|    if (io_->write(pngBlank, sizeof(pngBlank)) != sizeof(pngBlank)) {
  ------------------
  |  Branch (62:9): [True: 0, False: 0]
  ------------------
   63|       |#ifdef EXIV2_DEBUG_MESSAGES
   64|       |      std::cerr << "Exiv2::PngImage:: Failed to create PNG image on memory\n";
   65|       |#endif
   66|      0|    }
   67|      0|  }
   68|    888|}
_ZN5Exiv28PngImage14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  180|  2.04k|void PngImage::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
  181|  2.04k|  if (io_->open() != 0) {
  ------------------
  |  Branch (181:7): [True: 0, False: 2.04k]
  ------------------
  182|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  183|      0|  }
  184|  2.04k|  if (!isPngType(*io_, true)) {
  ------------------
  |  Branch (184:7): [True: 0, False: 2.04k]
  ------------------
  185|      0|    throw Error(ErrorCode::kerNotAnImage, "PNG");
  186|      0|  }
  187|       |
  188|  2.04k|  std::string chType(4, 0);
  189|       |
  190|  2.04k|  if (option == kpsBasic || option == kpsXMP || option == kpsIccProfile || option == kpsRecursive) {
  ------------------
  |  Branch (190:7): [True: 420, False: 1.62k]
  |  Branch (190:29): [True: 305, False: 1.31k]
  |  Branch (190:49): [True: 295, False: 1.02k]
  |  Branch (190:76): [True: 305, False: 715]
  ------------------
  191|  1.32k|    const auto xmpKey = upper("XML:com.adobe.xmp");
  192|  1.32k|    const auto exifKey = upper("Raw profile type exif");
  193|  1.32k|    const auto app1Key = upper("Raw profile type APP1");
  194|  1.32k|    const auto iptcKey = upper("Raw profile type iptc");
  195|  1.32k|    const auto softKey = upper("Software");
  196|  1.32k|    const auto commKey = upper("Comment");
  197|  1.32k|    const auto descKey = upper("Description");
  198|       |
  199|  1.32k|    bool bPrint = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (199:19): [True: 420, False: 905]
  |  Branch (199:41): [True: 305, False: 600]
  ------------------
  200|  1.32k|    if (bPrint) {
  ------------------
  |  Branch (200:9): [True: 725, False: 600]
  ------------------
  201|    725|      out << "STRUCTURE OF PNG FILE: " << io_->path() << '\n';
  202|    725|      out << " address | chunk |  length | data                           | checksum" << '\n';
  203|    725|    }
  204|       |
  205|  1.32k|    const size_t imgSize = io_->size();
  206|  1.32k|    DataBuf cheaderBuf(8);
  207|       |
  208|  13.0k|    while (!io_->eof() && chType != "IEND") {
  ------------------
  |  Branch (208:12): [True: 12.9k, False: 125]
  |  Branch (208:27): [True: 11.7k, False: 1.20k]
  ------------------
  209|  11.7k|      const size_t address = io_->tell();
  210|       |
  211|  11.7k|      size_t bufRead = io_->read(cheaderBuf.data(), cheaderBuf.size());
  212|  11.7k|      if (io_->error())
  ------------------
  |  Branch (212:11): [True: 0, False: 11.7k]
  ------------------
  213|      0|        throw Error(ErrorCode::kerFailedToReadImageData);
  214|  11.7k|      if (bufRead != cheaderBuf.size())
  ------------------
  |  Branch (214:11): [True: 0, False: 11.7k]
  ------------------
  215|      0|        throw Error(ErrorCode::kerInputDataReadFailed);
  216|       |
  217|       |      // Decode chunk data length.
  218|  11.7k|      const uint32_t dataOffset = cheaderBuf.read_uint32(0, Exiv2::bigEndian);
  219|  58.6k|      for (int i = 4; i < 8; i++) {
  ------------------
  |  Branch (219:23): [True: 46.9k, False: 11.7k]
  ------------------
  220|  46.9k|        chType[i - 4] = cheaderBuf.read_uint8(i);
  221|  46.9k|      }
  222|       |
  223|       |      // test that we haven't hit EOF, or wanting to read excessive data
  224|  11.7k|      const size_t restore = io_->tell();
  225|  11.7k|      if (dataOffset > imgSize - restore) {
  ------------------
  |  Branch (225:11): [True: 0, False: 11.7k]
  ------------------
  226|      0|        throw Exiv2::Error(ErrorCode::kerFailedToReadImageData);
  227|      0|      }
  228|       |
  229|  11.7k|      DataBuf buff(dataOffset);
  230|  11.7k|      if (dataOffset > 0) {
  ------------------
  |  Branch (230:11): [True: 3.19k, False: 8.52k]
  ------------------
  231|  3.19k|        bufRead = io_->read(buff.data(), dataOffset);
  232|  3.19k|        enforce(bufRead == dataOffset, ErrorCode::kerFailedToReadImageData);
  233|  3.19k|      }
  234|  11.7k|      io_->seek(restore, BasicIo::beg);
  235|       |
  236|       |      // format output
  237|  11.7k|      const int iMax = 30;
  238|  11.7k|      const auto blen = std::min<uint32_t>(iMax, dataOffset);
  239|  11.7k|      std::string dataString;
  240|       |      // if blen == 0 => slice construction fails
  241|  11.7k|      if (blen > 0) {
  ------------------
  |  Branch (241:11): [True: 3.19k, False: 8.52k]
  ------------------
  242|  3.19k|        std::stringstream ss;
  243|  3.19k|        ss << Internal::binaryToString(makeSlice(buff, 0, blen));
  244|  3.19k|        dataString = ss.str();
  245|  3.19k|      }
  246|   301k|      while (dataString.size() < iMax)
  ------------------
  |  Branch (246:14): [True: 289k, False: 11.7k]
  ------------------
  247|   289k|        dataString += ' ';
  248|  11.7k|      dataString.resize(iMax);
  249|       |
  250|  11.7k|      if (bPrint) {
  ------------------
  |  Branch (250:11): [True: 6.21k, False: 5.50k]
  ------------------
  251|  6.21k|        io_->seek(dataOffset, BasicIo::cur);  // jump to checksum
  252|  6.21k|        byte checksum[4];
  253|  6.21k|        bufRead = io_->read(checksum, 4);
  254|  6.21k|        enforce(bufRead == 4, ErrorCode::kerFailedToReadImageData);
  255|  6.21k|        io_->seek(restore, BasicIo::beg);  // restore file pointer
  256|       |
  257|  6.21k|        out << stringFormat("{:8} | {:<5} |{:8} | {}", address, chType, dataOffset, dataString)
  ------------------
  |  |   18|  6.21k|#define stringFormat std::format
  ------------------
  258|  6.21k|            << stringFormat(" | 0x{:02x}{:02x}{:02x}{:02x}\n", checksum[0], checksum[1], checksum[2], checksum[3]);
  ------------------
  |  |   18|  6.21k|#define stringFormat std::format
  ------------------
  259|  6.21k|      }
  260|       |
  261|       |      // chunk type
  262|  11.7k|      bool tEXt = chType == "tEXt";
  263|  11.7k|      bool zTXt = chType == "zTXt";
  264|  11.7k|      bool iCCP = chType == "iCCP";
  265|  11.7k|      bool iTXt = chType == "iTXt";
  266|  11.7k|      bool eXIf = chType == "eXIf";
  267|       |
  268|       |      // for XMP, ICC etc: read and format data
  269|  11.7k|      const auto dataStringU = upper(dataString);
  270|  11.7k|      bool bXMP = option == kpsXMP && findi(dataStringU, xmpKey) == 0;
  ------------------
  |  Branch (270:19): [True: 2.77k, False: 8.95k]
  |  Branch (270:39): [True: 45, False: 2.72k]
  ------------------
  271|  11.7k|      bool bExif = option == kpsRecursive && (findi(dataStringU, exifKey) == 0 || findi(dataStringU, app1Key) == 0);
  ------------------
  |  Branch (271:20): [True: 2.76k, False: 8.96k]
  |  Branch (271:47): [True: 6, False: 2.75k]
  |  Branch (271:83): [True: 13, False: 2.74k]
  ------------------
  272|  11.7k|      bool bIptc = option == kpsRecursive && findi(dataStringU, iptcKey) == 0;
  ------------------
  |  Branch (272:20): [True: 2.76k, False: 8.96k]
  |  Branch (272:46): [True: 11, False: 2.75k]
  ------------------
  273|  11.7k|      bool bSoft = option == kpsRecursive && findi(dataStringU, softKey) == 0;
  ------------------
  |  Branch (273:20): [True: 2.76k, False: 8.96k]
  |  Branch (273:46): [True: 6, False: 2.75k]
  ------------------
  274|  11.7k|      bool bComm = option == kpsRecursive && findi(dataStringU, commKey) == 0;
  ------------------
  |  Branch (274:20): [True: 2.76k, False: 8.96k]
  |  Branch (274:46): [True: 14, False: 2.75k]
  ------------------
  275|  11.7k|      bool bDesc = option == kpsRecursive && findi(dataStringU, descKey) == 0;
  ------------------
  |  Branch (275:20): [True: 2.76k, False: 8.96k]
  |  Branch (275:46): [True: 62, False: 2.70k]
  ------------------
  276|  11.7k|      bool bDump = bXMP || bExif || bIptc || bSoft || bComm || bDesc || iCCP || eXIf;
  ------------------
  |  Branch (276:20): [True: 160, False: 11.5k]
  |  Branch (276:28): [True: 19, False: 11.5k]
  |  Branch (276:37): [True: 11, False: 11.5k]
  |  Branch (276:46): [True: 6, False: 11.5k]
  |  Branch (276:55): [True: 14, False: 11.5k]
  |  Branch (276:64): [True: 62, False: 11.4k]
  |  Branch (276:73): [True: 248, False: 11.2k]
  |  Branch (276:81): [True: 0, False: 11.2k]
  ------------------
  277|       |
  278|  11.7k|      if (bDump) {
  ------------------
  |  Branch (278:11): [True: 405, False: 11.3k]
  ------------------
  279|    405|        DataBuf dataBuf;
  280|    405|        enforce(dataOffset < std::numeric_limits<uint32_t>::max(), ErrorCode::kerFailedToReadImageData);
  281|    405|        DataBuf data(dataOffset + 1ul);
  282|    405|        data.write_uint8(dataOffset, 0);
  283|    405|        bufRead = io_->read(data.data(), dataOffset);
  284|    405|        enforce(bufRead == dataOffset, ErrorCode::kerFailedToReadImageData);
  285|    405|        io_->seek(restore, BasicIo::beg);
  286|    405|        size_t name_l = std::strlen(data.c_str()) + 1;  // leading string length
  287|    405|        enforce(name_l < dataOffset, ErrorCode::kerCorruptedMetadata);
  288|       |
  289|    405|        auto start = static_cast<uint32_t>(name_l);
  290|    405|        bool bLF = false;
  291|       |
  292|       |        // decode the chunk
  293|    405|        bool bGood = false;
  294|    405|        if (tEXt) {
  ------------------
  |  Branch (294:13): [True: 100, False: 305]
  ------------------
  295|    100|          bGood = tEXtToDataBuf(data.c_data(name_l), dataOffset - name_l, dataBuf);
  296|    100|        }
  297|    405|        if (zTXt || iCCP) {
  ------------------
  |  Branch (297:13): [True: 6, False: 399]
  |  Branch (297:21): [True: 250, False: 149]
  ------------------
  298|    251|          enforce(dataOffset - name_l - 1 <= std::numeric_limits<uLongf>::max(), ErrorCode::kerCorruptedMetadata);
  299|    251|          bGood = zlibToDataBuf(data.c_data(name_l + 1), static_cast<uLongf>(dataOffset - name_l - 1),
  300|    251|                                dataBuf);  // +1 = 'compressed' flag
  301|    251|        }
  302|    405|        if (iTXt) {
  ------------------
  |  Branch (302:13): [True: 42, False: 363]
  ------------------
  303|     42|          bGood = (3 <= dataOffset) && (start < dataOffset - 3);  // good if not a nul chunk
  ------------------
  |  Branch (303:19): [True: 42, False: 0]
  |  Branch (303:40): [True: 42, False: 0]
  ------------------
  304|     42|        }
  305|    405|        if (eXIf) {
  ------------------
  |  Branch (305:13): [True: 0, False: 405]
  ------------------
  306|      0|          bGood = true;  // eXIf requires no pre-processing
  307|      0|        }
  308|       |
  309|       |        // format is content dependent
  310|    405|        if (bGood) {
  ------------------
  |  Branch (310:13): [True: 157, False: 248]
  ------------------
  311|    157|          if (bXMP) {
  ------------------
  |  Branch (311:15): [True: 44, False: 113]
  ------------------
  312|    773|            while (start < dataOffset && !data.read_uint8(start))
  ------------------
  |  Branch (312:20): [True: 770, False: 3]
  |  Branch (312:42): [True: 729, False: 41]
  ------------------
  313|    729|              start++;                  // skip leading nul bytes
  314|     44|            out << data.c_data(start);  // output the xmp
  315|     44|          }
  316|       |
  317|    157|          if (bExif || bIptc) {
  ------------------
  |  Branch (317:15): [True: 16, False: 141]
  |  Branch (317:24): [True: 11, False: 130]
  ------------------
  318|     27|            DataBuf parsedBuf = PngChunk::readRawProfile(dataBuf, tEXt);
  319|       |#ifdef EXIV2_DEBUG_MESSAGES
  320|       |            std::cerr << Exiv2::Internal::binaryToString(
  321|       |                             makeSlice(parsedBuf.c_data(), std::min<size_t>(50, parsedBuf.size()), 0))
  322|       |                      << '\n';
  323|       |#endif
  324|     27|            if (!parsedBuf.empty()) {
  ------------------
  |  Branch (324:17): [True: 12, False: 15]
  ------------------
  325|     12|              if (bExif) {
  ------------------
  |  Branch (325:19): [True: 4, False: 8]
  ------------------
  326|       |                // check for expected "Exif\0\0" APP1 identifier, punt otherwise
  327|      4|                size_t offset = 0;
  328|      4|                std::array<byte, 6> exifId{0x45, 0x78, 0x69, 0x66, 0x00, 0x00};  // "Exif\0\0"
  329|      4|                if (0 == parsedBuf.cmpBytes(0, exifId.data(), exifId.size())) {
  ------------------
  |  Branch (329:21): [True: 0, False: 4]
  ------------------
  330|      0|                  offset = 6;
  331|      0|                }
  332|       |                // create memio object with the data, then print the structure
  333|      4|                MemIo p(parsedBuf.c_data(offset), parsedBuf.size() - offset);
  334|      4|                printTiffStructure(p, out, option, depth + 1);
  335|      4|              }
  336|     12|              if (bIptc) {
  ------------------
  |  Branch (336:19): [True: 8, False: 4]
  ------------------
  337|      8|                IptcData::printStructure(out, makeSlice(parsedBuf, 0, parsedBuf.size()), depth);
  338|      8|              }
  339|     12|            }
  340|     27|          }
  341|       |
  342|    157|          if (bSoft && !dataBuf.empty()) {
  ------------------
  |  Branch (342:15): [True: 5, False: 152]
  |  Branch (342:24): [True: 4, False: 1]
  ------------------
  343|      4|            DataBuf s(dataBuf.size() + 1);                         // allocate buffer with an extra byte
  344|      4|            std::copy(dataBuf.begin(), dataBuf.end(), s.begin());  // copy in the dataBuf
  345|      4|            s.write_uint8(dataBuf.size(), 0);                      // nul terminate it
  346|      4|            const auto str = s.c_str();                            // give it name
  347|      4|            out << Internal::indent(depth) << buff.c_str() << ": " << str;
  348|      4|            bLF = true;
  349|      4|          }
  350|       |
  351|    157|          if ((iCCP && option == kpsIccProfile) || bComm) {
  ------------------
  |  Branch (351:16): [True: 15, False: 142]
  |  Branch (351:24): [True: 3, False: 12]
  |  Branch (351:52): [True: 11, False: 138]
  ------------------
  352|     14|            out.write(dataBuf.c_str(), dataBuf.size());
  353|     14|            bLF = bComm;
  354|     14|          }
  355|       |
  356|    157|          if (bDesc && iTXt) {
  ------------------
  |  Branch (356:15): [True: 55, False: 102]
  |  Branch (356:24): [True: 11, False: 44]
  ------------------
  357|     11|            DataBuf decoded = PngChunk::decodeTXTChunk(buff, PngChunk::iTXt_Chunk);
  358|     11|            out.write(decoded.c_str(), decoded.size());
  359|     11|            bLF = true;
  360|     11|          }
  361|       |
  362|    157|          if (eXIf && option == kpsRecursive) {
  ------------------
  |  Branch (362:15): [True: 0, False: 157]
  |  Branch (362:23): [True: 0, False: 0]
  ------------------
  363|       |            // create memio object with the data, then print the structure
  364|      0|            MemIo p(data.c_data(), dataOffset);
  365|      0|            printTiffStructure(p, out, option, depth + 1);
  366|      0|          }
  367|       |
  368|    157|          if (bLF)
  ------------------
  |  Branch (368:15): [True: 26, False: 131]
  ------------------
  369|     26|            out << '\n';
  370|    157|        }
  371|    405|      }
  372|  11.7k|      io_->seek(dataOffset + 4, BasicIo::cur);  // jump past checksum
  373|  11.7k|      if (io_->error())
  ------------------
  |  Branch (373:11): [True: 0, False: 11.7k]
  ------------------
  374|      0|        throw Error(ErrorCode::kerFailedToReadImageData);
  375|  11.7k|    }
  376|  1.32k|  }
  377|  2.04k|}
_ZN5Exiv28PngImage12readMetadataEv:
  392|    888|void PngImage::readMetadata() {
  393|       |#ifdef EXIV2_DEBUG_MESSAGES
  394|       |  std::cerr << "Exiv2::PngImage::readMetadata: Reading PNG file " << io_->path() << '\n';
  395|       |#endif
  396|    888|  if (io_->open() != 0) {
  ------------------
  |  Branch (396:7): [True: 0, False: 888]
  ------------------
  397|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  398|      0|  }
  399|    888|  IoCloser closer(*io_);
  400|    888|  if (!isPngType(*io_, true)) {
  ------------------
  |  Branch (400:7): [True: 0, False: 888]
  ------------------
  401|      0|    throw Error(ErrorCode::kerNotAnImage, "PNG");
  402|      0|  }
  403|    888|  clearMetadata();
  404|       |
  405|    888|  const size_t imgSize = io_->size();
  406|    888|  DataBuf cheaderBuf(8);  // Chunk header: 4 bytes (data size) + 4 bytes (chunk type).
  407|    888|  const DecodeParams dp(max_recursion_depth_);
  408|       |
  409|  93.4k|  while (!io_->eof()) {
  ------------------
  |  Branch (409:10): [True: 93.1k, False: 240]
  ------------------
  410|  93.1k|    readChunk(cheaderBuf, *io_);  // Read chunk header.
  411|       |
  412|       |    // Decode chunk data length.
  413|  93.1k|    uint32_t chunkLength = cheaderBuf.read_uint32(0, Exiv2::bigEndian);
  414|  93.1k|    if (chunkLength > imgSize - io_->tell()) {
  ------------------
  |  Branch (414:9): [True: 139, False: 93.0k]
  ------------------
  415|    139|      throw Exiv2::Error(ErrorCode::kerFailedToReadImageData);
  416|    139|    }
  417|       |
  418|  93.0k|    std::string chunkType(cheaderBuf.c_str(4), 4);
  419|       |#ifdef EXIV2_DEBUG_MESSAGES
  420|       |    std::cout << "Exiv2::PngImage::readMetadata: chunk type: " << chunkType << " length: " << chunkLength << '\n';
  421|       |#endif
  422|       |
  423|       |    /// \todo analyse remaining chunks of the standard
  424|       |    // Perform a chunk triage for item that we need.
  425|  93.0k|    if (chunkType == "IEND" || chunkType == "IHDR" || chunkType == "tEXt" || chunkType == "zTXt" ||
  ------------------
  |  Branch (425:9): [True: 484, False: 92.5k]
  |  Branch (425:32): [True: 386, False: 92.1k]
  |  Branch (425:55): [True: 473, False: 91.7k]
  |  Branch (425:78): [True: 96, False: 91.6k]
  ------------------
  426|  91.6k|        chunkType == "eXIf" || chunkType == "iTXt" || chunkType == "iCCP") {
  ------------------
  |  Branch (426:9): [True: 132, False: 91.4k]
  |  Branch (426:32): [True: 359, False: 91.1k]
  |  Branch (426:55): [True: 264, False: 90.8k]
  ------------------
  427|  2.13k|      DataBuf chunkData(chunkLength);
  428|  2.13k|      if (chunkLength > 0) {
  ------------------
  |  Branch (428:11): [True: 1.55k, False: 584]
  ------------------
  429|  1.55k|        readChunk(chunkData, *io_);  // Extract chunk data.
  430|  1.55k|      }
  431|       |
  432|  2.13k|      if (chunkType == "IEND") {
  ------------------
  |  Branch (432:11): [True: 425, False: 1.71k]
  ------------------
  433|    425|        return;  // Last chunk found: we stop parsing.
  434|    425|      }
  435|  1.71k|      if (chunkType == "IHDR" && chunkData.size() >= 8) {
  ------------------
  |  Branch (435:11): [True: 386, False: 1.32k]
  |  Branch (435:34): [True: 79, False: 307]
  ------------------
  436|     79|        PngChunk::decodeIHDRChunk(chunkData, &pixelWidth_, &pixelHeight_);
  437|  1.63k|      } else if (chunkType == "tEXt") {
  ------------------
  |  Branch (437:18): [True: 473, False: 1.15k]
  ------------------
  438|    473|        PngChunk::decodeTXTChunk(this, chunkData, PngChunk::tEXt_Chunk, dp);
  439|  1.15k|      } else if (chunkType == "zTXt") {
  ------------------
  |  Branch (439:18): [True: 96, False: 1.06k]
  ------------------
  440|     96|        PngChunk::decodeTXTChunk(this, chunkData, PngChunk::zTXt_Chunk, dp);
  441|  1.06k|      } else if (chunkType == "iTXt") {
  ------------------
  |  Branch (441:18): [True: 359, False: 703]
  ------------------
  442|    359|        PngChunk::decodeTXTChunk(this, chunkData, PngChunk::iTXt_Chunk, dp);
  443|    703|      } else if (chunkType == "eXIf") {
  ------------------
  |  Branch (443:18): [True: 132, False: 571]
  ------------------
  444|    132|        ByteOrder bo = TiffParser::decode(exifData(), iptcData(), xmpData(), chunkData.c_data(), chunkData.size(), dp);
  445|    132|        setByteOrder(bo);
  446|    571|      } else if (chunkType == "iCCP") {
  ------------------
  |  Branch (446:18): [True: 264, False: 307]
  ------------------
  447|       |        // The ICC profile name can vary from 1-79 characters.
  448|    264|        uint32_t iccOffset = 0;
  449|  2.57k|        do {
  450|  2.57k|          enforce(iccOffset < 80 && iccOffset < chunkLength, Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (450:19): [True: 2.57k, False: 0]
  |  Branch (450:37): [True: 2.56k, False: 7]
  ------------------
  451|  2.57k|        } while (chunkData.read_uint8(iccOffset++) != 0x00);
  ------------------
  |  Branch (451:18): [True: 2.30k, False: 264]
  ------------------
  452|       |
  453|    264|        profileName_ = std::string(chunkData.c_str(), iccOffset - 1);
  454|    264|        ++iccOffset;  // +1 = 'compressed' flag
  455|    264|        enforce(iccOffset <= chunkLength, Exiv2::ErrorCode::kerCorruptedMetadata);
  456|       |
  457|    264|        zlibToDataBuf(chunkData.c_data(iccOffset), static_cast<uLongf>(chunkLength - iccOffset), iccProfile_);
  458|       |#ifdef EXIV2_DEBUG_MESSAGES
  459|       |        std::cout << "Exiv2::PngImage::readMetadata: profile name: " << profileName_ << '\n';
  460|       |        std::cout << "Exiv2::PngImage::readMetadata: iccProfile.size_ (uncompressed) : " << iccProfile_.size() << '\n';
  461|       |#endif
  462|    264|      }
  463|       |
  464|       |      // Set chunkLength to 0 in case we have read a supported chunk type. Otherwise, we need to seek the
  465|       |      // file to the next chunk position.
  466|  1.71k|      chunkLength = 0;
  467|  1.71k|    }
  468|       |
  469|       |    // Move to the next chunk: chunk data size + 4 CRC bytes.
  470|       |#ifdef EXIV2_DEBUG_MESSAGES
  471|       |    std::cout << "Exiv2::PngImage::readMetadata: Seek to offset: " << chunkLength + 4 << '\n';
  472|       |#endif
  473|  92.6k|    io_->seek(chunkLength + 4, BasicIo::cur);
  474|  92.6k|    if (io_->error() || io_->eof()) {
  ------------------
  |  Branch (474:9): [True: 240, False: 92.3k]
  |  Branch (474:25): [True: 84, False: 92.3k]
  ------------------
  475|     84|      throw Error(ErrorCode::kerFailedToReadImageData);
  476|     84|    }
  477|  92.6k|  }
  478|    888|}  // PngImage::readMetadata
_ZN5Exiv28PngImage13writeMetadataEv:
  480|    295|void PngImage::writeMetadata() {
  481|    295|  if (io_->open() != 0) {
  ------------------
  |  Branch (481:7): [True: 0, False: 295]
  ------------------
  482|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  483|      0|  }
  484|    295|  IoCloser closer(*io_);
  485|    295|  MemIo tempIo;
  486|       |
  487|    295|  doWriteMetadata(tempIo);  // may throw
  488|    295|  io_->close();
  489|    295|  io_->transfer(tempIo);  // may throw
  490|       |
  491|    295|}  // PngImage::writeMetadata
_ZN5Exiv28PngImage15doWriteMetadataERNS_7BasicIoE:
  493|    295|void PngImage::doWriteMetadata(BasicIo& outIo) {
  494|    295|  if (!io_->isopen())
  ------------------
  |  Branch (494:7): [True: 0, False: 295]
  ------------------
  495|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  496|    295|  if (!outIo.isopen())
  ------------------
  |  Branch (496:7): [True: 0, False: 295]
  ------------------
  497|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  498|       |
  499|       |#ifdef EXIV2_DEBUG_MESSAGES
  500|       |  std::cout << "Exiv2::PngImage::doWriteMetadata: Writing PNG file " << io_->path() << "\n";
  501|       |  std::cout << "Exiv2::PngImage::doWriteMetadata: tmp file created " << outIo.path() << "\n";
  502|       |#endif
  503|       |
  504|    295|  if (!isPngType(*io_, true)) {
  ------------------
  |  Branch (504:7): [True: 0, False: 295]
  ------------------
  505|      0|    throw Error(ErrorCode::kerNoImageInInputData);
  506|      0|  }
  507|       |
  508|       |  // Write PNG Signature.
  509|    295|  if (outIo.write(pngSignature.data(), 8) != 8)
  ------------------
  |  Branch (509:7): [True: 0, False: 295]
  ------------------
  510|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  511|       |
  512|    295|  DataBuf cheaderBuf(8);  // Chunk header : 4 bytes (data size) + 4 bytes (chunk type).
  513|       |
  514|  2.73k|  while (!io_->eof()) {
  ------------------
  |  Branch (514:10): [True: 2.73k, False: 0]
  ------------------
  515|       |    // Read chunk header.
  516|  2.73k|    size_t bufRead = io_->read(cheaderBuf.data(), 8);
  517|  2.73k|    if (io_->error())
  ------------------
  |  Branch (517:9): [True: 0, False: 2.73k]
  ------------------
  518|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  519|  2.73k|    if (bufRead != 8)
  ------------------
  |  Branch (519:9): [True: 0, False: 2.73k]
  ------------------
  520|      0|      throw Error(ErrorCode::kerInputDataReadFailed);
  521|       |
  522|       |    // Decode chunk data length.
  523|       |
  524|  2.73k|    uint32_t dataOffset = cheaderBuf.read_uint32(0, Exiv2::bigEndian);
  525|  2.73k|    if (dataOffset > 0x7FFFFFFF)
  ------------------
  |  Branch (525:9): [True: 0, False: 2.73k]
  ------------------
  526|      0|      throw Exiv2::Error(ErrorCode::kerFailedToReadImageData);
  527|       |
  528|       |    // Read whole chunk : Chunk header + Chunk data (not fixed size - can be null) + CRC (4 bytes).
  529|       |
  530|  2.73k|    DataBuf chunkBuf(8 + dataOffset + 4);  // Chunk header (8 bytes) + Chunk data + CRC (4 bytes).
  531|  2.73k|    std::copy(cheaderBuf.begin(), cheaderBuf.end(), chunkBuf.begin());  // Copy header.
  532|  2.73k|    bufRead = io_->read(chunkBuf.data(8), dataOffset + 4);              // Extract chunk data + CRC
  533|  2.73k|    if (io_->error())
  ------------------
  |  Branch (533:9): [True: 0, False: 2.73k]
  ------------------
  534|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  535|  2.73k|    if (bufRead != dataOffset + 4)
  ------------------
  |  Branch (535:9): [True: 0, False: 2.73k]
  ------------------
  536|      0|      throw Error(ErrorCode::kerInputDataReadFailed);
  537|       |
  538|  2.73k|    const std::string szChunk(cheaderBuf.begin() + 4, cheaderBuf.end());
  539|       |
  540|  2.73k|    if (szChunk == "IEND") {
  ------------------
  |  Branch (540:9): [True: 295, False: 2.44k]
  ------------------
  541|       |      // Last chunk found: we write it and done.
  542|       |#ifdef EXIV2_DEBUG_MESSAGES
  543|       |      std::cout << "Exiv2::PngImage::doWriteMetadata: Write IEND chunk (length: " << dataOffset << ")\n";
  544|       |#endif
  545|    295|      if (outIo.write(chunkBuf.data(), chunkBuf.size()) != chunkBuf.size())
  ------------------
  |  Branch (545:11): [True: 0, False: 295]
  ------------------
  546|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  547|    295|      return;
  548|    295|    }
  549|  2.44k|    if (szChunk == "eXIf" || szChunk == "iCCP") {
  ------------------
  |  Branch (549:9): [True: 0, False: 2.44k]
  |  Branch (549:30): [True: 61, False: 2.37k]
  ------------------
  550|       |      // do nothing (strip): Exif metadata is written following IHDR
  551|       |      // together with the ICC profile as fresh eXIf and iCCP chunks
  552|       |#ifdef EXIV2_DEBUG_MESSAGES
  553|       |      std::cout << "Exiv2::PngImage::doWriteMetadata: strip " << szChunk << " chunk (length: " << dataOffset << ")"
  554|       |                << '\n';
  555|       |#endif
  556|  2.37k|    } else if (szChunk == "IHDR") {
  ------------------
  |  Branch (556:16): [True: 214, False: 2.16k]
  ------------------
  557|       |#ifdef EXIV2_DEBUG_MESSAGES
  558|       |      std::cout << "Exiv2::PngImage::doWriteMetadata: Write IHDR chunk (length: " << dataOffset << ")\n";
  559|       |#endif
  560|    214|      if (outIo.write(chunkBuf.data(), chunkBuf.size()) != chunkBuf.size())
  ------------------
  |  Branch (560:11): [True: 0, False: 214]
  ------------------
  561|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  562|       |
  563|       |      // Write all updated metadata here, just after IHDR.
  564|    214|      if (!comment_.empty()) {
  ------------------
  |  Branch (564:11): [True: 51, False: 163]
  ------------------
  565|       |        // Update Comment data to a new PNG chunk
  566|     51|        std::string chunk = PngChunk::makeMetadataChunk(comment_, mdComment);
  567|     51|        if (outIo.write(reinterpret_cast<const byte*>(chunk.data()), chunk.size()) != chunk.size()) {
  ------------------
  |  Branch (567:13): [True: 0, False: 51]
  ------------------
  568|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  569|      0|        }
  570|     51|      }
  571|       |
  572|    214|      if (!exifData_.empty()) {
  ------------------
  |  Branch (572:11): [True: 0, False: 214]
  ------------------
  573|       |        // Update Exif data to a new PNG chunk
  574|      0|        Blob blob;
  575|      0|        ExifParser::encode(blob, littleEndian, exifData_);
  576|      0|        if (!blob.empty()) {
  ------------------
  |  Branch (576:13): [True: 0, False: 0]
  ------------------
  577|      0|          byte length[4];
  578|      0|          ul2Data(length, static_cast<uint32_t>(blob.size()), bigEndian);
  579|       |
  580|       |          // calculate CRC
  581|      0|          uLong tmp = crc32(0L, Z_NULL, 0);
  582|      0|          tmp = crc32(tmp, typeExif, 4);
  583|      0|          tmp = crc32(tmp, blob.data(), static_cast<uint32_t>(blob.size()));
  584|      0|          byte crc[4];
  585|      0|          ul2Data(crc, tmp, bigEndian);
  586|       |
  587|      0|          if (outIo.write(length, 4) != 4 || outIo.write(typeExif, 4) != 4 ||
  ------------------
  |  Branch (587:15): [True: 0, False: 0]
  |  Branch (587:46): [True: 0, False: 0]
  ------------------
  588|      0|              outIo.write(blob.data(), blob.size()) != blob.size() || outIo.write(crc, 4) != 4) {
  ------------------
  |  Branch (588:15): [True: 0, False: 0]
  |  Branch (588:71): [True: 0, False: 0]
  ------------------
  589|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  590|      0|          }
  591|       |#ifdef EXIV2_DEBUG_MESSAGES
  592|       |          std::cout << "Exiv2::PngImage::doWriteMetadata: build eXIf"
  593|       |                    << " chunk (length: " << blob.size() << ")" << '\n';
  594|       |#endif
  595|      0|        }
  596|      0|      }
  597|       |
  598|    214|      if (!iptcData_.empty()) {
  ------------------
  |  Branch (598:11): [True: 0, False: 214]
  ------------------
  599|       |        // Update IPTC data to a new PNG chunk
  600|      0|        DataBuf newPsData = Photoshop::setIptcIrb(nullptr, 0, iptcData_);
  601|      0|        if (!newPsData.empty()) {
  ------------------
  |  Branch (601:13): [True: 0, False: 0]
  ------------------
  602|      0|          std::string rawIptc(newPsData.c_str(), newPsData.size());
  603|      0|          std::string chunk = PngChunk::makeMetadataChunk(rawIptc, mdIptc);
  604|      0|          if (outIo.write(reinterpret_cast<const byte*>(chunk.data()), chunk.size()) != chunk.size()) {
  ------------------
  |  Branch (604:15): [True: 0, False: 0]
  ------------------
  605|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  606|      0|          }
  607|      0|        }
  608|      0|      }
  609|       |
  610|    214|      if (iccProfileDefined()) {
  ------------------
  |  Branch (610:11): [True: 87, False: 127]
  ------------------
  611|     87|        DataBuf compressed;
  612|     87|        enforce(iccProfile_.size() <= std::numeric_limits<uLongf>::max(), ErrorCode::kerCorruptedMetadata);
  613|     87|        if (zlibToCompressed(iccProfile_.c_data(), static_cast<uLongf>(iccProfile_.size()), compressed)) {
  ------------------
  |  Branch (613:13): [True: 87, False: 0]
  ------------------
  614|     87|          const auto nameLength = static_cast<uint32_t>(profileName_.size());
  615|     87|          const uint32_t chunkLength = nameLength + 2 + static_cast<uint32_t>(compressed.size());
  616|     87|          byte length[4];
  617|     87|          ul2Data(length, chunkLength, bigEndian);
  618|       |
  619|       |          // calculate CRC
  620|     87|          uLong tmp = crc32(0L, Z_NULL, 0);
  621|     87|          tmp = crc32(tmp, typeICCP, 4);
  622|     87|          tmp = crc32(tmp, reinterpret_cast<const Bytef*>(profileName_.data()), nameLength);
  623|     87|          tmp = crc32(tmp, nullComp, 2);
  624|     87|          tmp = crc32(tmp, compressed.c_data(), static_cast<uint32_t>(compressed.size()));
  625|     87|          byte crc[4];
  626|     87|          ul2Data(crc, tmp, bigEndian);
  627|       |
  628|     87|          if (outIo.write(length, 4) != 4 || outIo.write(typeICCP, 4) != 4 ||
  ------------------
  |  Branch (628:15): [True: 0, False: 87]
  |  Branch (628:46): [True: 0, False: 87]
  ------------------
  629|     87|              outIo.write(reinterpret_cast<const byte*>(profileName_.data()), nameLength) != nameLength ||
  ------------------
  |  Branch (629:15): [True: 0, False: 87]
  ------------------
  630|     87|              outIo.write(nullComp, 2) != 2 ||
  ------------------
  |  Branch (630:15): [True: 0, False: 87]
  ------------------
  631|     87|              outIo.write(compressed.c_data(), compressed.size()) != compressed.size() || outIo.write(crc, 4) != 4) {
  ------------------
  |  Branch (631:15): [True: 0, False: 87]
  |  Branch (631:91): [True: 0, False: 87]
  ------------------
  632|      0|            throw Error(ErrorCode::kerImageWriteFailed);
  633|      0|          }
  634|       |#ifdef EXIV2_DEBUG_MESSAGES
  635|       |          std::cout << "Exiv2::PngImage::doWriteMetadata: build iCCP"
  636|       |                    << " chunk (length: " << chunkLength << ")" << '\n';
  637|       |#endif
  638|     87|        }
  639|     87|      }
  640|       |
  641|    214|      if (!writeXmpFromPacket() && XmpParser::encode(xmpPacket_, xmpData_) > 1) {
  ------------------
  |  Branch (641:11): [True: 214, False: 0]
  |  Branch (641:36): [True: 0, False: 214]
  ------------------
  642|      0|#ifndef SUPPRESS_WARNINGS
  643|      0|        EXV_ERROR << "Failed to encode XMP metadata.\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  644|      0|#endif
  645|      0|      }
  646|    214|      if (!xmpPacket_.empty()) {
  ------------------
  |  Branch (646:11): [True: 42, False: 172]
  ------------------
  647|       |        // Update XMP data to a new PNG chunk
  648|     42|        std::string chunk = PngChunk::makeMetadataChunk(xmpPacket_, mdXmp);
  649|     42|        if (outIo.write(reinterpret_cast<const byte*>(chunk.data()), chunk.size()) != chunk.size()) {
  ------------------
  |  Branch (649:13): [True: 0, False: 42]
  ------------------
  650|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  651|      0|        }
  652|     42|      }
  653|  2.16k|    } else if (szChunk == "tEXt" || szChunk == "zTXt" || szChunk == "iTXt") {
  ------------------
  |  Branch (653:16): [True: 180, False: 1.98k]
  |  Branch (653:37): [True: 25, False: 1.96k]
  |  Branch (653:58): [True: 53, False: 1.90k]
  ------------------
  654|    258|      DataBuf key = PngChunk::keyTXTChunk(chunkBuf, true);
  655|    258|      if (!key.empty() && (compare("Raw profile type exif", key) || compare("Raw profile type APP1", key) ||
  ------------------
  |  Branch (655:11): [True: 221, False: 37]
  |  Branch (655:28): [True: 3, False: 218]
  |  Branch (655:69): [True: 10, False: 208]
  ------------------
  656|    208|                           compare("Raw profile type iptc", key) || compare("Raw profile type xmp", key) ||
  ------------------
  |  Branch (656:28): [True: 10, False: 198]
  |  Branch (656:69): [True: 1, False: 197]
  ------------------
  657|    197|                           compare("XML:com.adobe.xmp", key) || compare("Description", key))) {
  ------------------
  |  Branch (657:28): [True: 43, False: 154]
  |  Branch (657:65): [True: 65, False: 89]
  ------------------
  658|       |#ifdef EXIV2_DEBUG_MESSAGES
  659|       |        std::cout << "Exiv2::PngImage::doWriteMetadata: strip " << szChunk << " chunk (length: " << dataOffset << ")"
  660|       |                  << '\n';
  661|       |#endif
  662|    132|      } else {
  663|       |#ifdef EXIV2_DEBUG_MESSAGES
  664|       |        std::cout << "Exiv2::PngImage::doWriteMetadata: write " << szChunk << " chunk (length: " << dataOffset << ")"
  665|       |                  << '\n';
  666|       |#endif
  667|    126|        if (outIo.write(chunkBuf.c_data(), chunkBuf.size()) != chunkBuf.size())
  ------------------
  |  Branch (667:13): [True: 0, False: 126]
  ------------------
  668|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  669|    126|      }
  670|  1.90k|    } else {
  671|       |      // Write all others chunk as well.
  672|       |#ifdef EXIV2_DEBUG_MESSAGES
  673|       |      std::cout << "Exiv2::PngImage::doWriteMetadata:  copy " << szChunk << " chunk (length: " << dataOffset << ")"
  674|       |                << '\n';
  675|       |#endif
  676|  1.90k|      if (outIo.write(chunkBuf.c_data(), chunkBuf.size()) != chunkBuf.size())
  ------------------
  |  Branch (676:11): [True: 0, False: 1.90k]
  ------------------
  677|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  678|  1.90k|    }
  679|  2.44k|  }
  680|       |
  681|    295|}  // PngImage::doWriteMetadata
_ZN5Exiv214newPngInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  685|    888|Image::UniquePtr newPngInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  686|    888|  auto image = std::make_unique<PngImage>(std::move(io), params);
  687|    888|  if (!image->good()) {
  ------------------
  |  Branch (687:7): [True: 0, False: 888]
  ------------------
  688|      0|    return nullptr;
  689|      0|  }
  690|    888|  return image;
  691|    888|}
_ZN5Exiv29isPngTypeERNS_7BasicIoEb:
  693|  17.7k|bool isPngType(BasicIo& iIo, bool advance) {
  694|  17.7k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (694:7): [True: 0, False: 17.7k]
  |  Branch (694:22): [True: 132, False: 17.6k]
  ------------------
  695|    132|    throw Error(ErrorCode::kerInputDataReadFailed);
  696|    132|  }
  697|  17.6k|  const int32_t len = 8;
  698|  17.6k|  std::array<byte, len> buf;
  699|  17.6k|  iIo.read(buf.data(), len);
  700|  17.6k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (700:7): [True: 0, False: 17.6k]
  |  Branch (700:22): [True: 0, False: 17.6k]
  ------------------
  701|      0|    return false;
  702|      0|  }
  703|  17.6k|  bool rc = buf == pngSignature;
  704|  17.6k|  if (!advance || !rc) {
  ------------------
  |  Branch (704:7): [True: 14.4k, False: 3.22k]
  |  Branch (704:19): [True: 0, False: 3.22k]
  ------------------
  705|  14.4k|    iIo.seek(-len, BasicIo::cur);
  706|  14.4k|  }
  707|       |
  708|  17.6k|  return rc;
  709|  17.6k|}
pngimage.cpp:_ZN5Exiv2L5findiERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_:
  176|  19.3k|static std::string::size_type findi(const std::string& str, const std::string& substr) {
  177|  19.3k|  return str.find(substr);
  178|  19.3k|}
pngimage.cpp:_ZN5Exiv2L13tEXtToDataBufEPKhmRNS_7DataBufE:
  124|    100|static bool tEXtToDataBuf(const byte* bytes, size_t length, DataBuf& result) {
  125|    100|  static std::array<int, 256> value;
  126|    100|  static bool bFirst = true;
  127|    100|  if (bFirst) {
  ------------------
  |  Branch (127:7): [True: 1, False: 99]
  ------------------
  128|      1|    value.fill(0);
  129|     11|    for (int i = 0; i < 10; i++) {
  ------------------
  |  Branch (129:21): [True: 10, False: 1]
  ------------------
  130|     10|      value['0' + i] = i + 1;
  131|     10|    }
  132|      7|    for (int i = 0; i < 6; i++) {
  ------------------
  |  Branch (132:21): [True: 6, False: 1]
  ------------------
  133|      6|      value['a' + i] = i + 10 + 1;
  134|      6|      value['A' + i] = i + 10 + 1;
  135|      6|    }
  136|      1|    bFirst = false;
  137|      1|  }
  138|       |
  139|       |  // calculate length and allocate result;
  140|       |  // count: number of \n in the header
  141|    100|  size_t count = 0;
  142|       |  // p points to the current position in the array bytes
  143|    100|  const byte* p = bytes;
  144|       |
  145|       |  // header is '\nsomething\n number\n hex'
  146|       |  // => increment p until it points to the byte after the last \n
  147|       |  //    p must stay within bounds of the bytes array!
  148|  5.67k|  while (count < 3 && 0 < length) {
  ------------------
  |  Branch (148:10): [True: 5.63k, False: 38]
  |  Branch (148:23): [True: 5.57k, False: 62]
  ------------------
  149|       |    // length is later used for range checks of p => decrement it for each increment of p
  150|  5.57k|    --length;
  151|  5.57k|    if (*p++ == '\n') {
  ------------------
  |  Branch (151:9): [True: 128, False: 5.44k]
  ------------------
  152|    128|      count++;
  153|    128|    }
  154|  5.57k|  }
  155|  15.1k|  for (size_t i = 0; i < length; i++)
  ------------------
  |  Branch (155:22): [True: 15.0k, False: 100]
  ------------------
  156|  15.0k|    if (value[p[i]])
  ------------------
  |  Branch (156:9): [True: 2.40k, False: 12.6k]
  ------------------
  157|  2.40k|      ++count;
  158|    100|  result.alloc((count + 1) / 2);
  159|       |
  160|       |  // hex to binary
  161|    100|  count = 0;
  162|    100|  byte* r = result.data();
  163|    100|  int n = 0;  // nibble
  164|  15.1k|  for (size_t i = 0; i < length; i++) {
  ------------------
  |  Branch (164:22): [True: 15.0k, False: 100]
  ------------------
  165|  15.0k|    if (value[p[i]]) {
  ------------------
  |  Branch (165:9): [True: 2.40k, False: 12.6k]
  ------------------
  166|  2.40k|      int v = value[p[i]] - 1;
  167|  2.40k|      if (++count % 2)
  ------------------
  |  Branch (167:11): [True: 1.21k, False: 1.19k]
  ------------------
  168|  1.21k|        n = v * 16;  // leading digit
  169|  1.19k|      else
  170|  1.19k|        *r++ = n + v;  // trailing
  171|  2.40k|    }
  172|  15.0k|  }
  173|    100|  return true;
  174|    100|}
pngimage.cpp:_ZN5Exiv2L13zlibToDataBufEPKhmRNS_7DataBufE:
   74|    507|static bool zlibToDataBuf(const byte* bytes, uLongf length, DataBuf& result) {
   75|    507|  uLongf uncompressedLen = length;  // just a starting point
   76|    507|  int zlibResult = Z_BUF_ERROR;
   77|       |
   78|  1.05k|  while (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (78:10): [True: 548, False: 507]
  ------------------
   79|    548|    result.alloc(uncompressedLen);
   80|    548|    zlibResult = uncompress(result.data(), &uncompressedLen, bytes, length);
   81|       |    // if result buffer is large than necessary, redo to fit perfectly.
   82|    548|    if (zlibResult == Z_OK && uncompressedLen < result.size()) {
  ------------------
  |  Branch (82:9): [True: 22, False: 526]
  |  Branch (82:31): [True: 22, False: 0]
  ------------------
   83|     22|      result.reset();
   84|       |
   85|     22|      result.alloc(uncompressedLen);
   86|     22|      zlibResult = uncompress(result.data(), &uncompressedLen, bytes, length);
   87|     22|    }
   88|    548|    if (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (88:9): [True: 41, False: 507]
  ------------------
   89|       |      // the uncompressed buffer needs to be larger
   90|     41|      result.reset();
   91|       |
   92|       |      // Sanity - never bigger than 16mb
   93|     41|      if (uncompressedLen > 16 * 1024 * 1024)
  ------------------
  |  Branch (93:11): [True: 0, False: 41]
  ------------------
   94|      0|        zlibResult = Z_DATA_ERROR;
   95|     41|      else
   96|     41|        uncompressedLen *= 2;
   97|     41|    }
   98|    548|  }
   99|       |
  100|       |  return zlibResult == Z_OK;
  101|    507|}
pngimage.cpp:_ZN5Exiv2L9readChunkERNS_7DataBufERNS_7BasicIoE:
  379|  94.7k|static void readChunk(DataBuf& buffer, BasicIo& io) {
  380|       |#ifdef EXIV2_DEBUG_MESSAGES
  381|       |  std::cout << "Exiv2::PngImage::readMetadata: Position: " << io.tell() << '\n';
  382|       |#endif
  383|  94.7k|  const size_t bufRead = io.read(buffer.data(), buffer.size());
  384|  94.7k|  if (io.error()) {
  ------------------
  |  Branch (384:7): [True: 0, False: 94.7k]
  ------------------
  385|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  386|      0|  }
  387|  94.7k|  if (bufRead != buffer.size()) {
  ------------------
  |  Branch (387:7): [True: 59, False: 94.6k]
  ------------------
  388|     59|    throw Error(ErrorCode::kerInputDataReadFailed);
  389|     59|  }
  390|  94.7k|}
pngimage.cpp:_ZN5Exiv2L16zlibToCompressedEPKhmRNS_7DataBufE:
  103|     87|static bool zlibToCompressed(const byte* bytes, uLongf length, DataBuf& result) {
  104|     87|  uLongf compressedLen = length;  // just a starting point
  105|     87|  int zlibResult = Z_BUF_ERROR;
  106|       |
  107|    348|  while (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (107:10): [True: 261, False: 87]
  ------------------
  108|    261|    result.alloc(compressedLen);
  109|    261|    zlibResult = compress(result.data(), &compressedLen, bytes, length);
  110|    261|    if (zlibResult == Z_BUF_ERROR) {
  ------------------
  |  Branch (110:9): [True: 174, False: 87]
  ------------------
  111|       |      // the compressedArray needs to be larger
  112|    174|      result.reset();
  113|    174|      compressedLen *= 2;
  114|    174|    } else {
  115|     87|      result.reset();
  116|     87|      result.alloc(compressedLen);
  117|     87|      zlibResult = compress(result.data(), &compressedLen, bytes, length);
  118|     87|    }
  119|    261|  }
  120|       |
  121|       |  return zlibResult == Z_OK;
  122|     87|}
pngimage.cpp:_ZN12_GLOBAL__N_17compareENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEERKN5Exiv27DataBufE:
   44|  1.19k|bool compare(std::string_view str, const Exiv2::DataBuf& buf) {
   45|  1.19k|  const auto minlen = std::min<size_t>(str.size(), buf.size());
   46|  1.19k|  return buf.cmpBytes(0, str.data(), minlen) == 0;
   47|  1.19k|}

_ZN5Exiv212PreviewImageC2ENS_17PreviewPropertiesEONS_7DataBufE:
  990|    485|    properties_(std::move(properties)), preview_(std::move(data)) {
  991|    485|}
_ZNK5Exiv212PreviewImage5pDataEv:
 1017|    485|const byte* PreviewImage::pData() const {
 1018|    485|  return preview_.c_data();
 1019|    485|}
_ZNK5Exiv212PreviewImage4sizeEv:
 1021|    485|uint32_t PreviewImage::size() const {
 1022|    485|  return static_cast<uint32_t>(preview_.size());
 1023|    485|}
_ZN5Exiv214PreviewManagerC2ERKNS_5ImageE:
 1045|  2.26k|PreviewManager::PreviewManager(const Image& image) : image_(image) {
 1046|  2.26k|}
_ZNK5Exiv214PreviewManager20getPreviewPropertiesEv:
 1048|  2.26k|PreviewPropertiesList PreviewManager::getPreviewProperties() const {
 1049|  2.26k|  PreviewPropertiesList list;
 1050|       |  // go through the loader table and store all successfully created loaders in the list
 1051|  78.5k|  for (PreviewId id = 0; id < Loader::getNumLoaders(); ++id) {
  ------------------
  |  Branch (1051:26): [True: 76.3k, False: 2.26k]
  ------------------
 1052|  76.3k|    auto loader = Loader::create(id, image_);
 1053|  76.3k|    if (loader && loader->readDimensions()) {
  ------------------
  |  Branch (1053:9): [True: 4.67k, False: 71.6k]
  |  Branch (1053:19): [True: 3.09k, False: 1.58k]
  ------------------
 1054|  3.09k|      PreviewProperties props = loader->getProperties();
 1055|  3.09k|      DataBuf buf = loader->getData();  // #16 getPreviewImage()
 1056|  3.09k|      props.size_ = buf.size();         //     update the size
 1057|  3.09k|      list.push_back(std::move(props));
 1058|  3.09k|    }
 1059|  76.3k|  }
 1060|  2.26k|  std::sort(list.begin(), list.end(),
 1061|  2.26k|            [](const auto& lhs, const auto& rhs) { return lhs.width_ * lhs.height_ < rhs.width_ * rhs.height_; });
 1062|       |
 1063|  2.26k|  return list;
 1064|  2.26k|}
_ZNK5Exiv214PreviewManager15getPreviewImageERKNS_17PreviewPropertiesE:
 1066|    485|PreviewImage PreviewManager::getPreviewImage(const PreviewProperties& properties) const {
 1067|    485|  auto loader = Loader::create(properties.id_, image_);
 1068|    485|  DataBuf buf;
 1069|    485|  if (loader) {
  ------------------
  |  Branch (1069:7): [True: 485, False: 0]
  ------------------
 1070|    485|    buf = loader->getData();
 1071|    485|  }
 1072|       |
 1073|    485|  return {properties, std::move(buf)};
 1074|    485|}
preview.cpp:_ZN12_GLOBAL__N_16Loader13getNumLoadersEv:
  350|   155k|PreviewId Loader::getNumLoaders() {
  351|   155k|  return PreviewId{std::size(loaderList_)};
  352|   155k|}
preview.cpp:_ZN12_GLOBAL__N_118createLoaderNativeEiRKN5Exiv25ImageEi:
  368|  9.07k|Loader::UniquePtr createLoaderNative(PreviewId id, const Image& image, int parIdx) {
  369|  9.07k|  return std::make_unique<LoaderNative>(id, image, parIdx);
  370|  9.07k|}
preview.cpp:_ZN12_GLOBAL__N_112LoaderNativeC2EiRKN5Exiv25ImageEi:
  354|  9.07k|LoaderNative::LoaderNative(PreviewId id, const Image& image, int parIdx) : Loader(id, image) {
  355|  9.07k|  if (0 > parIdx || static_cast<size_t>(parIdx) >= image.nativePreviews().size())
  ------------------
  |  Branch (355:7): [True: 0, False: 9.07k]
  |  Branch (355:21): [True: 9.07k, False: 0]
  ------------------
  356|  9.07k|    return;
  357|      0|  nativePreview_ = image.nativePreviews()[parIdx];
  358|      0|  width_ = nativePreview_.width_;
  359|      0|  height_ = nativePreview_.height_;
  360|      0|  valid_ = true;
  361|      0|  if (nativePreview_.filter_.empty()) {
  ------------------
  |  Branch (361:7): [True: 0, False: 0]
  ------------------
  362|      0|    size_ = nativePreview_.size_;
  363|      0|  } else {
  364|      0|    size_ = getData().size();
  365|      0|  }
  366|      0|}
preview.cpp:_ZN12_GLOBAL__N_16LoaderC2EiRKN5Exiv25ImageE:
  343|  72.3k|Loader::Loader(PreviewId id, const Image& image) : id_(id), image_(image) {
  344|  72.3k|}
preview.cpp:_ZNK12_GLOBAL__N_16Loader13getPropertiesEv:
  346|  3.09k|PreviewProperties Loader::getProperties() const {
  347|  3.09k|  return {"", "", size_, width_, height_, id_};
  348|  3.09k|}
preview.cpp:_ZN12_GLOBAL__N_16Loader14readDimensionsEv:
   77|  2.17k|  virtual bool readDimensions() {
   78|  2.17k|    return true;
   79|  2.17k|  }
preview.cpp:_ZN12_GLOBAL__N_16LoaderD2Ev:
   54|  72.3k|  virtual ~Loader() = default;
preview.cpp:_ZNK12_GLOBAL__N_16Loader5validEv:
   66|  76.1k|  [[nodiscard]] virtual bool valid() const {
   67|  76.1k|    return valid_;
   68|  76.1k|  }
preview.cpp:_ZN12_GLOBAL__N_124createLoaderExifDataJpegEiRKN5Exiv25ImageEi:
  568|  27.2k|Loader::UniquePtr createLoaderExifDataJpeg(PreviewId id, const Image& image, int parIdx) {
  569|  27.2k|  return std::make_unique<LoaderExifDataJpeg>(id, image, parIdx);
  570|  27.2k|}
preview.cpp:_ZN12_GLOBAL__N_118LoaderExifDataJpegC2EiRKN5Exiv25ImageEi:
  555|  27.2k|    Loader(id, image), dataKey_(param_[parIdx].dataKey_) {
  556|  27.2k|  if (auto pos = image_.exifData().findKey(dataKey_); pos != image_.exifData().end()) {
  ------------------
  |  Branch (556:55): [True: 29, False: 27.1k]
  ------------------
  557|     29|    size_ = pos->sizeDataArea();  // indirect data
  558|     29|    if (size_ == 0 && pos->typeId() == undefined)
  ------------------
  |  Branch (558:9): [True: 29, False: 0]
  |  Branch (558:23): [True: 17, False: 12]
  ------------------
  559|     17|      size_ = pos->size();  // direct data
  560|     29|  }
  561|       |
  562|  27.2k|  if (size_ == 0)
  ------------------
  |  Branch (562:7): [True: 27.2k, False: 17]
  ------------------
  563|  27.2k|    return;
  564|       |
  565|     17|  valid_ = true;
  566|     17|}
preview.cpp:_ZNK12_GLOBAL__N_118LoaderExifDataJpeg13getPropertiesEv:
  572|      7|PreviewProperties LoaderExifDataJpeg::getProperties() const {
  573|      7|  PreviewProperties prop = Loader::getProperties();
  574|      7|  prop.mimeType_ = "image/jpeg";
  575|      7|  prop.extension_ = ".jpg";
  576|      7|  return prop;
  577|      7|}
preview.cpp:_ZNK12_GLOBAL__N_118LoaderExifDataJpeg7getDataEv:
  579|     24|DataBuf LoaderExifDataJpeg::getData() const {
  580|     24|  DataBuf buf;
  581|       |
  582|     24|  if (!valid())
  ------------------
  |  Branch (582:7): [True: 0, False: 24]
  ------------------
  583|      0|    return buf;
  584|       |
  585|     24|  if (auto pos = image_.exifData().findKey(dataKey_); pos != image_.exifData().end()) {
  ------------------
  |  Branch (585:55): [True: 24, False: 0]
  ------------------
  586|     24|    buf = pos->dataArea();  // indirect data
  587|       |
  588|     24|    if (buf.empty()) {  // direct data
  ------------------
  |  Branch (588:9): [True: 24, False: 0]
  ------------------
  589|     24|      buf = DataBuf(pos->size());
  590|     24|      pos->copy(buf.data(), invalidByteOrder);
  591|     24|    }
  592|       |
  593|     24|    buf.write_uint8(0, 0xff);  // fix Minolta thumbnails with invalid jpeg header
  594|     24|    return buf;
  595|     24|  }
  596|       |
  597|      0|  return buf;
  598|     24|}
preview.cpp:_ZN12_GLOBAL__N_118LoaderExifDataJpeg14readDimensionsEv:
  600|     10|bool LoaderExifDataJpeg::readDimensions() {
  601|     10|  if (!valid())
  ------------------
  |  Branch (601:7): [True: 0, False: 10]
  ------------------
  602|      0|    return false;
  603|       |
  604|     10|  DataBuf buf = getData();
  605|     10|  if (buf.empty())
  ------------------
  |  Branch (605:7): [True: 0, False: 10]
  ------------------
  606|      0|    return false;
  607|       |
  608|     10|  try {
  609|     10|    auto image = ImageFactory::open(buf.c_data(), buf.size());
  610|     10|    if (!image)
  ------------------
  |  Branch (610:9): [True: 0, False: 10]
  ------------------
  611|      0|      return false;
  612|     10|    image->readMetadata();
  613|       |
  614|     10|    width_ = image->pixelWidth();
  615|     10|    height_ = image->pixelHeight();
  616|     10|  } catch (const Error& /* error */) {
  617|      3|    return false;
  618|      3|  }
  619|       |
  620|      7|  return true;
  621|     10|}
preview.cpp:_ZN12_GLOBAL__N_116createLoaderTiffEiRKN5Exiv25ImageEi:
  681|  15.7k|Loader::UniquePtr createLoaderTiff(PreviewId id, const Image& image, int parIdx) {
  682|  15.7k|  return std::make_unique<LoaderTiff>(id, image, parIdx);
  683|  15.7k|}
preview.cpp:_ZN12_GLOBAL__N_110LoaderTiffC2EiRKN5Exiv25ImageEi:
  624|  15.7k|    Loader(id, image), group_(param_[parIdx].group_) {
  625|  15.7k|  const ExifData& exifData = image_.exifData();
  626|       |
  627|  15.7k|  size_t offsetCount = 0;
  628|  15.7k|  ExifData::const_iterator pos;
  629|       |
  630|       |  // check if the group_ contains a preview image
  631|  15.7k|  if (param_[parIdx].checkTag_) {
  ------------------
  |  Branch (631:7): [True: 13.5k, False: 2.21k]
  ------------------
  632|  13.5k|    pos = exifData.findKey(ExifKey(param_[parIdx].checkTag_));
  633|  13.5k|    if (pos == exifData.end())
  ------------------
  |  Branch (633:9): [True: 10.5k, False: 3.05k]
  ------------------
  634|  10.5k|      return;
  635|  3.05k|    if (param_[parIdx].checkValue_ && pos->toString() != param_[parIdx].checkValue_)
  ------------------
  |  Branch (635:9): [True: 3.05k, False: 0]
  |  Branch (635:9): [True: 281, False: 2.76k]
  |  Branch (635:39): [True: 281, False: 2.76k]
  ------------------
  636|    281|      return;
  637|  3.05k|  }
  638|       |
  639|  4.98k|  pos = exifData.findKey(ExifKey(std::string("Exif.") + group_ + ".StripOffsets"));
  640|  4.98k|  if (pos != exifData.end()) {
  ------------------
  |  Branch (640:7): [True: 2.54k, False: 2.44k]
  ------------------
  641|  2.54k|    offsetTag_ = "StripOffsets";
  642|  2.54k|    sizeTag_ = "StripByteCounts";
  643|  2.54k|    offsetCount = pos->value().count();
  644|  2.54k|  } else {
  645|  2.44k|    pos = exifData.findKey(ExifKey(std::string("Exif.") + group_ + ".TileOffsets"));
  646|  2.44k|    if (pos == exifData.end())
  ------------------
  |  Branch (646:9): [True: 2.29k, False: 154]
  ------------------
  647|  2.29k|      return;
  648|    154|    offsetTag_ = "TileOffsets";
  649|    154|    sizeTag_ = "TileByteCounts";
  650|    154|    offsetCount = pos->value().count();
  651|    154|  }
  652|       |
  653|  2.69k|  pos = exifData.findKey(ExifKey(std::string("Exif.") + group_ + '.' + sizeTag_));
  654|  2.69k|  if (pos == exifData.end())
  ------------------
  |  Branch (654:7): [True: 66, False: 2.63k]
  ------------------
  655|     66|    return;
  656|  2.63k|  if (offsetCount != pos->value().count())
  ------------------
  |  Branch (656:7): [True: 52, False: 2.57k]
  ------------------
  657|     52|    return;
  658|  7.14k|  for (size_t i = 0; i < offsetCount; i++) {
  ------------------
  |  Branch (658:22): [True: 4.56k, False: 2.57k]
  ------------------
  659|  4.56k|    size_ += pos->toUint32(i);
  660|  4.56k|  }
  661|       |
  662|  2.57k|  if (size_ == 0)
  ------------------
  |  Branch (662:7): [True: 39, False: 2.54k]
  ------------------
  663|     39|    return;
  664|       |
  665|  2.54k|  pos = exifData.findKey(ExifKey(std::string("Exif.") + group_ + ".ImageWidth"));
  666|  2.54k|  if (pos != exifData.end() && pos->count() > 0) {
  ------------------
  |  Branch (666:7): [True: 2.49k, False: 49]
  |  Branch (666:7): [True: 2.41k, False: 129]
  |  Branch (666:32): [True: 2.41k, False: 80]
  ------------------
  667|  2.41k|    width_ = pos->toUint32();
  668|  2.41k|  }
  669|       |
  670|  2.54k|  pos = exifData.findKey(ExifKey(std::string("Exif.") + group_ + ".ImageLength"));
  671|  2.54k|  if (pos != exifData.end() && pos->count() > 0) {
  ------------------
  |  Branch (671:7): [True: 2.49k, False: 49]
  |  Branch (671:7): [True: 2.41k, False: 124]
  |  Branch (671:32): [True: 2.41k, False: 75]
  ------------------
  672|  2.41k|    height_ = pos->toUint32();
  673|  2.41k|  }
  674|       |
  675|  2.54k|  if (width_ == 0 || height_ == 0)
  ------------------
  |  Branch (675:7): [True: 150, False: 2.39k]
  |  Branch (675:22): [True: 91, False: 2.29k]
  ------------------
  676|    230|    return;
  677|       |
  678|  2.31k|  valid_ = true;
  679|  2.31k|}
preview.cpp:_ZNK12_GLOBAL__N_110LoaderTiff13getPropertiesEv:
  685|  2.17k|PreviewProperties LoaderTiff::getProperties() const {
  686|  2.17k|  PreviewProperties prop = Loader::getProperties();
  687|  2.17k|  prop.mimeType_ = "image/tiff";
  688|  2.17k|  prop.extension_ = ".tif";
  689|  2.17k|  return prop;
  690|  2.17k|}
preview.cpp:_ZNK12_GLOBAL__N_110LoaderTiff7getDataEv:
  692|  2.29k|DataBuf LoaderTiff::getData() const {
  693|  2.29k|  const ExifData& exifData = image_.exifData();
  694|       |
  695|  2.29k|  ExifData preview;
  696|       |
  697|       |  // copy tags
  698|   614k|  for (auto&& pos : exifData) {
  ------------------
  |  Branch (698:19): [True: 614k, False: 2.29k]
  ------------------
  699|   614k|    if (pos.groupName() == group_) {
  ------------------
  |  Branch (699:9): [True: 138k, False: 475k]
  ------------------
  700|       |      /*
  701|       |         Write only the necessary TIFF image tags
  702|       |         tags that especially could cause problems are:
  703|       |         "NewSubfileType" - the result is no longer a thumbnail, it is a standalone image
  704|       |         "Orientation" - this tag typically appears only in the "Image" group. Deleting it ensures
  705|       |                         consistent result for all previews, including JPEG
  706|       |      */
  707|   138k|      uint16_t tag = pos.tag();
  708|   138k|      if (tag != 0x00fe && tag != 0x00ff && Internal::isTiffImageTag(tag, IfdId::ifd0Id)) {
  ------------------
  |  Branch (708:11): [True: 136k, False: 2.43k]
  |  Branch (708:28): [True: 135k, False: 822]
  |  Branch (708:45): [True: 77.0k, False: 58.1k]
  ------------------
  709|  77.0k|        preview.add(ExifKey(tag, "Image"), &pos.value());
  710|  77.0k|      }
  711|   138k|    }
  712|   614k|  }
  713|       |
  714|  2.29k|  auto& dataValue = const_cast<Value&>(preview["Exif.Image." + offsetTag_].value());
  715|       |
  716|  2.29k|  if (dataValue.sizeDataArea() == 0) {
  ------------------
  |  Branch (716:7): [True: 2.29k, False: 0]
  ------------------
  717|       |    // image data are not available via exifData, read them from image_.io()
  718|  2.29k|    BasicIo& io = image_.io();
  719|       |
  720|  2.29k|    if (io.open() != 0) {
  ------------------
  |  Branch (720:9): [True: 0, False: 2.29k]
  ------------------
  721|      0|      throw Error(ErrorCode::kerDataSourceOpenFailed, io.path(), strError());
  722|      0|    }
  723|  2.29k|    IoCloser closer(io);
  724|       |
  725|  2.29k|    const Exiv2::byte* base = io.mmap();
  726|       |
  727|  2.29k|    const Value& sizes = preview["Exif.Image." + sizeTag_].value();
  728|       |
  729|  2.29k|    if (sizes.count() == dataValue.count()) {
  ------------------
  |  Branch (729:9): [True: 2.29k, False: 0]
  ------------------
  730|  2.29k|      if (sizes.count() == 1) {
  ------------------
  |  Branch (730:11): [True: 2.18k, False: 114]
  ------------------
  731|       |        // this saves one copying of the buffer
  732|  2.18k|        uint32_t offset = dataValue.toUint32(0);
  733|  2.18k|        uint32_t size = sizes.toUint32(0);
  734|  2.18k|        if (Safe::add(offset, size) <= static_cast<uint32_t>(io.size()))
  ------------------
  |  Branch (734:13): [True: 1.12k, False: 1.06k]
  ------------------
  735|  1.12k|          dataValue.setDataArea(base + offset, size);
  736|  2.18k|      } else {
  737|       |        // FIXME: the buffer is probably copied twice, it should be optimized
  738|    114|        Internal::enforce(size_ <= io.size(), ErrorCode::kerCorruptedMetadata);
  739|    114|        DataBuf buf(size_);
  740|    114|        uint32_t idxBuf = 0;
  741|  1.66k|        for (size_t i = 0; i < sizes.count(); i++) {
  ------------------
  |  Branch (741:28): [True: 1.54k, False: 114]
  ------------------
  742|  1.54k|          uint32_t offset = dataValue.toUint32(i);
  743|  1.54k|          uint32_t size = sizes.toUint32(i);
  744|       |
  745|       |          // the size_ parameter is originally computed by summing all values inside sizes
  746|       |          // see the constructor of LoaderTiff
  747|       |          // But e.g in malicious files some of these values could be negative
  748|       |          // That's why we check again for each step here to really make sure we don't overstep
  749|  1.54k|          Internal::enforce(Safe::add(idxBuf, size) <= size_, ErrorCode::kerCorruptedMetadata);
  750|  1.54k|          if (size != 0 && Safe::add(offset, size) <= static_cast<uint32_t>(io.size())) {
  ------------------
  |  Branch (750:15): [True: 893, False: 653]
  |  Branch (750:28): [True: 352, False: 541]
  ------------------
  751|    352|            std::copy_n(base + offset, size, buf.begin() + idxBuf);
  752|    352|          }
  753|       |
  754|  1.54k|          idxBuf += size;
  755|  1.54k|        }
  756|    114|        dataValue.setDataArea(buf.c_data(), buf.size());
  757|    114|      }
  758|  2.29k|    }
  759|  2.29k|  }
  760|       |
  761|       |  // Fix compression value in the CR2 IFD2 image
  762|  2.29k|  if (0 == strcmp(group_, "Image2") && image_.mimeType() == "image/x-canon-cr2") {
  ------------------
  |  Branch (762:7): [True: 0, False: 2.29k]
  |  Branch (762:7): [True: 0, False: 2.29k]
  |  Branch (762:40): [True: 0, False: 0]
  ------------------
  763|      0|    preview["Exif.Image.Compression"] = std::uint16_t{1};
  764|      0|  }
  765|       |
  766|       |  // write new image
  767|  2.29k|  MemIo mio;
  768|  2.29k|  IptcData emptyIptc;
  769|  2.29k|  XmpData emptyXmp;
  770|  2.29k|  TiffParser::encode(mio, nullptr, 0, Exiv2::littleEndian, preview, emptyIptc, emptyXmp);
  771|  2.29k|  return {mio.mmap(), mio.size()};
  772|  2.29k|}
preview.cpp:_ZN12_GLOBAL__N_120createLoaderExifJpegEiRKN5Exiv25ImageEi:
  496|  18.0k|Loader::UniquePtr createLoaderExifJpeg(PreviewId id, const Image& image, int parIdx) {
  497|  18.0k|  return std::make_unique<LoaderExifJpeg>(id, image, parIdx);
  498|  18.0k|}
preview.cpp:_ZN12_GLOBAL__N_114LoaderExifJpegC2EiRKN5Exiv25ImageEi:
  467|  18.0k|LoaderExifJpeg::LoaderExifJpeg(PreviewId id, const Image& image, int parIdx) : Loader(id, image) {
  468|  18.0k|  const ExifData& exifData = image_.exifData();
  469|  18.0k|  auto pos = exifData.findKey(ExifKey(param_[parIdx].offsetKey_));
  470|  18.0k|  if (pos != exifData.end() && pos->count() > 0) {
  ------------------
  |  Branch (470:7): [True: 4.79k, False: 13.2k]
  |  Branch (470:7): [True: 3.15k, False: 14.9k]
  |  Branch (470:32): [True: 3.15k, False: 1.64k]
  ------------------
  471|  3.15k|    offset_ = pos->toUint32();
  472|  3.15k|  }
  473|       |
  474|  18.0k|  size_ = 0;
  475|  18.0k|  pos = exifData.findKey(ExifKey(param_[parIdx].sizeKey_));
  476|  18.0k|  if (pos != exifData.end() && pos->count() > 0) {
  ------------------
  |  Branch (476:7): [True: 4.83k, False: 13.2k]
  |  Branch (476:7): [True: 3.21k, False: 14.8k]
  |  Branch (476:32): [True: 3.21k, False: 1.62k]
  ------------------
  477|  3.21k|    size_ = pos->toUint32();
  478|  3.21k|  }
  479|       |
  480|  18.0k|  if (offset_ == 0 || size_ == 0)
  ------------------
  |  Branch (480:7): [True: 14.9k, False: 3.12k]
  |  Branch (480:23): [True: 174, False: 2.95k]
  ------------------
  481|  15.1k|    return;
  482|       |
  483|  2.95k|  if (param_[parIdx].baseOffsetKey_) {
  ------------------
  |  Branch (483:7): [True: 0, False: 2.95k]
  ------------------
  484|      0|    pos = exifData.findKey(ExifKey(param_[parIdx].baseOffsetKey_));
  485|      0|    if (pos != exifData.end() && pos->count() > 0) {
  ------------------
  |  Branch (485:9): [True: 0, False: 0]
  |  Branch (485:9): [True: 0, False: 0]
  |  Branch (485:34): [True: 0, False: 0]
  ------------------
  486|      0|      offset_ += pos->toUint32();
  487|      0|    }
  488|      0|  }
  489|       |
  490|  2.95k|  if (Safe::add(offset_, size_) > image_.io().size())
  ------------------
  |  Branch (490:7): [True: 105, False: 2.85k]
  ------------------
  491|    105|    return;
  492|       |
  493|  2.85k|  valid_ = true;
  494|  2.85k|}
preview.cpp:_ZNK12_GLOBAL__N_114LoaderExifJpeg13getPropertiesEv:
  500|    909|PreviewProperties LoaderExifJpeg::getProperties() const {
  501|    909|  PreviewProperties prop = Loader::getProperties();
  502|    909|  prop.mimeType_ = "image/jpeg";
  503|    909|  prop.extension_ = ".jpg";
  504|    909|  return prop;
  505|    909|}
preview.cpp:_ZNK12_GLOBAL__N_114LoaderExifJpeg7getDataEv:
  507|  1.26k|DataBuf LoaderExifJpeg::getData() const {
  508|  1.26k|  if (!valid())
  ------------------
  |  Branch (508:7): [True: 0, False: 1.26k]
  ------------------
  509|      0|    return {};
  510|  1.26k|  BasicIo& io = image_.io();
  511|       |
  512|  1.26k|  if (io.open() != 0) {
  ------------------
  |  Branch (512:7): [True: 0, False: 1.26k]
  ------------------
  513|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io.path(), strError());
  514|      0|  }
  515|  1.26k|  IoCloser closer(io);
  516|       |
  517|  1.26k|  const Exiv2::byte* base = io.mmap();
  518|       |
  519|  1.26k|  return {base + offset_, size_};
  520|  1.26k|}
preview.cpp:_ZN12_GLOBAL__N_114LoaderExifJpeg14readDimensionsEv:
  522|  2.49k|bool LoaderExifJpeg::readDimensions() {
  523|  2.49k|  if (!valid())
  ------------------
  |  Branch (523:7): [True: 0, False: 2.49k]
  ------------------
  524|      0|    return false;
  525|  2.49k|  if (width_ || height_)
  ------------------
  |  Branch (525:7): [True: 0, False: 2.49k]
  |  Branch (525:17): [True: 0, False: 2.49k]
  ------------------
  526|      0|    return true;
  527|       |
  528|  2.49k|  BasicIo& io = image_.io();
  529|       |
  530|  2.49k|  if (io.open() != 0) {
  ------------------
  |  Branch (530:7): [True: 0, False: 2.49k]
  ------------------
  531|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io.path(), strError());
  532|      0|  }
  533|  2.49k|  IoCloser closer(io);
  534|  2.49k|  const Exiv2::byte* base = io.mmap();
  535|       |
  536|  2.49k|  try {
  537|  2.49k|    auto image = ImageFactory::open(base + offset_, size_);
  538|  2.49k|    if (!image)
  ------------------
  |  Branch (538:9): [True: 0, False: 2.49k]
  ------------------
  539|      0|      return false;
  540|  2.49k|    image->readMetadata();
  541|       |
  542|  2.49k|    width_ = image->pixelWidth();
  543|  2.49k|    height_ = image->pixelHeight();
  544|  2.49k|  } catch (const Error& /* error */) {
  545|  1.58k|#ifndef SUPPRESS_WARNINGS
  546|  1.58k|    EXV_WARNING << "Invalid JPEG preview image.\n";
  ------------------
  |  |  138|  1.58k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1.58k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  1.58k|  LogMsg(LogMsg::warn).os()
  ------------------
  547|  1.58k|#endif
  548|  1.58k|    return false;
  549|  1.58k|  }
  550|       |
  551|    909|  return true;
  552|  2.49k|}
preview.cpp:_ZN12_GLOBAL__N_119createLoaderXmpJpegEiRKN5Exiv25ImageEi:
  807|  2.21k|Loader::UniquePtr createLoaderXmpJpeg(PreviewId id, const Image& image, int parIdx) {
  808|  2.21k|  return std::make_unique<LoaderXmpJpeg>(id, image, parIdx);
  809|  2.21k|}
preview.cpp:_ZN12_GLOBAL__N_113LoaderXmpJpegC2EiRKN5Exiv25ImageEi:
  774|  2.21k|LoaderXmpJpeg::LoaderXmpJpeg(PreviewId id, const Image& image, int parIdx) : Loader(id, image) {
  775|  2.21k|  (void)parIdx;
  776|       |
  777|  2.21k|  const XmpData& xmpData = image_.xmpData();
  778|       |
  779|  2.21k|  std::string prefix = "xmpGImg";
  780|  2.21k|  if (xmpData.findKey(XmpKey("Xmp.xmp.Thumbnails[1]/xapGImg:image")) != xmpData.end()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 2.21k]
  ------------------
  781|      0|    prefix = "xapGImg";
  782|      0|  }
  783|       |
  784|  2.21k|  auto imageDatum = xmpData.findKey(XmpKey("Xmp.xmp.Thumbnails[1]/" + prefix + ":image"));
  785|  2.21k|  if (imageDatum == xmpData.end())
  ------------------
  |  Branch (785:7): [True: 2.21k, False: 0]
  ------------------
  786|  2.21k|    return;
  787|      0|  auto formatDatum = xmpData.findKey(XmpKey("Xmp.xmp.Thumbnails[1]/" + prefix + ":format"));
  788|      0|  if (formatDatum == xmpData.end())
  ------------------
  |  Branch (788:7): [True: 0, False: 0]
  ------------------
  789|      0|    return;
  790|      0|  auto widthDatum = xmpData.findKey(XmpKey("Xmp.xmp.Thumbnails[1]/" + prefix + ":width"));
  791|      0|  if (widthDatum == xmpData.end())
  ------------------
  |  Branch (791:7): [True: 0, False: 0]
  ------------------
  792|      0|    return;
  793|      0|  auto heightDatum = xmpData.findKey(XmpKey("Xmp.xmp.Thumbnails[1]/" + prefix + ":height"));
  794|      0|  if (heightDatum == xmpData.end())
  ------------------
  |  Branch (794:7): [True: 0, False: 0]
  ------------------
  795|      0|    return;
  796|       |
  797|      0|  if (formatDatum->toString() != "JPEG")
  ------------------
  |  Branch (797:7): [True: 0, False: 0]
  ------------------
  798|      0|    return;
  799|       |
  800|      0|  width_ = widthDatum->toUint32();
  801|      0|  height_ = heightDatum->toUint32();
  802|      0|  preview_ = decodeBase64(imageDatum->toString());
  803|      0|  size_ = preview_.size();
  804|      0|  valid_ = true;
  805|      0|}
preview.cpp:_ZN12_GLOBAL__N_16Loader6createEiRKN5Exiv25ImageE:
  328|  76.7k|Loader::UniquePtr Loader::create(PreviewId id, const Image& image) {
  329|  76.7k|  Loader::UniquePtr loader;
  330|  76.7k|  if (id < 0 || id >= Loader::getNumLoaders())
  ------------------
  |  Branch (330:7): [True: 0, False: 76.7k]
  |  Branch (330:17): [True: 0, False: 76.7k]
  ------------------
  331|      0|    return loader;
  332|       |
  333|  76.7k|  if (loaderList_[id].imageMimeType_ && std::string(loaderList_[id].imageMimeType_) != image.mimeType())
  ------------------
  |  Branch (333:7): [True: 6.70k, False: 70.0k]
  |  Branch (333:7): [True: 4.42k, False: 72.3k]
  |  Branch (333:41): [True: 4.42k, False: 2.27k]
  ------------------
  334|  4.42k|    return loader;
  335|       |
  336|  72.3k|  loader = loaderList_[id].create_(id, image, loaderList_[id].parIdx_);
  337|  72.3k|  if (!loader->valid())
  ------------------
  |  Branch (337:7): [True: 67.1k, False: 5.18k]
  ------------------
  338|  67.1k|    loader = nullptr;
  339|       |
  340|  72.3k|  return loader;
  341|  76.7k|}
preview.cpp:_ZZNK5Exiv214PreviewManager20getPreviewPropertiesEvENK3$_0clINS_17PreviewPropertiesES3_EEDaRKT_RKT0_:
 1061|  2.01k|            [](const auto& lhs, const auto& rhs) { return lhs.width_ * lhs.height_ < rhs.width_ * rhs.height_; });

_ZNK5Exiv29XmpNsInfoeqERKNS0_2NsE:
 4939|   481k|bool XmpNsInfo::operator==(const XmpNsInfo::Ns& ns) const {
 4940|   481k|  return ns_ == ns.ns_;
 4941|   481k|}
_ZNK5Exiv29XmpNsInfoeqERKNS0_6PrefixE:
 4943|  23.9M|bool XmpNsInfo::operator==(const XmpNsInfo::Prefix& prefix) const {
 4944|  23.9M|  return prefix_ == prefix.prefix_;
 4945|  23.9M|}
_ZN5Exiv213XmpProperties8getMutexEv:
 4952|  1.22M|std::mutex& XmpProperties::getMutex() {
 4953|  1.22M|  static std::mutex m;
 4954|  1.22M|  return m;
 4955|  1.22M|}
_ZN5Exiv213XmpProperties24lookupNsRegistryUnlockedERKNS_9XmpNsInfo6PrefixERKNS0_7XmpLockE:
 4963|  1.19M|const XmpNsInfo* XmpProperties::lookupNsRegistryUnlocked(const XmpNsInfo::Prefix& prefix, const XmpLock&) {
 4964|  6.11M|  for (const auto& [_, p] : nsRegistry_) {
  ------------------
  |  Branch (4964:27): [True: 6.11M, False: 1.18M]
  ------------------
 4965|  6.11M|    if (p == prefix)
  ------------------
  |  Branch (4965:9): [True: 2.61k, False: 6.11M]
  ------------------
 4966|  2.61k|      return &p;
 4967|  6.11M|  }
 4968|  1.18M|  return nullptr;
 4969|  1.19M|}
_ZN5Exiv213XmpProperties18registerNsUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKNS0_7XmpLockE:
 4976|      6|void XmpProperties::registerNsUnlocked(const std::string& ns, const std::string& prefix, const XmpLock& lock) {
 4977|      6|  if (ns.empty())
  ------------------
  |  Branch (4977:7): [True: 0, False: 6]
  ------------------
 4978|      0|    return;
 4979|      6|  std::string ns2 = ns;
 4980|      6|  if (ns2.back() != '/' && ns2.back() != '#')
  ------------------
  |  Branch (4980:7): [True: 5, False: 1]
  |  Branch (4980:28): [True: 4, False: 1]
  ------------------
 4981|      4|    ns2 += '/';
 4982|       |
 4983|       |  // 1. Check if this URI is already registered with this exact prefix
 4984|      6|  auto it = nsRegistry_.find(ns2);
 4985|      6|  if (it != nsRegistry_.end() && std::strcmp(it->second.prefix_, prefix.c_str()) == 0) {
  ------------------
  |  Branch (4985:7): [True: 0, False: 6]
  |  Branch (4985:7): [True: 0, False: 6]
  |  Branch (4985:34): [True: 0, False: 0]
  ------------------
 4986|      0|    return;  // Already registered with this prefix
 4987|      0|  }
 4988|       |
 4989|       |  // 2. Check if this prefix is already registered with a DIFFERENT URI
 4990|      6|  if (auto xnp = lookupNsRegistryUnlocked(XmpNsInfo::Prefix{prefix}, lock)) {
  ------------------
  |  Branch (4990:12): [True: 0, False: 6]
  ------------------
 4991|      0|#ifndef SUPPRESS_WARNINGS
 4992|      0|    if (ns2 != xnp->ns_)
  ------------------
  |  Branch (4992:9): [True: 0, False: 0]
  ------------------
 4993|      0|      EXV_WARNING << "Updating namespace URI for " << prefix << " from " << xnp->ns_ << " to " << ns2 << "\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
 4994|      0|#endif
 4995|      0|    unregisterNsUnlocked(xnp->ns_, lock);
 4996|      0|  }
 4997|       |
 4998|       |  // 3. Ensure the URI is unregistered if it's currently used with a different prefix
 4999|       |  // (This handles the case where prefix changed for the same URI, preventing memory leak)
 5000|      6|  unregisterNsUnlocked(ns2, lock);
 5001|       |  // Allocated memory is freed when the namespace is unregistered.
 5002|       |  // Using malloc/free for better system compatibility in case
 5003|       |  // users don't unregister their namespaces explicitly.
 5004|      6|  XmpNsInfo xn;
 5005|      6|  auto c = new char[ns2.size() + 1];
 5006|      6|  std::strcpy(c, ns2.c_str());
 5007|      6|  xn.ns_ = c;
 5008|      6|  c = new char[prefix.size() + 1];
 5009|      6|  std::strcpy(c, prefix.c_str());
 5010|      6|  xn.prefix_ = c;
 5011|      6|  xn.xmpPropertyInfo_ = nullptr;
 5012|      6|  xn.desc_ = "";
 5013|      6|  nsRegistry_[ns2] = xn;
 5014|      6|}
_ZN5Exiv213XmpProperties20unregisterNsUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS0_7XmpLockE:
 5021|      6|void XmpProperties::unregisterNsUnlocked(const std::string& ns, const XmpLock&) {
 5022|      6|  unregisterNsNoLock(ns, LifetimeKey{});
 5023|      6|}
_ZN5Exiv213XmpProperties18unregisterNsNoLockERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS0_11LifetimeKeyE:
 5025|     12|void XmpProperties::unregisterNsNoLock(const std::string& ns, LifetimeKey) {
 5026|     12|  auto i = nsRegistry_.find(ns);
 5027|     12|  if (i != nsRegistry_.end()) {
  ------------------
  |  Branch (5027:7): [True: 6, False: 6]
  ------------------
 5028|      6|    delete[] i->second.prefix_;
 5029|      6|    delete[] i->second.ns_;
 5030|      6|    nsRegistry_.erase(i);
 5031|      6|  }
 5032|     12|}
_ZN5Exiv213XmpProperties21unregisterAllNsNoLockENS0_11LifetimeKeyE:
 5042|      1|void XmpProperties::unregisterAllNsNoLock(LifetimeKey) {
 5043|       |  /// \todo check if we are not unregistering the first NS
 5044|      1|  auto i = nsRegistry_.begin();
 5045|      7|  while (i != nsRegistry_.end()) {
  ------------------
  |  Branch (5045:10): [True: 6, False: 1]
  ------------------
 5046|      6|    auto kill = i++;
 5047|      6|    unregisterNsNoLock(kill->first, LifetimeKey{});
 5048|      6|  }
 5049|      1|}
_ZN5Exiv213XmpProperties14prefixUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS0_7XmpLockE:
 5056|  11.8k|std::string XmpProperties::prefixUnlocked(const std::string& ns, const XmpLock&) {
 5057|  11.8k|  std::string ns2 = ns;
 5058|  11.8k|  if (ns2.back() != '/' && ns2.back() != '#')
  ------------------
  |  Branch (5058:7): [True: 8.15k, False: 3.69k]
  |  Branch (5058:28): [True: 7.41k, False: 737]
  ------------------
 5059|  7.41k|    ns2 += '/';
 5060|       |
 5061|  11.8k|  auto i = nsRegistry_.find(ns2);
 5062|  11.8k|  std::string p;
 5063|  11.8k|  if (i != nsRegistry_.end())
  ------------------
  |  Branch (5063:7): [True: 681, False: 11.1k]
  ------------------
 5064|    681|    p = i->second.prefix_;
 5065|  11.1k|  else if (auto xn = Exiv2::find(xmpNsInfo, XmpNsInfo::Ns{std::move(ns2)}))
  ------------------
  |  Branch (5065:17): [True: 1.03k, False: 10.1k]
  ------------------
 5066|  1.03k|    p = std::string(xn->prefix_);
 5067|  11.8k|  return p;
 5068|  11.8k|}
_ZN5Exiv213XmpProperties10nsUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS0_7XmpLockE:
 5075|   584k|std::string XmpProperties::nsUnlocked(const std::string& prefix, const XmpLock& lock) {
 5076|   584k|  if (auto xn = lookupNsRegistryUnlocked(XmpNsInfo::Prefix{prefix}, lock))
  ------------------
  |  Branch (5076:12): [True: 1.68k, False: 583k]
  ------------------
 5077|  1.68k|    return xn->ns_;
 5078|   583k|  return nsInfoUnlocked(prefix, lock)->ns_;
 5079|   584k|}
_ZN5Exiv213XmpProperties21prefixIsBoundUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS0_7XmpLockE:
 5081|  2.17k|bool XmpProperties::prefixIsBoundUnlocked(const std::string& prefix, const XmpLock& lock) {
 5082|  2.17k|  const auto pf = XmpNsInfo::Prefix{prefix};
 5083|  2.17k|  return lookupNsRegistryUnlocked(pf, lock) != nullptr || Exiv2::find(xmpNsInfo, pf) != nullptr;
  ------------------
  |  Branch (5083:10): [True: 928, False: 1.24k]
  |  Branch (5083:59): [True: 1.24k, False: 6]
  ------------------
 5084|  2.17k|}
_ZN5Exiv213XmpProperties20propertyTypeUnlockedERKNS_6XmpKeyERKNS0_7XmpLockE:
 5111|  21.4k|TypeId XmpProperties::propertyTypeUnlocked(const XmpKey& key, const XmpLock& lock) {
 5112|  21.4k|  const XmpPropertyInfo* pi = propertyInfoUnlocked(key, lock);
 5113|  21.4k|  return pi ? pi->typeId_ : xmpText;
  ------------------
  |  Branch (5113:10): [True: 20.8k, False: 590]
  ------------------
 5114|  21.4k|}
_ZN5Exiv213XmpProperties20propertyInfoUnlockedERKNS_6XmpKeyERKNS0_7XmpLockE:
 5121|  21.4k|const XmpPropertyInfo* XmpProperties::propertyInfoUnlocked(const XmpKey& key, const XmpLock& lock) {
 5122|  21.4k|  std::string prefix = key.groupName();
 5123|  21.4k|  std::string property = key.tagName();
 5124|       |  // If property is a path for a nested property, determines the innermost element
 5125|  21.4k|  if (auto i = property.find_last_of('/'); i != std::string::npos) {
  ------------------
  |  Branch (5125:44): [True: 0, False: 21.4k]
  ------------------
 5126|      0|    i = std::distance(property.begin(), std::find_if(property.begin() + i, property.end(), isalpha));
 5127|      0|    property = property.substr(i);
 5128|      0|    i = property.find_first_of(':');
 5129|      0|    if (i != std::string::npos) {
  ------------------
  |  Branch (5129:9): [True: 0, False: 0]
  ------------------
 5130|      0|      prefix = property.substr(0, i);
 5131|      0|      property = property.substr(i + 1);
 5132|      0|    }
 5133|       |#ifdef EXIV2_DEBUG_MESSAGES
 5134|       |    std::cout << "Nested key: " << key.key() << ", prefix: " << prefix << ", property: " << property << "\n";
 5135|       |#endif
 5136|      0|  }
 5137|  21.4k|  if (auto pl = propertyListUnlocked(prefix, lock)) {
  ------------------
  |  Branch (5137:12): [True: 21.4k, False: 0]
  ------------------
 5138|  2.93M|    for (size_t j = 0; pl[j].name_; ++j) {
  ------------------
  |  Branch (5138:24): [True: 2.93M, False: 590]
  ------------------
 5139|  2.93M|      if (property == pl[j].name_) {
  ------------------
  |  Branch (5139:11): [True: 20.8k, False: 2.91M]
  ------------------
 5140|  20.8k|        return pl + j;
 5141|  20.8k|      }
 5142|  2.93M|    }
 5143|  21.4k|  }
 5144|    590|  return nullptr;
 5145|  21.4k|}
_ZN5Exiv213XmpProperties20propertyListUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS0_7XmpLockE:
 5162|  21.4k|const XmpPropertyInfo* XmpProperties::propertyListUnlocked(const std::string& prefix, const XmpLock& lock) {
 5163|  21.4k|  return nsInfoUnlocked(prefix, lock)->xmpPropertyInfo_;
 5164|  21.4k|}
_ZN5Exiv213XmpProperties14nsInfoUnlockedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS0_7XmpLockE:
 5171|   604k|const XmpNsInfo* XmpProperties::nsInfoUnlocked(const std::string& prefix, const XmpLock& lock) {
 5172|   604k|  const auto pf = XmpNsInfo::Prefix{prefix};
 5173|   604k|  const XmpNsInfo* xn = lookupNsRegistryUnlocked(pf, lock);
 5174|   604k|  if (!xn)
  ------------------
  |  Branch (5174:7): [True: 604k, False: 0]
  ------------------
 5175|   604k|    xn = Exiv2::find(xmpNsInfo, pf);
 5176|   604k|  if (!xn)
  ------------------
  |  Branch (5176:7): [True: 0, False: 604k]
  ------------------
 5177|      0|    throw Error(ErrorCode::kerNoNamespaceInfoForXmpPrefix, prefix);
 5178|   604k|  return xn;
 5179|   604k|}
_ZN5Exiv213XmpProperties13printPropertyERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEERKNS_5ValueE:
 5207|  18.3k|std::ostream& XmpProperties::printProperty(std::ostream& os, const std::string& key, const Value& value) {
 5208|  18.3k|  XmpLock lock;
 5209|  18.3k|  return printPropertyUnlocked(os, key, value, lock);
 5210|  18.3k|}
_ZN5Exiv213XmpProperties21printPropertyUnlockedERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEERKNS_5ValueERKNS0_7XmpLockE:
 5213|  18.3k|                                                   const XmpLock&) {
 5214|  18.3k|  PrintFct fct = printValue;
 5215|  18.3k|  if (value.count() != 0) {
  ------------------
  |  Branch (5215:7): [True: 17.5k, False: 842]
  ------------------
 5216|  17.5k|    if (auto info = Exiv2::find(xmpPrintInfo, key))
  ------------------
  |  Branch (5216:14): [True: 0, False: 17.5k]
  ------------------
 5217|      0|      fct = info->printFct_;
 5218|  17.5k|  }
 5219|  18.3k|  return fct(os, value, nullptr);
 5220|  18.3k|}
_ZN5Exiv26XmpKey4ImplC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESA_RKNS_13XmpProperties7XmpLockE:
 5250|  9.14k|XmpKey::Impl::Impl(const std::string& prefix, const std::string& property, const XmpProperties::XmpLock& lock) {
 5251|       |  // Validate prefix unlocked (must hold lock)
 5252|  9.14k|  if (XmpProperties::nsUnlocked(prefix, lock).empty())
  ------------------
  |  Branch (5252:7): [True: 0, False: 9.14k]
  ------------------
 5253|      0|    throw Error(ErrorCode::kerNoNamespaceForPrefix, prefix);
 5254|       |
 5255|  9.14k|  property_ = property;
 5256|  9.14k|  prefix_ = prefix;
 5257|  9.14k|}
_ZN5Exiv26XmpKeyC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 5259|  87.4k|XmpKey::XmpKey(const std::string& key) : p_(std::make_unique<Impl>()) {
 5260|  87.4k|  p_->decomposeKey(key);
 5261|  87.4k|}
_ZN5Exiv26XmpKeyC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_13XmpProperties7XmpLockE:
 5263|   488k|XmpKey::XmpKey(const std::string& key, const XmpProperties::XmpLock& lock) : p_(std::make_unique<Impl>()) {
 5264|   488k|  p_->decomposeKeyUnlocked(key, lock);
 5265|   488k|}
_ZN5Exiv26XmpKeyC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKNS_13XmpProperties7XmpLockE:
 5271|  9.14k|    p_(std::make_unique<Impl>(prefix, property, lock)) {
 5272|  9.14k|}
_ZN5Exiv26XmpKeyD2Ev:
 5274|   656k|XmpKey::~XmpKey() = default;
_ZN5Exiv26XmpKeyC2ERKS0_:
 5276|  71.4k|XmpKey::XmpKey(const XmpKey& rhs) : p_(std::make_unique<Impl>(*rhs.p_)) {
 5277|  71.4k|}
_ZNK5Exiv26XmpKey5cloneEv:
 5286|  71.4k|XmpKey::UniquePtr XmpKey::clone() const {
 5287|  71.4k|  return UniquePtr(clone_());
 5288|  71.4k|}
_ZNK5Exiv26XmpKey6clone_Ev:
 5290|  71.4k|XmpKey* XmpKey::clone_() const {
 5291|  71.4k|  return new XmpKey(*this);
 5292|  71.4k|}
_ZNK5Exiv26XmpKey3keyEv:
 5294|  6.86M|std::string XmpKey::key() const {
 5295|  6.86M|  return std::string(Exiv2::XmpKey::Impl::familyName_) + "." + p_->prefix_ + "." + p_->property_;
 5296|  6.86M|}
_ZNK5Exiv26XmpKey9groupNameEv:
 5302|  25.0k|std::string XmpKey::groupName() const {
 5303|  25.0k|  return p_->prefix_;
 5304|  25.0k|}
_ZNK5Exiv26XmpKey7tagNameEv:
 5306|  38.6k|std::string XmpKey::tagName() const {
 5307|  38.6k|  return p_->property_;
 5308|  38.6k|}
_ZN5Exiv26XmpKey4Impl12decomposeKeyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 5335|  87.4k|void XmpKey::Impl::decomposeKey(const std::string& key) {
 5336|  87.4k|  XmpProperties::XmpLock lock;
 5337|  87.4k|  decomposeKeyUnlocked(key, lock);
 5338|  87.4k|}  // XmpKey::Impl::decomposeKey
_ZN5Exiv26XmpKey4Impl20decomposeKeyUnlockedERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_13XmpProperties7XmpLockE:
 5340|   575k|void XmpKey::Impl::decomposeKeyUnlocked(const std::string& key, const XmpProperties::XmpLock& lock) {
 5341|       |  // Get the family name, prefix and property name parts of the key
 5342|   575k|  if (!key.starts_with(familyName_))
  ------------------
  |  Branch (5342:7): [True: 50, False: 575k]
  ------------------
 5343|     50|    throw Error(ErrorCode::kerInvalidKey, key);
 5344|   575k|  std::string::size_type pos1 = key.find('.');
 5345|   575k|  std::string::size_type pos0 = pos1 + 1;
 5346|   575k|  pos1 = key.find('.', pos0);
 5347|   575k|  if (pos1 == std::string::npos)
  ------------------
  |  Branch (5347:7): [True: 0, False: 575k]
  ------------------
 5348|      0|    throw Error(ErrorCode::kerInvalidKey, key);
 5349|   575k|  std::string prefix = key.substr(pos0, pos1 - pos0);
 5350|   575k|  if (prefix.empty())
  ------------------
  |  Branch (5350:7): [True: 0, False: 575k]
  ------------------
 5351|      0|    throw Error(ErrorCode::kerInvalidKey, key);
 5352|   575k|  std::string property = key.substr(pos1 + 1);
 5353|   575k|  if (property.empty())
  ------------------
  |  Branch (5353:7): [True: 0, False: 575k]
  ------------------
 5354|      0|    throw Error(ErrorCode::kerInvalidKey, key);
 5355|       |
 5356|       |  // Validate prefix unlocked (must hold lock)
 5357|   575k|  if (XmpProperties::nsUnlocked(prefix, lock).empty())
  ------------------
  |  Branch (5357:7): [True: 0, False: 575k]
  ------------------
 5358|      0|    throw Error(ErrorCode::kerNoNamespaceForPrefix, prefix);
 5359|       |
 5360|   575k|  property_ = std::move(property);
 5361|   575k|  prefix_ = std::move(prefix);
 5362|   575k|}  // XmpKey::Impl::decomposeKeyUnlocked
properties.cpp:_ZNK12_GLOBAL__N_112XmpPrintInfoeqERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   21|  1.17M|  bool operator==(const std::string& key) const {
   22|  1.17M|    return key == key_;
   23|  1.17M|  }
_ZN5Exiv26XmpKey4ImplC2Ev:
 5224|   575k|  Impl() = default;                                                                             //!< Default constructor

_ZN5Exiv28PsdImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  103|    182|    Image(ImageType::psd, mdExif | mdIptc | mdXmp, std::move(io), params) {
  104|    182|}  // PsdImage::PsdImage
_ZN5Exiv28PsdImage12readMetadataEv:
  115|    175|void PsdImage::readMetadata() {
  116|       |#ifdef EXIV2_DEBUG_MESSAGES
  117|       |  std::cerr << "Exiv2::PsdImage::readMetadata: Reading Photoshop file " << io_->path() << "\n";
  118|       |#endif
  119|    175|  if (io_->open() != 0) {
  ------------------
  |  Branch (119:7): [True: 0, False: 175]
  ------------------
  120|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  121|      0|  }
  122|    175|  IoCloser closer(*io_);
  123|       |  // Ensure that this is the correct image type
  124|    175|  if (!isPsdType(*io_, false)) {
  ------------------
  |  Branch (124:7): [True: 0, False: 175]
  ------------------
  125|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (125:9): [True: 0, False: 0]
  |  Branch (125:25): [True: 0, False: 0]
  ------------------
  126|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  127|      0|    throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  128|      0|  }
  129|    175|  clearMetadata();
  130|       |
  131|       |  /*
  132|       |    The Photoshop header goes as follows -- all numbers are in big-endian byte order:
  133|       |
  134|       |    offset  length   name       description
  135|       |    ======  =======  =========  =========
  136|       |     0      4 bytes  signature  always '8BPS'
  137|       |     4      2 bytes  version    always equal to 1
  138|       |     6      6 bytes  reserved   must be zero
  139|       |    12      2 bytes  channels   number of channels in the image, including alpha channels (1 to 24)
  140|       |    14      4 bytes  rows       the height of the image in pixels
  141|       |    18      4 bytes  columns    the width of the image in pixels
  142|       |    22      2 bytes  depth      the number of bits per channel
  143|       |    24      2 bytes  mode       the color mode of the file; Supported values are: Bitmap=0; Grayscale=1;
  144|       |    Indexed=2; RGB=3; CMYK=4; Multichannel=7; Duotone=8; Lab=9
  145|       |  */
  146|    175|  byte buf[26];
  147|    175|  if (io_->read(buf, 26) != 26) {
  ------------------
  |  Branch (147:7): [True: 0, False: 175]
  ------------------
  148|      0|    throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  149|      0|  }
  150|    175|  pixelWidth_ = getLong(buf + 18, bigEndian);
  151|    175|  pixelHeight_ = getLong(buf + 14, bigEndian);
  152|       |
  153|       |  // immediately following the image header is the color mode data section,
  154|       |  // the first four bytes of which specify the byte size of the whole section
  155|    175|  if (io_->read(buf, 4) != 4) {
  ------------------
  |  Branch (155:7): [True: 0, False: 175]
  ------------------
  156|      0|    throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  157|      0|  }
  158|       |
  159|       |  // skip it
  160|    175|  if (io_->seek(getULong(buf, bigEndian), BasicIo::cur)) {
  ------------------
  |  Branch (160:7): [True: 6, False: 169]
  ------------------
  161|      6|    throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  162|      6|  }
  163|       |
  164|       |  // after the color data section, comes a list of resource blocks, preceded by the total byte size
  165|    169|  if (io_->read(buf, 4) != 4) {
  ------------------
  |  Branch (165:7): [True: 1, False: 168]
  ------------------
  166|      1|    throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  167|      1|  }
  168|    168|  uint32_t resourcesLength = getULong(buf, bigEndian);
  169|    168|  Internal::enforce(resourcesLength < io_->size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  170|       |
  171|    320|  while (resourcesLength > 0) {
  ------------------
  |  Branch (171:10): [True: 247, False: 73]
  ------------------
  172|    247|    Internal::enforce(resourcesLength >= 8, Exiv2::ErrorCode::kerCorruptedMetadata);
  173|    247|    resourcesLength -= 8;
  174|    247|    if (io_->read(buf, 8) != 8) {
  ------------------
  |  Branch (174:9): [True: 4, False: 243]
  ------------------
  175|      4|      throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  176|      4|    }
  177|       |
  178|    243|    if (!Photoshop::isIrb(buf)) {
  ------------------
  |  Branch (178:9): [True: 90, False: 153]
  ------------------
  179|     90|      break;  // bad resource type
  180|     90|    }
  181|    153|    uint16_t resourceId = getUShort(buf + 4, bigEndian);
  182|    153|    uint32_t resourceNameLength = buf[6] & ~1;
  183|       |
  184|       |    // skip the resource name, plus any padding
  185|    153|    Internal::enforce(resourceNameLength <= resourcesLength, Exiv2::ErrorCode::kerCorruptedMetadata);
  186|    153|    resourcesLength -= resourceNameLength;
  187|    153|    io_->seek(resourceNameLength, BasicIo::cur);
  188|       |
  189|       |    // read resource size
  190|    153|    Internal::enforce(resourcesLength >= 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  191|    153|    resourcesLength -= 4;
  192|    153|    if (io_->read(buf, 4) != 4) {
  ------------------
  |  Branch (192:9): [True: 1, False: 152]
  ------------------
  193|      1|      throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  194|      1|    }
  195|    152|    uint32_t resourceSize = getULong(buf, bigEndian);
  196|    152|    const size_t curOffset = io_->tell();
  197|       |
  198|       |#ifdef EXIV2_DEBUG_MESSAGES
  199|       |    std::cerr << std::hex << "resourceId: " << resourceId << std::dec << " length: " << resourceSize << std::hex
  200|       |              << "\n";
  201|       |#endif
  202|       |
  203|    152|    Internal::enforce(resourceSize <= resourcesLength, Exiv2::ErrorCode::kerCorruptedMetadata);
  204|    152|    readResourceBlock(resourceId, resourceSize);
  205|    152|    resourceSize = (resourceSize + 1) & ~1;  // pad to even
  206|    152|    Internal::enforce(resourceSize <= resourcesLength, Exiv2::ErrorCode::kerCorruptedMetadata);
  207|    152|    resourcesLength -= resourceSize;
  208|    152|    io_->seek(curOffset + resourceSize, BasicIo::beg);
  209|    152|  }
  210|       |
  211|    168|}  // PsdImage::readMetadata
_ZN5Exiv28PsdImage17readResourceBlockEtj:
  213|    116|void PsdImage::readResourceBlock(uint16_t resourceId, uint32_t resourceSize) {
  214|    116|  switch (resourceId) {
  215|     12|    case kPhotoshopResourceID::IPTC_NAA: {
  ------------------
  |  Branch (215:5): [True: 12, False: 104]
  ------------------
  216|     12|      DataBuf rawIPTC(resourceSize);
  217|     12|      io_->read(rawIPTC.data(), rawIPTC.size());
  218|     12|      if (io_->error() || io_->eof())
  ------------------
  |  Branch (218:11): [True: 0, False: 12]
  |  Branch (218:27): [True: 1, False: 11]
  ------------------
  219|      1|        throw Error(ErrorCode::kerFailedToReadImageData);
  220|     11|      if (IptcParser::decode(iptcData_, rawIPTC.c_data(), rawIPTC.size())) {
  ------------------
  |  Branch (220:11): [True: 3, False: 8]
  ------------------
  221|      3|#ifndef SUPPRESS_WARNINGS
  222|      3|        EXV_WARNING << "Failed to decode IPTC metadata.\n";
  ------------------
  |  |  138|      3|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 3]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      3|  LogMsg(LogMsg::warn).os()
  ------------------
  223|      3|#endif
  224|      3|        iptcData_.clear();
  225|      3|      }
  226|     11|      break;
  227|     12|    }
  228|       |
  229|      9|    case kPhotoshopResourceID::ExifInfo: {
  ------------------
  |  Branch (229:5): [True: 9, False: 107]
  ------------------
  230|      9|      DataBuf rawExif(resourceSize);
  231|      9|      io_->read(rawExif.data(), rawExif.size());
  232|      9|      if (io_->error() || io_->eof())
  ------------------
  |  Branch (232:11): [True: 0, False: 9]
  |  Branch (232:27): [True: 1, False: 8]
  ------------------
  233|      1|        throw Error(ErrorCode::kerFailedToReadImageData);
  234|      8|      const DecodeParams dp(max_recursion_depth_);
  235|      8|      ByteOrder bo = ExifParser::decode(exifData_, rawExif.c_data(), rawExif.size(), dp);
  236|      8|      setByteOrder(bo);
  237|      8|      if (!rawExif.empty() && byteOrder() == invalidByteOrder) {
  ------------------
  |  Branch (237:11): [True: 1, False: 7]
  |  Branch (237:31): [True: 0, False: 1]
  ------------------
  238|      0|#ifndef SUPPRESS_WARNINGS
  239|      0|        EXV_WARNING << "Failed to decode Exif metadata.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  240|      0|#endif
  241|      0|        exifData_.clear();
  242|      0|      }
  243|      8|      break;
  244|      9|    }
  245|       |
  246|     12|    case kPhotoshopResourceID::XMPPacket: {
  ------------------
  |  Branch (246:5): [True: 12, False: 104]
  ------------------
  247|     12|      DataBuf xmpPacket(resourceSize);
  248|     12|      io_->read(xmpPacket.data(), xmpPacket.size());
  249|     12|      if (io_->error() || io_->eof())
  ------------------
  |  Branch (249:11): [True: 0, False: 12]
  |  Branch (249:27): [True: 1, False: 11]
  ------------------
  250|      1|        throw Error(ErrorCode::kerFailedToReadImageData);
  251|     11|      xmpPacket_.assign(xmpPacket.c_str(), xmpPacket.size());
  252|     11|      const DecodeParams dp(max_recursion_depth_);
  253|     11|      if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_, dp)) {
  ------------------
  |  Branch (253:11): [True: 4, False: 7]
  |  Branch (253:34): [True: 4, False: 0]
  ------------------
  254|      4|#ifndef SUPPRESS_WARNINGS
  255|      4|        EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|      4|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 4]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      4|  LogMsg(LogMsg::warn).os()
  ------------------
  256|      4|#endif
  257|      4|      }
  258|     11|      break;
  259|     12|    }
  260|       |
  261|       |    // - PS 4.0 preview data is fetched from ThumbnailResource
  262|       |    // - PS >= 5.0 preview data is fetched from ThumbnailResource2
  263|      2|    case kPhotoshopResourceID::ThumbnailResource:
  ------------------
  |  Branch (263:5): [True: 2, False: 114]
  ------------------
  264|     28|    case kPhotoshopResourceID::ThumbnailResource2: {
  ------------------
  |  Branch (264:5): [True: 26, False: 90]
  ------------------
  265|       |      /*
  266|       |        Photoshop thumbnail resource header
  267|       |
  268|       |        offset  length    name            description
  269|       |        ======  ========  ====            ===========
  270|       |         0      4 bytes   format          = 1 (kJpegRGB). Also supports kRawRGB (0).
  271|       |         4      4 bytes   width           Width of thumbnail in pixels.
  272|       |         8      4 bytes   height          Height of thumbnail in pixels.
  273|       |        12      4 bytes   widthbytes      Padded row bytes as (width * bitspixel + 31) / 32 * 4.
  274|       |        16      4 bytes   size            Total size as widthbytes * height * planes
  275|       |        20      4 bytes   compressedsize  Size after compression. Used for consistency check.
  276|       |        24      2 bytes   bitspixel       = 24. Bits per pixel.
  277|       |        26      2 bytes   planes          = 1. Number of planes.
  278|       |        28      variable  data            JFIF data in RGB format.
  279|       |                                          Note: For resource ID 1033 the data is in BGR format.
  280|       |      */
  281|     28|      byte buf[28];
  282|     28|      if (io_->read(buf, 28) != 28) {
  ------------------
  |  Branch (282:11): [True: 2, False: 26]
  ------------------
  283|      2|        throw Error(ErrorCode::kerNotAnImage, "Photoshop");
  284|      2|      }
  285|     26|      NativePreview nativePreview;
  286|     26|      nativePreview.position_ = io_->tell();
  287|     26|      nativePreview.size_ = getLong(buf + 20, bigEndian);  // compressedsize
  288|     26|      nativePreview.width_ = getLong(buf + 4, bigEndian);
  289|     26|      nativePreview.height_ = getLong(buf + 8, bigEndian);
  290|     26|      const uint32_t format = getLong(buf + 0, bigEndian);
  291|       |
  292|     26|      Internal::enforce(nativePreview.size_ <= static_cast<size_t>(std::numeric_limits<long>::max()),
  293|     26|                        Exiv2::ErrorCode::kerCorruptedMetadata);
  294|       |
  295|     26|      if (nativePreview.size_ > 0 && nativePreview.position_ > 0) {
  ------------------
  |  Branch (295:11): [True: 10, False: 16]
  |  Branch (295:38): [True: 10, False: 0]
  ------------------
  296|     10|        io_->seek(static_cast<long>(nativePreview.size_), BasicIo::cur);
  297|     10|        if (io_->error() || io_->eof())
  ------------------
  |  Branch (297:13): [True: 0, False: 10]
  |  Branch (297:29): [True: 3, False: 7]
  ------------------
  298|      3|          throw Error(ErrorCode::kerFailedToReadImageData);
  299|       |
  300|       |        // unsupported format of native preview
  301|      7|        if (format != 1)
  ------------------
  |  Branch (301:13): [True: 7, False: 0]
  ------------------
  302|      7|          break;
  303|      0|        nativePreview.filter_ = "";
  304|      0|        nativePreview.mimeType_ = "image/jpeg";
  305|      0|        nativePreviews_.push_back(std::move(nativePreview));
  306|      0|      }
  307|     16|      break;
  308|     26|    }
  309|       |
  310|     55|    default:
  ------------------
  |  Branch (310:5): [True: 55, False: 61]
  ------------------
  311|     55|      break;
  312|    116|  }
  313|    116|}  // PsdImage::readResourceBlock
_ZN5Exiv214newPsdInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  679|    182|Image::UniquePtr newPsdInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  680|    182|  auto image = std::make_unique<PsdImage>(std::move(io), params);
  681|    182|  if (!image->good()) {
  ------------------
  |  Branch (681:7): [True: 7, False: 175]
  ------------------
  682|      7|    return nullptr;
  683|      7|  }
  684|    175|  return image;
  685|    182|}
_ZN5Exiv29isPsdTypeERNS_7BasicIoEb:
  687|  10.7k|bool isPsdType(BasicIo& iIo, bool advance) {
  688|  10.7k|  const int32_t len = 6;
  689|  10.7k|  const std::array<byte, len> PsdHeader{'8', 'B', 'P', 'S', 0, 1};
  690|  10.7k|  std::array<byte, len> buf;
  691|  10.7k|  iIo.read(buf.data(), len);
  692|  10.7k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (692:7): [True: 0, False: 10.7k]
  |  Branch (692:22): [True: 149, False: 10.5k]
  ------------------
  693|    149|    return false;
  694|    149|  }
  695|  10.5k|  bool matched = buf == PsdHeader;
  696|  10.5k|  if (!advance || !matched) {
  ------------------
  |  Branch (696:7): [True: 10.5k, False: 0]
  |  Branch (696:19): [True: 0, False: 0]
  ------------------
  697|  10.5k|    iIo.seek(-len, BasicIo::cur);
  698|  10.5k|  }
  699|       |
  700|  10.5k|  return matched;
  701|  10.7k|}

_ZN5Exiv214QuickTimeVideoC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  540|  1.87k|    Image(ImageType::qtime, mdNone, std::move(io), params), mvhdTimeScale_(1), mdhdTimeScale_(1), currentStream_(Null) {
  541|  1.87k|}  // QuickTimeVideo::QuickTimeVideo
_ZNK5Exiv214QuickTimeVideo8mimeTypeEv:
  543|  1.87k|std::string QuickTimeVideo::mimeType() const {
  544|  1.87k|  return "video/quicktime";
  545|  1.87k|}
_ZN5Exiv214QuickTimeVideo12readMetadataEv:
  550|  1.87k|void QuickTimeVideo::readMetadata() {
  551|  1.87k|  if (io_->open() != 0)
  ------------------
  |  Branch (551:7): [True: 0, False: 1.87k]
  ------------------
  552|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  553|       |
  554|       |  // Ensure that this is the correct image type
  555|  1.87k|  if (!isQTimeType(*io_, false)) {
  ------------------
  |  Branch (555:7): [True: 0, False: 1.87k]
  ------------------
  556|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (556:9): [True: 0, False: 0]
  |  Branch (556:25): [True: 0, False: 0]
  ------------------
  557|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  558|      0|    throw Error(ErrorCode::kerNotAnImage, "QuickTime");
  559|      0|  }
  560|       |
  561|  1.87k|  IoCloser closer(*io_);
  562|  1.87k|  clearMetadata();
  563|  1.87k|  continueTraversing_ = true;
  564|  1.87k|  height_ = width_ = 1;
  565|       |
  566|  1.87k|  xmpData_["Xmp.video.FileSize"] = static_cast<double>(io_->size()) / 1048576.0;
  567|  1.87k|  xmpData_["Xmp.video.MimeType"] = mimeType();
  568|       |
  569|  20.2k|  while (continueTraversing_)
  ------------------
  |  Branch (569:10): [True: 18.3k, False: 1.87k]
  ------------------
  570|  18.3k|    decodeBlock(0);
  571|       |
  572|  1.87k|  xmpData_["Xmp.video.AspectRatio"] = getAspectRatio(width_, height_);
  573|  1.87k|}  // QuickTimeVideo::readMetadata
_ZN5Exiv214QuickTimeVideo11decodeBlockEmRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  575|  23.1k|void QuickTimeVideo::decodeBlock(size_t recursion_depth, std::string const& entered_from) {
  576|  23.1k|  enforce(recursion_depth < max_recursion_depth_, Exiv2::ErrorCode::kerCorruptedMetadata);
  577|       |
  578|  23.1k|  const long bufMinSize = 4;
  579|  23.1k|  DataBuf buf(bufMinSize + 1);
  580|  23.1k|  uint64_t size = 0;
  581|  23.1k|  buf.data()[4] = '\0';
  582|       |
  583|  23.1k|  io_->read(buf.data(), 4);
  584|  23.1k|  if (io_->eof()) {
  ------------------
  |  Branch (584:7): [True: 202, False: 22.9k]
  ------------------
  585|    202|    continueTraversing_ = false;
  586|    202|    return;
  587|    202|  }
  588|       |
  589|  22.9k|  size = buf.read_uint32(0, bigEndian);
  590|       |
  591|  22.9k|  io_->readOrThrow(buf.data(), 4);
  592|       |
  593|       |  // we have read 2x 4 bytes
  594|  22.9k|  size_t hdrsize = 8;
  595|       |
  596|  22.9k|  if (size == 1) {
  ------------------
  |  Branch (596:7): [True: 57, False: 22.9k]
  ------------------
  597|       |    // The box size is encoded as a uint64_t, so we need to read another 8 bytes.
  598|     57|    DataBuf data(8);
  599|     57|    hdrsize += 8;
  600|     57|    io_->readOrThrow(data.data(), data.size());
  601|     57|    size = data.read_uint64(0, bigEndian);
  602|  22.9k|  } else if (size == 0 && entered_from == "meta") {
  ------------------
  |  Branch (602:14): [True: 110, False: 22.7k]
  |  Branch (602:27): [True: 50, False: 60]
  ------------------
  603|     50|    size = buf.read_uint32(0, bigEndian);
  604|     50|    io_->readOrThrow(buf.data(), 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  605|     50|  }
  606|       |
  607|  22.9k|  enforce(size >= hdrsize, Exiv2::ErrorCode::kerCorruptedMetadata);
  608|  22.9k|  enforce(size - hdrsize <= io_->size() - io_->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  609|  22.9k|  enforce(size - hdrsize <= std::numeric_limits<size_t>::max(), Exiv2::ErrorCode::kerCorruptedMetadata);
  610|       |
  611|       |  // std::cerr<<"Tag=>"<<buf.data()<<"     size=>"<<size-hdrsize << '\n';
  612|  22.9k|  const auto newsize = static_cast<size_t>(size - hdrsize);
  613|  22.9k|  if (ignoreList(buf)) {
  ------------------
  |  Branch (613:7): [True: 637, False: 22.3k]
  ------------------
  614|    637|    discard(newsize);
  615|    637|    return;
  616|    637|  }
  617|  22.3k|  tagDecoder(buf, newsize, recursion_depth + 1);
  618|  22.3k|}  // QuickTimeVideo::decodeBlock
_ZN5Exiv214QuickTimeVideo10tagDecoderERNS_7DataBufEmm:
  628|  21.4k|void QuickTimeVideo::tagDecoder(Exiv2::DataBuf& buf, size_t size, size_t recursion_depth) {
  629|  21.4k|  enforce(recursion_depth < max_recursion_depth_, Exiv2::ErrorCode::kerCorruptedMetadata);
  630|  21.4k|  assert(buf.size() > 4);
  631|       |
  632|  21.4k|  if (ignoreList(buf))
  ------------------
  |  Branch (632:7): [True: 0, False: 21.4k]
  ------------------
  633|      0|    discard(size);
  634|       |
  635|  21.4k|  else if (dataIgnoreList(buf)) {
  ------------------
  |  Branch (635:12): [True: 1.89k, False: 19.5k]
  ------------------
  636|  1.89k|    decodeBlock(recursion_depth + 1, Exiv2::toString(buf.data()));
  637|  19.5k|  } else if (equalsQTimeTag(buf, "ftyp"))
  ------------------
  |  Branch (637:14): [True: 3.00k, False: 16.5k]
  ------------------
  638|  3.00k|    fileTypeDecoder(size);
  639|       |
  640|  16.5k|  else if (equalsQTimeTag(buf, "trak"))
  ------------------
  |  Branch (640:12): [True: 2.58k, False: 14.0k]
  ------------------
  641|  2.58k|    setMediaStream(size);
  642|       |
  643|  14.0k|  else if (equalsQTimeTag(buf, "mvhd"))
  ------------------
  |  Branch (643:12): [True: 71, False: 13.9k]
  ------------------
  644|     71|    movieHeaderDecoder(size);
  645|       |
  646|  13.9k|  else if (equalsQTimeTag(buf, "tkhd"))
  ------------------
  |  Branch (646:12): [True: 248, False: 13.6k]
  ------------------
  647|    248|    trackHeaderDecoder(size);
  648|       |
  649|  13.6k|  else if (equalsQTimeTag(buf, "mdhd"))
  ------------------
  |  Branch (649:12): [True: 102, False: 13.5k]
  ------------------
  650|    102|    mediaHeaderDecoder(size);
  651|       |
  652|  13.5k|  else if (equalsQTimeTag(buf, "hdlr"))
  ------------------
  |  Branch (652:12): [True: 694, False: 12.8k]
  ------------------
  653|    694|    handlerDecoder(size);
  654|       |
  655|  12.8k|  else if (equalsQTimeTag(buf, "vmhd"))
  ------------------
  |  Branch (655:12): [True: 843, False: 12.0k]
  ------------------
  656|    843|    videoHeaderDecoder(size);
  657|       |
  658|  12.0k|  else if (equalsQTimeTag(buf, "udta"))
  ------------------
  |  Branch (658:12): [True: 1.35k, False: 10.6k]
  ------------------
  659|  1.35k|    userDataDecoder(size, recursion_depth + 1);
  660|       |
  661|  10.6k|  else if (equalsQTimeTag(buf, "dref"))
  ------------------
  |  Branch (661:12): [True: 2.13k, False: 8.55k]
  ------------------
  662|  2.13k|    multipleEntriesDecoder(recursion_depth + 1);
  663|       |
  664|  8.55k|  else if (equalsQTimeTag(buf, "stsd"))
  ------------------
  |  Branch (664:12): [True: 334, False: 8.22k]
  ------------------
  665|    334|    sampleDesc(size);
  666|       |
  667|  8.22k|  else if (equalsQTimeTag(buf, "stts"))
  ------------------
  |  Branch (667:12): [True: 160, False: 8.06k]
  ------------------
  668|    160|    timeToSampleDecoder();
  669|       |
  670|  8.06k|  else if (equalsQTimeTag(buf, "pnot"))
  ------------------
  |  Branch (670:12): [True: 139, False: 7.92k]
  ------------------
  671|    139|    previewTagDecoder(size);
  672|       |
  673|  7.92k|  else if (equalsQTimeTag(buf, "tapt"))
  ------------------
  |  Branch (673:12): [True: 995, False: 6.93k]
  ------------------
  674|    995|    trackApertureTagDecoder(size);
  675|       |
  676|  6.93k|  else if (equalsQTimeTag(buf, "keys"))
  ------------------
  |  Branch (676:12): [True: 89, False: 6.84k]
  ------------------
  677|     89|    keysTagDecoder(size);
  678|       |
  679|  6.84k|  else if (equalsQTimeTag(buf, "url ")) {
  ------------------
  |  Branch (679:12): [True: 397, False: 6.44k]
  ------------------
  680|    397|    if (currentStream_ == Video)
  ------------------
  |  Branch (680:9): [True: 181, False: 216]
  ------------------
  681|    181|      xmpData_["Xmp.video.URL"] = readString(*io_, size);
  682|    216|    else if (currentStream_ == Audio)
  ------------------
  |  Branch (682:14): [True: 169, False: 47]
  ------------------
  683|    169|      xmpData_["Xmp.audio.URL"] = readString(*io_, size);
  684|     47|    else
  685|     47|      discard(size);
  686|    397|  }
  687|       |
  688|  6.44k|  else if (equalsQTimeTag(buf, "urn ")) {
  ------------------
  |  Branch (688:12): [True: 640, False: 5.80k]
  ------------------
  689|    640|    if (currentStream_ == Video)
  ------------------
  |  Branch (689:9): [True: 371, False: 269]
  ------------------
  690|    371|      xmpData_["Xmp.video.URN"] = readString(*io_, size);
  691|    269|    else if (currentStream_ == Audio)
  ------------------
  |  Branch (691:14): [True: 23, False: 246]
  ------------------
  692|     23|      xmpData_["Xmp.audio.URN"] = readString(*io_, size);
  693|    246|    else
  694|    246|      discard(size);
  695|    640|  }
  696|       |
  697|  5.80k|  else if (equalsQTimeTag(buf, "dcom")) {
  ------------------
  |  Branch (697:12): [True: 9, False: 5.79k]
  ------------------
  698|      9|    xmpData_["Xmp.video.Compressor"] = readString(*io_, size);
  699|      9|  }
  700|       |
  701|  5.79k|  else if (equalsQTimeTag(buf, "smhd")) {
  ------------------
  |  Branch (701:12): [True: 20, False: 5.77k]
  ------------------
  702|     20|    io_->readOrThrow(buf.data(), 4);
  703|     20|    io_->readOrThrow(buf.data(), 4);
  704|     20|    xmpData_["Xmp.audio.Balance"] = buf.read_uint16(0, bigEndian);
  705|     20|  }
  706|       |
  707|  5.77k|  else {
  708|  5.77k|    discard(size);
  709|  5.77k|  }
  710|  21.4k|}  // QuickTimeVideo::tagDecoder
_ZN5Exiv214QuickTimeVideo7discardEm:
  712|  6.70k|void QuickTimeVideo::discard(size_t size) {
  713|  6.70k|  size_t cur_pos = io_->tell();
  714|  6.70k|  io_->seek(cur_pos + size, BasicIo::beg);
  715|  6.70k|}  // QuickTimeVideo::discard
_ZN5Exiv214QuickTimeVideo17previewTagDecoderEm:
  717|    139|void QuickTimeVideo::previewTagDecoder(size_t size) {
  718|    139|  DataBuf buf(5);
  719|    139|  size_t cur_pos = io_->tell();
  720|    139|  io_->readOrThrow(buf.data(), 4);
  721|    139|  xmpData_["Xmp.video.PreviewDate"] = buf.read_uint32(0, bigEndian);
  722|    139|  io_->readOrThrow(buf.data(), 2);
  723|    139|  xmpData_["Xmp.video.PreviewVersion"] = getShort(buf.data(), bigEndian);
  724|       |
  725|    139|  io_->readOrThrow(buf.data(), 4);
  726|    139|  buf.write_uint8(4, 0);  // nul-terminate string
  727|    139|  if (equalsQTimeTag(buf, "PICT"))
  ------------------
  |  Branch (727:7): [True: 3, False: 136]
  ------------------
  728|      3|    xmpData_["Xmp.video.PreviewAtomType"] = "QuickDraw Picture";
  729|    136|  else
  730|    136|    xmpData_["Xmp.video.PreviewAtomType"] = buf.data();
  731|       |
  732|    139|  io_->seek(cur_pos + size, BasicIo::beg);
  733|    139|}  // QuickTimeVideo::previewTagDecoder
_ZN5Exiv214QuickTimeVideo14keysTagDecoderEm:
  735|     89|void QuickTimeVideo::keysTagDecoder(size_t size) {
  736|     89|  DataBuf buf(5);
  737|     89|  size_t cur_pos = io_->tell();
  738|     89|  io_->readOrThrow(buf.data(), 4);
  739|     89|  xmpData_["Xmp.video.PreviewDate"] = buf.read_uint32(0, bigEndian);
  740|     89|  io_->readOrThrow(buf.data(), 2);
  741|     89|  xmpData_["Xmp.video.PreviewVersion"] = getShort(buf.data(), bigEndian);
  742|       |
  743|     89|  io_->readOrThrow(buf.data(), 4);
  744|     89|  buf.write_uint8(4, 0);  // nul-terminate string
  745|     89|  if (equalsQTimeTag(buf, "PICT"))
  ------------------
  |  Branch (745:7): [True: 1, False: 88]
  ------------------
  746|      1|    xmpData_["Xmp.video.PreviewAtomType"] = "QuickDraw Picture";
  747|     88|  else
  748|     88|    xmpData_["Xmp.video.PreviewAtomType"] = buf.data();
  749|       |
  750|     89|  io_->seek(cur_pos + size, BasicIo::beg);
  751|     89|}  // QuickTimeVideo::keysTagDecoder
_ZN5Exiv214QuickTimeVideo23trackApertureTagDecoderEm:
  753|    995|void QuickTimeVideo::trackApertureTagDecoder(size_t size) {
  754|    995|  DataBuf buf(4);
  755|    995|  DataBuf buf2(2);
  756|    995|  size_t cur_pos = io_->tell();
  757|    995|  byte n = 3;
  758|       |
  759|  3.97k|  while (n--) {
  ------------------
  |  Branch (759:10): [True: 2.97k, False: 995]
  ------------------
  760|  2.97k|    io_->seek(4L, BasicIo::cur);
  761|  2.97k|    io_->readOrThrow(buf.data(), 4);
  762|       |
  763|  2.97k|    if (equalsQTimeTag(buf, "clef")) {
  ------------------
  |  Branch (763:9): [True: 31, False: 2.94k]
  ------------------
  764|     31|      io_->seek(4L, BasicIo::cur);
  765|     31|      io_->readOrThrow(buf.data(), 2);
  766|     31|      io_->readOrThrow(buf2.data(), 2);
  767|     31|      xmpData_["Xmp.video.CleanApertureWidth"] =
  768|     31|          stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|     31|#define stringFormat std::format
  ------------------
  769|     31|      io_->readOrThrow(buf.data(), 2);
  770|     31|      io_->readOrThrow(buf2.data(), 2);
  771|     31|      xmpData_["Xmp.video.CleanApertureHeight"] =
  772|     31|          stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|     31|#define stringFormat std::format
  ------------------
  773|     31|    }
  774|       |
  775|  2.94k|    else if (equalsQTimeTag(buf, "prof")) {
  ------------------
  |  Branch (775:14): [True: 36, False: 2.91k]
  ------------------
  776|     36|      io_->seek(4L, BasicIo::cur);
  777|     36|      io_->readOrThrow(buf.data(), 2);
  778|     36|      io_->readOrThrow(buf2.data(), 2);
  779|     36|      xmpData_["Xmp.video.ProductionApertureWidth"] =
  780|     36|          stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|     36|#define stringFormat std::format
  ------------------
  781|     36|      io_->readOrThrow(buf.data(), 2);
  782|     36|      io_->readOrThrow(buf2.data(), 2);
  783|     36|      xmpData_["Xmp.video.ProductionApertureHeight"] =
  784|     36|          stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|     36|#define stringFormat std::format
  ------------------
  785|     36|    }
  786|       |
  787|  2.91k|    else if (equalsQTimeTag(buf, "enof")) {
  ------------------
  |  Branch (787:14): [True: 26, False: 2.88k]
  ------------------
  788|     26|      io_->seek(4L, BasicIo::cur);
  789|     26|      io_->readOrThrow(buf.data(), 2);
  790|     26|      io_->readOrThrow(buf2.data(), 2);
  791|     26|      xmpData_["Xmp.video.EncodedPixelsWidth"] =
  792|     26|          stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|     26|#define stringFormat std::format
  ------------------
  793|     26|      io_->readOrThrow(buf.data(), 2);
  794|     26|      io_->readOrThrow(buf2.data(), 2);
  795|     26|      xmpData_["Xmp.video.EncodedPixelsHeight"] =
  796|     26|          stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|     26|#define stringFormat std::format
  ------------------
  797|     26|    }
  798|  2.97k|  }
  799|    995|  io_->seek(cur_pos + size, BasicIo::beg);
  800|    995|}  // QuickTimeVideo::trackApertureTagDecoder
_ZN5Exiv214QuickTimeVideo17CameraTagsDecoderEm:
  802|    288|void QuickTimeVideo::CameraTagsDecoder(size_t size) {
  803|    288|  size_t cur_pos = io_->tell();
  804|    288|  DataBuf buf(49);
  805|    288|  DataBuf buf2(4);
  806|       |
  807|    288|  io_->readOrThrow(buf.data(), 4);
  808|    288|  if (equalsQTimeTag(buf, "NIKO")) {
  ------------------
  |  Branch (808:7): [True: 125, False: 163]
  ------------------
  809|    125|    io_->seek(cur_pos, BasicIo::beg);
  810|       |
  811|    125|    io_->readOrThrow(buf.data(), 24);
  812|    125|    buf.write_uint8(24, 0);  // nul-terminate string
  813|    125|    xmpData_["Xmp.video.Make"] = buf.data();
  814|    125|    io_->readOrThrow(buf.data(), 14);
  815|    125|    buf.write_uint8(14, 0);  // nul-terminate string
  816|    125|    xmpData_["Xmp.video.Model"] = buf.data();
  817|    125|    io_->readOrThrow(buf.data(), 4);
  818|    125|    xmpData_["Xmp.video.ExposureTime"] = stringFormat("1/{}", std::ceil(buf.read_uint32(0, littleEndian) / 10.0));
  ------------------
  |  |   18|    125|#define stringFormat std::format
  ------------------
  819|    125|    io_->readOrThrow(buf.data(), 4);
  820|    125|    io_->readOrThrow(buf2.data(), 4);
  821|    125|    xmpData_["Xmp.video.FNumber"] =
  822|    125|        buf.read_uint32(0, littleEndian) / static_cast<double>(buf2.read_uint32(0, littleEndian));
  823|    125|    io_->readOrThrow(buf.data(), 4);
  824|    125|    io_->readOrThrow(buf2.data(), 4);
  825|    125|    xmpData_["Xmp.video.ExposureCompensation"] =
  826|    125|        buf.read_uint32(0, littleEndian) / static_cast<double>(buf2.read_uint32(0, littleEndian));
  827|    125|    io_->readOrThrow(buf.data(), 10);
  828|    125|    io_->readOrThrow(buf.data(), 4);
  829|    125|    if (auto td = Exiv2::find(whiteBalance, buf.read_uint32(0, littleEndian)))
  ------------------
  |  Branch (829:14): [True: 53, False: 72]
  ------------------
  830|     53|      xmpData_["Xmp.video.WhiteBalance"] = _(td->label_);
  ------------------
  |  |   40|     53|#define _(String) (String)
  ------------------
  831|    125|    io_->readOrThrow(buf.data(), 4);
  832|    125|    io_->readOrThrow(buf2.data(), 4);
  833|    125|    xmpData_["Xmp.video.FocalLength"] =
  834|    125|        buf.read_uint32(0, littleEndian) / static_cast<double>(buf2.read_uint32(0, littleEndian));
  835|    125|    io_->seek(95L, BasicIo::cur);
  836|    125|    io_->readOrThrow(buf.data(), 48);
  837|    125|    buf.write_uint8(48, 0);
  838|    125|    xmpData_["Xmp.video.Software"] = buf.data();
  839|    125|    io_->readOrThrow(buf.data(), 4);
  840|    125|    xmpData_["Xmp.video.ISO"] = buf.read_uint32(0, littleEndian);
  841|    125|  }
  842|       |
  843|    288|  io_->seek(cur_pos + size, BasicIo::beg);
  844|    288|}  // QuickTimeVideo::CameraTagsDecoder
_ZN5Exiv214QuickTimeVideo15userDataDecoderEmm:
  846|  1.36k|void QuickTimeVideo::userDataDecoder(size_t outer_size, size_t recursion_depth) {
  847|  1.36k|  enforce(recursion_depth < max_recursion_depth_, Exiv2::ErrorCode::kerCorruptedMetadata);
  848|  1.36k|  const size_t start_pos = io_->tell();
  849|  1.36k|  const TagVocabulary* td;
  850|  1.36k|  const TagVocabulary* tv;
  851|  1.36k|  const TagVocabulary* tv_internal;
  852|       |
  853|  1.36k|  const long bufMinSize = 100;
  854|  1.36k|  DataBuf buf(bufMinSize);
  855|  1.36k|  size_t size_internal = outer_size;
  856|  1.36k|  std::memset(buf.data(), 0x0, buf.size());
  857|       |
  858|  3.51k|  while ((size_internal / 4 != 0) && (size_internal > 0)) {
  ------------------
  |  Branch (858:10): [True: 2.86k, False: 651]
  |  Branch (858:38): [True: 2.86k, False: 0]
  ------------------
  859|  2.86k|    const size_t loop_start_pos = io_->tell();
  860|  2.86k|    buf.data()[4] = '\0';
  861|  2.86k|    io_->readOrThrow(buf.data(), 4);
  862|  2.86k|    const size_t size = buf.read_uint32(0, bigEndian);
  863|  2.86k|    if (size > size_internal)
  ------------------
  |  Branch (863:9): [True: 700, False: 2.16k]
  ------------------
  864|    700|      break;
  865|  2.16k|    size_internal -= size;
  866|  2.16k|    io_->readOrThrow(buf.data(), 4);
  867|       |
  868|  2.16k|    if (buf.data()[0] == 169)
  ------------------
  |  Branch (868:9): [True: 13, False: 2.14k]
  ------------------
  869|     13|      buf.data()[0] = ' ';
  870|  2.16k|    td = Exiv2::find(userDatatags, Exiv2::toString(buf.data()));
  871|       |
  872|  2.16k|    tv = Exiv2::find(userDataReferencetags, Exiv2::toString(buf.data()));
  873|       |
  874|  2.16k|    if (size <= 12)
  ------------------
  |  Branch (874:9): [True: 18, False: 2.14k]
  ------------------
  875|     18|      break;
  876|       |
  877|  2.14k|    if (equalsQTimeTag(buf, "DcMD") || equalsQTimeTag(buf, "NCDT"))
  ------------------
  |  Branch (877:9): [True: 5, False: 2.13k]
  |  Branch (877:40): [True: 11, False: 2.12k]
  ------------------
  878|     16|      userDataDecoder(size - 8, recursion_depth + 1);
  879|       |
  880|  2.12k|    else if (equalsQTimeTag(buf, "NCTG"))
  ------------------
  |  Branch (880:14): [True: 1.27k, False: 851]
  ------------------
  881|  1.27k|      NikonTagsDecoder(size - 8);
  882|       |
  883|    851|    else if (equalsQTimeTag(buf, "TAGS"))
  ------------------
  |  Branch (883:14): [True: 288, False: 563]
  ------------------
  884|    288|      CameraTagsDecoder(size - 8);
  885|       |
  886|    563|    else if (equalsQTimeTag(buf, "CNCV") || equalsQTimeTag(buf, "CNFV") || equalsQTimeTag(buf, "CNMN") ||
  ------------------
  |  Branch (886:14): [True: 33, False: 530]
  |  Branch (886:45): [True: 10, False: 520]
  |  Branch (886:76): [True: 4, False: 516]
  ------------------
  887|    516|             equalsQTimeTag(buf, "NCHD") || equalsQTimeTag(buf, "FFMV")) {
  ------------------
  |  Branch (887:14): [True: 21, False: 495]
  |  Branch (887:45): [True: 11, False: 484]
  ------------------
  888|     79|      enforce(tv, Exiv2::ErrorCode::kerCorruptedMetadata);
  889|     79|      xmpData_[_(tv->label_)] = readString(*io_, size - 8);
  ------------------
  |  |   40|     79|#define _(String) (String)
  ------------------
  890|     79|    }
  891|       |
  892|    484|    else if (equalsQTimeTag(buf, "CMbo") || equalsQTimeTag(buf, "Cmbo")) {
  ------------------
  |  Branch (892:14): [True: 45, False: 439]
  |  Branch (892:45): [True: 0, False: 439]
  ------------------
  893|     45|      enforce(tv, Exiv2::ErrorCode::kerCorruptedMetadata);
  894|     45|      io_->readOrThrow(buf.data(), 2);
  895|     45|      buf.data()[2] = '\0';
  896|     45|      tv_internal = Exiv2::find(cameraByteOrderTags, Exiv2::toString(buf.data()));
  897|       |
  898|     45|      if (tv_internal)
  ------------------
  |  Branch (898:11): [True: 30, False: 15]
  ------------------
  899|     30|        xmpData_[_(tv->label_)] = _(tv_internal->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
                      xmpData_[_(tv->label_)] = _(tv_internal->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  900|     15|      else
  901|     15|        xmpData_[_(tv->label_)] = buf.data();
  ------------------
  |  |   40|     15|#define _(String) (String)
  ------------------
  902|     45|    }
  903|       |
  904|    439|    else if (tv) {
  ------------------
  |  Branch (904:14): [True: 86, False: 353]
  ------------------
  905|     86|      io_->readOrThrow(buf.data(), 4);
  906|     86|      xmpData_[_(tv->label_)] = readString(*io_, size - 12);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  907|     86|    }
  908|       |
  909|    353|    else if (td)
  ------------------
  |  Branch (909:14): [True: 15, False: 338]
  ------------------
  910|     15|      tagDecoder(buf, size - 8, recursion_depth + 1);
  911|       |
  912|  2.14k|    enforce(io_->tell() <= loop_start_pos + size, Exiv2::ErrorCode::kerCorruptedMetadata);
  913|  2.14k|  }
  914|       |
  915|  1.36k|  io_->seek(start_pos + outer_size, BasicIo::beg);
  916|  1.36k|}  // QuickTimeVideo::userDataDecoder
_ZN5Exiv214QuickTimeVideo16NikonTagsDecoderEm:
  918|  1.27k|void QuickTimeVideo::NikonTagsDecoder(size_t size) {
  919|  1.27k|  size_t cur_pos = io_->tell();
  920|  1.27k|  DataBuf buf(201);
  921|  1.27k|  DataBuf buf2(4 + 1);
  922|  1.27k|  uint32_t TagID = 0;
  923|  1.27k|  uint16_t dataLength = 0;
  924|  1.27k|  uint16_t dataType = 2;
  925|  1.27k|  const TagDetails* td;
  926|  1.27k|  const TagDetails* td2;
  927|       |
  928|   103k|  for (int i = 0; i < 100; i++) {
  ------------------
  |  Branch (928:19): [True: 102k, False: 1.27k]
  ------------------
  929|   102k|    io_->readOrThrow(buf.data(), 4);
  930|   102k|    TagID = buf.read_uint32(0, bigEndian);
  931|   102k|    td = Exiv2::find(NikonNCTGTags, TagID);
  932|       |
  933|   102k|    io_->readOrThrow(buf.data(), 2);
  934|   102k|    dataType = buf.read_uint16(0, bigEndian);
  935|       |
  936|   102k|    std::memset(buf.data(), 0x0, buf.size());
  937|   102k|    io_->readOrThrow(buf.data(), 2);
  938|       |
  939|   102k|    if (TagID == 0x2000023) {
  ------------------
  |  Branch (939:9): [True: 2.65k, False: 99.8k]
  ------------------
  940|  2.65k|      size_t local_pos = io_->tell();
  941|  2.65k|      dataLength = buf.read_uint16(0, bigEndian);
  942|  2.65k|      std::memset(buf.data(), 0x0, buf.size());
  943|       |
  944|  2.65k|      io_->readOrThrow(buf.data(), 4);
  945|  2.65k|      xmpData_["Xmp.video.PictureControlVersion"] = buf.data();
  946|  2.65k|      io_->readOrThrow(buf.data(), 20);
  947|  2.65k|      xmpData_["Xmp.video.PictureControlName"] = buf.data();
  948|  2.65k|      io_->readOrThrow(buf.data(), 20);
  949|  2.65k|      xmpData_["Xmp.video.PictureControlBase"] = buf.data();
  950|  2.65k|      io_->readOrThrow(buf.data(), 4);
  951|  2.65k|      std::memset(buf.data(), 0x0, buf.size());
  952|       |
  953|  2.65k|      io_->readOrThrow(buf.data(), 1);
  954|  2.65k|      td2 = Exiv2::find(PictureControlAdjust, static_cast<int>(buf.data()[0]) & 7);
  955|  2.65k|      if (td2)
  ------------------
  |  Branch (955:11): [True: 1.88k, False: 779]
  ------------------
  956|  1.88k|        xmpData_["Xmp.video.PictureControlAdjust"] = _(td2->label_);
  ------------------
  |  |   40|  1.88k|#define _(String) (String)
  ------------------
  957|    779|      else
  958|    779|        xmpData_["Xmp.video.PictureControlAdjust"] = static_cast<int>(buf.data()[0]) & 7;
  959|       |
  960|  2.65k|      io_->readOrThrow(buf.data(), 1);
  961|  2.65k|      td2 = Exiv2::find(NormalSoftHard, static_cast<int>(buf.data()[0]) & 7);
  962|  2.65k|      if (td2)
  ------------------
  |  Branch (962:11): [True: 1.53k, False: 1.12k]
  ------------------
  963|  1.53k|        xmpData_["Xmp.video.PictureControlQuickAdjust"] = _(td2->label_);
  ------------------
  |  |   40|  1.53k|#define _(String) (String)
  ------------------
  964|       |
  965|  2.65k|      io_->readOrThrow(buf.data(), 1);
  966|  2.65k|      td2 = Exiv2::find(NormalSoftHard, static_cast<int>(buf.data()[0]) & 7);
  967|  2.65k|      if (td2)
  ------------------
  |  Branch (967:11): [True: 1.56k, False: 1.09k]
  ------------------
  968|  1.56k|        xmpData_["Xmp.video.Sharpness"] = _(td2->label_);
  ------------------
  |  |   40|  1.56k|#define _(String) (String)
  ------------------
  969|  1.09k|      else
  970|  1.09k|        xmpData_["Xmp.video.Sharpness"] = static_cast<int>(buf.data()[0]) & 7;
  971|       |
  972|  2.65k|      io_->readOrThrow(buf.data(), 1);
  973|  2.65k|      td2 = Exiv2::find(NormalSoftHard, static_cast<int>(buf.data()[0]) & 7);
  974|  2.65k|      if (td2)
  ------------------
  |  Branch (974:11): [True: 1.25k, False: 1.40k]
  ------------------
  975|  1.25k|        xmpData_["Xmp.video.Contrast"] = _(td2->label_);
  ------------------
  |  |   40|  1.25k|#define _(String) (String)
  ------------------
  976|  1.40k|      else
  977|  1.40k|        xmpData_["Xmp.video.Contrast"] = static_cast<int>(buf.data()[0]) & 7;
  978|       |
  979|  2.65k|      io_->readOrThrow(buf.data(), 1);
  980|  2.65k|      td2 = Exiv2::find(NormalSoftHard, static_cast<int>(buf.data()[0]) & 7);
  981|  2.65k|      if (td2)
  ------------------
  |  Branch (981:11): [True: 1.27k, False: 1.38k]
  ------------------
  982|  1.27k|        xmpData_["Xmp.video.Brightness"] = _(td2->label_);
  ------------------
  |  |   40|  1.27k|#define _(String) (String)
  ------------------
  983|  1.38k|      else
  984|  1.38k|        xmpData_["Xmp.video.Brightness"] = static_cast<int>(buf.data()[0]) & 7;
  985|       |
  986|  2.65k|      io_->readOrThrow(buf.data(), 1);
  987|  2.65k|      td2 = Exiv2::find(Saturation, static_cast<int>(buf.data()[0]) & 7);
  988|  2.65k|      if (td2)
  ------------------
  |  Branch (988:11): [True: 1.24k, False: 1.41k]
  ------------------
  989|  1.24k|        xmpData_["Xmp.video.Saturation"] = _(td2->label_);
  ------------------
  |  |   40|  1.24k|#define _(String) (String)
  ------------------
  990|  1.41k|      else
  991|  1.41k|        xmpData_["Xmp.video.Saturation"] = static_cast<int>(buf.data()[0]) & 7;
  992|       |
  993|  2.65k|      io_->readOrThrow(buf.data(), 1);
  994|  2.65k|      xmpData_["Xmp.video.HueAdjustment"] = static_cast<int>(buf.data()[0]) & 7;
  995|       |
  996|  2.65k|      io_->readOrThrow(buf.data(), 1);
  997|  2.65k|      td2 = Exiv2::find(FilterEffect, static_cast<int>(buf.data()[0]));
  998|  2.65k|      if (td2)
  ------------------
  |  Branch (998:11): [True: 563, False: 2.09k]
  ------------------
  999|    563|        xmpData_["Xmp.video.FilterEffect"] = _(td2->label_);
  ------------------
  |  |   40|    563|#define _(String) (String)
  ------------------
 1000|  2.09k|      else
 1001|  2.09k|        xmpData_["Xmp.video.FilterEffect"] = static_cast<int>(buf.data()[0]);
 1002|       |
 1003|  2.65k|      io_->readOrThrow(buf.data(), 1);
 1004|  2.65k|      td2 = Exiv2::find(ToningEffect, static_cast<int>(buf.data()[0]));
 1005|  2.65k|      if (td2)
  ------------------
  |  Branch (1005:11): [True: 708, False: 1.95k]
  ------------------
 1006|    708|        xmpData_["Xmp.video.ToningEffect"] = _(td2->label_);
  ------------------
  |  |   40|    708|#define _(String) (String)
  ------------------
 1007|  1.95k|      else
 1008|  1.95k|        xmpData_["Xmp.video.ToningEffect"] = static_cast<int>(buf.data()[0]);
 1009|       |
 1010|  2.65k|      io_->readOrThrow(buf.data(), 1);
 1011|  2.65k|      xmpData_["Xmp.video.ToningSaturation"] = static_cast<int>(buf.data()[0]);
 1012|       |
 1013|  2.65k|      io_->seek(local_pos + dataLength, BasicIo::beg);
 1014|  2.65k|    }
 1015|       |
 1016|  99.8k|    else if (TagID == 0x2000024) {
  ------------------
  |  Branch (1016:14): [True: 594, False: 99.2k]
  ------------------
 1017|    594|      size_t local_pos = io_->tell();
 1018|    594|      dataLength = buf.read_uint16(0, bigEndian);
 1019|    594|      std::memset(buf.data(), 0x0, buf.size());
 1020|       |
 1021|    594|      io_->readOrThrow(buf.data(), 2);
 1022|    594|      xmpData_["Xmp.video.TimeZone"] = Exiv2::getShort(buf.data(), bigEndian);
 1023|    594|      io_->readOrThrow(buf.data(), 1);
 1024|    594|      td2 = Exiv2::find(YesNo, static_cast<int>(buf.data()[0]));
 1025|    594|      if (td2)
  ------------------
  |  Branch (1025:11): [True: 371, False: 223]
  ------------------
 1026|    371|        xmpData_["Xmp.video.DayLightSavings"] = _(td2->label_);
  ------------------
  |  |   40|    371|#define _(String) (String)
  ------------------
 1027|       |
 1028|    594|      io_->readOrThrow(buf.data(), 1);
 1029|    594|      td2 = Exiv2::find(DateDisplayFormat, static_cast<int>(buf.data()[0]));
 1030|    594|      if (td2)
  ------------------
  |  Branch (1030:11): [True: 345, False: 249]
  ------------------
 1031|    345|        xmpData_["Xmp.video.DateDisplayFormat"] = _(td2->label_);
  ------------------
  |  |   40|    345|#define _(String) (String)
  ------------------
 1032|       |
 1033|    594|      io_->seek(local_pos + dataLength, BasicIo::beg);
 1034|    594|    }
 1035|       |
 1036|  99.2k|    else if (dataType == 2 || dataType == 7) {
  ------------------
  |  Branch (1036:14): [True: 1.70k, False: 97.5k]
  |  Branch (1036:31): [True: 288, False: 97.2k]
  ------------------
 1037|  1.64k|      dataLength = buf.read_uint16(0, bigEndian);
 1038|  1.64k|      std::memset(buf.data(), 0x0, buf.size());
 1039|       |
 1040|       |      // Sanity check with an "unreasonably" large number
 1041|  1.64k|      if (dataLength >= buf.size()) {
  ------------------
  |  Branch (1041:11): [True: 503, False: 1.14k]
  ------------------
 1042|    503|#ifndef SUPPRESS_WARNINGS
 1043|    503|        EXV_ERROR << "Xmp.video Nikon Tags, dataLength was found to be larger than 200."
  ------------------
  |  |  142|    503|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 503]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    503|  LogMsg(LogMsg::error).os()
  ------------------
 1044|      0|                  << " Entries considered invalid. Not Processed.\n";
 1045|    503|#endif
 1046|    503|        io_->seek(io_->tell() + dataLength, BasicIo::beg);
 1047|    503|        buf.data()[0] = '\0';
 1048|  1.14k|      } else {
 1049|  1.14k|        io_->readOrThrow(buf.data(), dataLength);
 1050|  1.14k|        buf.data()[dataLength] = '\0';
 1051|  1.14k|      }
 1052|       |
 1053|  1.64k|      if (td) {
  ------------------
  |  Branch (1053:11): [True: 480, False: 1.16k]
  ------------------
 1054|    480|        xmpData_[_(td->label_)] = buf.data();
  ------------------
  |  |   40|    480|#define _(String) (String)
  ------------------
 1055|    480|      }
 1056|  97.5k|    } else if (dataType == 4) {
  ------------------
  |  Branch (1056:16): [True: 994, False: 96.5k]
  ------------------
 1057|    994|      dataLength = buf.read_uint16(0, bigEndian) * 4;
 1058|    994|      std::memset(buf.data(), 0x0, buf.size());
 1059|    994|      io_->readOrThrow(buf.data(), 4);
 1060|    994|      if (td)
  ------------------
  |  Branch (1060:11): [True: 312, False: 682]
  ------------------
 1061|    312|        xmpData_[_(td->label_)] = buf.read_uint32(0, bigEndian);
  ------------------
  |  |   40|    312|#define _(String) (String)
  ------------------
 1062|       |
 1063|       |      // Sanity check with an "unreasonably" large number
 1064|    994|      if (dataLength > 200 || dataLength < 4) {
  ------------------
  |  Branch (1064:11): [True: 590, False: 404]
  |  Branch (1064:31): [True: 320, False: 84]
  ------------------
 1065|    903|#ifndef SUPPRESS_WARNINGS
 1066|    903|        EXV_ERROR << "Xmp.video Nikon Tags, dataLength was found to be of inappropriate size."
  ------------------
  |  |  142|    903|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 903]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    903|  LogMsg(LogMsg::error).os()
  ------------------
 1067|      0|                  << " Entries considered invalid. Not Processed.\n";
 1068|    903|#endif
 1069|    903|        io_->seek(io_->tell() + dataLength - 4, BasicIo::beg);
 1070|    903|      } else
 1071|     91|        io_->readOrThrow(buf.data(), dataLength - 4);
 1072|  96.5k|    } else if (dataType == 3) {
  ------------------
  |  Branch (1072:16): [True: 912, False: 95.6k]
  ------------------
 1073|    912|      dataLength = buf.read_uint16(0, bigEndian) * 2;
 1074|    912|      std::memset(buf.data(), 0x0, buf.size());
 1075|    912|      io_->readOrThrow(buf.data(), 2);
 1076|    912|      if (td)
  ------------------
  |  Branch (1076:11): [True: 248, False: 664]
  ------------------
 1077|    248|        xmpData_[_(td->label_)] = buf.read_uint16(0, bigEndian);
  ------------------
  |  |   40|    248|#define _(String) (String)
  ------------------
 1078|       |
 1079|       |      // Sanity check with an "unreasonably" large number
 1080|    912|      if (dataLength > 200 || dataLength < 2) {
  ------------------
  |  Branch (1080:11): [True: 273, False: 639]
  |  Branch (1080:31): [True: 573, False: 66]
  ------------------
 1081|    846|#ifndef SUPPRESS_WARNINGS
 1082|    846|        EXV_ERROR << "Xmp.video Nikon Tags, dataLength was found to be of inappropriate size."
  ------------------
  |  |  142|    846|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 846]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    846|  LogMsg(LogMsg::error).os()
  ------------------
 1083|      0|                  << " Entries considered invalid. Not Processed.\n";
 1084|    846|#endif
 1085|    846|        io_->seek(io_->tell() + dataLength - 2, BasicIo::beg);
 1086|    846|      } else
 1087|     66|        io_->readOrThrow(buf.data(), dataLength - 2);
 1088|  95.6k|    } else if (dataType == 5) {
  ------------------
  |  Branch (1088:16): [True: 559, False: 95.1k]
  ------------------
 1089|    559|      dataLength = buf.read_uint16(0, bigEndian) * 8;
 1090|    559|      std::memset(buf.data(), 0x0, buf.size());
 1091|    559|      io_->readOrThrow(buf.data(), 4);
 1092|    559|      io_->readOrThrow(buf2.data(), 4);
 1093|    559|      if (td)
  ------------------
  |  Branch (1093:11): [True: 164, False: 395]
  ------------------
 1094|    164|        xmpData_[_(td->label_)] =
  ------------------
  |  |   40|    164|#define _(String) (String)
  ------------------
 1095|    164|            static_cast<double>(buf.read_uint32(0, bigEndian)) / static_cast<double>(buf2.read_uint32(0, bigEndian));
 1096|       |
 1097|       |      // Sanity check with an "unreasonably" large number
 1098|    559|      if (dataLength > 200 || dataLength < 8) {
  ------------------
  |  Branch (1098:11): [True: 158, False: 401]
  |  Branch (1098:31): [True: 339, False: 62]
  ------------------
 1099|    496|#ifndef SUPPRESS_WARNINGS
 1100|    496|        EXV_ERROR << "Xmp.video Nikon Tags, dataLength was found to be of inappropriate size."
  ------------------
  |  |  142|    496|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 496]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    496|  LogMsg(LogMsg::error).os()
  ------------------
 1101|      0|                  << " Entries considered invalid. Not Processed.\n";
 1102|    496|#endif
 1103|    496|        io_->seek(io_->tell() + dataLength - 8, BasicIo::beg);
 1104|    496|      } else
 1105|     63|        io_->readOrThrow(buf.data(), dataLength - 8);
 1106|  95.1k|    } else if (dataType == 8) {
  ------------------
  |  Branch (1106:16): [True: 680, False: 94.4k]
  ------------------
 1107|    680|      dataLength = buf.read_uint16(0, bigEndian) * 2;
 1108|    680|      std::memset(buf.data(), 0x0, buf.size());
 1109|    680|      io_->readOrThrow(buf.data(), 2);
 1110|    680|      io_->readOrThrow(buf2.data(), 2);
 1111|    680|      if (td)
  ------------------
  |  Branch (1111:11): [True: 289, False: 391]
  ------------------
 1112|    289|        xmpData_[_(td->label_)] = stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   40|    289|#define _(String) (String)
  ------------------
                      xmpData_[_(td->label_)] = stringFormat("{}.{}", buf.read_uint16(0, bigEndian), buf2.read_uint16(0, bigEndian));
  ------------------
  |  |   18|    289|#define stringFormat std::format
  ------------------
 1113|       |
 1114|       |      // Sanity check with an "unreasonably" large number
 1115|    680|      if (dataLength > 200 || dataLength < 4) {
  ------------------
  |  Branch (1115:11): [True: 381, False: 299]
  |  Branch (1115:31): [True: 175, False: 124]
  ------------------
 1116|    555|#ifndef SUPPRESS_WARNINGS
 1117|    555|        EXV_ERROR << "Xmp.video Nikon Tags, dataLength was found to be of inappropriate size."
  ------------------
  |  |  142|    555|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 555]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    555|  LogMsg(LogMsg::error).os()
  ------------------
 1118|      0|                  << " Entries considered invalid. Not Processed.\n";
 1119|    555|#endif
 1120|    555|        io_->seek(io_->tell() + dataLength - 4, BasicIo::beg);
 1121|    555|      } else
 1122|    125|        io_->readOrThrow(buf.data(), dataLength - 4);
 1123|    680|    }
 1124|   102k|  }
 1125|       |
 1126|  1.27k|  io_->seek(cur_pos + size, BasicIo::beg);
 1127|  1.27k|}  // QuickTimeVideo::NikonTagsDecoder
_ZN5Exiv214QuickTimeVideo14setMediaStreamEm:
 1129|  2.58k|void QuickTimeVideo::setMediaStream(size_t atom_size) {
 1130|  2.58k|  size_t current_position = io_->tell();
 1131|  2.58k|  size_t search_end = Safe::add(current_position, atom_size);
 1132|  2.58k|  if (search_end > io_->size())
  ------------------
  |  Branch (1132:7): [True: 0, False: 2.58k]
  ------------------
 1133|      0|    search_end = io_->size();
 1134|  2.58k|  DataBuf buf(4 + 1);
 1135|       |
 1136|  27.6k|  while (!io_->eof() && Safe::add(io_->tell(), size_t{4}) <= search_end) {
  ------------------
  |  Branch (1136:10): [True: 27.6k, False: 0]
  |  Branch (1136:25): [True: 25.7k, False: 1.86k]
  ------------------
 1137|  25.7k|    io_->readOrThrow(buf.data(), 4);
 1138|  25.7k|    if (equalsQTimeTag(buf, "hdlr")) {
  ------------------
  |  Branch (1138:9): [True: 713, False: 25.0k]
  ------------------
 1139|    713|      if (Safe::add(io_->tell(), size_t{12}) > search_end)
  ------------------
  |  Branch (1139:11): [True: 93, False: 620]
  ------------------
 1140|     93|        break;
 1141|    620|      io_->readOrThrow(buf.data(), 4);
 1142|    620|      io_->readOrThrow(buf.data(), 4);
 1143|    620|      io_->readOrThrow(buf.data(), 4);
 1144|       |
 1145|    620|      if (equalsQTimeTag(buf, "vide"))
  ------------------
  |  Branch (1145:11): [True: 163, False: 457]
  ------------------
 1146|    163|        currentStream_ = Video;
 1147|    457|      else if (equalsQTimeTag(buf, "soun"))
  ------------------
  |  Branch (1147:16): [True: 104, False: 353]
  ------------------
 1148|    104|        currentStream_ = Audio;
 1149|    353|      else if (equalsQTimeTag(buf, "hint"))
  ------------------
  |  Branch (1149:16): [True: 3, False: 350]
  ------------------
 1150|      3|        currentStream_ = Hint;
 1151|    350|      else
 1152|    350|        currentStream_ = GenMediaHeader;
 1153|    620|      break;
 1154|    713|    }
 1155|  25.7k|  }
 1156|       |
 1157|  2.58k|  io_->seek(current_position, BasicIo::beg);
 1158|  2.58k|}  // QuickTimeVideo::setMediaStream
_ZN5Exiv214QuickTimeVideo19timeToSampleDecoderEv:
 1160|    160|void QuickTimeVideo::timeToSampleDecoder() {
 1161|    160|  DataBuf buf(4 + 1);
 1162|    160|  io_->readOrThrow(buf.data(), 4);
 1163|    160|  io_->readOrThrow(buf.data(), 4);
 1164|    160|  uint64_t totalframes = 0;
 1165|    160|  uint64_t timeOfFrames = 0;
 1166|    160|  const uint32_t noOfEntries = buf.read_uint32(0, bigEndian);
 1167|       |
 1168|    499|  for (uint32_t i = 0; i < noOfEntries; i++) {
  ------------------
  |  Branch (1168:24): [True: 339, False: 160]
  ------------------
 1169|    339|    io_->readOrThrow(buf.data(), 4);
 1170|    339|    const uint64_t temp = buf.read_uint32(0, bigEndian);
 1171|    339|    totalframes = Safe::add(totalframes, temp);
 1172|    339|    io_->readOrThrow(buf.data(), 4);
 1173|    339|    timeOfFrames = Safe::add(timeOfFrames, temp * buf.read_uint32(0, bigEndian));
 1174|    339|  }
 1175|    160|  if (currentStream_ == Video) {
  ------------------
  |  Branch (1175:7): [True: 82, False: 78]
  ------------------
 1176|     82|    if (timeOfFrames == 0)
  ------------------
  |  Branch (1176:9): [True: 42, False: 40]
  ------------------
 1177|     42|      timeOfFrames = 1;
 1178|     82|    xmpData_["Xmp.video.FrameRate"] =
 1179|     82|        static_cast<double>(totalframes) * static_cast<double>(mdhdTimeScale_) / static_cast<double>(timeOfFrames);
 1180|     82|  }
 1181|    160|}  // QuickTimeVideo::timeToSampleDecoder
_ZN5Exiv214QuickTimeVideo10sampleDescEm:
 1183|    334|void QuickTimeVideo::sampleDesc(size_t size) {
 1184|    334|  DataBuf buf(100);
 1185|    334|  size_t cur_pos = io_->tell();
 1186|    334|  io_->readOrThrow(buf.data(), 4);
 1187|    334|  io_->readOrThrow(buf.data(), 4);
 1188|    334|  const uint32_t noOfEntries = buf.read_uint32(0, bigEndian);
 1189|       |
 1190|  77.1k|  for (uint32_t i = 0; i < noOfEntries; i++) {
  ------------------
  |  Branch (1190:24): [True: 76.9k, False: 218]
  ------------------
 1191|  76.9k|    if (currentStream_ == Video)
  ------------------
  |  Branch (1191:9): [True: 36.6k, False: 40.3k]
  ------------------
 1192|  36.6k|      imageDescDecoder();
 1193|  40.3k|    else if (currentStream_ == Audio)
  ------------------
  |  Branch (1193:14): [True: 40.2k, False: 116]
  ------------------
 1194|  40.2k|      audioDescDecoder();
 1195|    116|    else
 1196|    116|      break;
 1197|  76.9k|  }
 1198|    334|  io_->seek(Safe::add(cur_pos, size), BasicIo::beg);
 1199|    334|}  // QuickTimeVideo::sampleDesc
_ZN5Exiv214QuickTimeVideo16audioDescDecoderEv:
 1201|  40.2k|void QuickTimeVideo::audioDescDecoder() {
 1202|  40.2k|  DataBuf buf(40);
 1203|  40.2k|  std::memset(buf.data(), 0x0, buf.size());
 1204|  40.2k|  buf.data()[4] = '\0';
 1205|  40.2k|  io_->readOrThrow(buf.data(), 4);
 1206|  40.2k|  size_t size = 82;
 1207|       |
 1208|  40.2k|  const TagVocabulary* td;
 1209|       |
 1210|   844k|  for (int i = 0; size / 4 != 0; size -= 4, i++) {
  ------------------
  |  Branch (1210:19): [True: 804k, False: 40.1k]
  ------------------
 1211|   804k|    io_->readOrThrow(buf.data(), 4);
 1212|   804k|    switch (i) {
 1213|  40.2k|      case AudioFormat:
  ------------------
  |  Branch (1213:7): [True: 40.2k, False: 764k]
  ------------------
 1214|  40.2k|        td = Exiv2::find(qTimeFileType, Exiv2::toString(buf.data()));
 1215|  40.2k|        if (td)
  ------------------
  |  Branch (1215:13): [True: 160, False: 40.0k]
  ------------------
 1216|    160|          xmpData_["Xmp.audio.Compressor"] = _(td->label_);
  ------------------
  |  |   40|    160|#define _(String) (String)
  ------------------
 1217|  40.0k|        else
 1218|  40.0k|          xmpData_["Xmp.audio.Compressor"] = buf.data();
 1219|  40.2k|        break;
 1220|  40.2k|      case AudioVendorID:
  ------------------
  |  Branch (1220:7): [True: 40.2k, False: 764k]
  ------------------
 1221|  40.2k|        td = Exiv2::find(vendorIDTags, Exiv2::toString(buf.data()));
 1222|  40.2k|        if (td)
  ------------------
  |  Branch (1222:13): [True: 354, False: 39.8k]
  ------------------
 1223|    354|          xmpData_["Xmp.audio.VendorID"] = _(td->label_);
  ------------------
  |  |   40|    354|#define _(String) (String)
  ------------------
 1224|  40.2k|        break;
 1225|  40.2k|      case AudioChannels:
  ------------------
  |  Branch (1225:7): [True: 40.2k, False: 764k]
  ------------------
 1226|  40.2k|        xmpData_["Xmp.audio.ChannelType"] = buf.read_uint16(0, bigEndian);
 1227|  40.2k|        xmpData_["Xmp.audio.BitsPerSample"] = ((buf.data()[2] * 256) + buf.data()[3]);
 1228|  40.2k|        break;
 1229|  40.2k|      case AudioSampleRate:
  ------------------
  |  Branch (1229:7): [True: 40.2k, False: 764k]
  ------------------
 1230|  40.2k|        xmpData_["Xmp.audio.SampleRate"] =
 1231|  40.2k|            buf.read_uint16(0, bigEndian) + ((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
 1232|  40.2k|        break;
 1233|   643k|      default:
  ------------------
  |  Branch (1233:7): [True: 643k, False: 160k]
  ------------------
 1234|   643k|        break;
 1235|   804k|    }
 1236|   804k|  }
 1237|  40.1k|  io_->readOrThrow(buf.data(), static_cast<long>(size % 4));  // cause size is so small, this cast should be right.
 1238|  40.1k|}  // QuickTimeVideo::audioDescDecoder
_ZN5Exiv214QuickTimeVideo16imageDescDecoderEv:
 1240|  36.6k|void QuickTimeVideo::imageDescDecoder() {
 1241|  36.6k|  DataBuf buf(40);
 1242|  36.6k|  std::memset(buf.data(), 0x0, buf.size());
 1243|  36.6k|  buf.data()[4] = '\0';
 1244|  36.6k|  io_->readOrThrow(buf.data(), 4);
 1245|  36.6k|  size_t size = 82;
 1246|       |
 1247|  36.6k|  const TagVocabulary* td;
 1248|       |
 1249|   438k|  for (int i = 0; size / 4 != 0; size -= 4, i++) {
  ------------------
  |  Branch (1249:19): [True: 402k, False: 36.5k]
  ------------------
 1250|   402k|    io_->readOrThrow(buf.data(), 4);
 1251|   402k|    buf.write_uint8(4, 0);  // nul-terminate string
 1252|       |
 1253|   402k|    switch (i) {
 1254|  36.5k|      case codec:
  ------------------
  |  Branch (1254:7): [True: 36.5k, False: 365k]
  ------------------
 1255|  36.5k|        td = Exiv2::find(qTimeFileType, Exiv2::toString(buf.data()));
 1256|  36.5k|        if (td)
  ------------------
  |  Branch (1256:13): [True: 191, False: 36.3k]
  ------------------
 1257|    191|          xmpData_["Xmp.video.Codec"] = _(td->label_);
  ------------------
  |  |   40|    191|#define _(String) (String)
  ------------------
 1258|  36.3k|        else
 1259|  36.3k|          xmpData_["Xmp.video.Codec"] = buf.data();
 1260|  36.5k|        break;
 1261|  36.5k|      case VendorID:
  ------------------
  |  Branch (1261:7): [True: 36.5k, False: 365k]
  ------------------
 1262|  36.5k|        td = Exiv2::find(vendorIDTags, Exiv2::toString(buf.data()));
 1263|  36.5k|        if (td)
  ------------------
  |  Branch (1263:13): [True: 287, False: 36.2k]
  ------------------
 1264|    287|          xmpData_["Xmp.video.VendorID"] = _(td->label_);
  ------------------
  |  |   40|    287|#define _(String) (String)
  ------------------
 1265|  36.5k|        break;
 1266|  36.5k|      case SourceImageWidth_Height:
  ------------------
  |  Branch (1266:7): [True: 36.5k, False: 365k]
  ------------------
 1267|  36.5k|        xmpData_["Xmp.video.SourceImageWidth"] = buf.read_uint16(0, bigEndian);
 1268|  36.5k|        xmpData_["Xmp.video.SourceImageHeight"] = ((buf.data()[2] * 256) + buf.data()[3]);
 1269|  36.5k|        break;
 1270|  36.5k|      case XResolution:
  ------------------
  |  Branch (1270:7): [True: 36.5k, False: 365k]
  ------------------
 1271|  36.5k|        xmpData_["Xmp.video.XResolution"] =
 1272|  36.5k|            buf.read_uint16(0, bigEndian) + ((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
 1273|  36.5k|        break;
 1274|  36.5k|      case YResolution:
  ------------------
  |  Branch (1274:7): [True: 36.5k, False: 365k]
  ------------------
 1275|  36.5k|        xmpData_["Xmp.video.YResolution"] =
 1276|  36.5k|            buf.read_uint16(0, bigEndian) + ((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
 1277|  36.5k|        io_->readOrThrow(buf.data(), 3);
 1278|  36.5k|        size -= 3;
 1279|  36.5k|        break;
 1280|  36.5k|      case CompressorName:
  ------------------
  |  Branch (1280:7): [True: 36.5k, False: 365k]
  ------------------
 1281|  36.5k|        io_->readOrThrow(buf.data(), 32);
 1282|  36.5k|        size -= 32;
 1283|  36.5k|        xmpData_["Xmp.video.Compressor"] = buf.data();
 1284|  36.5k|        break;
 1285|   182k|      default:
  ------------------
  |  Branch (1285:7): [True: 182k, False: 219k]
  ------------------
 1286|   182k|        break;
 1287|   402k|    }
 1288|   402k|  }
 1289|  36.5k|  io_->readOrThrow(buf.data(), static_cast<long>(size % 4));
 1290|  36.5k|  xmpData_["Xmp.video.BitDepth"] = static_cast<int>(buf.read_uint8(0));
 1291|  36.5k|}  // QuickTimeVideo::imageDescDecoder
_ZN5Exiv214QuickTimeVideo22multipleEntriesDecoderEm:
 1293|  2.13k|void QuickTimeVideo::multipleEntriesDecoder(size_t recursion_depth) {
 1294|  2.13k|  enforce(recursion_depth < max_recursion_depth_, Exiv2::ErrorCode::kerCorruptedMetadata);
 1295|  2.13k|  DataBuf buf(4 + 1);
 1296|  2.13k|  io_->readOrThrow(buf.data(), 4);
 1297|  2.13k|  io_->readOrThrow(buf.data(), 4);
 1298|  2.13k|  uint32_t noOfEntries;
 1299|       |
 1300|  2.13k|  noOfEntries = buf.read_uint32(0, bigEndian);
 1301|       |
 1302|  5.04k|  for (uint32_t i = 0; i < noOfEntries && continueTraversing_; i++) {
  ------------------
  |  Branch (1302:24): [True: 3.20k, False: 1.83k]
  |  Branch (1302:43): [True: 2.90k, False: 302]
  ------------------
 1303|  2.90k|    decodeBlock(recursion_depth + 1);
 1304|  2.90k|  }
 1305|  2.13k|}  // QuickTimeVideo::multipleEntriesDecoder
_ZN5Exiv214QuickTimeVideo18videoHeaderDecoderEm:
 1307|    843|void QuickTimeVideo::videoHeaderDecoder(size_t size) {
 1308|    843|  DataBuf buf(3);
 1309|    843|  std::memset(buf.data(), 0x0, buf.size());
 1310|    843|  buf.data()[2] = '\0';
 1311|    843|  currentStream_ = Video;
 1312|       |
 1313|    843|  const TagDetails* td;
 1314|       |
 1315|  7.23k|  for (int i = 0; size / 2 != 0; size -= 2, i++) {
  ------------------
  |  Branch (1315:19): [True: 6.39k, False: 843]
  ------------------
 1316|  6.39k|    io_->readOrThrow(buf.data(), 2);
 1317|       |
 1318|  6.39k|    switch (i) {
 1319|    831|      case GraphicsMode:
  ------------------
  |  Branch (1319:7): [True: 831, False: 5.56k]
  ------------------
 1320|    831|        td = Exiv2::find(graphicsModetags, buf.read_uint16(0, bigEndian));
 1321|    831|        if (td)
  ------------------
  |  Branch (1321:13): [True: 653, False: 178]
  ------------------
 1322|    653|          xmpData_["Xmp.video.GraphicsMode"] = _(td->label_);
  ------------------
  |  |   40|    653|#define _(String) (String)
  ------------------
 1323|    831|        break;
 1324|    262|      case OpColor:
  ------------------
  |  Branch (1324:7): [True: 262, False: 6.12k]
  ------------------
 1325|    262|        xmpData_["Xmp.video.OpColor"] = buf.read_uint16(0, bigEndian);
 1326|    262|        break;
 1327|  5.29k|      default:
  ------------------
  |  Branch (1327:7): [True: 5.29k, False: 1.09k]
  ------------------
 1328|  5.29k|        break;
 1329|  6.39k|    }
 1330|  6.39k|  }
 1331|    843|  io_->readOrThrow(buf.data(), size % 2);
 1332|    843|}  // QuickTimeVideo::videoHeaderDecoder
_ZN5Exiv214QuickTimeVideo14handlerDecoderEm:
 1334|    694|void QuickTimeVideo::handlerDecoder(size_t size) {
 1335|    694|  size_t cur_pos = io_->tell();
 1336|    694|  DataBuf buf(5);
 1337|    694|  std::memset(buf.data(), 0x0, buf.size());
 1338|    694|  buf.data()[4] = '\0';
 1339|       |
 1340|    694|  const TagVocabulary* tv;
 1341|       |
 1342|  4.15k|  for (int i = 0; i < 5; i++) {
  ------------------
  |  Branch (1342:19): [True: 3.46k, False: 691]
  ------------------
 1343|  3.46k|    io_->readOrThrow(buf.data(), 4);
 1344|       |
 1345|  3.46k|    switch (i) {
  ------------------
  |  Branch (1345:13): [True: 2.07k, False: 1.38k]
  ------------------
 1346|    694|      case HandlerClass:
  ------------------
  |  Branch (1346:7): [True: 694, False: 2.77k]
  ------------------
 1347|    694|        tv = Exiv2::find(handlerClassTags, Exiv2::toString(buf.data()));
 1348|    694|        if (tv) {
  ------------------
  |  Branch (1348:13): [True: 37, False: 657]
  ------------------
 1349|     37|          if (currentStream_ == Video)
  ------------------
  |  Branch (1349:15): [True: 24, False: 13]
  ------------------
 1350|     24|            xmpData_["Xmp.video.HandlerClass"] = _(tv->label_);
  ------------------
  |  |   40|     24|#define _(String) (String)
  ------------------
 1351|     13|          else if (currentStream_ == Audio)
  ------------------
  |  Branch (1351:20): [True: 6, False: 7]
  ------------------
 1352|      6|            xmpData_["Xmp.audio.HandlerClass"] = _(tv->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1353|     37|        }
 1354|    694|        break;
 1355|    693|      case HandlerType:
  ------------------
  |  Branch (1355:7): [True: 693, False: 2.77k]
  ------------------
 1356|    693|        tv = Exiv2::find(handlerTypeTags, Exiv2::toString(buf.data()));
 1357|    693|        if (tv) {
  ------------------
  |  Branch (1357:13): [True: 460, False: 233]
  ------------------
 1358|    460|          if (currentStream_ == Video)
  ------------------
  |  Branch (1358:15): [True: 148, False: 312]
  ------------------
 1359|    148|            xmpData_["Xmp.video.HandlerType"] = _(tv->label_);
  ------------------
  |  |   40|    148|#define _(String) (String)
  ------------------
 1360|    312|          else if (currentStream_ == Audio)
  ------------------
  |  Branch (1360:20): [True: 96, False: 216]
  ------------------
 1361|     96|            xmpData_["Xmp.audio.HandlerType"] = _(tv->label_);
  ------------------
  |  |   40|     96|#define _(String) (String)
  ------------------
 1362|    460|        }
 1363|    693|        break;
 1364|    691|      case HandlerVendorID:
  ------------------
  |  Branch (1364:7): [True: 691, False: 2.77k]
  ------------------
 1365|    691|        tv = Exiv2::find(vendorIDTags, Exiv2::toString(buf.data()));
 1366|    691|        if (tv) {
  ------------------
  |  Branch (1366:13): [True: 157, False: 534]
  ------------------
 1367|    157|          if (currentStream_ == Video)
  ------------------
  |  Branch (1367:15): [True: 25, False: 132]
  ------------------
 1368|     25|            xmpData_["Xmp.video.HandlerVendorID"] = _(tv->label_);
  ------------------
  |  |   40|     25|#define _(String) (String)
  ------------------
 1369|    132|          else if (currentStream_ == Audio)
  ------------------
  |  Branch (1369:20): [True: 67, False: 65]
  ------------------
 1370|     67|            xmpData_["Xmp.audio.HandlerVendorID"] = _(tv->label_);
  ------------------
  |  |   40|     67|#define _(String) (String)
  ------------------
 1371|    157|        }
 1372|    691|        break;
 1373|  3.46k|    }
 1374|  3.46k|  }
 1375|    691|  io_->seek(cur_pos + size, BasicIo::beg);
 1376|    691|}  // QuickTimeVideo::handlerDecoder
_ZN5Exiv214QuickTimeVideo15fileTypeDecoderEm:
 1378|  3.00k|void QuickTimeVideo::fileTypeDecoder(size_t size) {
 1379|  3.00k|  DataBuf buf(5);
 1380|  3.00k|  std::memset(buf.data(), 0x0, buf.size());
 1381|  3.00k|  buf.data()[4] = '\0';
 1382|  3.00k|  Exiv2::Value::UniquePtr v = Exiv2::Value::create(Exiv2::xmpSeq);
 1383|  3.00k|  const TagVocabulary* td;
 1384|       |
 1385|  29.4k|  for (int i = 0; size / 4 != 0; size -= 4, i++) {
  ------------------
  |  Branch (1385:19): [True: 26.4k, False: 3.00k]
  ------------------
 1386|  26.4k|    io_->readOrThrow(buf.data(), 4);
 1387|  26.4k|    td = Exiv2::find(qTimeFileType, Exiv2::toString(buf.data()));
 1388|       |
 1389|  26.4k|    switch (i) {
 1390|  2.99k|      case 0:
  ------------------
  |  Branch (1390:7): [True: 2.99k, False: 23.4k]
  ------------------
 1391|  2.99k|        if (td)
  ------------------
  |  Branch (1391:13): [True: 2.59k, False: 396]
  ------------------
 1392|  2.59k|          xmpData_["Xmp.video.MajorBrand"] = _(td->label_);
  ------------------
  |  |   40|  2.59k|#define _(String) (String)
  ------------------
 1393|  2.99k|        break;
 1394|  2.19k|      case 1:
  ------------------
  |  Branch (1394:7): [True: 2.19k, False: 24.2k]
  ------------------
 1395|  2.19k|        xmpData_["Xmp.video.MinorVersion"] = buf.read_uint32(0, bigEndian);
 1396|  2.19k|        break;
 1397|  21.2k|      default:
  ------------------
  |  Branch (1397:7): [True: 21.2k, False: 5.18k]
  ------------------
 1398|  21.2k|        if (td)
  ------------------
  |  Branch (1398:13): [True: 692, False: 20.5k]
  ------------------
 1399|    692|          v->read(_(td->label_));
  ------------------
  |  |   40|    692|#define _(String) (String)
  ------------------
 1400|  20.5k|        else
 1401|  20.5k|          v->read(Exiv2::toString(buf.data()));
 1402|  21.2k|        break;
 1403|  26.4k|    }
 1404|  26.4k|  }
 1405|  3.00k|  xmpData_.add(Exiv2::XmpKey("Xmp.video.CompatibleBrands"), v.get());
 1406|  3.00k|  io_->readOrThrow(buf.data(), size % 4);
 1407|  3.00k|}  // QuickTimeVideo::fileTypeDecoder
_ZN5Exiv214QuickTimeVideo18mediaHeaderDecoderEm:
 1409|    102|void QuickTimeVideo::mediaHeaderDecoder(size_t size) {
 1410|    102|  DataBuf buf(5);
 1411|    102|  std::memset(buf.data(), 0x0, buf.size());
 1412|    102|  buf.data()[4] = '\0';
 1413|    102|  int64_t time_scale = 1;
 1414|       |
 1415|  1.47k|  for (int i = 0; size / 4 != 0; size -= 4, i++) {
  ------------------
  |  Branch (1415:19): [True: 1.37k, False: 102]
  ------------------
 1416|  1.37k|    io_->readOrThrow(buf.data(), 4);
 1417|       |
 1418|  1.37k|    switch (i) {
 1419|     92|      case MediaHeaderVersion:
  ------------------
  |  Branch (1419:7): [True: 92, False: 1.28k]
  ------------------
 1420|     92|        if (currentStream_ == Video)
  ------------------
  |  Branch (1420:13): [True: 16, False: 76]
  ------------------
 1421|     16|          xmpData_["Xmp.video.MediaHeaderVersion"] = static_cast<int>(buf.read_uint8(0));
 1422|     76|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1422:18): [True: 13, False: 63]
  ------------------
 1423|     13|          xmpData_["Xmp.audio.MediaHeaderVersion"] = static_cast<int>(buf.read_uint8(0));
 1424|     92|        break;
 1425|     91|      case MediaCreateDate:
  ------------------
  |  Branch (1425:7): [True: 91, False: 1.28k]
  ------------------
 1426|       |        // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
 1427|     91|        if (currentStream_ == Video)
  ------------------
  |  Branch (1427:13): [True: 15, False: 76]
  ------------------
 1428|     15|          xmpData_["Xmp.video.MediaCreateDate"] = buf.read_uint32(0, bigEndian);
 1429|     76|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1429:18): [True: 13, False: 63]
  ------------------
 1430|     13|          xmpData_["Xmp.audio.MediaCreateDate"] = buf.read_uint32(0, bigEndian);
 1431|     91|        break;
 1432|     90|      case MediaModifyDate:
  ------------------
  |  Branch (1432:7): [True: 90, False: 1.28k]
  ------------------
 1433|       |        // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
 1434|     90|        if (currentStream_ == Video)
  ------------------
  |  Branch (1434:13): [True: 15, False: 75]
  ------------------
 1435|     15|          xmpData_["Xmp.video.MediaModifyDate"] = buf.read_uint32(0, bigEndian);
 1436|     75|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1436:18): [True: 13, False: 62]
  ------------------
 1437|     13|          xmpData_["Xmp.audio.MediaModifyDate"] = buf.read_uint32(0, bigEndian);
 1438|     90|        break;
 1439|     68|      case MediaTimeScale:
  ------------------
  |  Branch (1439:7): [True: 68, False: 1.30k]
  ------------------
 1440|     68|        if (currentStream_ == Video)
  ------------------
  |  Branch (1440:13): [True: 11, False: 57]
  ------------------
 1441|     11|          xmpData_["Xmp.video.MediaTimeScale"] = buf.read_uint32(0, bigEndian);
 1442|     57|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1442:18): [True: 13, False: 44]
  ------------------
 1443|     13|          xmpData_["Xmp.audio.MediaTimeScale"] = buf.read_uint32(0, bigEndian);
 1444|     68|        time_scale = std::max(1U, buf.read_uint32(0, bigEndian));
 1445|     68|        mdhdTimeScale_ = time_scale;
 1446|     68|        break;
 1447|     67|      case MediaDuration:
  ------------------
  |  Branch (1447:7): [True: 67, False: 1.30k]
  ------------------
 1448|     67|        if (currentStream_ == Video)
  ------------------
  |  Branch (1448:13): [True: 10, False: 57]
  ------------------
 1449|     10|          xmpData_["Xmp.video.MediaDuration"] = time_scale ? buf.read_uint32(0, bigEndian) / time_scale : 0;
  ------------------
  |  Branch (1449:49): [True: 10, False: 0]
  ------------------
 1450|     57|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1450:18): [True: 13, False: 44]
  ------------------
 1451|     13|          xmpData_["Xmp.audio.MediaDuration"] = time_scale ? buf.read_uint32(0, bigEndian) / time_scale : 0;
  ------------------
  |  Branch (1451:49): [True: 13, False: 0]
  ------------------
 1452|     67|        break;
 1453|     67|      case MediaLanguageCode:
  ------------------
  |  Branch (1453:7): [True: 67, False: 1.30k]
  ------------------
 1454|     67|        if (currentStream_ == Video)
  ------------------
  |  Branch (1454:13): [True: 10, False: 57]
  ------------------
 1455|     10|          xmpData_["Xmp.video.MediaLangCode"] = buf.read_uint16(0, bigEndian);
 1456|     57|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1456:18): [True: 13, False: 44]
  ------------------
 1457|     13|          xmpData_["Xmp.audio.MediaLangCode"] = buf.read_uint16(0, bigEndian);
 1458|     67|        break;
 1459|       |
 1460|    898|      default:
  ------------------
  |  Branch (1460:7): [True: 898, False: 475]
  ------------------
 1461|    898|        break;
 1462|  1.37k|    }
 1463|  1.37k|  }
 1464|    102|  io_->readOrThrow(buf.data(), size % 4);
 1465|    102|}  // QuickTimeVideo::mediaHeaderDecoder
_ZN5Exiv214QuickTimeVideo18trackHeaderDecoderEm:
 1467|    248|void QuickTimeVideo::trackHeaderDecoder(size_t size) {
 1468|    248|  DataBuf buf(5);
 1469|    248|  std::memset(buf.data(), 0x0, buf.size());
 1470|    248|  buf.data()[4] = '\0';
 1471|    248|  int64_t temp = 0;
 1472|       |
 1473|  1.51k|  for (int i = 0; size / 4 != 0; size -= 4, i++) {
  ------------------
  |  Branch (1473:19): [True: 1.27k, False: 248]
  ------------------
 1474|  1.27k|    io_->readOrThrow(buf.data(), 4);
 1475|       |
 1476|  1.27k|    switch (i) {
 1477|     41|      case TrackHeaderVersion:
  ------------------
  |  Branch (1477:7): [True: 41, False: 1.22k]
  ------------------
 1478|     41|        if (currentStream_ == Video)
  ------------------
  |  Branch (1478:13): [True: 8, False: 33]
  ------------------
 1479|      8|          xmpData_["Xmp.video.TrackHeaderVersion"] = static_cast<int>(buf.read_uint8(0));
 1480|     33|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1480:18): [True: 8, False: 25]
  ------------------
 1481|      8|          xmpData_["Xmp.audio.TrackHeaderVersion"] = static_cast<int>(buf.read_uint8(0));
 1482|     41|        break;
 1483|     40|      case TrackCreateDate:
  ------------------
  |  Branch (1483:7): [True: 40, False: 1.23k]
  ------------------
 1484|       |        // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
 1485|     40|        if (currentStream_ == Video)
  ------------------
  |  Branch (1485:13): [True: 8, False: 32]
  ------------------
 1486|      8|          xmpData_["Xmp.video.TrackCreateDate"] = buf.read_uint32(0, bigEndian);
 1487|     32|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1487:18): [True: 8, False: 24]
  ------------------
 1488|      8|          xmpData_["Xmp.audio.TrackCreateDate"] = buf.read_uint32(0, bigEndian);
 1489|     40|        break;
 1490|     39|      case TrackModifyDate:
  ------------------
  |  Branch (1490:7): [True: 39, False: 1.23k]
  ------------------
 1491|       |        // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
 1492|     39|        if (currentStream_ == Video)
  ------------------
  |  Branch (1492:13): [True: 8, False: 31]
  ------------------
 1493|      8|          xmpData_["Xmp.video.TrackModifyDate"] = buf.read_uint32(0, bigEndian);
 1494|     31|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1494:18): [True: 8, False: 23]
  ------------------
 1495|      8|          xmpData_["Xmp.audio.TrackModifyDate"] = buf.read_uint32(0, bigEndian);
 1496|     39|        break;
 1497|     38|      case TrackID:
  ------------------
  |  Branch (1497:7): [True: 38, False: 1.23k]
  ------------------
 1498|     38|        if (currentStream_ == Video)
  ------------------
  |  Branch (1498:13): [True: 7, False: 31]
  ------------------
 1499|      7|          xmpData_["Xmp.video.TrackID"] = buf.read_uint32(0, bigEndian);
 1500|     31|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1500:18): [True: 8, False: 23]
  ------------------
 1501|      8|          xmpData_["Xmp.audio.TrackID"] = buf.read_uint32(0, bigEndian);
 1502|     38|        break;
 1503|     36|      case TrackDuration:
  ------------------
  |  Branch (1503:7): [True: 36, False: 1.23k]
  ------------------
 1504|     36|        if (currentStream_ == Video)
  ------------------
  |  Branch (1504:13): [True: 7, False: 29]
  ------------------
 1505|      7|          xmpData_["Xmp.video.TrackDuration"] = mvhdTimeScale_ ? buf.read_uint32(0, bigEndian) / mvhdTimeScale_ : 0;
  ------------------
  |  Branch (1505:49): [True: 7, False: 0]
  ------------------
 1506|     29|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1506:18): [True: 8, False: 21]
  ------------------
 1507|      8|          xmpData_["Xmp.audio.TrackDuration"] = mvhdTimeScale_ ? buf.read_uint32(0, bigEndian) / mvhdTimeScale_ : 0;
  ------------------
  |  Branch (1507:49): [True: 8, False: 0]
  ------------------
 1508|     36|        break;
 1509|     35|      case TrackLayer:
  ------------------
  |  Branch (1509:7): [True: 35, False: 1.23k]
  ------------------
 1510|     35|        if (currentStream_ == Video)
  ------------------
  |  Branch (1510:13): [True: 7, False: 28]
  ------------------
 1511|      7|          xmpData_["Xmp.video.TrackLayer"] = buf.read_uint16(0, bigEndian);
 1512|     28|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1512:18): [True: 8, False: 20]
  ------------------
 1513|      8|          xmpData_["Xmp.audio.TrackLayer"] = buf.read_uint16(0, bigEndian);
 1514|     35|        break;
 1515|     34|      case TrackVolume:
  ------------------
  |  Branch (1515:7): [True: 34, False: 1.23k]
  ------------------
 1516|     34|        if (currentStream_ == Video)
  ------------------
  |  Branch (1516:13): [True: 7, False: 27]
  ------------------
 1517|      7|          xmpData_["Xmp.video.TrackVolume"] = (static_cast<int>(buf.read_uint8(0)) + (buf.data()[2] * 0.1)) * 100;
 1518|     27|        else if (currentStream_ == Audio)
  ------------------
  |  Branch (1518:18): [True: 8, False: 19]
  ------------------
 1519|      8|          xmpData_["Xmp.video.TrackVolume"] = (static_cast<int>(buf.read_uint8(0)) + (buf.data()[2] * 0.1)) * 100;
 1520|     34|        break;
 1521|     33|      case ImageWidth:
  ------------------
  |  Branch (1521:7): [True: 33, False: 1.23k]
  ------------------
 1522|     33|        if (currentStream_ == Video) {
  ------------------
  |  Branch (1522:13): [True: 6, False: 27]
  ------------------
 1523|      6|          temp = buf.read_uint16(0, bigEndian) + static_cast<int64_t>((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
 1524|      6|          xmpData_["Xmp.video.Width"] = temp;
 1525|      6|          width_ = temp;
 1526|      6|        }
 1527|     33|        break;
 1528|     33|      case ImageHeight:
  ------------------
  |  Branch (1528:7): [True: 33, False: 1.23k]
  ------------------
 1529|     33|        if (currentStream_ == Video) {
  ------------------
  |  Branch (1529:13): [True: 6, False: 27]
  ------------------
 1530|      6|          temp = buf.read_uint16(0, bigEndian) + static_cast<int64_t>((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
 1531|      6|          xmpData_["Xmp.video.Height"] = temp;
 1532|      6|          height_ = temp;
 1533|      6|        }
 1534|     33|        break;
 1535|    941|      default:
  ------------------
  |  Branch (1535:7): [True: 941, False: 329]
  ------------------
 1536|    941|        break;
 1537|  1.27k|    }
 1538|  1.27k|  }
 1539|    248|  io_->readOrThrow(buf.data(), size % 4);
 1540|    248|}  // QuickTimeVideo::trackHeaderDecoder
_ZN5Exiv214QuickTimeVideo18movieHeaderDecoderEm:
 1542|     71|void QuickTimeVideo::movieHeaderDecoder(size_t size) {
 1543|     71|  DataBuf buf(5);
 1544|     71|  std::memset(buf.data(), 0x0, buf.size());
 1545|     71|  buf.data()[4] = '\0';
 1546|       |
 1547|    978|  for (int i = 0; size / 4 != 0; size -= 4, i++) {
  ------------------
  |  Branch (1547:19): [True: 907, False: 71]
  ------------------
 1548|    907|    io_->readOrThrow(buf.data(), 4);
 1549|       |
 1550|    907|    switch (i) {
 1551|     40|      case MovieHeaderVersion:
  ------------------
  |  Branch (1551:7): [True: 40, False: 867]
  ------------------
 1552|     40|        xmpData_["Xmp.video.MovieHeaderVersion"] = static_cast<int>(buf.read_uint8(0));
 1553|     40|        break;
 1554|     38|      case CreateDate:
  ------------------
  |  Branch (1554:7): [True: 38, False: 869]
  ------------------
 1555|       |        // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
 1556|     38|        xmpData_["Xmp.video.DateUTC"] = buf.read_uint32(0, bigEndian);
 1557|     38|        break;
 1558|     37|      case ModifyDate:
  ------------------
  |  Branch (1558:7): [True: 37, False: 870]
  ------------------
 1559|       |        // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
 1560|     37|        xmpData_["Xmp.video.ModificationDate"] = buf.read_uint32(0, bigEndian);
 1561|     37|        break;
 1562|     36|      case TimeScale:
  ------------------
  |  Branch (1562:7): [True: 36, False: 871]
  ------------------
 1563|     36|        xmpData_["Xmp.video.TimeScale"] = buf.read_uint32(0, bigEndian);
 1564|     36|        mvhdTimeScale_ = std::max(1U, buf.read_uint32(0, bigEndian));
 1565|     36|        break;
 1566|     30|      case Duration:
  ------------------
  |  Branch (1566:7): [True: 30, False: 877]
  ------------------
 1567|     30|        if (mvhdTimeScale_ != 0) {  // To prevent division by zero
  ------------------
  |  Branch (1567:13): [True: 30, False: 0]
  ------------------
 1568|     30|          xmpData_["Xmp.video.Duration"] = buf.read_uint32(0, bigEndian) * 1000 / mvhdTimeScale_;
 1569|     30|        }
 1570|     30|        break;
 1571|     30|      case PreferredRate:
  ------------------
  |  Branch (1571:7): [True: 30, False: 877]
  ------------------
 1572|     30|        xmpData_["Xmp.video.PreferredRate"] =
 1573|     30|            buf.read_uint16(0, bigEndian) + ((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
 1574|     30|        break;
 1575|     30|      case PreferredVolume:
  ------------------
  |  Branch (1575:7): [True: 30, False: 877]
  ------------------
 1576|     30|        xmpData_["Xmp.video.PreferredVolume"] = (static_cast<int>(buf.read_uint8(0)) + (buf.data()[2] * 0.1)) * 100;
 1577|     30|        break;
 1578|     25|      case PreviewTime:
  ------------------
  |  Branch (1578:7): [True: 25, False: 882]
  ------------------
 1579|     25|        xmpData_["Xmp.video.PreviewTime"] = buf.read_uint32(0, bigEndian);
 1580|     25|        break;
 1581|     25|      case PreviewDuration:
  ------------------
  |  Branch (1581:7): [True: 25, False: 882]
  ------------------
 1582|     25|        xmpData_["Xmp.video.PreviewDuration"] = buf.read_uint32(0, bigEndian);
 1583|     25|        break;
 1584|     24|      case PosterTime:
  ------------------
  |  Branch (1584:7): [True: 24, False: 883]
  ------------------
 1585|     24|        xmpData_["Xmp.video.PosterTime"] = buf.read_uint32(0, bigEndian);
 1586|     24|        break;
 1587|     24|      case SelectionTime:
  ------------------
  |  Branch (1587:7): [True: 24, False: 883]
  ------------------
 1588|     24|        xmpData_["Xmp.video.SelectionTime"] = buf.read_uint32(0, bigEndian);
 1589|     24|        break;
 1590|     24|      case SelectionDuration:
  ------------------
  |  Branch (1590:7): [True: 24, False: 883]
  ------------------
 1591|     24|        xmpData_["Xmp.video.SelectionDuration"] = buf.read_uint32(0, bigEndian);
 1592|     24|        break;
 1593|     24|      case CurrentTime:
  ------------------
  |  Branch (1593:7): [True: 24, False: 883]
  ------------------
 1594|     24|        xmpData_["Xmp.video.CurrentTime"] = buf.read_uint32(0, bigEndian);
 1595|     24|        break;
 1596|     24|      case NextTrackID:
  ------------------
  |  Branch (1596:7): [True: 24, False: 883]
  ------------------
 1597|     24|        xmpData_["Xmp.video.NextTrackID"] = buf.read_uint32(0, bigEndian);
 1598|     24|        break;
 1599|    496|      default:
  ------------------
  |  Branch (1599:7): [True: 496, False: 411]
  ------------------
 1600|    496|        break;
 1601|    907|    }
 1602|    907|  }
 1603|     71|  io_->readOrThrow(buf.data(), size % 4);
 1604|     71|}  // QuickTimeVideo::movieHeaderDecoder
_ZN5Exiv216newQTimeInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
 1606|  1.87k|Image::UniquePtr newQTimeInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
 1607|  1.87k|  auto image = std::make_unique<QuickTimeVideo>(std::move(io), params);
 1608|  1.87k|  if (!image->good()) {
  ------------------
  |  Branch (1608:7): [True: 1, False: 1.87k]
  ------------------
 1609|      1|    return nullptr;
 1610|      1|  }
 1611|  1.87k|  return image;
 1612|  1.87k|}
_ZN5Exiv211isQTimeTypeERNS_7BasicIoEb:
 1614|  13.0k|bool isQTimeType(BasicIo& iIo, bool advance) {
 1615|  13.0k|  auto buf = DataBuf(12 + 1);
 1616|  13.0k|  iIo.read(buf.data(), 12);
 1617|  13.0k|  buf.write_uint8(12, 0);  // nul-terminate string
 1618|       |
 1619|  13.0k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (1619:7): [True: 0, False: 13.0k]
  |  Branch (1619:22): [True: 147, False: 12.8k]
  ------------------
 1620|    147|    return false;
 1621|    147|  }
 1622|  12.8k|  auto qTimeTags = std::array{"PICT", "free", "ftyp", "junk", "mdat", "moov", "pict", "pnot", "skip", "uuid", "wide"};
 1623|       |
 1624|  12.8k|  bool matched = false;
 1625|       |
 1626|  59.9k|  for (auto const& tag : qTimeTags) {
  ------------------
  |  Branch (1626:24): [True: 59.9k, False: 2.17k]
  ------------------
 1627|  59.9k|    auto tmp = buf.cmpBytes(4, tag, 4);
 1628|  59.9k|    if (tmp == 0) {
  ------------------
  |  Branch (1628:9): [True: 10.7k, False: 49.2k]
  ------------------
 1629|       |      // we only match if we actually know the video type. This is done
 1630|       |      // to avoid matching just on ftyp because bmffimage also has that
 1631|       |      // header.
 1632|  10.7k|      if (Exiv2::find(qTimeFileType, Exiv2::toString(buf.data(8)))) {
  ------------------
  |  Branch (1632:11): [True: 5.61k, False: 5.09k]
  ------------------
 1633|  5.61k|        matched = true;
 1634|  5.61k|      }
 1635|  10.7k|      break;
 1636|  10.7k|    }
 1637|  59.9k|  }
 1638|       |
 1639|  12.8k|  if (!advance || !matched) {
  ------------------
  |  Branch (1639:7): [True: 12.8k, False: 0]
  |  Branch (1639:19): [True: 0, False: 0]
  ------------------
 1640|  12.8k|    iIo.seek(0L, BasicIo::beg);
 1641|  12.8k|  }
 1642|       |
 1643|  12.8k|  return matched;
 1644|  13.0k|}
quicktimevideo.cpp:_ZN5Exiv28InternalL10ignoreListERNS_7DataBufE:
  503|  43.5k|static bool ignoreList(Exiv2::DataBuf& buf) {
  504|  43.5k|  const char ignoreList[13][5] = {
  505|  43.5k|      "mdat", "edts", "junk", "iods", "alis", "stsc", "stsz", "stco", "ctts", "stss", "skip", "wide", "cmvd",
  506|  43.5k|  };
  507|       |
  508|  43.5k|  for (auto i : ignoreList)
  ------------------
  |  Branch (508:15): [True: 559k, False: 42.9k]
  ------------------
  509|   559k|    if (equalsQTimeTag(buf, i))
  ------------------
  |  Branch (509:9): [True: 637, False: 559k]
  ------------------
  510|    637|      return true;
  511|       |
  512|  42.9k|  return false;
  513|  43.5k|}
quicktimevideo.cpp:_ZN5Exiv28InternalL14dataIgnoreListERNS_7DataBufE:
  522|  21.4k|static bool dataIgnoreList(Exiv2::DataBuf& buf) {
  523|  21.4k|  const char ignoreList[8][5] = {
  524|  21.4k|      "moov", "mdia", "minf", "dinf", "alis", "stbl", "cmov", "meta",
  525|  21.4k|  };
  526|       |
  527|  21.4k|  for (auto i : ignoreList)
  ------------------
  |  Branch (527:15): [True: 164k, False: 19.5k]
  ------------------
  528|   164k|    if (equalsQTimeTag(buf, i))
  ------------------
  |  Branch (528:9): [True: 1.89k, False: 162k]
  ------------------
  529|  1.89k|      return true;
  530|       |
  531|  19.5k|  return false;
  532|  21.4k|}
quicktimevideo.cpp:_ZN5Exiv28InternalL14equalsQTimeTagERNS_7DataBufEPKc:
  492|   962k|static bool equalsQTimeTag(Exiv2::DataBuf& buf, const char str[5]) {
  493|   962k|  return std::equal(buf.begin(), buf.begin() + 4, str,
  494|   962k|                    [](auto b, auto s) { return std::tolower(b) == std::tolower(s); });
  495|   962k|}
quicktimevideo.cpp:_ZZN5Exiv28InternalL14equalsQTimeTagERNS_7DataBufEPKcENK3$_0clIhcEEDaT_T0_:
  494|  1.09M|                    [](auto b, auto s) { return std::tolower(b) == std::tolower(s); });
quicktimevideo.cpp:_ZN5Exiv2L10readStringERNS_7BasicIoEm:
  620|    915|static std::string readString(BasicIo& io, size_t size) {
  621|    915|  enforce(size <= io.size() - io.tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  622|    915|  Exiv2::DataBuf str(size + 1);
  623|    915|  io.readOrThrow(str.data(), size);
  624|    915|  str.write_uint8(size, 0);  // nul-terminate string
  625|    915|  return Exiv2::toString(str.data());
  626|    915|}

_ZN5Exiv28RafImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   25|    139|    Image(ImageType::raf, mdExif | mdIptc | mdXmp, std::move(io), params) {
   26|    139|}  // RafImage::RafImage
_ZNK5Exiv28RafImage10pixelWidthEv:
   32|     10|uint32_t RafImage::pixelWidth() const {
   33|     10|  if (pixelWidth_ != 0)
  ------------------
  |  Branch (33:7): [True: 0, False: 10]
  ------------------
   34|      0|    return pixelWidth_;
   35|       |
   36|     10|  auto widthIter = exifData_.findKey(Exiv2::ExifKey("Exif.Fujifilm.RawImageFullWidth"));
   37|     10|  if (widthIter == exifData_.end() || widthIter->count() == 0)
  ------------------
  |  Branch (37:7): [True: 10, False: 0]
  |  Branch (37:7): [True: 10, False: 0]
  |  Branch (37:39): [True: 0, False: 0]
  ------------------
   38|     10|    return 0;
   39|      0|  return widthIter->toUint32();
   40|     10|}
_ZNK5Exiv28RafImage11pixelHeightEv:
   42|     10|uint32_t RafImage::pixelHeight() const {
   43|     10|  if (pixelHeight_ != 0)
  ------------------
  |  Branch (43:7): [True: 0, False: 10]
  ------------------
   44|      0|    return pixelHeight_;
   45|       |
   46|     10|  auto heightIter = exifData_.findKey(Exiv2::ExifKey("Exif.Fujifilm.RawImageFullHeight"));
   47|     10|  if (heightIter == exifData_.end() || heightIter->count() == 0)
  ------------------
  |  Branch (47:7): [True: 10, False: 0]
  |  Branch (47:7): [True: 10, False: 0]
  |  Branch (47:40): [True: 0, False: 0]
  ------------------
   48|     10|    return 0;
   49|      0|  return heightIter->toUint32();
   50|     10|}
_ZN5Exiv28RafImage14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
   67|    308|void RafImage::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
   68|    308|  if (io_->open() != 0) {
  ------------------
  |  Branch (68:7): [True: 0, False: 308]
  ------------------
   69|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   70|      0|  }
   71|       |  // Ensure this is the correct image type
   72|    308|  if (!isRafType(*io_, true)) {
  ------------------
  |  Branch (72:7): [True: 0, False: 308]
  ------------------
   73|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (73:9): [True: 0, False: 0]
  |  Branch (73:25): [True: 0, False: 0]
  ------------------
   74|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   75|      0|    throw Error(ErrorCode::kerNotAnImage, "RAF");
   76|      0|  }
   77|       |
   78|       |  // The following is based on https://libopenraw.freedesktop.org/formats/raf/ and
   79|       |  // https://exiftool.org/TagNames/FujiFilm.html#RAFHeader
   80|       |
   81|    308|  const bool bPrint = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (81:23): [True: 78, False: 230]
  |  Branch (81:45): [True: 38, False: 192]
  ------------------
   82|    308|  if (bPrint) {
  ------------------
  |  Branch (82:7): [True: 116, False: 192]
  ------------------
   83|    116|    io_->seek(0, BasicIo::beg);  // rewind
   84|    116|    size_t address = io_->tell();
   85|    116|    constexpr auto format = " {:9} | {:9} | ";
   86|       |
   87|    116|    {
   88|    116|      out << Internal::indent(depth) << "STRUCTURE OF RAF FILE: " << io().path() << '\n';
   89|    116|      out << Internal::indent(depth) << "   Address |    Length | Payload" << '\n';
   90|    116|    }
   91|       |
   92|    116|    byte magicdata[17];
   93|    116|    io_->readOrThrow(magicdata, 16);
   94|    116|    magicdata[16] = 0;
   95|    116|    {
   96|    116|      out << Internal::indent(depth) << stringFormat(format, address, 16)  // 0
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
   97|    116|          << "       magic : " << reinterpret_cast<const char*>(magicdata) << '\n';
   98|    116|    }
   99|       |
  100|    116|    address = io_->tell();
  101|    116|    byte data1[5];
  102|    116|    io_->read(data1, 4);
  103|    116|    data1[4] = 0;
  104|    116|    {
  105|    116|      out << Internal::indent(depth) << stringFormat(format, address, 4)  // 16
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  106|    116|          << "       data1 : " << reinterpret_cast<const char*>(&data1) << '\n';
  107|    116|    }
  108|       |
  109|    116|    address = io_->tell();
  110|    116|    byte data2[9];
  111|    116|    io_->read(data2, 8);
  112|    116|    data2[8] = 0;
  113|    116|    {
  114|    116|      out << Internal::indent(depth) << stringFormat(format, address, 8)  // 20
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  115|    116|          << "       data2 : " << reinterpret_cast<const char*>(&data2) << '\n';
  116|    116|    }
  117|       |
  118|    116|    address = io_->tell();
  119|    116|    byte camdata[33];
  120|    116|    io_->read(camdata, 32);
  121|    116|    camdata[32] = 0;
  122|    116|    {
  123|    116|      out << Internal::indent(depth) << stringFormat(format, address, 32)  // 28
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  124|    116|          << "      camera : " << reinterpret_cast<const char*>(&camdata) << '\n';
  125|    116|    }
  126|       |
  127|    116|    address = io_->tell();
  128|    116|    byte dir_version[5];
  129|    116|    io_->read(dir_version, 4);
  130|    116|    dir_version[4] = 0;
  131|    116|    {
  132|    116|      out << Internal::indent(depth) << stringFormat(format, address, 4)  // 60
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  133|    116|          << "     version : " << reinterpret_cast<const char*>(&dir_version) << '\n';
  134|    116|    }
  135|       |
  136|    116|    address = io_->tell();
  137|    116|    DataBuf unknown(20);
  138|    116|    io_->readOrThrow(unknown.data(), unknown.size());
  139|    116|    {
  140|    116|      out << Internal::indent(depth) << stringFormat(format, address, 20)
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  141|    116|          << "     unknown : " << Internal::binaryToString(makeSlice(unknown, 0, unknown.size())) << '\n';
  142|    116|    }
  143|       |
  144|    116|    address = io_->tell();
  145|    116|    byte jpg_img_offset[4];
  146|    116|    io_->read(jpg_img_offset, 4);
  147|    116|    byte jpg_img_length[4];
  148|    116|    size_t address2 = io_->tell();
  149|    116|    io_->read(jpg_img_length, 4);
  150|       |
  151|    116|    uint32_t jpg_img_off = Exiv2::getULong(jpg_img_offset, bigEndian);
  152|    116|    uint32_t jpg_img_len = Exiv2::getULong(jpg_img_length, bigEndian);
  153|    116|    {
  154|    116|      out << Internal::indent(depth) << stringFormat(format, address, 4) << " JPEG offset : " << jpg_img_off << '\n';
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  155|    116|      out << Internal::indent(depth) << stringFormat(format, address2, 4) << " JPEG length : " << jpg_img_len << '\n';
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  156|    116|    }
  157|       |
  158|       |    // RAFs can carry the payload in one or two parts
  159|    116|    uint32_t meta_off[2], meta_len[2];
  160|    116|    uint32_t cfa_off[2], cfa_len[2], comp[2], cfa_size[2], cfa_data[2];
  161|    338|    for (size_t i = 0; i < 2; i++) {
  ------------------
  |  Branch (161:24): [True: 222, False: 116]
  ------------------
  162|    222|      address = io_->tell();
  163|    222|      byte data[4];
  164|    222|      io_->readOrThrow(data, 4);
  165|    222|      meta_off[i] = Exiv2::getULong(data, bigEndian);
  166|    222|      address2 = io_->tell();
  167|    222|      io_->readOrThrow(data, 4);
  168|    222|      meta_len[i] = Exiv2::getULong(data, bigEndian);
  169|    222|      {
  170|    222|        out << Internal::indent(depth) << stringFormat(format, address, 4)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  171|    222|            << stringFormat("meta offset{} : {}\n", i + 1, meta_off[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  172|    222|        out << Internal::indent(depth) << stringFormat(format, address2, 4)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  173|    222|            << stringFormat("meta length{} : {}\n", i + 1, meta_len[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  174|    222|      }
  175|       |
  176|    222|      address = io_->tell();
  177|    222|      io_->readOrThrow(data, 4);
  178|    222|      cfa_off[i] = Exiv2::getULong(data, bigEndian);
  179|    222|      address2 = io_->tell();
  180|    222|      io_->readOrThrow(data, 4);
  181|    222|      cfa_len[i] = Exiv2::getULong(data, bigEndian);
  182|    222|      size_t address3 = io_->tell();
  183|    222|      io_->readOrThrow(data, 4);
  184|    222|      comp[i] = Exiv2::getULong(data, bigEndian);
  185|    222|      size_t address4 = io_->tell();
  186|    222|      io_->readOrThrow(data, 4);
  187|    222|      cfa_size[i] = Exiv2::getULong(data, bigEndian);
  188|    222|      size_t address5 = io_->tell();
  189|    222|      io_->readOrThrow(data, 4);
  190|    222|      cfa_data[i] = Exiv2::getULong(data, bigEndian);
  191|    222|      {
  192|    222|        out << Internal::indent(depth) << stringFormat(format, address, 4U)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  193|    222|            << stringFormat(" CFA offset{} : {}\n", i + 1, cfa_off[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  194|    222|        out << Internal::indent(depth) << stringFormat(format, address2, 4U)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  195|    222|            << stringFormat(" CFA length{} : {}\n", i + 1, cfa_len[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  196|    222|        out << Internal::indent(depth) << stringFormat(format, address3, 4U)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  197|    222|            << stringFormat("compression{} : {}\n", i + 1, comp[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  198|    222|        out << Internal::indent(depth) << stringFormat(format, address4, 4U)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  199|    222|            << stringFormat("  CFA chunk{} : {}\n", i + 1, cfa_size[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  200|    222|        out << Internal::indent(depth) << stringFormat(format, address5, 4U)
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  201|    222|            << stringFormat("    unknown{} : {}\n", i + 1, cfa_data[i]);
  ------------------
  |  |   18|    222|#define stringFormat std::format
  ------------------
  202|    222|      }
  203|    222|    }
  204|       |
  205|    116|    io_->seek(jpg_img_off, BasicIo::beg);  // rewind
  206|    116|    address = io_->tell();
  207|    116|    DataBuf payload(16);  // header is different from chunks
  208|    116|    io_->readOrThrow(payload.data(), payload.size());
  209|    116|    {
  210|    116|      out << Internal::indent(depth) << stringFormat(format, address, jpg_img_len)
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  211|    116|          << "   JPEG data : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << '\n';
  212|    116|    }
  213|       |
  214|    116|    io_->seek(meta_off[0], BasicIo::beg);  // rewind
  215|    116|    address = io_->tell();
  216|    116|    io_->readOrThrow(payload.data(), payload.size());
  217|    116|    {
  218|    116|      out << Internal::indent(depth) << stringFormat(format, address, meta_len[0])
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  219|    116|          << "  meta data1 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << '\n';
  220|    116|    }
  221|       |
  222|    116|    if (meta_off[1] && meta_len[1]) {
  ------------------
  |  Branch (222:9): [True: 78, False: 38]
  |  Branch (222:24): [True: 76, False: 2]
  ------------------
  223|     76|      io_->seek(meta_off[1], BasicIo::beg);  // rewind
  224|     76|      address = io_->tell();
  225|     76|      io_->readOrThrow(payload.data(), payload.size());
  226|     76|      {
  227|     76|        out << Internal::indent(depth) << stringFormat(format, address, meta_len[1])
  ------------------
  |  |   18|     76|#define stringFormat std::format
  ------------------
  228|     76|            << "  meta data2 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << '\n';
  229|     76|      }
  230|     76|    }
  231|       |
  232|    116|    io_->seek(cfa_off[0], BasicIo::beg);  // rewind
  233|    116|    address = io_->tell();
  234|    116|    io_->readOrThrow(payload.data(), payload.size());
  235|    116|    {
  236|    116|      out << Internal::indent(depth) << stringFormat(format, address, cfa_len[0])
  ------------------
  |  |   18|    116|#define stringFormat std::format
  ------------------
  237|    116|          << "   CFA data1 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << '\n';
  238|    116|    }
  239|       |
  240|    116|    if (cfa_off[1] && cfa_len[1]) {
  ------------------
  |  Branch (240:9): [True: 77, False: 39]
  |  Branch (240:23): [True: 73, False: 4]
  ------------------
  241|     73|      io_->seek(cfa_off[1], BasicIo::beg);  // rewind
  242|     73|      address = io_->tell();
  243|     73|      io_->readOrThrow(payload.data(), payload.size());
  244|     73|      {
  245|     73|        out << Internal::indent(depth) << stringFormat(format, address, cfa_len[1])  // cfa_off
  ------------------
  |  |   18|     73|#define stringFormat std::format
  ------------------
  246|     73|            << "   CFA data2 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << '\n';
  247|     73|      }
  248|     73|    }
  249|    116|  }
  250|    308|}  // RafImage::printStructure
_ZN5Exiv28RafImage12readMetadataEv:
  252|    139|void RafImage::readMetadata() {
  253|       |#ifdef EXIV2_DEBUG_MESSAGES
  254|       |  std::cerr << "Reading RAF file " << io_->path() << "\n";
  255|       |#endif
  256|    139|  if (io_->open() != 0)
  ------------------
  |  Branch (256:7): [True: 0, False: 139]
  ------------------
  257|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  258|    139|  IoCloser closer(*io_);
  259|       |  // Ensure that this is the correct image type
  260|    139|  if (!isRafType(*io_, false)) {
  ------------------
  |  Branch (260:7): [True: 0, False: 139]
  ------------------
  261|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (261:9): [True: 0, False: 0]
  |  Branch (261:25): [True: 0, False: 0]
  ------------------
  262|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  263|      0|    throw Error(ErrorCode::kerNotAnImage, "RAF");
  264|      0|  }
  265|       |
  266|    139|  clearMetadata();
  267|       |
  268|    139|  if (io_->seek(84, BasicIo::beg) != 0)
  ------------------
  |  Branch (268:7): [True: 4, False: 135]
  ------------------
  269|      4|    throw Error(ErrorCode::kerFailedToReadImageData);
  270|    135|  byte jpg_img_offset[4];
  271|    135|  if (io_->read(jpg_img_offset, 4) != 4)
  ------------------
  |  Branch (271:7): [True: 0, False: 135]
  ------------------
  272|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  273|    135|  byte jpg_img_length[4];
  274|    135|  if (io_->read(jpg_img_length, 4) != 4)
  ------------------
  |  Branch (274:7): [True: 2, False: 133]
  ------------------
  275|      2|    throw Error(ErrorCode::kerFailedToReadImageData);
  276|    133|  uint32_t jpg_img_off_u32 = Exiv2::getULong(jpg_img_offset, bigEndian);
  277|    133|  uint32_t jpg_img_len_u32 = Exiv2::getULong(jpg_img_length, bigEndian);
  278|       |
  279|    133|  Internal::enforce(Safe::add(jpg_img_off_u32, jpg_img_len_u32) <= io_->size(), ErrorCode::kerCorruptedMetadata);
  280|       |
  281|    133|  auto jpg_img_off = static_cast<long>(jpg_img_off_u32);
  282|    133|  auto jpg_img_len = static_cast<long>(jpg_img_len_u32);
  283|       |
  284|    133|  Internal::enforce(jpg_img_len >= 12, ErrorCode::kerCorruptedMetadata);
  285|       |
  286|    133|  DataBuf jpg_buf(jpg_img_len);
  287|    133|  if (io_->seek(jpg_img_off, BasicIo::beg) != 0)
  ------------------
  |  Branch (287:7): [True: 0, False: 133]
  ------------------
  288|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  289|       |
  290|    133|  if (!jpg_buf.empty()) {
  ------------------
  |  Branch (290:7): [True: 112, False: 21]
  ------------------
  291|    112|    io_->read(jpg_buf.data(), jpg_buf.size());
  292|    112|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (292:9): [True: 0, False: 112]
  |  Branch (292:25): [True: 0, False: 112]
  ------------------
  293|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  294|    112|  }
  295|       |
  296|       |  // Retrieve metadata from embedded JPEG preview image.
  297|    133|  try {
  298|    133|    auto jpg_io = std::make_unique<Exiv2::MemIo>(jpg_buf.data(), jpg_buf.size());
  299|    133|    auto jpg_img = JpegImage(std::move(jpg_io), ImageCtorParams(false, 0));
  300|    133|    jpg_img.readMetadata();
  301|    133|    setByteOrder(jpg_img.byteOrder());
  302|    133|    xmpData_ = jpg_img.xmpData();
  303|    133|    exifData_ = jpg_img.exifData();
  304|    133|    iptcData_ = jpg_img.iptcData();
  305|    133|    comment_ = jpg_img.comment();
  306|    133|  } catch (const Exiv2::Error&) {
  307|    110|  }
  308|       |
  309|    133|  exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian);
  310|    112|  exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);
  311|       |
  312|       |  // Todo: parse the proprietary metadata structure
  313|       |  //       at offset 92 for pixelWidth_ & pixelHeight_
  314|       |  // See https://libopenraw.freedesktop.org/formats/raf/
  315|       |  // and https://exiftool.org/TagNames/FujiFilm.html#RAF
  316|       |
  317|       |  // parse the tiff
  318|    112|  std::array<byte, 4> readBuff;
  319|    112|  if (io_->seek(100, BasicIo::beg) != 0)
  ------------------
  |  Branch (319:7): [True: 1, False: 111]
  ------------------
  320|      1|    throw Error(ErrorCode::kerFailedToReadImageData);
  321|    111|  if (io_->read(readBuff.data(), 4) != 4)
  ------------------
  |  Branch (321:7): [True: 2, False: 109]
  ------------------
  322|      2|    throw Error(ErrorCode::kerFailedToReadImageData);
  323|    109|  uint32_t tiffOffset = Exiv2::getULong(readBuff.data(), bigEndian);
  324|       |
  325|    109|  if (io_->read(readBuff.data(), 4) != 4)
  ------------------
  |  Branch (325:7): [True: 5, False: 104]
  ------------------
  326|      5|    throw Error(ErrorCode::kerFailedToReadImageData);
  327|    104|  uint32_t tiffLength = Exiv2::getULong(readBuff.data(), bigEndian);
  328|       |
  329|       |  // sanity check.  Does tiff lie inside the file?
  330|    104|  Internal::enforce(Safe::add(tiffOffset, tiffLength) <= io_->size(), ErrorCode::kerCorruptedMetadata);
  331|       |
  332|    104|  if (io_->seek(tiffOffset, BasicIo::beg) != 0)
  ------------------
  |  Branch (332:7): [True: 0, False: 104]
  ------------------
  333|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
  334|       |
  335|       |  // Check if this really is a tiff and then call the tiff parser.
  336|       |  // Check is needed because some older models just embed a raw bitstream.
  337|       |  // For those files we skip the parsing step.
  338|    104|  if (io_->read(readBuff.data(), 4) != 4) {
  ------------------
  |  Branch (338:7): [True: 1, False: 103]
  ------------------
  339|      1|    throw Error(ErrorCode::kerFailedToReadImageData);
  340|      1|  }
  341|    103|  io_->seek(-4, BasicIo::cur);
  342|    103|  const std::array<byte, 4> Id1{0x49, 0x49, 0x2A, 0x00};
  343|    103|  const std::array<byte, 4> Id2{0x4D, 0x4D, 0x00, 0x2A};
  344|    103|  if (readBuff == Id1 || readBuff == Id2) {
  ------------------
  |  Branch (344:7): [True: 12, False: 91]
  |  Branch (344:26): [True: 4, False: 87]
  ------------------
  345|      5|    DataBuf tiff(tiffLength);
  346|      5|    io_->read(tiff.data(), tiff.size());
  347|       |
  348|      5|    if (!io_->error() && !io_->eof()) {
  ------------------
  |  Branch (348:9): [True: 5, False: 0]
  |  Branch (348:26): [True: 5, False: 0]
  ------------------
  349|      5|      const DecodeParams dp(max_recursion_depth_);
  350|      5|      TiffParser::decode(exifData_, iptcData_, xmpData_, tiff.c_data(), tiff.size(), dp);
  351|      5|    }
  352|      5|  }
  353|    103|}
_ZN5Exiv28RafImage13writeMetadataEv:
  355|     38|void RafImage::writeMetadata() {
  356|       |  //! Todo: implement me!
  357|     38|  throw(Error(ErrorCode::kerWritingImageFormatUnsupported, "RAF"));
  358|     38|}  // RafImage::writeMetadata
_ZN5Exiv214newRafInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  362|    139|Image::UniquePtr newRafInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  363|    139|  auto image = std::make_unique<RafImage>(std::move(io), params);
  364|    139|  if (!image->good()) {
  ------------------
  |  Branch (364:7): [True: 0, False: 139]
  ------------------
  365|      0|    return nullptr;
  366|      0|  }
  367|    139|  return image;
  368|    139|}
_ZN5Exiv29isRafTypeERNS_7BasicIoEb:
  370|  13.0k|bool isRafType(BasicIo& iIo, bool advance) {
  371|  13.0k|  const int32_t len = 8;
  372|  13.0k|  constexpr std::array<byte, len> RafId{'F', 'U', 'J', 'I', 'F', 'I', 'L', 'M'};
  373|  13.0k|  std::array<byte, len> buf;
  374|  13.0k|  iIo.read(buf.data(), len);
  375|  13.0k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (375:7): [True: 0, False: 13.0k]
  |  Branch (375:22): [True: 0, False: 13.0k]
  ------------------
  376|      0|    return false;
  377|      0|  }
  378|  13.0k|  bool rc = buf == RafId;
  379|  13.0k|  if (!advance || !rc) {
  ------------------
  |  Branch (379:7): [True: 12.7k, False: 308]
  |  Branch (379:19): [True: 0, False: 308]
  ------------------
  380|  12.7k|    iIo.seek(-len, BasicIo::cur);
  381|  12.7k|  }
  382|  13.0k|  return rc;
  383|  13.0k|}

_ZN5Exiv29RiffVideoC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
  365|    280|    Image(ImageType::riff, mdNone, std::move(io), params) {
  366|    280|}  // RiffVideo::RiffVideo
_ZNK5Exiv29RiffVideo8mimeTypeEv:
  368|    280|std::string RiffVideo::mimeType() const {
  369|    280|  return "video/riff";
  370|    280|}
_ZN5Exiv29RiffVideo12readMetadataEv:
  375|    280|void RiffVideo::readMetadata() {
  376|    280|  if (io_->open() != 0)
  ------------------
  |  Branch (376:7): [True: 0, False: 280]
  ------------------
  377|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  378|       |
  379|       |  // Ensure that this is the correct image type
  380|    280|  if (!isRiffType(*io_, false)) {
  ------------------
  |  Branch (380:7): [True: 0, False: 280]
  ------------------
  381|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (381:9): [True: 0, False: 0]
  |  Branch (381:25): [True: 0, False: 0]
  ------------------
  382|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  383|      0|    throw Error(ErrorCode::kerNotAnImage, "RIFF");
  384|      0|  }
  385|       |
  386|    280|  IoCloser closer(*io_);
  387|    280|  clearMetadata();
  388|       |
  389|    280|  xmpData_["Xmp.video.FileSize"] = io_->size();
  390|    280|  xmpData_["Xmp.video.MimeType"] = mimeType();
  391|       |
  392|    280|  HeaderReader header(io_);
  393|    280|  xmpData_["Xmp.video.Container"] = header.getId();
  394|       |
  395|    280|  xmpData_["Xmp.video.FileType"] = readStringTag(io_);
  396|       |
  397|    280|  decodeBlocks();
  398|    280|}  // RiffVideo::readMetadata
_ZN5Exiv29RiffVideo12HeaderReaderC2ERKNSt3__110unique_ptrINS_7BasicIoENS2_14default_deleteIS4_EEEE:
  400|  29.2k|RiffVideo::HeaderReader::HeaderReader(const BasicIo::UniquePtr& io) {
  401|  29.2k|  Internal::enforce(io->size() > io->tell() + DWORD + DWORD, Exiv2::ErrorCode::kerCorruptedMetadata);
  402|  29.2k|  id_ = readStringTag(io);
  403|  29.2k|  size_ = readDWORDTag(io);
  404|  29.2k|}
_ZN5Exiv29RiffVideo5equalERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  406|   306k|bool RiffVideo::equal(const std::string& str1, const std::string& str2) {
  407|   306k|  if (str1.size() != str2.size())
  ------------------
  |  Branch (407:7): [True: 300k, False: 6.58k]
  ------------------
  408|   300k|    return false;
  409|       |
  410|  6.58k|  return Internal::upper(str1) == str2;
  411|   306k|}
_ZN5Exiv29RiffVideo8readListERKNS0_12HeaderReaderE:
  413|    561|void RiffVideo::readList(const HeaderReader& header_) {
  414|    561|  std::string chunk_type = readStringTag(io_);
  415|       |
  416|       |#ifdef EXIV2_DEBUG_MESSAGES
  417|       |  EXV_INFO << "-> Reading list : id= " << header_.getId() << "  type= " << chunk_type << " size= " << header_.getSize()
  418|       |           << "(" << io_->tell() << "/" << io_->size() << ")" << '\n';
  419|       |#endif
  420|       |
  421|    561|  if (equal(chunk_type, CHUNK_ID_INFO))
  ------------------
  |  Branch (421:7): [True: 302, False: 259]
  ------------------
  422|    302|    readInfoListChunk(header_.getSize());
  423|    259|  else if (equal(chunk_type, CHUNK_ID_MOVI)) {
  ------------------
  |  Branch (423:12): [True: 2, False: 257]
  ------------------
  424|      2|    readMoviList(header_.getSize());
  425|      2|  }
  426|    561|}
_ZN5Exiv29RiffVideo9readChunkERKNS0_12HeaderReaderE:
  428|  28.3k|void RiffVideo::readChunk(const HeaderReader& header_) {
  429|       |#ifdef EXIV2_DEBUG_MESSAGES
  430|       |  if (header_.getSize())
  431|       |    EXV_INFO << "--> Reading Chunk : [" << header_.getId() << "] size= " << header_.getSize() << "(" << io_->tell()
  432|       |             << "/" << io_->size() << ")" << '\n';
  433|       |#endif
  434|       |
  435|  28.3k|  if (equal(header_.getId(), CHUNK_ID_AVIH))
  ------------------
  |  Branch (435:7): [True: 195, False: 28.1k]
  ------------------
  436|    195|    readAviHeader();
  437|  28.1k|  else if (equal(header_.getId(), CHUNK_ID_STRH))
  ------------------
  |  Branch (437:12): [True: 155, False: 27.9k]
  ------------------
  438|    155|    readStreamHeader();
  439|  27.9k|  else if (equal(header_.getId(), CHUNK_ID_STRF))
  ------------------
  |  Branch (439:12): [True: 51, False: 27.9k]
  ------------------
  440|     51|    readStreamFormat(header_.getSize());
  441|  27.9k|  else if (equal(header_.getId(), CHUNK_ID_FMT)) {
  ------------------
  |  Branch (441:12): [True: 469, False: 27.4k]
  ------------------
  442|    469|    streamType_ = Audio;
  443|    469|    readStreamFormat(header_.getSize());
  444|  27.4k|  } else if (equal(header_.getId(), CHUNK_ID_STRD))
  ------------------
  |  Branch (444:14): [True: 17, False: 27.4k]
  ------------------
  445|     17|    readStreamData(header_.getSize());
  446|  27.4k|  else if (equal(header_.getId(), CHUNK_ID_STRN))
  ------------------
  |  Branch (446:12): [True: 2, False: 27.4k]
  ------------------
  447|      2|    StreamName(header_.getSize());
  448|  27.4k|  else if (equal(header_.getId(), CHUNK_ID_VPRP))
  ------------------
  |  Branch (448:12): [True: 10, False: 27.4k]
  ------------------
  449|     10|    readVPRPChunk(header_.getSize());
  450|  27.4k|  else if (equal(header_.getId(), CHUNK_ID_IDX1))
  ------------------
  |  Branch (450:12): [True: 46, False: 27.3k]
  ------------------
  451|     46|    readIndexChunk(header_.getSize());
  452|  27.3k|  else if (equal(header_.getId(), CHUNK_ID_DATA))
  ------------------
  |  Branch (452:12): [True: 42, False: 27.3k]
  ------------------
  453|     42|    readDataChunk(header_.getSize());
  454|  27.3k|  else if (equal(header_.getId(), CHUNK_ID_JUNK))
  ------------------
  |  Branch (454:12): [True: 9, False: 27.3k]
  ------------------
  455|      9|    readJunk(header_.getSize());
  456|  27.3k|  else {
  457|       |#ifdef EXIV2_DEBUG_MESSAGES
  458|       |    if (header_.getSize())
  459|       |      EXV_WARNING << "--> Ignoring Chunk : " << header_.getId() << "] size= " << header_.getSize() << "(" << io_->tell()
  460|       |                  << "/" << io_->size() << ")" << '\n';
  461|       |#endif
  462|  27.3k|    io_->seekOrThrow(io_->tell() + header_.getSize(), BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  463|  27.3k|  }
  464|  28.3k|}
_ZN5Exiv29RiffVideo12decodeBlocksEv:
  466|    280|void RiffVideo::decodeBlocks() {
  467|  28.9k|  do {
  468|  28.9k|    if (HeaderReader header(io_); equal(header.getId(), CHUNK_ID_LIST)) {
  ------------------
  |  Branch (468:35): [True: 561, False: 28.4k]
  ------------------
  469|    561|      readList(header);
  470|  28.4k|    } else {
  471|  28.4k|      readChunk(header);
  472|  28.4k|    }
  473|  28.9k|  } while (!io_->eof() && io_->tell() < io_->size());
  ------------------
  |  Branch (473:12): [True: 28.7k, False: 266]
  |  Branch (473:27): [True: 28.6k, False: 14]
  ------------------
  474|    280|}  // RiffVideo::decodeBlock
_ZN5Exiv29RiffVideo13readAviHeaderEv:
  476|    195|void RiffVideo::readAviHeader() {
  477|       |#ifdef EXIV2_DEBUG_MESSAGES
  478|       |  EXV_INFO << "--> dwMicroSecPerFrame    = " << readDWORDTag(io_) << '\n';
  479|       |  EXV_INFO << "--> dwMaxBytesPerSec      = " << readDWORDTag(io_) << '\n';
  480|       |  EXV_INFO << "--> dwPaddingGranularity  = " << readDWORDTag(io_) << '\n';
  481|       |  EXV_INFO << "--> dwFlags               = " << readDWORDTag(io_) << '\n';
  482|       |  EXV_INFO << "--> dwTotalFrames         = " << readDWORDTag(io_) << '\n';
  483|       |  EXV_INFO << "--> dwInitialFrames       = " << readDWORDTag(io_) << '\n';
  484|       |  EXV_INFO << "--> dwStreams             = " << readDWORDTag(io_) << '\n';
  485|       |  EXV_INFO << "--> dwSuggestedBufferSize = " << readDWORDTag(io_) << '\n';
  486|       |  EXV_INFO << "--> dwWidth               = " << readDWORDTag(io_) << '\n';
  487|       |  EXV_INFO << "--> dwHeight              = " << readDWORDTag(io_) << '\n';
  488|       |  EXV_INFO << "--> dwReserved1           = " << readDWORDTag(io_) << '\n';
  489|       |  EXV_INFO << "--> dwReserved2           = " << readDWORDTag(io_) << '\n';
  490|       |  EXV_INFO << "--> dwReserved3           = " << readDWORDTag(io_) << '\n';
  491|       |  EXV_INFO << "--> dwReserved4           = " << readDWORDTag(io_) << '\n';
  492|       |  if (LogMsg::info >= LogMsg::level() && LogMsg::handler())
  493|       |    io_->seekOrThrow(io_->tell() - DWORD * 14, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  494|       |#endif
  495|       |
  496|    195|  uint32_t TimeBetweenFrames = readDWORDTag(io_);
  497|    195|  xmpData_["Xmp.video.MicroSecPerFrame"] = TimeBetweenFrames;
  498|    195|  double frame_rate = 1000000. / TimeBetweenFrames;
  499|       |
  500|    195|  xmpData_["Xmp.video.MaxDataRate"] = readDWORDTag(io_);  // MaximumDataRate
  501|       |
  502|    195|  io_->seekOrThrow(io_->tell() + (DWORD * 2), BasicIo::beg,
  503|    195|                   ErrorCode::kerFailedToReadImageData);  // ignore PaddingGranularity and Flags
  504|       |
  505|    195|  uint32_t frame_count = readDWORDTag(io_);  // TotalNumberOfFrames
  506|    195|  xmpData_["Xmp.video.FrameCount"] = frame_count;
  507|       |
  508|    195|  io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg,
  509|    195|                   ErrorCode::kerFailedToReadImageData);  // ignore NumberOfInitialFrames
  510|       |
  511|    195|  xmpData_["Xmp.audio.ChannelType"] = getStreamType(readDWORDTag(io_));  // NumberOfStreams
  512|       |
  513|    195|  xmpData_["Xmp.video.StreamCount"] = readDWORDTag(io_);  // SuggestedBufferSize
  514|       |
  515|    195|  uint32_t width = readDWORDTag(io_);
  516|    195|  xmpData_["Xmp.video.Width"] = width;
  517|       |
  518|    195|  uint32_t height = readDWORDTag(io_);
  519|    195|  xmpData_["Xmp.video.Height"] = height;
  520|       |
  521|    195|  io_->seekOrThrow(io_->tell() + (DWORD * 4), BasicIo::beg,
  522|    195|                   ErrorCode::kerFailedToReadImageData);  // TimeScale, DataRate, StartTime, DataLength
  523|       |
  524|    195|  xmpData_["Xmp.video.AspectRatio"] = getAspectRatio(width, height);
  525|       |
  526|    195|  fillDuration(frame_rate, frame_count);
  527|    195|}
_ZN5Exiv29RiffVideo16readStreamHeaderEv:
  529|    155|void RiffVideo::readStreamHeader() {
  530|    155|  std::string stream = readStringTag(io_);
  531|    155|  streamType_ = (equal(stream, "VIDS")) ? Video : Audio;
  ------------------
  |  Branch (531:17): [True: 102, False: 53]
  ------------------
  532|       |
  533|       |#ifdef EXIV2_DEBUG_MESSAGES
  534|       |  EXV_INFO << "--> fccType                = " << stream << '\n';
  535|       |  EXV_INFO << "--> fccHandler             = " << readStringTag(io_) << '\n';
  536|       |  EXV_INFO << "--> dwFlags                = " << readDWORDTag(io_) << '\n';
  537|       |  EXV_INFO << "--> wPriority              = " << readWORDTag(io_) << '\n';
  538|       |  EXV_INFO << "--> wLanguage              = " << readWORDTag(io_) << '\n';
  539|       |  EXV_INFO << "--> dwInitialFrames        = " << readDWORDTag(io_) << '\n';  // 20
  540|       |  EXV_INFO << "--> dwScale                = " << readDWORDTag(io_) << '\n';
  541|       |  EXV_INFO << "--> dwRate                 = " << readDWORDTag(io_) << '\n';
  542|       |  EXV_INFO << "--> dwStart                = " << readDWORDTag(io_) << '\n';
  543|       |  EXV_INFO << "--> dwLength               = " << readDWORDTag(io_) << '\n';
  544|       |  EXV_INFO << "--> dwSuggestedBufferSize  = " << readDWORDTag(io_) << '\n';  // 40
  545|       |  EXV_INFO << "--> dwSampleSize           = " << readDWORDTag(io_) << '\n';
  546|       |  EXV_INFO << "--> Left                   = " << readWORDTag(io_) << '\n';
  547|       |  EXV_INFO << "--> top                    = " << readWORDTag(io_) << '\n';
  548|       |  EXV_INFO << "--> right                  = " << readWORDTag(io_) << '\n';
  549|       |  EXV_INFO << "--> bottom                 = " << readWORDTag(io_) << '\n';
  550|       |  EXV_INFO << "--> XXXXXX                 = " << readDWORDTag(io_) << '\n';  // 56
  551|       |  if (LogMsg::info >= LogMsg::level() && LogMsg::handler())
  552|       |    io_->seekOrThrow(io_->tell() - DWORD * 13, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  553|       |#endif
  554|       |
  555|    155|  xmpData_["Xmp.video.Codec"] = readStringTag(io_);  // DataHandler
  556|       |
  557|    155|  io_->seekOrThrow(io_->tell() + (DWORD * 2) + (WORD * 2), BasicIo::beg,
  558|    155|                   ErrorCode::kerFailedToReadImageData);  // dwFlags, wPriority, wLanguage, dwInitialFrames
  559|       |
  560|    155|  uint32_t divisor = readDWORDTag(io_);  // TimeScale
  561|       |
  562|    155|  if (divisor) {
  ------------------
  |  Branch (562:7): [True: 137, False: 18]
  ------------------
  563|    137|    auto rate = static_cast<double>(readDWORDTag(io_)) / divisor;
  564|    137|    xmpData_[(streamType_ == Video) ? "Xmp.video.FrameRate" : "Xmp.audio.SampleRate"] = rate;
  ------------------
  |  Branch (564:14): [True: 102, False: 35]
  ------------------
  565|    137|  }
  566|    155|  io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData);  // dwStart
  567|       |
  568|    155|  if (divisor) {
  ------------------
  |  Branch (568:7): [True: 137, False: 18]
  ------------------
  569|    137|    auto frame_count = static_cast<double>(readDWORDTag(io_)) / divisor;  // DataLength
  570|    137|    xmpData_[(streamType_ == Video) ? "Xmp.video.FrameCount" : "Xmp.audio.FrameCount"] = frame_count;
  ------------------
  |  Branch (570:14): [True: 102, False: 35]
  ------------------
  571|    137|  }
  572|       |
  573|    155|  io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData);  // dwSuggestedBufferSize
  574|       |
  575|    155|  xmpData_[(streamType_ == Video) ? "Xmp.video.VideoQuality" : "Xmp.video.StreamQuality"] = readDWORDTag(io_);
  ------------------
  |  Branch (575:12): [True: 101, False: 54]
  ------------------
  576|       |
  577|    155|  xmpData_[(streamType_ == Video) ? "Xmp.video.VideoSampleSize" : "Xmp.video.StreamSampleSize"] = readDWORDTag(io_);
  ------------------
  |  Branch (577:12): [True: 98, False: 57]
  ------------------
  578|    155|  io_->seekOrThrow(io_->tell() + (DWORD * 2), BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  579|    155|}
_ZN5Exiv29RiffVideo16readStreamFormatEm:
  581|    520|void RiffVideo::readStreamFormat(uint64_t size_) {
  582|       |  // The structure of the strf chunk depends on the media type. Video streams use the BITMAPINFOHEADER structure,
  583|       |  // whereas audio streams use the WAVEFORMATEX structure.
  584|       |
  585|       |#ifdef EXIV2_DEBUG_MESSAGES
  586|       |  if (streamType_ == Audio) {
  587|       |    EXV_INFO << "--> wFormatTag      = " << readWORDTag(io_) << '\n';
  588|       |    EXV_INFO << "--> nChannels       = " << readWORDTag(io_) << '\n';
  589|       |    EXV_INFO << "--> nSamplesPerSec  = " << readDWORDTag(io_) << '\n';
  590|       |    EXV_INFO << "--> nAvgBytesPerSec = " << readDWORDTag(io_) << '\n';
  591|       |    EXV_INFO << "--> nBlockAlign     = " << readWORDTag(io_) << '\n';
  592|       |    EXV_INFO << "--> wBitsPerSample  = " << readWORDTag(io_) << '\n';
  593|       |    if (LogMsg::info >= LogMsg::level() && LogMsg::handler())
  594|       |      io_->seekOrThrow(io_->tell() - DWORD * 4, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  595|       |  } else if (streamType_ == Video) {
  596|       |    EXV_INFO << "--> biSize            = " << readDWORDTag(io_) << '\n';
  597|       |    EXV_INFO << "--> biWidth           = " << readDWORDTag(io_) << '\n';
  598|       |    EXV_INFO << "--> biHeight          = " << readDWORDTag(io_) << '\n';
  599|       |    EXV_INFO << "--> biPlanes          = " << readWORDTag(io_) << '\n';
  600|       |    EXV_INFO << "--> biBitCount        = " << readWORDTag(io_) << '\n';
  601|       |    EXV_INFO << "--> biCompression     = " << readDWORDTag(io_) << '\n';
  602|       |    EXV_INFO << "--> biSizeImage       = " << readDWORDTag(io_) << '\n';
  603|       |    EXV_INFO << "--> biXPelsPerMeter   = " << readDWORDTag(io_) << '\n';
  604|       |    EXV_INFO << "--> biYPelsPerMeter   = " << readDWORDTag(io_) << '\n';
  605|       |    EXV_INFO << "--> biClrUsed         = " << readDWORDTag(io_) << '\n';
  606|       |    EXV_INFO << "--> biClrImportant    = " << readDWORDTag(io_) << '\n';
  607|       |    if (LogMsg::info >= LogMsg::level() && LogMsg::handler())
  608|       |      io_->seekOrThrow(io_->tell() - DWORD * 10, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  609|       |  }
  610|       |#endif
  611|       |
  612|    520|  if (streamType_ == Video) {
  ------------------
  |  Branch (612:7): [True: 50, False: 470]
  ------------------
  613|     50|    io_->seekOrThrow(io_->tell() + (DWORD * 3), BasicIo::beg,
  614|     50|                     ErrorCode::kerFailedToReadImageData);  // ignore biSize, biWidth, biHeight
  615|     50|    xmpData_["Xmp.video.Planes"] = readWORDTag(io_);
  616|     50|    xmpData_["Xmp.video.PixelDepth"] = readWORDTag(io_);
  617|     50|    xmpData_["Xmp.video.Compressor"] = readStringTag(io_);
  618|     50|    xmpData_["Xmp.video.ImageLength"] = readDWORDTag(io_);
  619|     50|    xmpData_["Xmp.video.PixelPerMeterX"] = readQWORDTag(io_);
  620|     50|    xmpData_["Xmp.video.PixelPerMeterY"] = readQWORDTag(io_);
  621|     50|    if (uint32_t NumOfColours = readDWORDTag(io_))
  ------------------
  |  Branch (621:18): [True: 33, False: 17]
  ------------------
  622|     33|      xmpData_["Xmp.video.NumOfColours"] = NumOfColours;
  623|     17|    else
  624|     17|      xmpData_["Xmp.video.NumOfColours"] = "Unspecified";
  625|     50|    if (uint32_t NumIfImpColours = readDWORDTag(io_))
  ------------------
  |  Branch (625:18): [True: 29, False: 21]
  ------------------
  626|     29|      xmpData_["Xmp.video.NumIfImpColours"] = NumIfImpColours;
  627|     21|    else
  628|     21|      xmpData_["Xmp.video.NumIfImpColours"] = "All";
  629|    470|  } else if (streamType_ == Audio) {
  ------------------
  |  Branch (629:14): [True: 469, False: 1]
  ------------------
  630|    469|    uint16_t format_tag = readWORDTag(io_);
  631|    469|    if (auto it = Internal::audioEncodingValues.find(format_tag); it != Internal::audioEncodingValues.end())
  ------------------
  |  Branch (631:67): [True: 66, False: 403]
  ------------------
  632|     66|      xmpData_["Xmp.audio.Compressor"] = it->second;
  633|    403|    else
  634|    403|      xmpData_["Xmp.audio.Compressor"] = format_tag;
  635|       |
  636|    469|    xmpData_["Xmp.audio.ChannelType"] = getStreamType(readDWORDTag(io_));
  637|    469|    xmpData_["Xmp.audio.SampleRate"] = readDWORDTag(io_);                                      // nSamplesPerSec
  638|    469|    io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData);  // nAvgBytesPerSec
  639|    469|    xmpData_["Xmp.audio.SampleType"] = readDWORDTag(io_);                                      // nBlockAlign
  640|    469|    xmpData_["Xmp.audio.BitsPerSample"] = readDWORDTag(io_);                                   // wBitsPerSample
  641|    469|    if (xmpData_["Xmp.video.FileType"].toString() == "AVI ")
  ------------------
  |  Branch (641:9): [True: 47, False: 422]
  ------------------
  642|     47|      io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData);  // cbSize
  643|    469|  } else {
  644|      1|    io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  645|      1|  }
  646|    520|}
_ZNK5Exiv29RiffVideo14readStreamDataEm:
  648|     17|void RiffVideo::readStreamData(uint64_t size_) const {
  649|     17|  io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  650|     17|}
_ZNK5Exiv29RiffVideo10StreamNameEm:
  652|      2|void RiffVideo::StreamName(uint64_t size_) const {
  653|       |  // This element contains a name for the stream. That stream name should only use plain ASCII, especially not UTF-8.
  654|      2|  io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  655|      2|}
_ZN5Exiv29RiffVideo17readInfoListChunkEm:
  657|    302|void RiffVideo::readInfoListChunk(uint64_t size_) {
  658|    302|  uint64_t current_size = DWORD;
  659|       |
  660|       |  // Add the elements to a temporary table first, so that we can check
  661|       |  // for duplicates before adding them to xmpData_.
  662|    302|  std::map<std::string, std::string> table;
  663|    735|  while (current_size < size_) {
  ------------------
  |  Branch (663:10): [True: 433, False: 302]
  ------------------
  664|    433|    std::string type = readStringTag(io_);
  665|    433|    size_t size = readDWORDTag(io_);
  666|    433|    std::string content = readStringTag(io_, size);
  667|    433|    if (auto it = Internal::infoTags.find(type); it != Internal::infoTags.end()) {
  ------------------
  |  Branch (667:50): [True: 12, False: 421]
  ------------------
  668|       |      // Check that it isn't a duplicate.
  669|     12|      Internal::enforce(table.find(it->second) == table.end(), ErrorCode::kerCorruptedMetadata);
  670|     12|      table[it->second] = content;
  671|     12|    }
  672|    433|    current_size += DWORD * 2;
  673|    433|    current_size += size;
  674|    433|  }
  675|       |  // Copy the elements from the temporary table to xmpData_.
  676|    302|  for (const auto& it : table) {
  ------------------
  |  Branch (676:23): [True: 5, False: 302]
  ------------------
  677|      5|    xmpData_[it.first] = it.second;
  678|      5|  }
  679|    302|}
_ZNK5Exiv29RiffVideo12readMoviListEm:
  681|      2|void RiffVideo::readMoviList(uint64_t size_) const {
  682|      2|  io_->seekOrThrow(io_->tell() + size_ - DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  683|      2|}
_ZNK5Exiv29RiffVideo13readVPRPChunkEm:
  685|     10|void RiffVideo::readVPRPChunk(uint64_t size_) const {
  686|       |#ifdef EXIV2_DEBUG_MESSAGES
  687|       |  EXV_INFO << "--> VideoFormatToken         = " << readDWORDTag(io_) << '\n';
  688|       |  EXV_INFO << "--> VideoStandard            = " << readDWORDTag(io_) << '\n';
  689|       |  EXV_INFO << "--> VerticalRefreshRate      = " << readDWORDTag(io_) << '\n';
  690|       |  EXV_INFO << "--> HTotalInT                = " << readDWORDTag(io_) << '\n';
  691|       |  EXV_INFO << "--> VTotalInLines            = " << readDWORDTag(io_) << '\n';
  692|       |  EXV_INFO << "--> FrameAspectRatio Height  = " << readWORDTag(io_) << '\n';
  693|       |  EXV_INFO << "--> FrameAspectRatio Width   = " << readWORDTag(io_) << '\n';
  694|       |  EXV_INFO << "--> FrameWidthInPixels       = " << readDWORDTag(io_) << '\n';
  695|       |  EXV_INFO << "--> FrameHeightInLines       = " << readDWORDTag(io_) << '\n';
  696|       |  EXV_INFO << "--> CompressedBMHeight       = " << readDWORDTag(io_) << '\n';
  697|       |  EXV_INFO << "--> FieldPerFrame            = " << readDWORDTag(io_) << '\n';
  698|       |  EXV_INFO << "--> CompressedBMWidth        = " << readDWORDTag(io_) << '\n';
  699|       |  EXV_INFO << "--> ValidBMHeight            = " << readDWORDTag(io_) << '\n';
  700|       |  EXV_INFO << "--> ValidBMWidth             = " << readDWORDTag(io_) << '\n';
  701|       |  EXV_INFO << "--> ValidBMXOffset           = " << readDWORDTag(io_) << '\n';
  702|       |  EXV_INFO << "--> ValidBMYOffset           = " << readDWORDTag(io_) << '\n';
  703|       |  EXV_INFO << "--> VideoXOffsetInT          = " << readDWORDTag(io_) << '\n';
  704|       |  EXV_INFO << "--> VideoYValidStartLine     = " << readDWORDTag(io_) << '\n';
  705|       |  if (LogMsg::info >= LogMsg::level() && LogMsg::handler())
  706|       |    io_->seekOrThrow(io_->tell() - DWORD * 17, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  707|       |#endif
  708|     10|  io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  709|     10|}
_ZNK5Exiv29RiffVideo14readIndexChunkEm:
  711|     46|void RiffVideo::readIndexChunk(uint64_t size_) const {
  712|       |#ifdef EXIV2_DEBUG_MESSAGES
  713|       |  uint64_t current_size = 0;
  714|       |  while (current_size < size_) {
  715|       |    EXV_DEBUG << "--> Identifier               = " << readStringTag(io_) << "\t(" << current_size << "/" << size_ << ")"
  716|       |              << '\n';
  717|       |    EXV_DEBUG << "--> Flags                    = " << readDWORDTag(io_) << "\t(" << current_size << "/" << size_ << ")"
  718|       |              << '\n';
  719|       |    EXV_DEBUG << "--> Offset                   = " << readDWORDTag(io_) << "\t(" << current_size << "/" << size_ << ")"
  720|       |              << '\n';
  721|       |    EXV_DEBUG << "--> Length                   = " << readDWORDTag(io_) << "\t(" << current_size << "/" << size_ << ")"
  722|       |              << '\n';
  723|       |    current_size += DWORD * 4;
  724|       |  }
  725|       |  if (LogMsg::debug >= LogMsg::level() && LogMsg::handler())
  726|       |    io_->seekOrThrow(io_->tell() - size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  727|       |#endif
  728|     46|  io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  729|     46|}
_ZNK5Exiv29RiffVideo13readDataChunkEm:
  731|     42|void RiffVideo::readDataChunk(uint64_t size_) const {
  732|       |#ifdef EXIV2_DEBUG_MESSAGES
  733|       |  EXV_INFO << "--> Data               = " << readStringTag(io_, static_cast<size_t>(size_)) << '\n';
  734|       |  uint64_t readed_size = size_;
  735|       |  if (size_ % 2 != 0) {
  736|       |    EXV_INFO << "--> pad byte          = " << readStringTag(io_, 1) << '\n';
  737|       |    readed_size += 1;
  738|       |  }
  739|       |  if (LogMsg::info >= LogMsg::level() && LogMsg::handler())
  740|       |    io_->seekOrThrow(io_->tell() - readed_size, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  741|       |#endif
  742|     42|  io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  743|     42|  if (size_ % 2 != 0)
  ------------------
  |  Branch (743:7): [True: 36, False: 6]
  ------------------
  744|     36|    io_->seekOrThrow(io_->tell() + 1, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  745|     42|}
_ZNK5Exiv29RiffVideo8readJunkEm:
  747|      9|void RiffVideo::readJunk(uint64_t size_) const {
  748|      9|  io_->seekOrThrow(io_->tell() + size_, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
  749|      9|}
_ZN5Exiv29RiffVideo13getStreamTypeEj:
  751|    655|std::string RiffVideo::getStreamType(uint32_t stream) {
  752|    655|  if (stream == 1)
  ------------------
  |  Branch (752:7): [True: 46, False: 609]
  ------------------
  753|     46|    return "Mono";
  754|    609|  if (stream == 2)
  ------------------
  |  Branch (754:7): [True: 8, False: 601]
  ------------------
  755|      8|    return "Stereo";
  756|    601|  if (stream == 5)
  ------------------
  |  Branch (756:7): [True: 112, False: 489]
  ------------------
  757|    112|    return "5.1 Surround Sound";
  758|    489|  if (stream == 7)
  ------------------
  |  Branch (758:7): [True: 7, False: 482]
  ------------------
  759|      7|    return "7.1 Surround Sound";
  760|    482|  return "Mono";
  761|    489|}
_ZN5Exiv29RiffVideo12fillDurationEdm:
  763|    180|void RiffVideo::fillDuration(double frame_rate, size_t frame_count) {
  764|    180|  if (frame_rate == 0)
  ------------------
  |  Branch (764:7): [True: 0, False: 180]
  ------------------
  765|      0|    return;
  766|       |
  767|    180|  auto duration = static_cast<uint64_t>(frame_count * 1000. / frame_rate);
  768|    180|  xmpData_["Xmp.video.FileDataRate"] = io_->size() / (1048576. * duration);
  769|    180|  xmpData_["Xmp.video.Duration"] = duration;  // Duration in number of seconds
  770|    180|}  // RiffVideo::fillDuration
_ZN5Exiv215newRiffInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  772|    280|Image::UniquePtr newRiffInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  773|    280|  auto image = std::make_unique<RiffVideo>(std::move(io), params);
  774|    280|  if (!image->good()) {
  ------------------
  |  Branch (774:7): [True: 0, False: 280]
  ------------------
  775|      0|    return nullptr;
  776|      0|  }
  777|    280|  return image;
  778|    280|}
_ZN5Exiv210isRiffTypeERNS_7BasicIoEb:
  780|  7.57k|bool isRiffType(BasicIo& iIo, bool advance) {
  781|  7.57k|  constexpr int len = 4;
  782|  7.57k|  const std::array<byte, len> RiffVideoId{'R', 'I', 'F', 'F'};
  783|  7.57k|  std::array<byte, len> buf;
  784|  7.57k|  iIo.read(buf.data(), len);
  785|  7.57k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (785:7): [True: 0, False: 7.57k]
  |  Branch (785:22): [True: 147, False: 7.43k]
  ------------------
  786|    147|    return false;
  787|    147|  }
  788|  7.43k|  bool matched = buf == RiffVideoId;
  789|  7.43k|  if (!advance || !matched) {
  ------------------
  |  Branch (789:7): [True: 7.43k, False: 0]
  |  Branch (789:19): [True: 0, False: 0]
  ------------------
  790|  7.43k|    iIo.seek(-1 * len, BasicIo::cur);
  791|  7.43k|  }
  792|  7.43k|  return matched;
  793|  7.57k|}

_ZN5Exiv28Rw2ImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   30|  2.27k|    Image(ImageType::rw2, mdExif | mdIptc | mdXmp, std::move(io), params) {
   31|  2.27k|}  // Rw2Image::Rw2Image
_ZNK5Exiv28Rw2Image8mimeTypeEv:
   33|  6.70k|std::string Rw2Image::mimeType() const {
   34|  6.70k|  return "image/x-panasonic-rw2";
   35|  6.70k|}
_ZNK5Exiv28Rw2Image10pixelWidthEv:
   37|    297|uint32_t Rw2Image::pixelWidth() const {
   38|    297|  auto imageWidth = exifData_.findKey(Exiv2::ExifKey("Exif.PanasonicRaw.SensorWidth"));
   39|    297|  if (imageWidth == exifData_.end() || imageWidth->count() == 0)
  ------------------
  |  Branch (39:7): [True: 239, False: 58]
  |  Branch (39:7): [True: 291, False: 6]
  |  Branch (39:40): [True: 52, False: 6]
  ------------------
   40|    291|    return 0;
   41|      6|  return imageWidth->toUint32();
   42|    297|}
_ZNK5Exiv28Rw2Image11pixelHeightEv:
   44|    297|uint32_t Rw2Image::pixelHeight() const {
   45|    297|  auto imageHeight = exifData_.findKey(Exiv2::ExifKey("Exif.PanasonicRaw.SensorHeight"));
   46|    297|  if (imageHeight == exifData_.end() || imageHeight->count() == 0)
  ------------------
  |  Branch (46:7): [True: 267, False: 30]
  |  Branch (46:7): [True: 293, False: 4]
  |  Branch (46:41): [True: 26, False: 4]
  ------------------
   47|    293|    return 0;
   48|      4|  return imageHeight->toUint32();
   49|    297|}
_ZN5Exiv28Rw2Image14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
   66|  3.30k|void Rw2Image::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
   67|  3.30k|  out << "RW2 IMAGE" << '\n';
   68|  3.30k|  if (io_->open() != 0)
  ------------------
  |  Branch (68:7): [True: 0, False: 3.30k]
  ------------------
   69|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   70|       |  // Ensure that this is the correct image type
   71|  3.30k|  if (imageType() == ImageType::none && !isRw2Type(*io_, false)) {
  ------------------
  |  Branch (71:7): [True: 0, False: 3.30k]
  |  Branch (71:41): [True: 0, False: 0]
  ------------------
   72|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (72:9): [True: 0, False: 0]
  |  Branch (72:25): [True: 0, False: 0]
  ------------------
   73|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   74|      0|    throw Error(ErrorCode::kerNotAJpeg);
   75|      0|  }
   76|       |
   77|  3.30k|  io_->seek(0, BasicIo::beg);
   78|       |
   79|  3.30k|  printTiffStructure(io(), out, option, depth);
   80|  3.30k|}  // Rw2Image::printStructure
_ZN5Exiv28Rw2Image12readMetadataEv:
   82|  2.27k|void Rw2Image::readMetadata() {
   83|       |#ifdef EXIV2_DEBUG_MESSAGES
   84|       |  std::cerr << "Reading RW2 file " << io_->path() << "\n";
   85|       |#endif
   86|  2.27k|  if (io_->open() != 0) {
  ------------------
  |  Branch (86:7): [True: 0, False: 2.27k]
  ------------------
   87|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   88|      0|  }
   89|  2.27k|  IoCloser closer(*io_);
   90|       |  // Ensure that this is the correct image type
   91|  2.27k|  if (!isRw2Type(*io_, false)) {
  ------------------
  |  Branch (91:7): [True: 0, False: 2.27k]
  ------------------
   92|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (92:9): [True: 0, False: 0]
  |  Branch (92:25): [True: 0, False: 0]
  ------------------
   93|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   94|      0|    throw Error(ErrorCode::kerNotAnImage, "RW2");
   95|      0|  }
   96|  2.27k|  clearMetadata();
   97|  2.27k|  const DecodeParams dp(max_recursion_depth_);
   98|  2.27k|  ByteOrder bo = Rw2Parser::decode(exifData_, iptcData_, xmpData_, io_->mmap(), io_->size(), dp);
   99|  2.27k|  setByteOrder(bo);
  100|       |
  101|       |  // A lot more metadata is hidden in the embedded preview image
  102|       |  // Todo: This should go into the Rw2Parser, but for that it needs the Image
  103|  2.27k|  PreviewManager loader(*this);
  104|  2.27k|  PreviewPropertiesList list = loader.getPreviewProperties();
  105|       |  // Todo: What if there are more preview images?
  106|  2.27k|  if (list.size() > 1) {
  ------------------
  |  Branch (106:7): [True: 722, False: 1.55k]
  ------------------
  107|    722|#ifndef SUPPRESS_WARNINGS
  108|    722|    EXV_WARNING << "RW2 image contains more than one preview. None used.\n";
  ------------------
  |  |  138|    722|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 722]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    722|  LogMsg(LogMsg::warn).os()
  ------------------
  109|    722|#endif
  110|    722|  }
  111|  2.27k|  if (list.size() != 1)
  ------------------
  |  Branch (111:7): [True: 1.72k, False: 554]
  ------------------
  112|  1.72k|    return;
  113|    554|  ExifData exifData;
  114|    554|  PreviewImage preview = loader.getPreviewImage(*list.begin());
  115|    554|  auto image = ImageFactory::open(preview.pData(), preview.size());
  116|    554|  if (!image) {
  ------------------
  |  Branch (116:7): [True: 0, False: 554]
  ------------------
  117|      0|#ifndef SUPPRESS_WARNINGS
  118|      0|    EXV_WARNING << "Failed to open RW2 preview image.\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  119|      0|#endif
  120|      0|    return;
  121|      0|  }
  122|    554|  image->readMetadata();
  123|    554|  ExifData& prevData = image->exifData();
  124|    554|  if (!prevData.empty()) {
  ------------------
  |  Branch (124:7): [True: 448, False: 106]
  ------------------
  125|       |    // Filter duplicate tags
  126|  53.6k|    for (const auto& pos : exifData_) {
  ------------------
  |  Branch (126:26): [True: 53.6k, False: 448]
  ------------------
  127|  53.6k|      if (pos.ifdId() == IfdId::panaRawId)
  ------------------
  |  Branch (127:11): [True: 13.8k, False: 39.7k]
  ------------------
  128|  13.8k|        continue;
  129|  39.7k|      auto dup = prevData.findKey(ExifKey(pos.key()));
  130|  39.7k|      if (dup != prevData.end()) {
  ------------------
  |  Branch (130:11): [True: 5.97k, False: 33.7k]
  ------------------
  131|       |#ifdef EXIV2_DEBUG_MESSAGES
  132|       |        std::cerr << "Filtering duplicate tag " << pos.key() << " (values '" << pos.value() << "' and '" << dup->value()
  133|       |                  << "')\n";
  134|       |#endif
  135|  5.97k|        prevData.erase(dup);
  136|  5.97k|      }
  137|  39.7k|    }
  138|    448|  }
  139|       |  // Remove tags not applicable for raw images
  140|    554|  static constexpr auto filteredTags = std::array{
  141|    554|      "Exif.Photo.ComponentsConfiguration",
  142|    554|      "Exif.Photo.CompressedBitsPerPixel",
  143|    554|      "Exif.Panasonic.ColorEffect",
  144|    554|      "Exif.Panasonic.Contrast",
  145|    554|      "Exif.Panasonic.NoiseReduction",
  146|    554|      "Exif.Panasonic.ColorMode",
  147|    554|      "Exif.Panasonic.OpticalZoomMode",
  148|    554|      "Exif.Panasonic.Contrast",
  149|    554|      "Exif.Panasonic.Saturation",
  150|    554|      "Exif.Panasonic.Sharpness",
  151|    554|      "Exif.Panasonic.FilmMode",
  152|    554|      "Exif.Panasonic.SceneMode",
  153|    554|      "Exif.Panasonic.WBRedLevel",
  154|    554|      "Exif.Panasonic.WBGreenLevel",
  155|    554|      "Exif.Panasonic.WBBlueLevel",
  156|    554|      "Exif.Photo.ColorSpace",
  157|    554|      "Exif.Photo.PixelXDimension",
  158|    554|      "Exif.Photo.PixelYDimension",
  159|    554|      "Exif.Photo.SceneType",
  160|    554|      "Exif.Photo.CustomRendered",
  161|    554|      "Exif.Photo.DigitalZoomRatio",
  162|    554|      "Exif.Photo.SceneCaptureType",
  163|    554|      "Exif.Photo.GainControl",
  164|    554|      "Exif.Photo.Contrast",
  165|    554|      "Exif.Photo.Saturation",
  166|    554|      "Exif.Photo.Sharpness",
  167|    554|      "Exif.Image.PrintImageMatching",
  168|    554|      "Exif.Image.YCbCrPositioning",
  169|    554|  };
  170|  13.5k|  for (auto&& filteredTag : filteredTags) {
  ------------------
  |  Branch (170:27): [True: 13.5k, False: 554]
  ------------------
  171|  13.5k|    auto pos = prevData.findKey(ExifKey(filteredTag));
  172|  13.5k|    if (pos != prevData.end()) {
  ------------------
  |  Branch (172:9): [True: 10, False: 13.5k]
  ------------------
  173|       |#ifdef EXIV2_DEBUG_MESSAGES
  174|       |      std::cerr << "Exif tag " << pos->key() << " removed\n";
  175|       |#endif
  176|     10|      prevData.erase(pos);
  177|     10|    }
  178|  13.5k|  }
  179|       |
  180|       |  // Add the remaining tags
  181|  85.6k|  for (const auto& pos : prevData) {
  ------------------
  |  Branch (181:24): [True: 85.6k, False: 554]
  ------------------
  182|  85.6k|    exifData_.add(pos);
  183|  85.6k|  }
  184|       |
  185|    554|}  // Rw2Image::readMetadata
_ZN5Exiv29Rw2Parser6decodeERNS_8ExifDataERNS_8IptcDataERNS_7XmpDataEPKhmRKNS_12DecodeParamsE:
  193|  2.27k|                            const DecodeParams& dp) {
  194|  2.27k|  Rw2Header rw2Header;
  195|  2.27k|  return TiffParserWorker::decode(exifData, iptcData, xmpData, pData, size, Tag::pana, TiffMapping::findDecoder, dp,
  196|  2.27k|                                  &rw2Header);
  197|  2.27k|}
_ZN5Exiv214newRw2InstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  201|  2.27k|Image::UniquePtr newRw2Instance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  202|  2.27k|  auto image = std::make_unique<Rw2Image>(std::move(io), params);
  203|  2.27k|  if (!image->good()) {
  ------------------
  |  Branch (203:7): [True: 0, False: 2.27k]
  ------------------
  204|      0|    return nullptr;
  205|      0|  }
  206|  2.27k|  return image;
  207|  2.27k|}
_ZN5Exiv29isRw2TypeERNS_7BasicIoEb:
  209|  20.5k|bool isRw2Type(BasicIo& iIo, bool advance) {
  210|  20.5k|  const int32_t len = 24;
  211|  20.5k|  byte buf[len];
  212|  20.5k|  iIo.read(buf, len);
  213|  20.5k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (213:7): [True: 0, False: 20.5k]
  |  Branch (213:22): [True: 132, False: 20.4k]
  ------------------
  214|    132|    return false;
  215|    132|  }
  216|  20.4k|  Rw2Header header;
  217|  20.4k|  bool rc = header.read(buf, len);
  218|  20.4k|  if (!advance || !rc) {
  ------------------
  |  Branch (218:7): [True: 20.4k, False: 0]
  |  Branch (218:19): [True: 0, False: 0]
  ------------------
  219|  20.4k|    iIo.seek(-len, BasicIo::cur);
  220|  20.4k|  }
  221|  20.4k|  return rc;
  222|  20.5k|}

_ZN5Exiv28Internal9Rw2HeaderC2Ev:
    6|  22.6k|Rw2Header::Rw2Header() : TiffHeaderBase(0x0055, 24, littleEndian, 0x00000018) {
    7|  22.6k|}

_ZN4Safe3addIjEET_S1_S1_:
  137|  6.73k|T add(T summand_1, T summand_2) {
  138|  6.73k|  T res = 0;
  139|  6.73k|  if (Internal::builtin_add_overflow(summand_1, summand_2, res)) {
  ------------------
  |  Branch (139:7): [True: 17, False: 6.71k]
  ------------------
  140|     17|    throw std::overflow_error("Overflow in addition");
  141|     17|  }
  142|  6.71k|  return res;
  143|  6.73k|}
_ZN4Safe8Internal20builtin_add_overflowIjEEbT_S2_RS2_:
   96|  6.73k|bool builtin_add_overflow(T summand_1, T summand_2, T& result) {
   97|  6.73k|#if (defined(__GNUC__) || defined(__clang__)) && (__GNUC__ >= 5 || __clang_major__ >= 3)
   98|       |  if constexpr (std::is_same_v<T, int>)
   99|       |    return __builtin_sadd_overflow(summand_1, summand_2, &result);
  100|       |  else if constexpr (std::is_same_v<T, long>)
  101|       |    return __builtin_saddl_overflow(summand_1, summand_2, &result);
  102|       |  else if constexpr (std::is_same_v<T, long long>)
  103|       |    return __builtin_saddll_overflow(summand_1, summand_2, &result);
  104|       |  else if constexpr (std::is_same_v<T, unsigned int>)
  105|  6.73k|    return __builtin_uadd_overflow(summand_1, summand_2, &result);
  106|       |  else if constexpr (std::is_same_v<T, unsigned long>)
  107|       |    return __builtin_uaddl_overflow(summand_1, summand_2, &result);
  108|       |  else if constexpr (std::is_same_v<T, unsigned long long>)
  109|       |    return __builtin_uaddll_overflow(summand_1, summand_2, &result);
  110|       |  else
  111|       |#endif
  112|       |    return fallback_add_overflow(summand_1, summand_2, result);
  113|  6.73k|}
_ZN4Safe3addImEET_S1_S1_:
  137|  2.86M|T add(T summand_1, T summand_2) {
  138|  2.86M|  T res = 0;
  139|  2.86M|  if (Internal::builtin_add_overflow(summand_1, summand_2, res)) {
  ------------------
  |  Branch (139:7): [True: 2, False: 2.86M]
  ------------------
  140|      2|    throw std::overflow_error("Overflow in addition");
  141|      2|  }
  142|  2.86M|  return res;
  143|  2.86M|}
_ZN4Safe8Internal20builtin_add_overflowImEEbT_S2_RS2_:
   96|  2.86M|bool builtin_add_overflow(T summand_1, T summand_2, T& result) {
   97|  2.86M|#if (defined(__GNUC__) || defined(__clang__)) && (__GNUC__ >= 5 || __clang_major__ >= 3)
   98|       |  if constexpr (std::is_same_v<T, int>)
   99|       |    return __builtin_sadd_overflow(summand_1, summand_2, &result);
  100|       |  else if constexpr (std::is_same_v<T, long>)
  101|       |    return __builtin_saddl_overflow(summand_1, summand_2, &result);
  102|       |  else if constexpr (std::is_same_v<T, long long>)
  103|       |    return __builtin_saddll_overflow(summand_1, summand_2, &result);
  104|       |  else if constexpr (std::is_same_v<T, unsigned int>)
  105|       |    return __builtin_uadd_overflow(summand_1, summand_2, &result);
  106|       |  else if constexpr (std::is_same_v<T, unsigned long>)
  107|  2.86M|    return __builtin_uaddl_overflow(summand_1, summand_2, &result);
  108|       |  else if constexpr (std::is_same_v<T, unsigned long long>)
  109|       |    return __builtin_uaddll_overflow(summand_1, summand_2, &result);
  110|       |  else
  111|       |#endif
  112|       |    return fallback_add_overflow(summand_1, summand_2, result);
  113|  2.86M|}
_ZN4Safe3addIlEET_S1_S1_:
  137|  30.9k|T add(T summand_1, T summand_2) {
  138|  30.9k|  T res = 0;
  139|  30.9k|  if (Internal::builtin_add_overflow(summand_1, summand_2, res)) {
  ------------------
  |  Branch (139:7): [True: 2, False: 30.9k]
  ------------------
  140|      2|    throw std::overflow_error("Overflow in addition");
  141|      2|  }
  142|  30.9k|  return res;
  143|  30.9k|}
_ZN4Safe8Internal20builtin_add_overflowIlEEbT_S2_RS2_:
   96|  30.9k|bool builtin_add_overflow(T summand_1, T summand_2, T& result) {
   97|  30.9k|#if (defined(__GNUC__) || defined(__clang__)) && (__GNUC__ >= 5 || __clang_major__ >= 3)
   98|       |  if constexpr (std::is_same_v<T, int>)
   99|       |    return __builtin_sadd_overflow(summand_1, summand_2, &result);
  100|       |  else if constexpr (std::is_same_v<T, long>)
  101|  30.9k|    return __builtin_saddl_overflow(summand_1, summand_2, &result);
  102|       |  else if constexpr (std::is_same_v<T, long long>)
  103|       |    return __builtin_saddll_overflow(summand_1, summand_2, &result);
  104|       |  else if constexpr (std::is_same_v<T, unsigned int>)
  105|       |    return __builtin_uadd_overflow(summand_1, summand_2, &result);
  106|       |  else if constexpr (std::is_same_v<T, unsigned long>)
  107|       |    return __builtin_uaddl_overflow(summand_1, summand_2, &result);
  108|       |  else if constexpr (std::is_same_v<T, unsigned long long>)
  109|       |    return __builtin_uaddll_overflow(summand_1, summand_2, &result);
  110|       |  else
  111|       |#endif
  112|       |    return fallback_add_overflow(summand_1, summand_2, result);
  113|  30.9k|}

samsungmn_int.cpp:_ZN5Exiv28InternalL22printCameraTemperatureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
   53|      6|static std::ostream& printCameraTemperature(std::ostream& os, const Value& value, const ExifData*) {
   54|      6|  if (value.count() != 1 || value.typeId() != signedRational) {
  ------------------
  |  Branch (54:7): [True: 2, False: 4]
  |  Branch (54:29): [True: 4, False: 0]
  ------------------
   55|      6|    return os << value;
   56|      6|  }
   57|      0|  return os << value.toFloat() << " C";
   58|      6|}
samsungmn_int.cpp:_ZN5Exiv28InternalL18printFocalLength35ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
   61|     30|static std::ostream& printFocalLength35(std::ostream& os, const Value& value, const ExifData*) {
   62|     30|  if (value.count() != 1 || value.typeId() != unsignedLong) {
  ------------------
  |  Branch (62:7): [True: 2, False: 28]
  |  Branch (62:29): [True: 14, False: 14]
  ------------------
   63|     16|    return os << value;
   64|     16|  }
   65|     14|  auto length = value.toInt64();
   66|     14|  if (length == 0) {
  ------------------
  |  Branch (66:7): [True: 6, False: 8]
  ------------------
   67|      6|    return os << _("Unknown");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
   68|      6|  }
   69|      8|  return os << stringFormat("{:.1f} mm", length / 10.0);
  ------------------
  |  |   18|      8|#define stringFormat std::format
  ------------------
   70|     14|}
samsungmn_int.cpp:_ZN5Exiv28InternalL12printPwColorERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  147|     58|static std::ostream& printPwColor(std::ostream& os, const Value& value, const ExifData*) {
  148|     58|  if (value.count() != 1 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (148:7): [True: 0, False: 58]
  |  Branch (148:29): [True: 0, False: 58]
  ------------------
  149|      0|    return os << value;
  150|      0|  }
  151|       |  // Special case where no color modification is done
  152|     58|  if (value.toInt64() == 65535) {
  ------------------
  |  Branch (152:7): [True: 6, False: 52]
  ------------------
  153|      6|    return os << _("Neutral");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  154|      6|  }
  155|       |  // Output seems to represent Hue in degrees
  156|     52|  return os << value.toInt64();
  157|     58|}
samsungmn_int.cpp:_ZN5Exiv28InternalL16printValueMinus4ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  160|    174|static std::ostream& printValueMinus4(std::ostream& os, const Value& value, const ExifData*) {
  161|    174|  if (value.count() != 1 || value.typeId() != unsignedShort) {
  ------------------
  |  Branch (161:7): [True: 0, False: 174]
  |  Branch (161:29): [True: 0, False: 174]
  ------------------
  162|      0|    return os << value;
  163|      0|  }
  164|    174|  return os << value.toInt64(0) - 4;
  165|    174|}

_ZN5Exiv28Internal17Samsung2MakerNote7tagListEv:
   19|  52.3k|  static constexpr auto tagList() {
   20|  52.3k|    return tagInfo_;
   21|  52.3k|  }
_ZN5Exiv28Internal17Samsung2MakerNote9tagListPwEv:
   23|  70.7k|  static constexpr auto tagListPw() {
   24|  70.7k|    return tagInfoPw_;
   25|  70.7k|  }

_ZN5Exiv28Internal14SigmaMakerNote15printStripLabelERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
   71|    328|std::ostream& SigmaMakerNote::printStripLabel(std::ostream& os, const Value& value, const ExifData*) {
   72|    328|  std::string v = value.toString();
   73|    328|  if (auto pos = v.find(':'); pos != std::string::npos) {
  ------------------
  |  Branch (73:31): [True: 164, False: 164]
  ------------------
   74|    164|    if (v.at(pos + 1) == ' ')
  ------------------
  |  Branch (74:9): [True: 56, False: 108]
  ------------------
   75|     56|      ++pos;
   76|    164|    v = v.substr(pos + 1);
   77|    164|  }
   78|    328|  return os << v;
   79|    328|}
_ZN5Exiv28Internal14SigmaMakerNote11print0x0008ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
   81|    500|std::ostream& SigmaMakerNote::print0x0008(std::ostream& os, const Value& value, const ExifData*) {
   82|    500|  std::string v = value.toString();
   83|    500|  if (v.empty()) {
  ------------------
  |  Branch (83:7): [True: 122, False: 378]
  ------------------
   84|    122|    return os;
   85|    122|  }
   86|    378|  switch (v.front()) {
   87|     76|    case 'P':
  ------------------
  |  Branch (87:5): [True: 76, False: 302]
  ------------------
   88|     76|      return os << _("Program");
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
   89|     34|    case 'A':
  ------------------
  |  Branch (89:5): [True: 34, False: 344]
  ------------------
   90|     34|      return os << _("Aperture priority");
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
   91|     28|    case 'S':
  ------------------
  |  Branch (91:5): [True: 28, False: 350]
  ------------------
   92|     28|      return os << _("Shutter priority");
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
   93|     16|    case 'M':
  ------------------
  |  Branch (93:5): [True: 16, False: 362]
  ------------------
   94|     16|      return os << _("Manual");
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
   95|    224|    default:
  ------------------
  |  Branch (95:5): [True: 224, False: 154]
  ------------------
   96|    224|      return os << "(" << value << ")";
   97|    378|  }
   98|    378|}
_ZN5Exiv28Internal14SigmaMakerNote11print0x0009ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  100|    432|std::ostream& SigmaMakerNote::print0x0009(std::ostream& os, const Value& value, const ExifData*) {
  101|    432|  std::string v = value.toString();
  102|    432|  if (v.empty()) {
  ------------------
  |  Branch (102:7): [True: 82, False: 350]
  ------------------
  103|     82|    return os;
  104|     82|  }
  105|    350|  switch (v.front()) {
  106|     70|    case 'A':
  ------------------
  |  Branch (106:5): [True: 70, False: 280]
  ------------------
  107|     70|      return os << _("Average");
  ------------------
  |  |   40|     70|#define _(String) (String)
  ------------------
  108|     74|    case 'C':
  ------------------
  |  Branch (108:5): [True: 74, False: 276]
  ------------------
  109|     74|      return os << _("Center");
  ------------------
  |  |   40|     74|#define _(String) (String)
  ------------------
  110|     36|    case '8':
  ------------------
  |  Branch (110:5): [True: 36, False: 314]
  ------------------
  111|     36|      return os << _("8-Segment");
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  112|    170|    default:
  ------------------
  |  Branch (112:5): [True: 170, False: 180]
  ------------------
  113|    170|      return os << "(" << value << ")";
  114|    350|  }
  115|    350|}

_ZN5Exiv28Internal14SigmaMakerNote7tagListEv:
   25|  28.8k|  static constexpr auto tagList() {
   26|  28.8k|    return tagInfo_;
   27|  28.8k|  }

_ZN5Exiv28Internal13SonyMakerNote25printWhiteBalanceFineTuneERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  921|    112|std::ostream& SonyMakerNote::printWhiteBalanceFineTune(std::ostream& os, const Value& value, const ExifData*) {
  922|    112|  if (value.count() != 1 || value.typeId() != unsignedLong)
  ------------------
  |  Branch (922:7): [True: 48, False: 64]
  |  Branch (922:29): [True: 58, False: 6]
  ------------------
  923|    106|    return os << "(" << value << ")";
  924|       |
  925|       |  // Sony writes the tag as an unsignedLong but treat it as a signedLong. Source:
  926|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L681
  927|      6|  return os << static_cast<int32_t>(value.toUint32(0));
  928|    112|}
_ZN5Exiv28Internal13SonyMakerNote19printMultiBurstModeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  930|    688|std::ostream& SonyMakerNote::printMultiBurstMode(std::ostream& os, const Value& value, const ExifData* metadata) {
  931|    688|  if (value.count() != 1 || value.typeId() != undefined)
  ------------------
  |  Branch (931:7): [True: 588, False: 100]
  |  Branch (931:29): [True: 100, False: 0]
  ------------------
  932|    688|    return os << "(" << value << ")";
  933|       |
  934|       |  // Some cameras do not set the type to undefined. Source:
  935|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L763
  936|       |
  937|      0|  return printMinoltaSonyBoolValue(os, value, metadata);
  938|    688|}
_ZN5Exiv28Internal13SonyMakerNote19printMultiBurstSizeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  940|    194|std::ostream& SonyMakerNote::printMultiBurstSize(std::ostream& os, const Value& value, const ExifData*) {
  941|    194|  if (value.count() != 1 || value.typeId() != unsignedShort)
  ------------------
  |  Branch (941:7): [True: 122, False: 72]
  |  Branch (941:29): [True: 66, False: 6]
  ------------------
  942|    188|    return os << "(" << value << ")";
  943|       |
  944|       |  // Some cameras do not set the type to unsignedShort. Source:
  945|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L771
  946|       |
  947|      6|  return os << value.toUint32(0);
  948|    194|}
_ZN5Exiv28Internal13SonyMakerNote15printAutoHDRStdERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  950|    426|std::ostream& SonyMakerNote::printAutoHDRStd(std::ostream& os, const Value& value, const ExifData* metadata) {
  951|    426|  if (value.count() != 1 || value.typeId() != unsignedLong)
  ------------------
  |  Branch (951:7): [True: 36, False: 390]
  |  Branch (951:29): [True: 72, False: 318]
  ------------------
  952|    108|    return os << "(" << value << ")";
  953|       |
  954|       |  // Sony writes the tag as an unsignedLong but treat it as 2 unsignedShort values. Source:
  955|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L887
  956|       |
  957|    318|  const auto v0 = value.toUint32(0);
  958|    318|  EXV_PRINT_TAG(sonyHDRStdPart1)(os, (v0 & 0x00ff), metadata);
  ------------------
  |  |  199|    318|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
  959|    318|  os << ", ";
  960|    318|  EXV_PRINT_TAG(sonyHDRStdPart2)(os, (v0 >> 16), metadata);
  ------------------
  |  |  199|    318|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
  961|       |
  962|    318|  return os;
  963|    426|}
_ZN5Exiv28Internal13SonyMakerNote16printWBShiftABGMERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  965|    340|std::ostream& SonyMakerNote::printWBShiftABGM(std::ostream& os, const Value& value, const ExifData*) {
  966|    340|  if (value.count() != 2 || value.typeId() != signedLong)
  ------------------
  |  Branch (966:7): [True: 46, False: 294]
  |  Branch (966:29): [True: 70, False: 224]
  ------------------
  967|    116|    return os << "(" << value << ")";
  968|       |
  969|       |  // Examples of Output:
  970|       |  // 1. "A/B: 0, G/M: 0"
  971|       |  // 2. "A/B: 1B, G/M: 2M"
  972|       |
  973|    224|  const auto v0 = value.toInt64(0);
  974|    224|  const auto v1 = value.toInt64(1);
  975|       |
  976|    224|  os << "A/B: ";
  977|    224|  if (v0 == 0) {
  ------------------
  |  Branch (977:7): [True: 18, False: 206]
  ------------------
  978|     18|    os << 0;
  979|    206|  } else if (v0 < 0) {
  ------------------
  |  Branch (979:14): [True: 84, False: 122]
  ------------------
  980|     84|    os << "A" << -v0;
  981|    122|  } else {
  982|    122|    os << "B" << v0;
  983|    122|  }
  984|       |
  985|    224|  os << ", G/M: ";
  986|    224|  if (v1 == 0)
  ------------------
  |  Branch (986:7): [True: 8, False: 216]
  ------------------
  987|      8|    return os << 0;
  988|       |
  989|    216|  if (v1 < 0)
  ------------------
  |  Branch (989:7): [True: 58, False: 158]
  ------------------
  990|     58|    return os << "G" << -v1;
  991|       |
  992|    158|  return os << "M" << v1;
  993|    216|}
_ZN5Exiv28Internal13SonyMakerNote15printFocusMode2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
  995|  2.22k|std::ostream& SonyMakerNote::printFocusMode2(std::ostream& os, const Value& value, const ExifData* metadata) {
  996|  2.22k|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (996:7): [True: 184, False: 2.03k]
  |  Branch (996:29): [True: 98, False: 1.93k]
  |  Branch (996:63): [True: 956, False: 982]
  ------------------
  997|  1.23k|    return os << "(" << value << ")";
  998|       |
  999|       |  // Tag only valid for certain camera models. See
 1000|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1123
 1001|    982|  std::string model;
 1002|    982|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1002:7): [True: 168, False: 814]
  ------------------
 1003|    168|    return os << "(" << value << ")";
 1004|       |
 1005|    814|  const auto v0 = value.toUint32(0);
 1006|       |
 1007|    814|  constexpr std::array models{"DSC-RX10M4", "DSC-RX100M6", "DSC-RX100M7", "DSC-RX100M5A", "DSC-HX99", "DSC-RX0M2"};
 1008|    814|  if (!model.starts_with("DSC-") ||
  ------------------
  |  Branch (1008:7): [True: 269, False: 545]
  ------------------
 1009|    545|      std::any_of(models.begin(), models.end(), [&model](auto m) { return model.starts_with(m); }))
  ------------------
  |  Branch (1009:7): [True: 343, False: 202]
  ------------------
 1010|    612|    return EXV_PRINT_TAG(sonyFocusMode2)(os, v0, metadata);
  ------------------
  |  |  199|    612|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1011|       |
 1012|    202|  return os << _("n/a");
  ------------------
  |  |   40|    202|#define _(String) (String)
  ------------------
 1013|    814|}
_ZN5Exiv28Internal13SonyMakerNote22printAFAreaModeSettingERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1015|  5.06k|std::ostream& SonyMakerNote::printAFAreaModeSetting(std::ostream& os, const Value& value, const ExifData* metadata) {
 1016|  5.06k|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (1016:7): [True: 378, False: 4.68k]
  |  Branch (1016:29): [True: 110, False: 4.57k]
  |  Branch (1016:63): [True: 920, False: 3.65k]
  ------------------
 1017|  1.40k|    return os << "(" << value << ")";
 1018|       |
 1019|       |  // Tag only valid for certain camera models. See
 1020|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1139
 1021|  3.65k|  std::string model;
 1022|  3.65k|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1022:7): [True: 120, False: 3.53k]
  ------------------
 1023|    120|    return os << "(" << value << ")";
 1024|       |
 1025|  3.53k|  const auto v0 = value.toUint32(0);
 1026|       |
 1027|  3.53k|  for (auto m : {"SLT-", "HV"})
  ------------------
  |  Branch (1027:15): [True: 6.69k, False: 3.10k]
  ------------------
 1028|  6.69k|    if (model.starts_with(m))
  ------------------
  |  Branch (1028:9): [True: 431, False: 6.25k]
  ------------------
 1029|    431|      return EXV_PRINT_TAG(sonyAFAreaModeSettingSet1)(os, v0, metadata);
  ------------------
  |  |  199|    431|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1030|       |
 1031|  3.10k|  constexpr std::array models2{
 1032|  3.10k|      "NEX-", "ILCE-", "ILME-", "DSC-RX10M4", "DSC-RX100M6", "DSC-RX100M7", "DSC-RX100M5A", "DSC-HX99", "DSC-RX0M2",
 1033|  3.10k|  };
 1034|  3.10k|  if (std::any_of(models2.begin(), models2.end(), [&model](auto m) { return model.starts_with(m); }))
  ------------------
  |  Branch (1034:7): [True: 1.08k, False: 2.02k]
  ------------------
 1035|  1.08k|    return EXV_PRINT_TAG(sonyAFAreaModeSettingSet2)(os, v0, metadata);
  ------------------
  |  |  199|  1.08k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1036|       |
 1037|  2.02k|  if (model.starts_with("ILCA-"))
  ------------------
  |  Branch (1037:7): [True: 1.40k, False: 614]
  ------------------
 1038|  1.40k|    return EXV_PRINT_TAG(sonyAFAreaModeSettingSet3)(os, v0, metadata);
  ------------------
  |  |  199|  1.40k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1039|       |
 1040|    614|  return os << _("n/a");
  ------------------
  |  |   40|    614|#define _(String) (String)
  ------------------
 1041|  2.02k|}
_ZN5Exiv28Internal13SonyMakerNote25printFlexibleSpotPositionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1043|  1.98k|std::ostream& SonyMakerNote::printFlexibleSpotPosition(std::ostream& os, const Value& value, const ExifData* metadata) {
 1044|  1.98k|  if (value.count() != 2 || value.typeId() != unsignedShort || !metadata)
  ------------------
  |  Branch (1044:7): [True: 136, False: 1.85k]
  |  Branch (1044:29): [True: 44, False: 1.80k]
  |  Branch (1044:64): [True: 904, False: 904]
  ------------------
 1045|  1.08k|    return os << "(" << value << ")";
 1046|       |
 1047|       |  // Tag only valid for certain camera models. See
 1048|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1189
 1049|    904|  std::string model;
 1050|    904|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1050:7): [True: 107, False: 797]
  ------------------
 1051|    107|    return os << "(" << value << ")";
 1052|       |
 1053|    797|  constexpr std::array models{
 1054|    797|      "NEX-", "ILCE-", "ILME-", "DSC-RX10M4", "DSC-RX100M6", "DSC-RX100M7", "DSC-RX100M5A", "DSC-HX99", "DSC-RX0M2",
 1055|    797|  };
 1056|    797|  if (std::any_of(models.begin(), models.end(), [&model](auto m) { return model.starts_with(m); }))
  ------------------
  |  Branch (1056:7): [True: 462, False: 335]
  ------------------
 1057|    462|    return os << value.toUint32(0) << ", " << value.toUint32(1);
 1058|       |
 1059|    335|  return os << _("n/a");
  ------------------
  |  |   40|    335|#define _(String) (String)
  ------------------
 1060|    797|}
_ZN5Exiv28Internal13SonyMakerNote20printAFPointSelectedERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1062|  9.96k|std::ostream& SonyMakerNote::printAFPointSelected(std::ostream& os, const Value& value, const ExifData* metadata) {
 1063|  9.96k|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (1063:7): [True: 60, False: 9.90k]
  |  Branch (1063:29): [True: 426, False: 9.47k]
  |  Branch (1063:63): [True: 4.73k, False: 4.73k]
  ------------------
 1064|  5.22k|    return os << "(" << value << ")";
 1065|       |
 1066|       |  // Tag only valid for certain camera models. See
 1067|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1203
 1068|  4.73k|  std::string model;
 1069|  4.73k|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1069:7): [True: 379, False: 4.35k]
  ------------------
 1070|    379|    return os << "(" << value << ")";
 1071|       |
 1072|  4.35k|  uint32_t aFAreaModeSetting = 0;
 1073|  4.35k|  const auto status = getAFAreaModeSetting(metadata, aFAreaModeSetting);
 1074|       |
 1075|  4.35k|  for (auto m : {"SLT-", "HV-"})
  ------------------
  |  Branch (1075:15): [True: 8.19k, False: 3.77k]
  ------------------
 1076|  8.19k|    if (model.starts_with(m))
  ------------------
  |  Branch (1076:9): [True: 580, False: 7.61k]
  ------------------
 1077|    580|      return EXV_PRINT_TAG(sonyAFPointSelectedSet1)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    580|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1078|       |
 1079|  3.77k|  for (auto m : {"ILCE-", "ILME-"})
  ------------------
  |  Branch (1079:15): [True: 7.44k, False: 3.45k]
  ------------------
 1080|  7.44k|    if (model.starts_with(m) && status && aFAreaModeSetting == 4)
  ------------------
  |  Branch (1080:9): [True: 900, False: 6.54k]
  |  Branch (1080:33): [True: 407, False: 493]
  |  Branch (1080:43): [True: 323, False: 84]
  ------------------
 1081|    323|      return EXV_PRINT_TAG(sonyAFPointSelectedSet1)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    323|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1082|       |
 1083|  3.45k|  for (auto m : {"ILCA-68", "ILCA-77M2"})
  ------------------
  |  Branch (1083:15): [True: 6.51k, False: 2.80k]
  ------------------
 1084|  6.51k|    if (model.starts_with(m) && status && aFAreaModeSetting != 8)
  ------------------
  |  Branch (1084:9): [True: 1.06k, False: 5.45k]
  |  Branch (1084:33): [True: 820, False: 246]
  |  Branch (1084:43): [True: 647, False: 173]
  ------------------
 1085|    647|      return EXV_PRINT_TAG(sonyAFPointSelectedSet2)(os, value, metadata);
  ------------------
  |  |  199|    647|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1086|       |
 1087|  2.80k|  if (model.starts_with("ILCA-99M2") && status && aFAreaModeSetting != 8)
  ------------------
  |  Branch (1087:7): [True: 560, False: 2.24k]
  |  Branch (1087:41): [True: 485, False: 75]
  |  Branch (1087:51): [True: 333, False: 152]
  ------------------
 1088|    333|    return EXV_PRINT_TAG(sonyAFPointSelectedSet3)(os, value, metadata);
  ------------------
  |  |  199|    333|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1089|       |
 1090|  2.47k|  if (model.starts_with("ILCA-") && status && aFAreaModeSetting == 8)
  ------------------
  |  Branch (1090:7): [True: 828, False: 1.64k]
  |  Branch (1090:37): [True: 466, False: 362]
  |  Branch (1090:47): [True: 325, False: 141]
  ------------------
 1091|    325|    return EXV_PRINT_TAG(sonyAFPointSelectedSet4)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    325|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1092|       |
 1093|  2.15k|  for (auto m : {"NEX-", "ILCE-", "ILME-"})
  ------------------
  |  Branch (1093:15): [True: 5.54k, False: 1.34k]
  ------------------
 1094|  5.54k|    if (model.starts_with(m))
  ------------------
  |  Branch (1094:9): [True: 805, False: 4.74k]
  ------------------
 1095|    805|      return EXV_PRINT_TAG(sonyAFPointSelectedSet5)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    805|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1096|       |
 1097|  1.34k|  return os << _("n/a");
  ------------------
  |  |   40|  1.34k|#define _(String) (String)
  ------------------
 1098|  2.15k|}
_ZN5Exiv28Internal13SonyMakerNote17printAFPointsUsedERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1100|  1.17k|std::ostream& SonyMakerNote::printAFPointsUsed(std::ostream& os, const Value& value, const ExifData* metadata) {
 1101|  1.17k|  if (value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (1101:7): [True: 70, False: 1.10k]
  |  Branch (1101:41): [True: 550, False: 550]
  ------------------
 1102|    620|    return os << "(" << value << ")";
 1103|       |
 1104|    550|  std::string model;
 1105|    550|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1105:7): [True: 81, False: 469]
  ------------------
 1106|     81|    return os << "(" << value << ")";
 1107|       |
 1108|    469|  constexpr std::array models1{"ILCA-", "DSC-"};
 1109|    469|  if (std::none_of(models1.begin(), models1.end(), [&model](auto m) { return model.starts_with(m); }))
  ------------------
  |  Branch (1109:7): [True: 206, False: 263]
  ------------------
 1110|    206|    return EXV_PRINT_TAG_BITLIST_ALL_LE(sonyAFPointsUsedSet1)(os, value, metadata);
  ------------------
  |  |  289|    206|#define EXV_PRINT_TAG_BITLIST_ALL_LE(array) printTagBitlistAllLE<std::size(array), array>
  ------------------
 1111|       |
 1112|    263|  for (auto m : {"ILCA-68", "ILCA-77M2"})
  ------------------
  |  Branch (1112:15): [True: 446, False: 104]
  ------------------
 1113|    446|    if (model.starts_with(m))
  ------------------
  |  Branch (1113:9): [True: 159, False: 287]
  ------------------
 1114|    159|      return EXV_PRINT_TAG_BITLIST_ALL_LE(sonyAFPointsUsedSet2)(os, value, metadata);
  ------------------
  |  |  289|    159|#define EXV_PRINT_TAG_BITLIST_ALL_LE(array) printTagBitlistAllLE<std::size(array), array>
  ------------------
 1115|       |
 1116|    104|  return os << _("n/a");
  ------------------
  |  |   40|    104|#define _(String) (String)
  ------------------
 1117|    263|}
_ZN5Exiv28Internal13SonyMakerNote15printAFTrackingERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1119|  2.28k|std::ostream& SonyMakerNote::printAFTracking(std::ostream& os, const Value& value, const ExifData* metadata) {
 1120|  2.28k|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (1120:7): [True: 56, False: 2.22k]
  |  Branch (1120:29): [True: 72, False: 2.15k]
  |  Branch (1120:63): [True: 1.07k, False: 1.07k]
  ------------------
 1121|  1.20k|    return os << "(" << value << ")";
 1122|       |
 1123|       |  // Tag only valid for certain camera models. See
 1124|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1353
 1125|  1.07k|  std::string model;
 1126|  1.07k|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1126:7): [True: 162, False: 914]
  ------------------
 1127|    162|    return os << "(" << value << ")";
 1128|       |
 1129|    914|  constexpr std::array models{"DSC-RX10M4", "DSC-RX100M6", "DSC-RX100M7", "DSC-RX100M5A", "DSC-HX99", "DSC-RX0M2"};
 1130|    914|  if (!model.starts_with("DSC-") ||
  ------------------
  |  Branch (1130:7): [True: 191, False: 723]
  ------------------
 1131|    723|      std::any_of(models.begin(), models.end(), [&model](auto m) { return model.starts_with(m); }))
  ------------------
  |  Branch (1131:7): [True: 437, False: 286]
  ------------------
 1132|    628|    return EXV_PRINT_TAG(sonyAFTracking)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    628|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1133|       |
 1134|    286|  return os << _("n/a");
  ------------------
  |  |   40|    286|#define _(String) (String)
  ------------------
 1135|    914|}
_ZN5Exiv28Internal13SonyMakerNote27printFocalPlaneAFPointsUsedERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1137|     90|std::ostream& SonyMakerNote::printFocalPlaneAFPointsUsed(std::ostream& os, const Value& value, const ExifData*) {
 1138|     90|  if (value.typeId() != unsignedByte)
  ------------------
  |  Branch (1138:7): [True: 28, False: 62]
  ------------------
 1139|     28|    return os << "(" << value << ")";
 1140|       |
 1141|     62|  if (value.toUint32(0) == 0)
  ------------------
  |  Branch (1141:7): [True: 6, False: 56]
  ------------------
 1142|      6|    return os << _("None");
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
 1143|       |
 1144|     56|  return os << "(" << value << ")";
 1145|     62|}
_ZN5Exiv28Internal13SonyMakerNote23printWBShiftABGMPreciseERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1147|    204|std::ostream& SonyMakerNote::printWBShiftABGMPrecise(std::ostream& os, const Value& value, const ExifData*) {
 1148|    204|  if (value.count() != 2 || value.typeId() != signedLong)
  ------------------
  |  Branch (1148:7): [True: 16, False: 188]
  |  Branch (1148:29): [True: 72, False: 116]
  ------------------
 1149|     88|    return os << "(" << value << ")";
 1150|       |
 1151|    116|  std::ios::fmtflags f(os.flags());
 1152|       |
 1153|    116|  const auto temp0 = static_cast<double>(value.toInt64(0)) / 1000.0;
 1154|    116|  const auto temp1 = static_cast<double>(value.toInt64(1)) / 1000.0;
 1155|       |
 1156|    116|  os << "A/B: ";
 1157|    116|  if (temp0 == 0) {
  ------------------
  |  Branch (1157:7): [True: 30, False: 86]
  ------------------
 1158|     30|    os << 0;
 1159|     86|  } else if (temp0 < 0) {
  ------------------
  |  Branch (1159:14): [True: 60, False: 26]
  ------------------
 1160|     60|    os << "A" << std::fixed << std::setprecision(2) << -temp0;
 1161|     60|  } else {
 1162|     26|    os << "B" << std::fixed << std::setprecision(2) << temp0;
 1163|     26|  }
 1164|    116|  os << ", G/M: ";
 1165|    116|  if (temp1 == 0) {
  ------------------
  |  Branch (1165:7): [True: 72, False: 44]
  ------------------
 1166|     72|    os << 0;
 1167|     72|  } else if (temp1 < 0) {
  ------------------
  |  Branch (1167:14): [True: 14, False: 30]
  ------------------
 1168|     14|    os << "G" << std::fixed << std::setprecision(2) << -temp1;
 1169|     30|  } else {
 1170|     30|    os << "M" << std::fixed << std::setprecision(2) << temp1;
 1171|     30|  }
 1172|       |
 1173|    116|  os.flags(f);
 1174|    116|  return os;
 1175|    204|}
_ZN5Exiv28Internal13SonyMakerNote31printExposureStandardAdjustmentERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1177|    182|std::ostream& SonyMakerNote::printExposureStandardAdjustment(std::ostream& os, const Value& value, const ExifData*) {
 1178|    182|  if (value.count() != 1 || value.typeId() != signedRational) {
  ------------------
  |  Branch (1178:7): [True: 68, False: 114]
  |  Branch (1178:29): [True: 32, False: 82]
  ------------------
 1179|    100|    return os << "(" << value << ")";
 1180|    100|  }
 1181|       |
 1182|     82|  const auto [r, s] = value.toRational();
 1183|     82|  return os << stringFormat("{:.1f}", static_cast<double>(r) / static_cast<double>(s));
  ------------------
  |  |   18|     82|#define stringFormat std::format
  ------------------
 1184|    182|}
_ZN5Exiv28Internal13SonyMakerNote19printPixelShiftInfoERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1186|    238|std::ostream& SonyMakerNote::printPixelShiftInfo(std::ostream& os, const Value& value, const ExifData*) {
 1187|    238|  if (value.count() != 6 || value.typeId() != undefined)
  ------------------
  |  Branch (1187:7): [True: 116, False: 122]
  |  Branch (1187:29): [True: 6, False: 116]
  ------------------
 1188|    122|    return os << "(" << value << ")";
 1189|       |
 1190|       |  // Tag format:
 1191|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1504
 1192|    116|  if (value.toString() == "0 0 0 0 0 0")
  ------------------
  |  Branch (1192:7): [True: 30, False: 86]
  ------------------
 1193|     30|    return os << _("n/a");
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
 1194|       |
 1195|       |  // Convert from little endian format
 1196|     86|  auto groupID = (value.toUint32(3) << 24) + (value.toUint32(2) << 16) + (value.toUint32(1) << 8) + value.toUint32(0);
 1197|       |
 1198|     86|  return os << stringFormat("Group {:02}{:02}{:02}{:02}, Shot {}/{} (0x{:x})", (groupID >> 17) & 0x1f,
  ------------------
  |  |   18|     86|#define stringFormat std::format
  ------------------
 1199|     86|                            (groupID >> 12) & 0x1f, (groupID >> 6) & 0x3f, groupID & 0x3f, value.toUint32(4),
 1200|     86|                            value.toUint32(5), (groupID >> 22));
 1201|    116|}
_ZN5Exiv28Internal13SonyMakerNote19printFocusFrameSizeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1203|    208|std::ostream& SonyMakerNote::printFocusFrameSize(std::ostream& os, const Value& value, const ExifData*) {
 1204|    208|  if (value.count() != 6 || value.typeId() != undefined)
  ------------------
  |  Branch (1204:7): [True: 80, False: 128]
  |  Branch (1204:29): [True: 30, False: 98]
  ------------------
 1205|    110|    return os << "(" << value << ")";
 1206|       |
 1207|       |  // Tag is written as undefined type but is used as unsignedShort. See
 1208|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L1578
 1209|       |
 1210|     98|  if (value.toUint32(4) == 0 && value.toUint32(5) == 0)
  ------------------
  |  Branch (1210:7): [True: 68, False: 30]
  |  Branch (1210:33): [True: 38, False: 30]
  ------------------
 1211|     38|    return os << _("n/a");
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
 1212|       |
 1213|       |  // Convert from little endian format
 1214|     60|  return os << ((value.toUint32(1) << 8) + value.toUint32(0)) << "x" << ((value.toUint32(3) << 8) + value.toUint32(2));
 1215|     98|}
_ZN5Exiv28Internal13SonyMakerNote21printColorTemperatureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1217|    248|std::ostream& SonyMakerNote::printColorTemperature(std::ostream& os, const Value& value, const ExifData*) {
 1218|    248|  if (value.count() != 1 || value.typeId() != unsignedLong)
  ------------------
  |  Branch (1218:7): [True: 54, False: 194]
  |  Branch (1218:29): [True: 26, False: 168]
  ------------------
 1219|     80|    return os << "(" << value << ")";
 1220|       |
 1221|    168|  auto v0 = value.toUint32(0);
 1222|    168|  if (v0 == 0)
  ------------------
  |  Branch (1222:7): [True: 94, False: 74]
  ------------------
 1223|     94|    return os << _("Auto");
  ------------------
  |  |   40|     94|#define _(String) (String)
  ------------------
 1224|       |
 1225|     74|  if (v0 == 0xffffffff)
  ------------------
  |  Branch (1225:7): [True: 14, False: 60]
  ------------------
 1226|     14|    return os << _("n/a");
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
 1227|       |
 1228|     60|  return os << v0 << " K";
 1229|     74|}
_ZN5Exiv28Internal13SonyMakerNote28printColorCompensationFilterERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1231|    150|std::ostream& SonyMakerNote::printColorCompensationFilter(std::ostream& os, const Value& value, const ExifData*) {
 1232|    150|  if (value.count() != 1 || value.typeId() != unsignedLong)
  ------------------
  |  Branch (1232:7): [True: 80, False: 70]
  |  Branch (1232:29): [True: 14, False: 56]
  ------------------
 1233|     94|    return os << "(" << value << ")";
 1234|       |
 1235|       |  // Tag is written as an unsignedLong but used as a signedLong. See
 1236|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L2093
 1237|       |
 1238|     56|  int64_t temp = static_cast<int32_t>(value.toUint32(0));
 1239|     56|  os << "G/M: ";
 1240|     56|  if (temp == 0)
  ------------------
  |  Branch (1240:7): [True: 20, False: 36]
  ------------------
 1241|     20|    return os << "0";
 1242|       |
 1243|     36|  if (temp < 0)
  ------------------
  |  Branch (1243:7): [True: 26, False: 10]
  ------------------
 1244|     26|    return os << "G" << -temp;
 1245|       |
 1246|     10|  return os << "M" << temp;
 1247|     36|}
_ZN5Exiv28Internal13SonyMakerNote13printLensSpecERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1288|    760|std::ostream& SonyMakerNote::printLensSpec(std::ostream& os, const Value& value, const ExifData*) {
 1289|    760|  if (value.count() != 8 || value.typeId() != unsignedByte)
  ------------------
  |  Branch (1289:7): [True: 16, False: 744]
  |  Branch (1289:29): [True: 46, False: 698]
  ------------------
 1290|     62|    return os << "(" << value << ")";
 1291|       |
 1292|       |  // Tag uses 8 bytes in the format:
 1293|       |  // <Flgs 1> <Flgs 2> <Focal len min> <Focal len max 1> <Focal len max 2> <Aperture min> <Aperture max> <Flags
 1294|       |  // 3>
 1295|       |  //   (0)       (1)         (2)              (3)               (4)             (5)            (6)          (7)
 1296|       |  //
 1297|       |  // Bytes 2-6 are each interpreted as 2 nibbles which are used as decimal. Nibbles have a value less than 10.
 1298|       |  // e.g., 36 == 0x24, converts to "2" and "4".
 1299|       |  // Optional elements (==0) are <Flgs 1>, <Flgs 2>, <Focal len max 1>, <Focal len max 2>, <Aperture max> and
 1300|       |  // <Flgs 3>
 1301|       |  //
 1302|       |  // Values for the tag are only set with compatible lenses, otherwise all 8 are set to 0.
 1303|       |  //
 1304|       |  // Examples of final output:
 1305|       |  // 1. "FE 90mm F2.8 Macro G OSS"
 1306|       |  // 2. "E PZ 16-50mm F3.5-5.6 OSS"
 1307|       |  // 3. "DT 18-55mm F3.5-5.6 SAM"
 1308|       |  // 4. "28-100mm F1.8-4.9"
 1309|       |  // 5. "35mm F2.0"
 1310|       |  //
 1311|       |  // See:
 1312|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L2170
 1313|       |
 1314|    698|  const auto focalLenMin = value.toUint32(2);
 1315|    698|  const auto focalLenMax1 = value.toUint32(3);
 1316|    698|  const auto focalLenMax2 = value.toUint32(4);
 1317|    698|  const auto appertureMin = value.toUint32(5);
 1318|    698|  const auto apertureMax = value.toUint32(6);
 1319|       |
 1320|    698|  if (value.toString() == "0 0 0 0 0 0 0 0" || focalLenMin == 0 || appertureMin == 0)
  ------------------
  |  Branch (1320:7): [True: 28, False: 670]
  |  Branch (1320:7): [True: 164, False: 534]
  |  Branch (1320:48): [True: 96, False: 574]
  |  Branch (1320:68): [True: 40, False: 534]
  ------------------
 1321|    164|    return os << _("Unknown");
  ------------------
  |  |   40|    164|#define _(String) (String)
  ------------------
 1322|       |
 1323|    534|  std::string flagsStart;
 1324|    534|  std::string flagsEnd;
 1325|    534|  findLensSpecFlags(value, flagsStart, flagsEnd);
 1326|       |
 1327|       |  // Output <Flgs 1>
 1328|    534|  if (!flagsStart.empty())
  ------------------
  |  Branch (1328:7): [True: 472, False: 62]
  ------------------
 1329|    472|    os << flagsStart << " ";
 1330|       |
 1331|       |  // Output <Focal len min>
 1332|    534|  auto temp = ((focalLenMin >> 4) & 0x0f);
 1333|    534|  if (temp != 0)  // Remove leading zero
  ------------------
  |  Branch (1333:7): [True: 356, False: 178]
  ------------------
 1334|    356|    os << temp;
 1335|       |
 1336|    534|  os << (focalLenMin & 0x0f);
 1337|       |
 1338|    534|  if (focalLenMax1 != 0 || focalLenMax2 != 0) {
  ------------------
  |  Branch (1338:7): [True: 388, False: 146]
  |  Branch (1338:28): [True: 74, False: 72]
  ------------------
 1339|    448|    os << "-";
 1340|    448|  }
 1341|       |
 1342|    534|  if (focalLenMax1 != 0) {
  ------------------
  |  Branch (1342:7): [True: 374, False: 160]
  ------------------
 1343|       |    // Output <Focal len max 1>
 1344|    374|    temp = ((focalLenMax1 >> 4) & 0x0f);
 1345|    374|    if (temp != 0)  // Remove leading zero
  ------------------
  |  Branch (1345:9): [True: 250, False: 124]
  ------------------
 1346|    250|      os << temp;
 1347|    374|    os << (focalLenMax1 & 0x0f);
 1348|       |
 1349|       |    // Output <Focal len max 2>
 1350|    374|    os << ((focalLenMax2 >> 4) & 0x0f) << (focalLenMax2 & 0x0f);
 1351|    374|  } else {
 1352|       |    // Output <Focal len max 2>
 1353|    160|    if (focalLenMax2 != 0)
  ------------------
  |  Branch (1353:9): [True: 74, False: 86]
  ------------------
 1354|     74|      os << ((focalLenMax2 >> 4) & 0x0f) << (focalLenMax2 & 0x0f);
 1355|    160|  }
 1356|       |
 1357|    534|  os << "mm";
 1358|       |
 1359|       |  // Output <Aperture min>
 1360|    534|  os << " F" << ((appertureMin >> 4) & 0x0f) << "." << (appertureMin & 0x0f);
 1361|       |
 1362|       |  // Output <Aperture max>
 1363|    534|  if (apertureMax != 0)
  ------------------
  |  Branch (1363:7): [True: 394, False: 140]
  ------------------
 1364|    394|    os << "-" << ((apertureMax >> 4) & 0x0f) << "." << (apertureMax & 0x0f);
 1365|       |
 1366|       |  // Output <Flags 3>
 1367|    534|  if (!flagsEnd.empty())
  ------------------
  |  Branch (1367:7): [True: 448, False: 86]
  ------------------
 1368|    448|    os << " " << flagsEnd;
 1369|    534|  return os;
 1370|    698|}
_ZN5Exiv28Internal13SonyMakerNote14printImageSizeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1372|    130|std::ostream& SonyMakerNote::printImageSize(std::ostream& os, const Value& value, const ExifData*) {
 1373|    130|  if (value.count() != 2 || value.typeId() != unsignedLong)
  ------------------
  |  Branch (1373:7): [True: 100, False: 30]
  |  Branch (1373:29): [True: 16, False: 14]
  ------------------
 1374|    116|    return os << "(" << value << ")";
 1375|       |
 1376|       |  // Values are stored as Height then Width
 1377|     14|  return os << value.toString(1) << " x " << value.toString(0);
 1378|    130|}
_ZN5Exiv28Internal13SonyMakerNote14printFocusModeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1380|    452|std::ostream& SonyMakerNote::printFocusMode(std::ostream& os, const Value& value, const ExifData* metadata) {
 1381|    452|  if (value.count() != 1 || value.typeId() != unsignedShort || !metadata)
  ------------------
  |  Branch (1381:7): [True: 214, False: 238]
  |  Branch (1381:29): [True: 48, False: 190]
  |  Branch (1381:64): [True: 95, False: 95]
  ------------------
 1382|    357|    return os << "(" << value << ")";
 1383|       |
 1384|       |  // Only valid for certain models of camera. See
 1385|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L2255
 1386|       |
 1387|     95|  if (std::string metaVersion; !getMetaVersion(metadata, metaVersion) || metaVersion != "DC7303320222000")
  ------------------
  |  Branch (1387:32): [True: 56, False: 39]
  |  Branch (1387:74): [True: 28, False: 11]
  ------------------
 1388|     84|    return EXV_PRINT_TAG(sonyFocusMode)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|     84|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1389|       |
 1390|     11|  return os << _("n/a");
  ------------------
  |  |   40|     11|#define _(String) (String)
  ------------------
 1391|     95|}
_ZN5Exiv28Internal13SonyMakerNote11printAFModeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1393|    932|std::ostream& SonyMakerNote::printAFMode(std::ostream& os, const Value& value, const ExifData* metadata) {
 1394|    932|  if (value.count() != 1 || value.typeId() != unsignedShort || !metadata)
  ------------------
  |  Branch (1394:7): [True: 20, False: 912]
  |  Branch (1394:29): [True: 42, False: 870]
  |  Branch (1394:64): [True: 435, False: 435]
  ------------------
 1395|    497|    return os << "(" << value << ")";
 1396|       |
 1397|       |  // Only valid for certain models of camera. See
 1398|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L2275
 1399|    435|  if (std::string metaVersion; !getMetaVersion(metadata, metaVersion) || metaVersion != "DC7303320222000")
  ------------------
  |  Branch (1399:32): [True: 212, False: 223]
  |  Branch (1399:74): [True: 66, False: 157]
  ------------------
 1400|    278|    return EXV_PRINT_TAG(sonyAFModeSet1)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    278|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1401|       |
 1402|    157|  if (uint32_t focusMode2 = 0; getFocusMode2(metadata, focusMode2) && focusMode2 != 0)
  ------------------
  |  Branch (1402:32): [True: 98, False: 59]
  |  Branch (1402:71): [True: 82, False: 16]
  ------------------
 1403|     82|    return EXV_PRINT_TAG(sonyAFModeSet2)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|     82|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1404|       |
 1405|     75|  return os << _("n/a");
  ------------------
  |  |   40|     75|#define _(String) (String)
  ------------------
 1406|    157|}
_ZN5Exiv28Internal13SonyMakerNote15printFocusMode3ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1408|  1.12k|std::ostream& SonyMakerNote::printFocusMode3(std::ostream& os, const Value& value, const ExifData* metadata) {
 1409|  1.12k|  if (value.count() != 1 || value.typeId() != unsignedShort || !metadata)
  ------------------
  |  Branch (1409:7): [True: 38, False: 1.08k]
  |  Branch (1409:29): [True: 280, False: 802]
  |  Branch (1409:64): [True: 401, False: 401]
  ------------------
 1410|    719|    return os << "(" << value << ")";
 1411|       |
 1412|       |  // Only valid for certain models of camera. See
 1413|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L2411
 1414|    401|  if (std::string metaVersion; getMetaVersion(metadata, metaVersion) && metaVersion == "DC7303320222000")
  ------------------
  |  Branch (1414:32): [True: 182, False: 219]
  |  Branch (1414:73): [True: 42, False: 140]
  ------------------
 1415|     42|    return EXV_PRINT_TAG(sonyFocusMode3)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|     42|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1416|       |
 1417|    359|  return os << _("n/a");
  ------------------
  |  |   40|    359|#define _(String) (String)
  ------------------
 1418|    401|}
_ZN5Exiv28Internal13SonyMakerNote27printHighISONoiseReduction2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1421|  1.00k|                                                         const ExifData* metadata) {
 1422|  1.00k|  if (value.count() != 1 || value.typeId() != unsignedShort || !metadata)
  ------------------
  |  Branch (1422:7): [True: 16, False: 984]
  |  Branch (1422:29): [True: 70, False: 914]
  |  Branch (1422:64): [True: 457, False: 457]
  ------------------
 1423|    543|    return os << "(" << value << ")";
 1424|       |
 1425|       |  // Only valid for certain models of camera. See
 1426|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L2437
 1427|    457|  std::string model;
 1428|    457|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1428:7): [True: 71, False: 386]
  ------------------
 1429|     71|    return os << "(" << value << ")";
 1430|       |
 1431|    386|  if (model.starts_with("DSC-") || model.starts_with("Stellar"))
  ------------------
  |  Branch (1431:7): [True: 190, False: 196]
  |  Branch (1431:36): [True: 16, False: 180]
  ------------------
 1432|    206|    return EXV_PRINT_TAG(sonyHighISONoiseReduction2)(os, value.toUint32(0), metadata);
  ------------------
  |  |  199|    206|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 1433|       |
 1434|    180|  return os << _("n/a");
  ------------------
  |  |   40|    180|#define _(String) (String)
  ------------------
 1435|    386|}
_ZN5Exiv28Internal13SonyMakerNote30printSony2FpAmbientTemperatureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1872|    266|                                                            const ExifData* metadata) {
 1873|    266|  if (value.count() != 1 || !metadata)
  ------------------
  |  Branch (1873:7): [True: 0, False: 266]
  |  Branch (1873:29): [True: 133, False: 133]
  ------------------
 1874|    133|    return os << "(" << value << ")";
 1875|       |
 1876|    133|  auto pos = metadata->findKey(ExifKey("Exif.Sony2Fp.0x0002"));
 1877|    133|  if (pos != metadata->end() && pos->count() == 1 && pos->toInt64() == 255)
  ------------------
  |  Branch (1877:7): [True: 133, False: 0]
  |  Branch (1877:7): [True: 29, False: 104]
  |  Branch (1877:33): [True: 133, False: 0]
  |  Branch (1877:54): [True: 29, False: 104]
  ------------------
 1878|     29|    return os << value << " °C";
 1879|       |
 1880|    104|  return os << N_("n/a");
  ------------------
  |  |   41|    104|#define N_(String) String
  ------------------
 1881|    133|}
_ZN5Exiv28Internal13SonyMakerNote21printSony2FpFocusModeERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1883|    252|std::ostream& SonyMakerNote::printSony2FpFocusMode(std::ostream& os, const Value& value, const ExifData*) {
 1884|    252|  if (value.count() != 1)
  ------------------
  |  Branch (1884:7): [True: 0, False: 252]
  ------------------
 1885|      0|    return os << value;
 1886|       |
 1887|    252|  const auto val = (value.toInt64() & 0x7F);
 1888|    252|  switch (val) {
  ------------------
  |  Branch (1888:11): [True: 156, False: 96]
  ------------------
 1889|     70|    case 0:
  ------------------
  |  Branch (1889:5): [True: 70, False: 182]
  ------------------
 1890|     70|      return os << N_("Manual");
  ------------------
  |  |   41|     70|#define N_(String) String
  ------------------
 1891|     28|    case 2:
  ------------------
  |  Branch (1891:5): [True: 28, False: 224]
  ------------------
 1892|     28|      return os << N_("AF-S");
  ------------------
  |  |   41|     28|#define N_(String) String
  ------------------
 1893|     38|    case 3:
  ------------------
  |  Branch (1893:5): [True: 38, False: 214]
  ------------------
 1894|     38|      return os << N_("AF-C");
  ------------------
  |  |   41|     38|#define N_(String) String
  ------------------
 1895|     10|    case 4:
  ------------------
  |  Branch (1895:5): [True: 10, False: 242]
  ------------------
 1896|     10|      return os << N_("AF-A");
  ------------------
  |  |   41|     10|#define N_(String) String
  ------------------
 1897|     10|    case 6:
  ------------------
  |  Branch (1897:5): [True: 10, False: 242]
  ------------------
 1898|     10|      return os << N_("DMF");
  ------------------
  |  |   41|     10|#define N_(String) String
  ------------------
 1899|    252|  }
 1900|       |
 1901|     96|  return os << "(" << val << ")";
 1902|    252|}
_ZN5Exiv28Internal13SonyMakerNote26printSony2FpFocusPosition2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1905|    252|                                                        const ExifData* metadata) {
 1906|    252|  if (value.count() != 1 || !metadata)
  ------------------
  |  Branch (1906:7): [True: 0, False: 252]
  |  Branch (1906:29): [True: 126, False: 126]
  ------------------
 1907|    126|    return os << "(" << value << ")";
 1908|       |
 1909|    126|  std::string model;
 1910|    126|  if (!getModel(metadata, model))
  ------------------
  |  Branch (1910:7): [True: 54, False: 72]
  ------------------
 1911|     54|    return os << "(" << value << ")";
 1912|       |
 1913|       |  // Ranges of models that do not support this tag
 1914|     72|  for (const auto& m : {"DSC-", "Stellar"})
  ------------------
  |  Branch (1914:22): [True: 120, False: 40]
  ------------------
 1915|    120|    if (model.starts_with(m))
  ------------------
  |  Branch (1915:9): [True: 32, False: 88]
  ------------------
 1916|     32|      return os << N_("n/a");
  ------------------
  |  |   41|     32|#define N_(String) String
  ------------------
 1917|       |
 1918|     40|  const auto val = value.toInt64();
 1919|     40|  if (val == 255)
  ------------------
  |  Branch (1919:7): [True: 3, False: 37]
  ------------------
 1920|      3|    return os << N_("Infinity");
  ------------------
  |  |   41|      3|#define N_(String) String
  ------------------
 1921|       |
 1922|     37|  return os << val;
 1923|     40|}
_ZN5Exiv28Internal13SonyMakerNote31printSonyMisc1CameraTemperatureERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1935|     72|                                                             const ExifData* metadata) {
 1936|     72|  if (value.count() != 1 || !metadata)
  ------------------
  |  Branch (1936:7): [True: 0, False: 72]
  |  Branch (1936:29): [True: 36, False: 36]
  ------------------
 1937|     36|    return os << "(" << value << ")";
 1938|       |
 1939|     36|  auto pos = metadata->findKey(ExifKey("Exif.SonyMisc1.0x0004"));
 1940|     36|  if (pos != metadata->end() && pos->count() == 1 && pos->toInt64() != 0 && pos->toInt64() < 100)
  ------------------
  |  Branch (1940:7): [True: 36, False: 0]
  |  Branch (1940:7): [True: 6, False: 30]
  |  Branch (1940:33): [True: 36, False: 0]
  |  Branch (1940:54): [True: 20, False: 16]
  |  Branch (1940:77): [True: 6, False: 14]
  ------------------
 1941|      6|    return os << value << " °C";
 1942|       |
 1943|     30|  return os << N_("n/a");
  ------------------
  |  |   41|     30|#define N_(String) String
  ------------------
 1944|     36|}
_ZN5Exiv28Internal13SonyMakerNote31printSonyMisc2bLensZoomPositionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 1999|     58|                                                             const ExifData* metadata) {
 2000|     58|  if (value.count() != 1 || !metadata)
  ------------------
  |  Branch (2000:7): [True: 0, False: 58]
  |  Branch (2000:29): [True: 29, False: 29]
  ------------------
 2001|     29|    return os << "(" << value << ")";
 2002|       |
 2003|     29|  std::string model;
 2004|     29|  if (!getModel(metadata, model))
  ------------------
  |  Branch (2004:7): [True: 9, False: 20]
  ------------------
 2005|      9|    return os << "(" << value << ")";
 2006|       |
 2007|       |  // Models that do not support this tag
 2008|     20|  for (auto m : {"SLT-", "HV", "ILCA-"})
  ------------------
  |  Branch (2008:15): [True: 56, False: 15]
  ------------------
 2009|     56|    if (Internal::contains(model, m))
  ------------------
  |  Branch (2009:9): [True: 5, False: 51]
  ------------------
 2010|      5|      return os << N_("n/a");
  ------------------
  |  |   41|      5|#define N_(String) String
  ------------------
 2011|       |
 2012|     15|  return os << stringFormat("{}%", std::lround(value.toInt64() / 10.24));
  ------------------
  |  |   18|     15|#define stringFormat std::format
  ------------------
 2013|     20|}
_ZN5Exiv28Internal13SonyMakerNote29printSonyMisc2bFocusPosition2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2016|     58|                                                           const ExifData* metadata) {
 2017|     58|  if (value.count() != 1 || !metadata)
  ------------------
  |  Branch (2017:7): [True: 0, False: 58]
  |  Branch (2017:29): [True: 29, False: 29]
  ------------------
 2018|     29|    return os << "(" << value << ")";
 2019|       |
 2020|     29|  std::string model;
 2021|     29|  if (!getModel(metadata, model))
  ------------------
  |  Branch (2021:7): [True: 9, False: 20]
  ------------------
 2022|      9|    return os << "(" << value << ")";
 2023|       |
 2024|       |  // Models that do not support this tag
 2025|     20|  for (auto m : {"SLT-", "HV", "ILCA-"})
  ------------------
  |  Branch (2025:15): [True: 56, False: 15]
  ------------------
 2026|     56|    if (Internal::contains(model, m))
  ------------------
  |  Branch (2026:9): [True: 5, False: 51]
  ------------------
 2027|      5|      return os << N_("n/a");
  ------------------
  |  |   41|      5|#define N_(String) String
  ------------------
 2028|       |
 2029|     15|  return os << value;
 2030|     20|}
_ZN5Exiv28Internal13SonyMakerNote37printSonyMisc3cShotNumberSincePowerUpERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2108|    194|                                                                   const ExifData* metadata) {
 2109|    194|  if (value.count() != 1 || value.typeId() != unsignedLong || !metadata)
  ------------------
  |  Branch (2109:7): [True: 0, False: 194]
  |  Branch (2109:29): [True: 32, False: 162]
  |  Branch (2109:63): [True: 81, False: 81]
  ------------------
 2110|    113|    return os << "(" << value << ")";
 2111|       |
 2112|     81|  std::string model;
 2113|     81|  if (!getModel(metadata, model))
  ------------------
  |  Branch (2113:7): [True: 40, False: 41]
  ------------------
 2114|     40|    return os << "(" << value << ")";
 2115|       |
 2116|       |  // Tag only valid for certain camera models. See
 2117|       |  // https://github.com/exiftool/exiftool/blob/7368629751669ba170511419b3d1e05bf0076d0e/lib/Image/ExifTool/Sony.pm#L8170
 2118|     41|  static constexpr const char* models[] = {
 2119|     41|      "ILCA-68",     "ILCA-77M2",   "ILCA-99M2",   "ILCE-5000",  "ILCE-5100", "ILCE-6000",  "ILCE-6300",
 2120|     41|      "ILCE-6500",   "ILCE-7",      "ILCE-7M2",    "ILCE-7R",    "ILCE-7RM2", "ILCE-7S",    "ILCE-7SM2",
 2121|     41|      "ILCE-7SM5",   "ILCE-QX1",    "DSC-HX350",   "DSC-HX400V", "DSC-HX60V", "DSC-HX80",   "DSC-HX90",
 2122|     41|      "DSC-HX90V",   "DSC-QX30",    "DSC-RX0",     "DSC-RX1RM2", "DSC-RX10",  "DSC-RX10M2", "DSC-RX10M3",
 2123|     41|      "DSC-RX100M3", "DSC-RX100M4", "DSC-RX100M5", "DSC-WX220",  "DSC-WX350", "DSC-WX500",
 2124|     41|  };
 2125|       |
 2126|     41|  if (Exiv2::find(models, model))
  ------------------
  |  Branch (2126:7): [True: 4, False: 37]
  ------------------
 2127|      4|    return os << value.toInt64();
 2128|       |
 2129|     37|  return os << N_("n/a");
  ------------------
  |  |   41|     37|#define N_(String) String
  ------------------
 2130|     41|}
_ZN5Exiv28Internal13SonyMakerNote29printSonyMisc3cSequenceNumberERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2132|    378|std::ostream& SonyMakerNote::printSonyMisc3cSequenceNumber(std::ostream& os, const Value& value, const ExifData*) {
 2133|    378|  return (value.count() != 1 || value.typeId() != unsignedLong) ? os << "(" << value << ")"
  ------------------
  |  Branch (2133:11): [True: 0, False: 378]
  |  Branch (2133:33): [True: 64, False: 314]
  ------------------
 2134|    378|                                                                : os << (value.toInt64() + 1);
 2135|    378|}
_ZN5Exiv28Internal13SonyMakerNote23printSonyMisc3cQuality2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2137|    184|std::ostream& SonyMakerNote::printSonyMisc3cQuality2(std::ostream& os, const Value& value, const ExifData* metadata) {
 2138|    184|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (2138:7): [True: 0, False: 184]
  |  Branch (2138:29): [True: 0, False: 184]
  |  Branch (2138:63): [True: 92, False: 92]
  ------------------
 2139|     92|    return os << "(" << value << ")";
 2140|       |
 2141|     92|  std::string model;
 2142|     92|  if (!getModel(metadata, model))
  ------------------
  |  Branch (2142:7): [True: 37, False: 55]
  ------------------
 2143|     37|    return os << "(" << value << ")";
 2144|       |
 2145|     55|  const auto val = value.toInt64();
 2146|       |
 2147|       |  // Tag only valid for certain camera models. See
 2148|       |  // https://github.com/exiftool/exiftool/blob/7368629751669ba170511419b3d1e05bf0076d0e/lib/Image/ExifTool/Sony.pm#L8219
 2149|     55|  constexpr const char* models[] = {"ILCE-1", "ILCE-7M4", "ILCE-7RM5", "ILCE-7SM3", "ILME-FX3"};
 2150|       |
 2151|     55|  if (Exiv2::find(models, model))
  ------------------
  |  Branch (2151:7): [True: 3, False: 52]
  ------------------
 2152|      3|    return EXV_PRINT_TAG(sonyMisc3cQuality2a)(os, val, metadata);
  ------------------
  |  |  199|      3|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2153|       |
 2154|     52|  return EXV_PRINT_TAG(sonyMisc3cQuality2b)(os, val, metadata);
  ------------------
  |  |  199|     52|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2155|     55|}
_ZN5Exiv28Internal13SonyMakerNote30printSonyMisc3cSonyImageHeightERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2158|    122|                                                            const ExifData* metadata) {
 2159|    122|  if (value.count() != 1 || value.typeId() != unsignedShort || !metadata)
  ------------------
  |  Branch (2159:7): [True: 0, False: 122]
  |  Branch (2159:29): [True: 32, False: 90]
  |  Branch (2159:64): [True: 45, False: 45]
  ------------------
 2160|     77|    return os << "(" << value << ")";
 2161|       |
 2162|     45|  std::string model;
 2163|     45|  if (!getModel(metadata, model))
  ------------------
  |  Branch (2163:7): [True: 18, False: 27]
  ------------------
 2164|     18|    return os << "(" << value << ")";
 2165|       |
 2166|       |  // Tag only valid for certain camera models. See
 2167|       |  // https://github.com/exiftool/exiftool/blob/7368629751669ba170511419b3d1e05bf0076d0e/lib/Image/ExifTool/Sony.pm#L8239
 2168|     27|  constexpr const char* models[] = {"ILCE-1", "ILCE-7M4", "ILCE-7RM5", "ILCE-7SM3", "ILME-FX3"};
 2169|       |
 2170|     27|  if (Exiv2::find(models, model))
  ------------------
  |  Branch (2170:7): [True: 1, False: 26]
  ------------------
 2171|      1|    return os << N_("n/a");
  ------------------
  |  |   41|      1|#define N_(String) String
  ------------------
 2172|       |
 2173|     26|  const auto val = value.toInt64();
 2174|     26|  if (val > 0)
  ------------------
  |  Branch (2174:7): [True: 16, False: 10]
  ------------------
 2175|     16|    return os << (8 * val);
 2176|     10|  return os << N_("n/a");
  ------------------
  |  |   41|     10|#define N_(String) String
  ------------------
 2177|     26|}
_ZN5Exiv28Internal13SonyMakerNote31printSonyMisc3cModelReleaseYearERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2180|    108|                                                             const ExifData* metadata) {
 2181|    108|  if (value.count() != 1 || value.typeId() != unsignedByte || !metadata)
  ------------------
  |  Branch (2181:7): [True: 0, False: 108]
  |  Branch (2181:29): [True: 0, False: 108]
  |  Branch (2181:63): [True: 54, False: 54]
  ------------------
 2182|     54|    return os << "(" << value << ")";
 2183|       |
 2184|     54|  std::string model;
 2185|     54|  if (!getModel(metadata, model))
  ------------------
  |  Branch (2185:7): [True: 17, False: 37]
  ------------------
 2186|     17|    return os << "(" << value << ")";
 2187|       |
 2188|       |  // Tag only valid for certain camera models. See
 2189|       |  // https://github.com/exiftool/exiftool/blob/7368629751669ba170511419b3d1e05bf0076d0e/lib/Image/ExifTool/Sony.pm#L8245
 2190|     37|  constexpr const char* models[] = {"ILCE-1", "ILCE-7M4", "ILCE-7RM5", "ILCE-7SM3", "ILME-FX3"};
 2191|       |
 2192|     37|  if (Exiv2::find(models, model)) {
  ------------------
  |  Branch (2192:7): [True: 0, False: 37]
  ------------------
 2193|      0|    return os << N_("n/a");
  ------------------
  |  |   41|      0|#define N_(String) String
  ------------------
 2194|      0|  }
 2195|       |
 2196|     37|  const auto val = value.toInt64();
 2197|     37|  if (val > 99)
  ------------------
  |  Branch (2197:7): [True: 12, False: 25]
  ------------------
 2198|     12|    return os << "(" << val << ")";
 2199|       |
 2200|     25|  if (val == 0)
  ------------------
  |  Branch (2200:7): [True: 6, False: 19]
  ------------------
 2201|      6|    return os << "2000";
 2202|       |
 2203|     19|  return os << "20" << val;
 2204|     25|}
_ZN5Exiv28Internal15sonyTagDecipherEtPKhmPNS0_13TiffComponentE:
 2333|    703|DataBuf sonyTagDecipher(uint16_t tag, const byte* bytes, size_t size, TiffComponent* object) {
 2334|    703|  return sonyTagCipher(tag, bytes, size, object, true);
 2335|    703|}
_ZN5Exiv28Internal15sonyTagEncipherEtPKhmPNS0_13TiffComponentE:
 2336|     33|DataBuf sonyTagEncipher(uint16_t tag, const byte* bytes, size_t size, TiffComponent* object) {
 2337|     33|  return sonyTagCipher(tag, bytes, size, object, false);
 2338|     33|}
sonymn_int.cpp:_ZN5Exiv28InternalL8getModelEPKNS_8ExifDataERNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  816|  12.8k|static auto getModel(const ExifData* metadata, std::string& val) {
  817|  12.8k|  auto pos = metadata->findKey(ExifKey("Exif.Image.Model"));
  818|  12.8k|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == asciiString) {
  ------------------
  |  Branch (818:7): [True: 5.97k, False: 6.84k]
  |  Branch (818:7): [True: 5.01k, False: 7.80k]
  |  Branch (818:33): [True: 5.25k, False: 717]
  |  Branch (818:53): [True: 5.01k, False: 248]
  ------------------
  819|  5.01k|    val = pos->toString(0);
  820|  5.01k|    return true;
  821|  5.01k|  }
  822|       |
  823|       |  // NOTE: As using the translated SonyModelID value, need to be synchronized with the array format
  824|  7.80k|  pos = metadata->findKey(ExifKey("Exif.Sony1.SonyModelID"));
  825|  7.80k|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == unsignedShort) {
  ------------------
  |  Branch (825:7): [True: 463, False: 7.34k]
  |  Branch (825:7): [True: 356, False: 7.44k]
  |  Branch (825:33): [True: 421, False: 42]
  |  Branch (825:53): [True: 356, False: 65]
  ------------------
  826|    356|    if (auto temp = pos->print(metadata); !Internal::contains(temp, ' ')) {
  ------------------
  |  Branch (826:43): [True: 306, False: 50]
  ------------------
  827|    306|      val = std::move(temp);
  828|    306|      return true;
  829|    306|    }
  830|     50|    val = "";
  831|     50|    return false;
  832|    356|  }
  833|  7.44k|  pos = metadata->findKey(ExifKey("Exif.Sony2.SonyModelID"));
  834|  7.44k|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == unsignedShort) {
  ------------------
  |  Branch (834:7): [True: 6.65k, False: 798]
  |  Branch (834:7): [True: 6.29k, False: 1.15k]
  |  Branch (834:33): [True: 6.39k, False: 257]
  |  Branch (834:53): [True: 6.29k, False: 97]
  ------------------
  835|  6.29k|    if (auto temp = pos->print(metadata); !Internal::contains(temp, ' ')) {
  ------------------
  |  Branch (835:43): [True: 6.22k, False: 70]
  ------------------
  836|  6.22k|      val = std::move(temp);
  837|  6.22k|      return true;
  838|  6.22k|    }
  839|     70|    val = "";
  840|     70|    return false;
  841|  6.29k|  }
  842|       |
  843|  1.15k|  val = "";
  844|  1.15k|  return false;
  845|  7.44k|}
sonymn_int.cpp:_ZZN5Exiv28Internal13SonyMakerNote15printFocusMode2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK3$_0clIPKcEEDaT_:
 1009|  2.36k|      std::any_of(models.begin(), models.end(), [&model](auto m) { return model.starts_with(m); }))
sonymn_int.cpp:_ZZN5Exiv28Internal13SonyMakerNote22printAFAreaModeSettingERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK3$_0clIPKcEEDaT_:
 1034|  22.5k|  if (std::any_of(models2.begin(), models2.end(), [&model](auto m) { return model.starts_with(m); }))
sonymn_int.cpp:_ZZN5Exiv28Internal13SonyMakerNote25printFlexibleSpotPositionERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK3$_0clIPKcEEDaT_:
 1056|  5.32k|  if (std::any_of(models.begin(), models.end(), [&model](auto m) { return model.starts_with(m); }))
sonymn_int.cpp:_ZN5Exiv28InternalL20getAFAreaModeSettingEPKNS_8ExifDataERj:
  847|  4.35k|static auto getAFAreaModeSetting(const ExifData* metadata, uint32_t& val) {
  848|  4.35k|  auto pos = metadata->findKey(ExifKey("Exif.Sony1.AFAreaModeSetting"));
  849|  4.35k|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == unsignedByte) {
  ------------------
  |  Branch (849:7): [True: 775, False: 3.58k]
  |  Branch (849:7): [True: 510, False: 3.84k]
  |  Branch (849:33): [True: 595, False: 180]
  |  Branch (849:53): [True: 510, False: 85]
  ------------------
  850|    510|    std::ostringstream oss;
  851|    510|    pos->write(oss, metadata);
  852|    510|    if (oss.str() == _("n/a")) {
  ------------------
  |  |   40|    510|#define _(String) (String)
  ------------------
  |  Branch (852:9): [True: 120, False: 390]
  ------------------
  853|    120|      val = 0;
  854|    120|      return false;
  855|    120|    }
  856|       |
  857|    390|    val = pos->toUint32(0);
  858|    390|    return true;
  859|    510|  }
  860|  3.84k|  pos = metadata->findKey(ExifKey("Exif.Sony2.AFAreaModeSetting"));
  861|  3.84k|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == unsignedByte) {
  ------------------
  |  Branch (861:7): [True: 2.67k, False: 1.17k]
  |  Branch (861:7): [True: 2.49k, False: 1.34k]
  |  Branch (861:33): [True: 2.63k, False: 41]
  |  Branch (861:53): [True: 2.49k, False: 132]
  ------------------
  862|  2.49k|    std::ostringstream oss;
  863|  2.49k|    pos->write(oss, metadata);
  864|  2.49k|    if (oss.str() == _("n/a")) {
  ------------------
  |  |   40|  2.49k|#define _(String) (String)
  ------------------
  |  Branch (864:9): [True: 296, False: 2.20k]
  ------------------
  865|    296|      val = 0;
  866|    296|      return false;
  867|    296|    }
  868|       |
  869|  2.20k|    val = pos->toUint32(0);
  870|  2.20k|    return true;
  871|  2.49k|  }
  872|       |
  873|  1.34k|  val = 0;
  874|  1.34k|  return false;
  875|  3.84k|}
sonymn_int.cpp:_ZZN5Exiv28Internal13SonyMakerNote17printAFPointsUsedERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK3$_0clIPKcEEDaT_:
 1109|    768|  if (std::none_of(models1.begin(), models1.end(), [&model](auto m) { return model.starts_with(m); }))
sonymn_int.cpp:_ZZN5Exiv28Internal13SonyMakerNote15printAFTrackingERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataEENK3$_0clIPKcEEDaT_:
 1131|  3.07k|      std::any_of(models.begin(), models.end(), [&model](auto m) { return model.starts_with(m); }))
sonymn_int.cpp:_ZN5Exiv28InternalL17findLensSpecFlagsERKNS_5ValueERNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEESB_:
 1249|    534|static void findLensSpecFlags(const Value& value, std::string& flagsStart, std::string& flagsEnd) {
 1250|    534|  static constexpr struct LensSpecFlags {
 1251|    534|    int64_t mask;  // Contains all the bits set in the flags.val_ array values
 1252|    534|    TagDetails flags[4];
 1253|    534|    bool prepend;
 1254|    534|  } lSFArray[] = {
 1255|    534|      {0x4000, {{0x4000, "PZ"}}, true},
 1256|    534|      {0x0300, {{0x0100, "DT"}, {0x0200, "FE"}, {0x0300, "E"}}, true},
 1257|    534|      {0x00e0, {{0x0020, "STF"}, {0x0040, N_("Reflex")}, {0x0060, N_("Macro")}, {0x0080, N_("Fisheye")}}, false},
  ------------------
  |  |   41|    534|#define N_(String) String
  ------------------
                    {0x00e0, {{0x0020, "STF"}, {0x0040, N_("Reflex")}, {0x0060, N_("Macro")}, {0x0080, N_("Fisheye")}}, false},
  ------------------
  |  |   41|    534|#define N_(String) String
  ------------------
                    {0x00e0, {{0x0020, "STF"}, {0x0040, N_("Reflex")}, {0x0060, N_("Macro")}, {0x0080, N_("Fisheye")}}, false},
  ------------------
  |  |   41|    534|#define N_(String) String
  ------------------
 1258|    534|      {0x000c, {{0x0004, "ZA"}, {0x0008, "G"}}, false},
 1259|    534|      {0x0003, {{0x0001, "SSM"}, {0x0002, "SAM"}}, false},
 1260|    534|      {0x8000, {{0x8000, "OSS"}}, false},
 1261|    534|      {0x2000, {{0x2000, "LE"}}, false},
 1262|    534|      {0x0800, {{0x0800, "II"}}, false},
 1263|    534|  };
 1264|       |
 1265|       |  // When processing, a bitwise 'AND' selects a compatible LensSpecFlags entry,
 1266|       |  // then search inside the 'flags' array for one match.
 1267|       |  //
 1268|       |  // See
 1269|       |  // https://github.com/exiftool/exiftool/blob/1e17485cbb372a502e5b9d052d01303db735e6fa/lib/Image/ExifTool/Sony.pm#L10545
 1270|       |
 1271|    534|  const auto joinedV0V7 = ((value.toUint32(0) << 8) + value.toUint32(7));
 1272|  4.21k|  for (const auto& i : lSFArray) {
  ------------------
  |  Branch (1272:22): [True: 4.21k, False: 520]
  ------------------
 1273|  4.21k|    if (auto temp = i.mask & joinedV0V7) {  // Check if a flag matches in the current LensSpecFlags
  ------------------
  |  Branch (1273:14): [True: 2.58k, False: 1.63k]
  ------------------
 1274|  2.58k|      if (auto f = Exiv2::find(i.flags, temp)) {
  ------------------
  |  Branch (1274:16): [True: 2.56k, False: 14]
  ------------------
 1275|  2.56k|        if (i.prepend)
  ------------------
  |  Branch (1275:13): [True: 714, False: 1.85k]
  ------------------
 1276|    714|          flagsStart = flagsStart.empty() ? f->label_ : stringFormat("{} {}", f->label_, flagsStart);
  ------------------
  |  |   18|    234|#define stringFormat std::format
  ------------------
  |  Branch (1276:24): [True: 480, False: 234]
  ------------------
 1277|  1.85k|        else
 1278|  1.85k|          flagsEnd = flagsEnd.empty() ? f->label_ : stringFormat("{} {}", flagsEnd, f->label_);
  ------------------
  |  |   18|  1.39k|#define stringFormat std::format
  ------------------
  |  Branch (1278:22): [True: 458, False: 1.39k]
  ------------------
 1279|  2.56k|        continue;
 1280|  2.56k|      }
 1281|       |      // Should never get in here. LensSpecFlags.mask should contain all the
 1282|       |      // bits in all the LensSpecFlags.flags.val_ entries
 1283|     14|      throw Error(ErrorCode::kerErrorMessage, "LensSpecFlags mask doesn't match the bits in the flags array");
 1284|  2.58k|    }
 1285|  4.21k|  }
 1286|    534|}
sonymn_int.cpp:_ZN5Exiv28InternalL14getMetaVersionEPKNS_8ExifDataERNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  877|    931|static auto getMetaVersion(const ExifData* metadata, std::string& val) {
  878|    931|  const auto pos = metadata->findKey(ExifKey("Exif.SonySInfo1.MetaVersion"));
  879|       |
  880|    931|  if (pos != metadata->end() && pos->typeId() == asciiString) {
  ------------------
  |  Branch (880:7): [True: 578, False: 353]
  |  Branch (880:7): [True: 578, False: 353]
  |  Branch (880:33): [True: 578, False: 0]
  ------------------
  881|    578|    std::string temp = pos->toString();
  882|    578|    if (!temp.empty()) {
  ------------------
  |  Branch (882:9): [True: 444, False: 134]
  ------------------
  883|    444|      val = std::move(temp);
  884|    444|      return true;
  885|    444|    }
  886|    578|  }
  887|    487|  val = "";
  888|    487|  return false;
  889|    931|}
sonymn_int.cpp:_ZN5Exiv28InternalL13getFocusMode2EPKNS_8ExifDataERj:
  891|    157|static auto getFocusMode2(const ExifData* metadata, uint32_t& val) {
  892|    157|  auto pos = metadata->findKey(ExifKey("Exif.Sony1.FocusMode2"));
  893|       |
  894|    157|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == unsignedByte) {
  ------------------
  |  Branch (894:7): [True: 0, False: 157]
  |  Branch (894:7): [True: 0, False: 157]
  |  Branch (894:33): [True: 0, False: 0]
  |  Branch (894:53): [True: 0, False: 0]
  ------------------
  895|      0|    std::ostringstream oss;
  896|      0|    pos->write(oss, metadata);
  897|      0|    if (oss.str() == _("n/a")) {
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  |  Branch (897:9): [True: 0, False: 0]
  ------------------
  898|      0|      val = 0;
  899|      0|      return false;
  900|      0|    }
  901|       |
  902|      0|    val = pos->toUint32(0);
  903|      0|    return true;
  904|      0|  }
  905|    157|  pos = metadata->findKey(ExifKey("Exif.Sony2.FocusMode2"));
  906|    157|  if (pos != metadata->end() && pos->size() != 0 && pos->typeId() == unsignedByte) {
  ------------------
  |  Branch (906:7): [True: 139, False: 18]
  |  Branch (906:7): [True: 110, False: 47]
  |  Branch (906:33): [True: 121, False: 18]
  |  Branch (906:53): [True: 110, False: 11]
  ------------------
  907|    110|    std::ostringstream oss;
  908|    110|    pos->write(oss, metadata);
  909|    110|    if (oss.str() == _("n/a")) {
  ------------------
  |  |   40|    110|#define _(String) (String)
  ------------------
  |  Branch (909:9): [True: 12, False: 98]
  ------------------
  910|     12|      val = 0;
  911|     12|      return false;
  912|     12|    }
  913|     98|    val = pos->toUint32(0);
  914|     98|    return true;
  915|    110|  }
  916|       |
  917|     47|  val = 0;
  918|     47|  return false;
  919|    157|}
sonymn_int.cpp:_ZN5Exiv28InternalL13sonyTagCipherEtPKhmPKNS0_13TiffComponentEb:
 2309|    736|                             bool bDecipher) {
 2310|    736|  DataBuf b(bytes, size);  // copy the data
 2311|       |
 2312|       |  // initialize the code table
 2313|    736|  byte code[256];
 2314|   184k|  for (uint32_t i = 0; i < 249; i++) {
  ------------------
  |  Branch (2314:24): [True: 183k, False: 736]
  ------------------
 2315|   183k|    if (bDecipher) {
  ------------------
  |  Branch (2315:9): [True: 175k, False: 8.21k]
  ------------------
 2316|   175k|      code[(i * i * i) % 249] = static_cast<byte>(i);
 2317|   175k|    } else {
 2318|  8.21k|      code[i] = (i * i * i) % 249;
 2319|  8.21k|    }
 2320|   183k|  }
 2321|  5.88k|  for (uint32_t i = 249; i < 256; i++) {
  ------------------
  |  Branch (2321:26): [True: 5.15k, False: 736]
  ------------------
 2322|  5.15k|    code[i] = static_cast<byte>(i);
 2323|  5.15k|  }
 2324|       |
 2325|       |  // code byte-by-byte
 2326|  1.11M|  for (uint32_t i = 0; i < size; i++) {
  ------------------
  |  Branch (2326:24): [True: 1.11M, False: 736]
  ------------------
 2327|  1.11M|    b.write_uint8(i, code[bytes[i]]);
 2328|  1.11M|  }
 2329|       |
 2330|    736|  return b;
 2331|    736|}

_ZN5Exiv28Internal13SonyMakerNote7tagListEv:
   29|   407k|  static constexpr auto tagList() {
   30|   407k|    return tagInfo_;
   31|   407k|  }
_ZN5Exiv28Internal13SonyMakerNote9tagListCsEv:
   33|  51.9k|  static constexpr auto tagListCs() {
   34|  51.9k|    return tagInfoCs_;
   35|  51.9k|  }
_ZN5Exiv28Internal13SonyMakerNote10tagListCs2Ev:
   37|  1.31k|  static constexpr auto tagListCs2() {
   38|  1.31k|    return tagInfoCs2_;
   39|  1.31k|  }
_ZN5Exiv28Internal13SonyMakerNote9tagListFpEv:
   41|  26.4k|  static constexpr auto tagListFp() {
   42|  26.4k|    return tagInfoFp_;
   43|  26.4k|  }
_ZN5Exiv28Internal13SonyMakerNote16tagListSonyMisc1Ev:
   45|    930|  static constexpr auto tagListSonyMisc1() {
   46|    930|    return tagInfoSonyMisc1_;
   47|    930|  }
_ZN5Exiv28Internal13SonyMakerNote17tagListSonyMisc2bEv:
   49|  4.28k|  static constexpr auto tagListSonyMisc2b() {
   50|  4.28k|    return tagInfoSonyMisc2b_;
   51|  4.28k|  }
_ZN5Exiv28Internal13SonyMakerNote17tagListSonyMisc3cEv:
   53|  1.06M|  static constexpr auto tagListSonyMisc3c() {
   54|  1.06M|    return tagInfoSonyMisc3c_;
   55|  1.06M|  }
_ZN5Exiv28Internal13SonyMakerNote17tagListSonySInfo1Ev:
   57|  30.1k|  static constexpr auto tagListSonySInfo1() {
   58|  30.1k|    return tagInfoSonySInfo1_;
   59|  30.1k|  }
_ZN5Exiv28Internal13SonyMakerNote12tagList2010eEv:
   61|    318|  static constexpr auto tagList2010e() {
   62|    318|    return tagInfo2010e_;
   63|    318|  }

_ZNK5Exiv28Internal13TagVocabularyeqENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEE:
   48|  11.0M|bool TagVocabulary::operator==(std::string_view key) const {
   49|  11.0M|  return key.ends_with(voc_);
   50|  11.0M|}
_ZNK5Exiv29GroupInfoeqENS_5IfdIdE:
   68|  2.22G|bool GroupInfo::operator==(IfdId ifdId) const {
   69|  2.22G|  return ifdId_ == ifdId;
   70|  2.22G|}
_ZNK5Exiv29GroupInfoeqERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   72|   901M|bool GroupInfo::operator==(const GroupName& groupName) const {
   73|   901M|  return groupName == groupName_;
   74|   901M|}
_ZN5Exiv28ExifTags7tagListERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  108|  4.84k|const TagInfo* ExifTags::tagList(const std::string& groupName) {
  109|  4.84k|  return Internal::tagList(groupName);
  110|  4.84k|}
_ZNK5Exiv27ExifKey4Impl7tagNameEv:
  177|  41.7M|std::string ExifKey::Impl::tagName() const {
  178|  41.7M|  if (tagInfo_ && tagInfo_->tag_ != 0xffff) {
  ------------------
  |  Branch (178:7): [True: 41.7M, False: 0]
  |  Branch (178:19): [True: 2.20M, False: 39.5M]
  ------------------
  179|  2.20M|    return tagInfo_->name_;
  180|  2.20M|  }
  181|  39.5M|  return stringFormat("0x{:04x}", tag_);
  ------------------
  |  |   18|  39.5M|#define stringFormat std::format
  ------------------
  182|  41.7M|}
_ZN5Exiv27ExifKey4Impl12decomposeKeyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  184|   474k|void ExifKey::Impl::decomposeKey(const std::string& key) {
  185|       |  // Get the family name, IFD name and tag name parts of the key
  186|   474k|  std::string::size_type pos1 = key.find('.');
  187|   474k|  if (pos1 == std::string::npos)
  ------------------
  |  Branch (187:7): [True: 0, False: 474k]
  ------------------
  188|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  189|   474k|  std::string familyName = key.substr(0, pos1);
  190|   474k|  if (familyName != familyName_)
  ------------------
  |  Branch (190:7): [True: 0, False: 474k]
  ------------------
  191|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  192|   474k|  std::string::size_type pos0 = pos1 + 1;
  193|   474k|  pos1 = key.find('.', pos0);
  194|   474k|  if (pos1 == std::string::npos)
  ------------------
  |  Branch (194:7): [True: 0, False: 474k]
  ------------------
  195|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  196|   474k|  std::string groupName = key.substr(pos0, pos1 - pos0);
  197|   474k|  if (groupName.empty())
  ------------------
  |  Branch (197:7): [True: 0, False: 474k]
  ------------------
  198|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  199|   474k|  std::string tn = key.substr(pos1 + 1);
  200|   474k|  if (tn.empty())
  ------------------
  |  Branch (200:7): [True: 0, False: 474k]
  ------------------
  201|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  202|       |
  203|       |  // Find IfdId
  204|   474k|  IfdId ifdId = groupId(groupName);
  205|   474k|  if (ifdId == IfdId::ifdIdNotSet)
  ------------------
  |  Branch (205:7): [True: 0, False: 474k]
  ------------------
  206|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  207|   474k|  if (!Internal::isExifIfd(ifdId) && !Internal::isMakerIfd(ifdId)) {
  ------------------
  |  Branch (207:7): [True: 206k, False: 268k]
  |  Branch (207:38): [True: 0, False: 206k]
  ------------------
  208|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  209|      0|  }
  210|       |  // Convert tag
  211|   474k|  uint16_t tag = tagNumber(tn, ifdId);
  212|       |  // Get tag info
  213|   474k|  tagInfo_ = tagInfo(tag, ifdId);
  214|   474k|  if (!tagInfo_)
  ------------------
  |  Branch (214:7): [True: 0, False: 474k]
  ------------------
  215|      0|    throw Error(ErrorCode::kerInvalidKey, key);
  216|       |
  217|   474k|  tag_ = tag;
  218|   474k|  ifdId_ = ifdId;
  219|   474k|  groupName_ = groupName;
  220|       |  // tagName() translates hex tag name (0xabcd) to a real tag name if there is one
  221|   474k|  key_ = familyName + "." + groupName + "." + tagName();
  222|   474k|}
_ZN5Exiv27ExifKey4Impl7makeKeyEtNS_5IfdIdEPKNS_7TagInfoE:
  224|  21.2M|void ExifKey::Impl::makeKey(uint16_t tag, IfdId ifdId, const TagInfo* tagInfo) {
  225|  21.2M|  tagInfo_ = tagInfo;
  226|  21.2M|  tag_ = tag;
  227|  21.2M|  ifdId_ = ifdId;
  228|  21.2M|  key_ = std::string(familyName_) + "." + groupName_ + "." + tagName();
  229|  21.2M|}
_ZN5Exiv27ExifKeyC2EtRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  231|  21.2M|ExifKey::ExifKey(uint16_t tag, const std::string& groupName) : p_(std::make_unique<Impl>()) {
  232|  21.2M|  IfdId ifdId = groupId(groupName);
  233|       |  // Todo: Test if this condition can be removed
  234|  21.2M|  if (!Internal::isExifIfd(ifdId) && !Internal::isMakerIfd(ifdId)) {
  ------------------
  |  Branch (234:7): [True: 19.8M, False: 1.35M]
  |  Branch (234:38): [True: 0, False: 19.8M]
  ------------------
  235|      0|    throw Error(ErrorCode::kerInvalidIfdId, ifdId);
  236|      0|  }
  237|  21.2M|  if (auto ti = tagInfo(tag, ifdId)) {
  ------------------
  |  Branch (237:12): [True: 21.2M, False: 0]
  ------------------
  238|  21.2M|    p_->groupName_ = groupName;
  239|  21.2M|    p_->makeKey(tag, ifdId, ti);
  240|  21.2M|    return;
  241|  21.2M|  }
  242|      0|  throw Error(ErrorCode::kerInvalidIfdId, ifdId);
  243|  21.2M|}
_ZN5Exiv27ExifKeyC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  254|   474k|ExifKey::ExifKey(const std::string& key) : p_(std::make_unique<Impl>()) {
  255|   474k|  p_->decomposeKey(key);
  256|   474k|}
_ZN5Exiv27ExifKeyC2ERKS0_:
  258|  44.8M|ExifKey::ExifKey(const ExifKey& rhs) : p_(std::make_unique<Impl>(*rhs.p_)) {
  259|  44.8M|}
_ZN5Exiv27ExifKeyD2Ev:
  261|  66.5M|ExifKey::~ExifKey() = default;
_ZNK5Exiv27ExifKey6setIdxEi:
  270|  21.1M|void ExifKey::setIdx(int idx) const {
  271|  21.1M|  p_->idx_ = idx;
  272|  21.1M|}
_ZNK5Exiv27ExifKey3keyEv:
  274|   142M|std::string ExifKey::key() const {
  275|   142M|  return p_->key_;
  276|   142M|}
_ZNK5Exiv27ExifKey9groupNameEv:
  282|  2.89M|std::string ExifKey::groupName() const {
  283|  2.89M|  return p_->groupName_;
  284|  2.89M|}
_ZNK5Exiv27ExifKey7tagNameEv:
  286|  20.0M|std::string ExifKey::tagName() const {
  287|  20.0M|  return p_->tagName();
  288|  20.0M|}
_ZNK5Exiv27ExifKey13defaultTypeIdEv:
  302|  13.6k|TypeId ExifKey::defaultTypeId() const {
  303|  13.6k|  if (!p_->tagInfo_)
  ------------------
  |  Branch (303:7): [True: 0, False: 13.6k]
  ------------------
  304|      0|    return unknownTag.typeId_;
  305|  13.6k|  return p_->tagInfo_->typeId_;
  306|  13.6k|}
_ZNK5Exiv27ExifKey3tagEv:
  308|  7.64M|uint16_t ExifKey::tag() const {
  309|  7.64M|  return p_->tag_;
  310|  7.64M|}
_ZNK5Exiv27ExifKey5cloneEv:
  312|  44.8M|ExifKey::UniquePtr ExifKey::clone() const {
  313|  44.8M|  return UniquePtr(clone_());
  314|  44.8M|}
_ZNK5Exiv27ExifKey6clone_Ev:
  316|  44.8M|ExifKey* ExifKey::clone_() const {
  317|  44.8M|  return new ExifKey(*this);
  318|  44.8M|}
_ZNK5Exiv27ExifKey5ifdIdEv:
  320|  16.2M|IfdId ExifKey::ifdId() const {
  321|  16.2M|  return p_->ifdId_;
  322|  16.2M|}
_ZNK5Exiv27ExifKey3idxEv:
  324|  2.35M|int ExifKey::idx() const {
  325|  2.35M|  return p_->idx_;
  326|  2.35M|}

_ZN5Exiv28Internal10ifdTagListEv:
 1778|  1.91M|const TagInfo* ifdTagList() {
 1779|  1.91M|  return ifdTagInfo;
 1780|  1.91M|}
_ZN5Exiv28Internal11exifTagListEv:
 2216|  71.4k|const TagInfo* exifTagList() {
 2217|  71.4k|  return exifTagInfo;
 2218|  71.4k|}
_ZN5Exiv28Internal10gpsTagListEv:
 2432|  56.9k|const TagInfo* gpsTagList() {
 2433|  56.9k|  return gpsTagInfo;
 2434|  56.9k|}
_ZN5Exiv28Internal10mpfTagListEv:
 2481|    214|const TagInfo* mpfTagList() {
 2482|    214|  return mpfTagInfo;
 2483|    214|}
_ZN5Exiv28Internal10iopTagListEv:
 2507|  11.4k|const TagInfo* iopTagList() {
 2508|  11.4k|  return iopTagInfo;
 2509|  11.4k|}
_ZN5Exiv28Internal9mnTagListEv:
 2523|   167k|const TagInfo* mnTagList() {
 2524|   167k|  return mnTagInfo;
 2525|   167k|}
_ZN5Exiv28Internal10isMakerIfdENS_5IfdIdE:
 2527|  20.0M|bool isMakerIfd(IfdId ifdId) {
 2528|  20.0M|  if (auto ii = Exiv2::find(groupInfo, ifdId))
  ------------------
  |  Branch (2528:12): [True: 20.0M, False: 0]
  ------------------
 2529|  20.0M|    return std::string_view("Makernote") == ii->ifdName_;
 2530|      0|  return false;
 2531|  20.0M|}
_ZN5Exiv28Internal9isExifIfdENS_5IfdIdE:
 2533|  21.6M|bool isExifIfd(IfdId ifdId) {
 2534|  21.6M|  switch (ifdId) {
 2535|   913k|    case IfdId::ifd0Id:
  ------------------
  |  Branch (2535:5): [True: 913k, False: 20.7M]
  ------------------
 2536|   964k|    case IfdId::exifId:
  ------------------
  |  Branch (2536:5): [True: 50.3k, False: 21.6M]
  ------------------
 2537|  1.00M|    case IfdId::gpsId:
  ------------------
  |  Branch (2537:5): [True: 43.7k, False: 21.6M]
  ------------------
 2538|  1.01M|    case IfdId::iopId:
  ------------------
  |  Branch (2538:5): [True: 9.84k, False: 21.6M]
  ------------------
 2539|  1.04M|    case IfdId::ifd1Id:
  ------------------
  |  Branch (2539:5): [True: 23.6k, False: 21.6M]
  ------------------
 2540|  1.05M|    case IfdId::ifd2Id:
  ------------------
  |  Branch (2540:5): [True: 8.62k, False: 21.6M]
  ------------------
 2541|  1.05M|    case IfdId::ifd3Id:
  ------------------
  |  Branch (2541:5): [True: 1.70k, False: 21.6M]
  ------------------
 2542|  1.05M|    case IfdId::mpfId:
  ------------------
  |  Branch (2542:5): [True: 0, False: 21.6M]
  ------------------
 2543|  1.18M|    case IfdId::subImage1Id:
  ------------------
  |  Branch (2543:5): [True: 128k, False: 21.5M]
  ------------------
 2544|  1.29M|    case IfdId::subImage2Id:
  ------------------
  |  Branch (2544:5): [True: 111k, False: 21.5M]
  ------------------
 2545|  1.38M|    case IfdId::subImage3Id:
  ------------------
  |  Branch (2545:5): [True: 93.8k, False: 21.5M]
  ------------------
 2546|  1.48M|    case IfdId::subImage4Id:
  ------------------
  |  Branch (2546:5): [True: 94.8k, False: 21.5M]
  ------------------
 2547|  1.49M|    case IfdId::subImage5Id:
  ------------------
  |  Branch (2547:5): [True: 17.0k, False: 21.6M]
  ------------------
 2548|  1.50M|    case IfdId::subImage6Id:
  ------------------
  |  Branch (2548:5): [True: 12.1k, False: 21.6M]
  ------------------
 2549|  1.52M|    case IfdId::subImage7Id:
  ------------------
  |  Branch (2549:5): [True: 16.1k, False: 21.6M]
  ------------------
 2550|  1.53M|    case IfdId::subImage8Id:
  ------------------
  |  Branch (2550:5): [True: 13.4k, False: 21.6M]
  ------------------
 2551|  1.55M|    case IfdId::subImage9Id:
  ------------------
  |  Branch (2551:5): [True: 13.4k, False: 21.6M]
  ------------------
 2552|  1.56M|    case IfdId::subThumb1Id:
  ------------------
  |  Branch (2552:5): [True: 9.34k, False: 21.6M]
  ------------------
 2553|  1.62M|    case IfdId::panaRawId:
  ------------------
  |  Branch (2553:5): [True: 59.2k, False: 21.6M]
  ------------------
 2554|  1.62M|      return true;
 2555|  20.0M|    default:
  ------------------
  |  Branch (2555:5): [True: 20.0M, False: 1.62M]
  ------------------
 2556|  20.0M|      return false;
 2557|  21.6M|  }
 2558|  21.6M|}
_ZN5Exiv28Internal7tagListENS_5IfdIdE:
 2568|  22.8M|const TagInfo* tagList(IfdId ifdId) {
 2569|  22.8M|  if (auto ii = Exiv2::find(groupInfo, ifdId))
  ------------------
  |  Branch (2569:12): [True: 22.8M, False: 0]
  ------------------
 2570|  22.8M|    if (ii->tagList_)
  ------------------
  |  Branch (2570:9): [True: 22.8M, False: 0]
  ------------------
 2571|  22.8M|      return ii->tagList_();
 2572|      0|  return nullptr;
 2573|  22.8M|}  // tagList
_ZN5Exiv28Internal7tagInfoEtNS_5IfdIdE:
 2575|  22.3M|const TagInfo* tagInfo(uint16_t tag, IfdId ifdId) {
 2576|  22.3M|  if (auto ti = tagList(ifdId)) {
  ------------------
  |  Branch (2576:12): [True: 22.3M, False: 0]
  ------------------
 2577|  22.3M|    int idx = 0;
 2578|   918M|    for (idx = 0; ti[idx].tag_ != 0xffff; ++idx) {
  ------------------
  |  Branch (2578:19): [True: 898M, False: 20.1M]
  ------------------
 2579|   898M|      if (ti[idx].tag_ == tag)
  ------------------
  |  Branch (2579:11): [True: 2.23M, False: 896M]
  ------------------
 2580|  2.23M|        break;
 2581|   898M|    }
 2582|  22.3M|    return ti + idx;
 2583|  22.3M|  }
 2584|      0|  return nullptr;
 2585|  22.3M|}  // tagInfo
_ZN5Exiv28Internal7tagInfoERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5IfdIdE:
 2587|   474k|const TagInfo* tagInfo(const std::string& tagName, IfdId ifdId) {
 2588|   474k|  if (tagName.empty())
  ------------------
  |  Branch (2588:7): [True: 0, False: 474k]
  ------------------
 2589|      0|    return nullptr;
 2590|   474k|  if (auto ti = tagList(ifdId)) {
  ------------------
  |  Branch (2590:12): [True: 474k, False: 0]
  ------------------
 2591|  23.3M|    for (int idx = 0; ti[idx].tag_ != 0xffff; ++idx) {
  ------------------
  |  Branch (2591:23): [True: 23.3M, False: 30.0k]
  ------------------
 2592|  23.3M|      if (tagName == ti[idx].name_) {
  ------------------
  |  Branch (2592:11): [True: 444k, False: 22.9M]
  ------------------
 2593|   444k|        return ti + idx;
 2594|   444k|      }
 2595|  23.3M|    }
 2596|   474k|  }
 2597|  30.0k|  return nullptr;
 2598|   474k|}  // tagInfo
_ZN5Exiv28Internal7groupIdERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 2600|  23.9M|IfdId groupId(const std::string& groupName) {
 2601|  23.9M|  if (auto ii = Exiv2::find(groupInfo, groupName))
  ------------------
  |  Branch (2601:12): [True: 23.9M, False: 0]
  ------------------
 2602|  23.9M|    return IfdId{ii->ifdId_};
 2603|      0|  return IfdId::ifdIdNotSet;
 2604|  23.9M|}
_ZN5Exiv28Internal9groupNameENS_5IfdIdE:
 2612|  21.1M|const char* groupName(IfdId ifdId) {
 2613|  21.1M|  if (auto ii = Exiv2::find(groupInfo, ifdId))
  ------------------
  |  Branch (2613:12): [True: 21.1M, False: 0]
  ------------------
 2614|  21.1M|    return ii->groupName_;
 2615|      0|  return groupInfo[0].groupName_;
 2616|  21.1M|}
_ZN5Exiv28Internal10printValueERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2618|   265k|std::ostream& printValue(std::ostream& os, const Value& value, const ExifData*) {
 2619|   265k|  return os << value;
 2620|   265k|}
_ZN5Exiv28Internal12printBitmaskERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2622|  2.19k|std::ostream& printBitmask(std::ostream& os, const Value& value, const ExifData* metadata) {
 2623|  2.19k|  if (value.typeId() == Exiv2::unsignedShort || value.typeId() == Exiv2::signedShort) {
  ------------------
  |  Branch (2623:7): [True: 576, False: 1.62k]
  |  Branch (2623:49): [True: 1.13k, False: 488]
  ------------------
 2624|  1.71k|    uint16_t bit = 0;
 2625|  1.71k|    uint16_t comma = 0;
 2626|  13.7M|    for (size_t i = 0; i < value.count(); i++) {  // for each element in value array
  ------------------
  |  Branch (2626:24): [True: 13.7M, False: 1.71k]
  ------------------
 2627|  13.7M|      auto bits = static_cast<uint16_t>(value.toInt64(i));
 2628|   234M|      for (uint16_t b = 0; b < 16; ++b) {  // for every bit
  ------------------
  |  Branch (2628:28): [True: 220M, False: 13.7M]
  ------------------
 2629|   220M|        if (bits & (1 << b)) {
  ------------------
  |  Branch (2629:13): [True: 193M, False: 26.7M]
  ------------------
 2630|   193M|          if (comma++) {
  ------------------
  |  Branch (2630:15): [True: 193M, False: 4.54k]
  ------------------
 2631|   193M|            os << ",";
 2632|   193M|          }
 2633|   193M|          os << bit;
 2634|   193M|        }
 2635|   220M|        bit++;
 2636|   220M|      }
 2637|  13.7M|    }
 2638|       |    // if no bits are set, print "(none)"
 2639|  1.71k|    if (!comma)
  ------------------
  |  Branch (2639:9): [True: 68, False: 1.64k]
  ------------------
 2640|     68|      os << N_("(none)");
  ------------------
  |  |   41|     68|#define N_(String) String
  ------------------
 2641|  1.71k|  } else {
 2642|    488|    printValue(os, value, metadata);
 2643|    488|  }
 2644|  2.19k|  return os;
 2645|  2.19k|}
_ZN5Exiv28Internal7fnumberEf:
 2647|  9.94k|float fnumber(float apertureValue) {
 2648|  9.94k|  float result = std::exp2(apertureValue / 2.F);
 2649|  9.94k|  if (std::abs(result - 3.5F) < 0.1F) {
  ------------------
  |  Branch (2649:7): [True: 125, False: 9.81k]
  ------------------
 2650|    125|    result = 3.5F;
 2651|    125|  }
 2652|  9.94k|  return result;
 2653|  9.94k|}
_ZN5Exiv28Internal12exposureTimeEf:
 2655|  1.70k|URational exposureTime(float shutterSpeedValue) {
 2656|  1.70k|  URational ur(1, 1);
 2657|  1.70k|  const double tmp = std::exp2(shutterSpeedValue);
 2658|  1.70k|  if (tmp > 1) {
  ------------------
  |  Branch (2658:7): [True: 1.07k, False: 633]
  ------------------
 2659|  1.07k|    const double x = std::round(tmp);
 2660|       |    // Check that x is within the range of a uint32_t before casting.
 2661|  1.07k|    if (x <= std::numeric_limits<uint32_t>::max()) {
  ------------------
  |  Branch (2661:9): [True: 508, False: 566]
  ------------------
 2662|    508|      ur.second = static_cast<uint32_t>(x);
 2663|    508|    }
 2664|  1.07k|  } else {
 2665|    633|    const double x = std::round(1 / tmp);
 2666|       |    // Check that x is within the range of a uint32_t before casting.
 2667|    633|    if (0 <= x && x <= std::numeric_limits<uint32_t>::max()) {
  ------------------
  |  Branch (2667:9): [True: 633, False: 0]
  |  Branch (2667:19): [True: 569, False: 64]
  ------------------
 2668|    569|      ur.first = static_cast<uint32_t>(x);
 2669|    569|    }
 2670|    633|  }
 2671|  1.70k|  return ur;
 2672|  1.70k|}
_ZN5Exiv28Internal9tagNumberERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5IfdIdE:
 2674|   474k|uint16_t tagNumber(const std::string& tagName, IfdId ifdId) {
 2675|   474k|  auto ti = tagInfo(tagName, ifdId);
 2676|   474k|  if (ti && ti->tag_ != 0xffff)
  ------------------
  |  Branch (2676:7): [True: 444k, False: 30.0k]
  |  Branch (2676:13): [True: 444k, False: 0]
  ------------------
 2677|   444k|    return ti->tag_;
 2678|  30.0k|  if (!isHex(tagName, 4, "0x"))
  ------------------
  |  Branch (2678:7): [True: 0, False: 30.0k]
  ------------------
 2679|      0|    throw Error(ErrorCode::kerInvalidTag, tagName, ifdId);
 2680|  30.0k|  return static_cast<uint16_t>(std::stoi(tagName, nullptr, 16));
 2681|  30.0k|}  // tagNumber
_ZN5Exiv28Internal10printInt64ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2683|  2.88k|std::ostream& printInt64(std::ostream& os, const Value& value, const ExifData*) {
 2684|  2.88k|  Rational r = value.toRational();
 2685|  2.88k|  if (r.second > 0)
  ------------------
  |  Branch (2685:7): [True: 2.60k, False: 276]
  ------------------
 2686|  2.60k|    return os << static_cast<int64_t>(r.first) / r.second;
 2687|    276|  return os << "(" << value << ")";
 2688|  2.88k|}  // printLong
_ZN5Exiv28Internal10printFloatERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2690|  1.62k|std::ostream& printFloat(std::ostream& os, const Value& value, const ExifData*) {
 2691|  1.62k|  Rational r = value.toRational();
 2692|  1.62k|  if (r.second != 0) {
  ------------------
  |  Branch (2692:7): [True: 1.50k, False: 118]
  ------------------
 2693|  1.50k|    os << value.toFloat();
 2694|  1.50k|  } else {
 2695|    118|    os << "(" << value << ")";
 2696|    118|  }
 2697|  1.62k|  return os;
 2698|  1.62k|}  // printFloat
_ZN5Exiv28Internal12printDegreesERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2700|  1.05k|std::ostream& printDegrees(std::ostream& os, const Value& value, const ExifData*) {
 2701|  1.05k|  std::ios::fmtflags f(os.flags());
 2702|  1.05k|  if (value.count() == 3) {
  ------------------
  |  Branch (2702:7): [True: 958, False: 100]
  ------------------
 2703|    958|    Rational deg = value.toRational(0);
 2704|    958|    Rational min = value.toRational(1);
 2705|    958|    Rational sec = value.toRational(2);
 2706|    958|    if ((deg.second != 1) || (min.second <= 0) || (sec.second <= 0)) {
  ------------------
  |  Branch (2706:9): [True: 182, False: 776]
  |  Branch (2706:30): [True: 128, False: 648]
  |  Branch (2706:51): [True: 282, False: 366]
  ------------------
 2707|    592|      return os << "(" << value << ")";
 2708|    592|    }
 2709|    366|    const int32_t dd = deg.first;
 2710|    366|    const int32_t mm = min.first / min.second;
 2711|    366|    const int32_t rem = min.first % min.second;
 2712|    366|    if ((min.second > 1) && (rem > 0)) {
  ------------------
  |  Branch (2712:9): [True: 158, False: 208]
  |  Branch (2712:29): [True: 122, False: 36]
  ------------------
 2713|    122|      if ((sec.first == 0) && (sec.second == 1) && (rem <= std::numeric_limits<int32_t>::max() / 60)) {
  ------------------
  |  Branch (2713:11): [True: 52, False: 70]
  |  Branch (2713:31): [True: 46, False: 6]
  |  Branch (2713:52): [True: 42, False: 4]
  ------------------
 2714|     42|        sec.first = 60 * rem;
 2715|     42|        sec.second = min.second;
 2716|     80|      } else {
 2717|     80|        return os << "(" << value << ")";
 2718|     80|      }
 2719|    122|    }
 2720|    286|    const float ss = static_cast<float>(sec.first) / sec.second;
 2721|    286|    os << dd << " deg ";
 2722|    286|    os << mm << "' ";
 2723|    286|    std::ostringstream oss;
 2724|    286|    oss.copyfmt(os);
 2725|    286|    os << std::fixed << std::setprecision(sec.second > 1 ? 2 : 0) << ss << "\"";
  ------------------
  |  Branch (2725:43): [True: 58, False: 228]
  ------------------
 2726|    286|    os.copyfmt(oss);
 2727|    286|  } else {
 2728|    100|    os << "(" << value << ")";
 2729|    100|  }
 2730|    386|  os.flags(f);
 2731|    386|  return os;
 2732|  1.05k|}  // printDegrees
_ZN5Exiv28Internal9printUcs2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2734|    666|std::ostream& printUcs2(std::ostream& os, const Value& value, const ExifData*) {
 2735|    666|  bool cnv = false;
 2736|    666|  if (value.typeId() == unsignedByte && value.size() > 0) {
  ------------------
  |  Branch (2736:7): [True: 484, False: 182]
  |  Branch (2736:41): [True: 484, False: 0]
  ------------------
 2737|    484|    DataBuf buf(value.size());
 2738|    484|    value.copy(buf.data(), invalidByteOrder);
 2739|       |    // Strip trailing odd byte due to failing UCS-2 conversion
 2740|    484|    if (buf.size() % 2 == 1) {
  ------------------
  |  Branch (2740:9): [True: 172, False: 312]
  ------------------
 2741|    172|      buf.resize(buf.size() - 1);
 2742|    172|    }
 2743|       |
 2744|       |    // Strip trailing UCS-2 0-characters
 2745|  1.41k|    while (buf.size() >= 2) {
  ------------------
  |  Branch (2745:12): [True: 1.37k, False: 40]
  ------------------
 2746|  1.37k|      if (buf.read_uint8(buf.size() - 1) != 0 || buf.read_uint8(buf.size() - 2) != 0)
  ------------------
  |  Branch (2746:11): [True: 306, False: 1.07k]
  |  Branch (2746:50): [True: 138, False: 934]
  ------------------
 2747|    444|        break;
 2748|    934|      buf.resize(buf.size() - 2);
 2749|    934|    }
 2750|       |
 2751|    484|    std::string str(buf.c_str(), buf.size());
 2752|    484|    cnv = convertStringCharset(str, "UCS-2LE", "UTF-8");
 2753|    484|    if (cnv)
  ------------------
  |  Branch (2753:9): [True: 392, False: 92]
  ------------------
 2754|    392|      os << str;
 2755|    484|  }
 2756|    666|  if (!cnv)
  ------------------
  |  Branch (2756:7): [True: 274, False: 392]
  ------------------
 2757|    274|    os << value;
 2758|    666|  return os;
 2759|    666|}
_ZN5Exiv28Internal13printExifUnitERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2761|    314|std::ostream& printExifUnit(std::ostream& os, const Value& value, const ExifData* metadata) {
 2762|    314|  return EXV_PRINT_TAG(exifUnit)(os, value, metadata);
  ------------------
  |  |  199|    314|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2763|    314|}
_ZN5Exiv28Internal22printLensSpecificationERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2765|    992|std::ostream& printLensSpecification(std::ostream& os, const Value& value, const ExifData*) {
 2766|    992|  std::ios::fmtflags f(os.flags());
 2767|       |  // check type and count of values
 2768|    992|  if (value.typeId() != unsignedRational || value.count() != 4 ||
  ------------------
  |  Branch (2768:7): [True: 24, False: 968]
  |  Branch (2768:7): [True: 280, False: 712]
  |  Branch (2768:45): [True: 14, False: 954]
  ------------------
 2769|       |      // divisor may be zero only if dividend is not zero
 2770|    954|      (value.toRational(0).first != 0 && value.toRational(0).second == 0) ||
  ------------------
  |  Branch (2770:8): [True: 728, False: 226]
  |  Branch (2770:42): [True: 70, False: 658]
  ------------------
 2771|    884|      (value.toRational(1).first != 0 && value.toRational(1).second == 0) ||
  ------------------
  |  Branch (2771:8): [True: 600, False: 284]
  |  Branch (2771:42): [True: 32, False: 568]
  ------------------
 2772|    852|      (value.toRational(2).first != 0 && value.toRational(2).second == 0) ||
  ------------------
  |  Branch (2772:8): [True: 636, False: 216]
  |  Branch (2772:42): [True: 72, False: 564]
  ------------------
 2773|    780|      (value.toRational(3).first != 0 && value.toRational(3).second == 0)) {
  ------------------
  |  Branch (2773:8): [True: 602, False: 178]
  |  Branch (2773:42): [True: 68, False: 534]
  ------------------
 2774|    280|    return os << "(" << value << ")";
 2775|    280|  }
 2776|       |  // values numerically are ok, so they can be converted
 2777|       |  // here first and second can be zero, so initialise float with 0.0f
 2778|    712|  float focalLength1 = 0.0f;
 2779|    712|  if (value.toRational(0).first != 0)
  ------------------
  |  Branch (2779:7): [True: 512, False: 200]
  ------------------
 2780|    512|    focalLength1 = value.toFloat(0);
 2781|    712|  float focalLength2 = 0.0f;
 2782|    712|  if (value.toRational(1).first != 0)
  ------------------
  |  Branch (2782:7): [True: 458, False: 254]
  ------------------
 2783|    458|    focalLength2 = value.toFloat(1);
 2784|    712|  float fNumber1 = 0.0f;
 2785|    712|  if (value.toRational(2).first != 0)
  ------------------
  |  Branch (2785:7): [True: 512, False: 200]
  ------------------
 2786|    512|    fNumber1 = value.toFloat(2);
 2787|    712|  float fNumber2 = 0.0f;
 2788|    712|  if (value.toRational(3).first != 0)
  ------------------
  |  Branch (2788:7): [True: 534, False: 178]
  ------------------
 2789|    534|    fNumber2 = value.toFloat(3);
 2790|       |
 2791|       |  // first value must not be bigger than second
 2792|    712|  if ((std::isgreater(focalLength1, focalLength2) && std::isgreater(focalLength2, 0.0f)) ||
  ------------------
  |  Branch (2792:8): [True: 248, False: 464]
  |  Branch (2792:54): [True: 140, False: 108]
  ------------------
 2793|    572|      (std::isgreater(fNumber1, fNumber2) && std::isgreater(fNumber2, 0.0f))) {
  ------------------
  |  Branch (2793:8): [True: 170, False: 402]
  |  Branch (2793:46): [True: 110, False: 60]
  ------------------
 2794|    250|    return os << "(" << value << ")";
 2795|    250|  }
 2796|       |
 2797|       |  // no lens specification available
 2798|    462|  if (focalLength1 == 0.0f && focalLength2 == 0.0f && fNumber1 == 0.0f && fNumber2 == 0.0f)
  ------------------
  |  Branch (2798:7): [True: 194, False: 268]
  |  Branch (2798:31): [True: 146, False: 48]
  |  Branch (2798:55): [True: 94, False: 52]
  |  Branch (2798:75): [True: 62, False: 32]
  ------------------
 2799|     62|    return os << _("n/a");
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
 2800|       |
 2801|       |  // lens specification available - at least parts
 2802|    400|  if (focalLength1 == 0.0f)
  ------------------
  |  Branch (2802:7): [True: 132, False: 268]
  ------------------
 2803|    132|    os << _("n/a");
  ------------------
  |  |   40|    132|#define _(String) (String)
  ------------------
 2804|    268|  else
 2805|    268|    os << std::setprecision(5) << focalLength1;
 2806|    400|  if (focalLength1 != focalLength2) {
  ------------------
  |  Branch (2806:7): [True: 260, False: 140]
  ------------------
 2807|    260|    if (focalLength2 == 0.0f)
  ------------------
  |  Branch (2807:9): [True: 104, False: 156]
  ------------------
 2808|    104|      os << "-n/a ";
 2809|    156|    else
 2810|    156|      os << "-" << std::setprecision(5) << focalLength2;
 2811|    260|  }
 2812|    400|  os << "mm";
 2813|    400|  std::ostringstream oss;
 2814|    400|  oss.copyfmt(os);
 2815|       |
 2816|    400|  if (std::isgreater(fNumber1, 0.0f) || std::isgreater(fNumber2, 0.0f)) {
  ------------------
  |  Branch (2816:7): [True: 262, False: 138]
  |  Branch (2816:41): [True: 84, False: 54]
  ------------------
 2817|    346|    os << " F";
 2818|    346|    if (fNumber1 == 0.0f)
  ------------------
  |  Branch (2818:9): [True: 84, False: 262]
  ------------------
 2819|     84|      os << " n/a";
 2820|    262|    else
 2821|    262|      os << std::setprecision(2) << fNumber1;
 2822|    346|    if (fNumber1 != fNumber2) {
  ------------------
  |  Branch (2822:9): [True: 278, False: 68]
  ------------------
 2823|    278|      if (fNumber2 == 0.0f)
  ------------------
  |  Branch (2823:11): [True: 60, False: 218]
  ------------------
 2824|     60|        os << "-n/a";
 2825|    218|      else
 2826|    218|        os << "-" << std::setprecision(2) << fNumber2;
 2827|    278|    }
 2828|    346|  }
 2829|    400|  os.copyfmt(oss);
 2830|    400|  os.flags(f);
 2831|    400|  return os;
 2832|    462|}
_ZN5Exiv28Internal11print0x0000ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2834|  1.20k|std::ostream& print0x0000(std::ostream& os, const Value& value, const ExifData*) {
 2835|  1.20k|  if (value.size() != 4 || value.typeId() != unsignedByte) {
  ------------------
  |  Branch (2835:7): [True: 1.14k, False: 60]
  |  Branch (2835:28): [True: 46, False: 14]
  ------------------
 2836|  1.19k|    return os << value;
 2837|  1.19k|  }
 2838|       |
 2839|     56|  for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (2839:19): [True: 42, False: 14]
  ------------------
 2840|     42|    os << value.toInt64(i);
 2841|     42|    os << ".";
 2842|     42|  }
 2843|     14|  os << value.toInt64(3);
 2844|       |
 2845|     14|  return os;
 2846|  1.20k|}
_ZN5Exiv28Internal11print0x0005ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2848|    140|std::ostream& print0x0005(std::ostream& os, const Value& value, const ExifData* metadata) {
 2849|    140|  return EXV_PRINT_TAG(exifGPSAltitudeRef)(os, value, metadata);
  ------------------
  |  |  199|    140|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2850|    140|}
_ZN5Exiv28Internal11print0x0006ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2852|    322|std::ostream& print0x0006(std::ostream& os, const Value& value, const ExifData*) {
 2853|    322|  std::ios::fmtflags f(os.flags());
 2854|    322|  std::ostringstream oss;
 2855|    322|  oss.copyfmt(os);
 2856|    322|  const int32_t d = value.toRational().second;
 2857|    322|  if (d == 0)
  ------------------
  |  Branch (2857:7): [True: 68, False: 254]
  ------------------
 2858|     68|    return os << "(" << value << ")";
 2859|    254|  const int p = d > 1 ? 1 : 0;
  ------------------
  |  Branch (2859:17): [True: 116, False: 138]
  ------------------
 2860|    254|  os << std::fixed << std::setprecision(p) << value.toFloat() << " m";
 2861|    254|  os.copyfmt(oss);
 2862|       |
 2863|    254|  os.flags(f);
 2864|    254|  return os;
 2865|    322|}
_ZN5Exiv28Internal11print0x0007ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2867|    698|std::ostream& print0x0007(std::ostream& os, const Value& value, const ExifData*) {
 2868|    698|  std::ios::fmtflags f(os.flags());
 2869|    698|  if (value.count() == 3) {
  ------------------
  |  Branch (2869:7): [True: 584, False: 114]
  ------------------
 2870|  1.92k|    for (int i = 0; i < 3; ++i) {
  ------------------
  |  Branch (2870:21): [True: 1.53k, False: 396]
  ------------------
 2871|  1.53k|      if (value.toRational(i).second == 0) {
  ------------------
  |  Branch (2871:11): [True: 188, False: 1.34k]
  ------------------
 2872|    188|        return os << "(" << value << ")";
 2873|    188|      }
 2874|  1.53k|    }
 2875|    396|    std::ostringstream oss;
 2876|    396|    oss.copyfmt(os);
 2877|    396|    const double t = (3600.0 * value.toInt64(0)) + (60.0 * value.toInt64(1)) + value.toFloat(2);
 2878|    396|    enforce<std::overflow_error>(std::isfinite(t), "Non-finite time value");
 2879|    396|    int p = 0;
 2880|    396|    const double fraction = std::fmod(t, 1);
 2881|    396|    if (fraction != 0)
  ------------------
  |  Branch (2881:9): [True: 232, False: 164]
  ------------------
 2882|    232|      p = 1;
 2883|    396|    const double ss = std::fmod(t, 60);
 2884|    396|    const double minutes = (t - ss) / 60;
 2885|    396|    const auto mm = static_cast<int>(std::fmod(minutes, 60));
 2886|    396|    const double hours = (minutes - mm) / 60;
 2887|    396|    const auto hh = static_cast<int>(std::fmod(hours, 24));
 2888|       |
 2889|    396|    os << std::setw(2) << std::setfill('0') << std::right << hh << ":" << std::setw(2) << std::setfill('0')
 2890|    396|       << std::right << mm << ":" << std::setw(2 + (p * 2)) << std::setfill('0') << std::right << std::fixed
 2891|    396|       << std::setprecision(p) << ss;
 2892|       |
 2893|    396|    os.copyfmt(oss);
 2894|    396|  } else {
 2895|    114|    os << value;
 2896|    114|  }
 2897|       |
 2898|    510|  os.flags(f);
 2899|    510|  return os;
 2900|    698|}
_ZN5Exiv28Internal11print0x0009ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2902|    134|std::ostream& print0x0009(std::ostream& os, const Value& value, const ExifData* metadata) {
 2903|    134|  return EXV_PRINT_TAG(exifGPSStatus)(os, value, metadata);
  ------------------
  |  |  199|    134|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2904|    134|}
_ZN5Exiv28Internal11print0x000aERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2906|     70|std::ostream& print0x000a(std::ostream& os, const Value& value, const ExifData* metadata) {
 2907|     70|  return EXV_PRINT_TAG(exifGPSMeasureMode)(os, value, metadata);
  ------------------
  |  |  199|     70|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2908|     70|}
_ZN5Exiv28Internal11print0x000cERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2910|    284|std::ostream& print0x000c(std::ostream& os, const Value& value, const ExifData* metadata) {
 2911|    284|  return EXV_PRINT_TAG(exifGPSSpeedRef)(os, value, metadata);
  ------------------
  |  |  199|    284|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2912|    284|}
_ZN5Exiv28Internal11print0x0019ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2914|    188|std::ostream& print0x0019(std::ostream& os, const Value& value, const ExifData* metadata) {
 2915|    188|  return EXV_PRINT_TAG(exifGPSDestDistanceRef)(os, value, metadata);
  ------------------
  |  |  199|    188|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2916|    188|}
_ZN5Exiv28Internal11print0x001eERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2918|    188|std::ostream& print0x001e(std::ostream& os, const Value& value, const ExifData* metadata) {
 2919|    188|  return EXV_PRINT_TAG(exifGPSDifferential)(os, value, metadata);
  ------------------
  |  |  199|    188|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2920|    188|}
_ZN5Exiv28Internal11print0x0112ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2922|  1.16k|std::ostream& print0x0112(std::ostream& os, const Value& value, const ExifData* metadata) {
 2923|  1.16k|  return EXV_PRINT_TAG(exifOrientation)(os, value, metadata);
  ------------------
  |  |  199|  1.16k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2924|  1.16k|}
_ZN5Exiv28Internal11print0x0213ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2931|    264|std::ostream& print0x0213(std::ostream& os, const Value& value, const ExifData* metadata) {
 2932|    264|  return EXV_PRINT_TAG(exifYCbCrPositioning)(os, value, metadata);
  ------------------
  |  |  199|    264|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2933|    264|}
_ZN5Exiv28Internal11print0x8298ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2935|    140|std::ostream& print0x8298(std::ostream& os, const Value& value, const ExifData*) {
 2936|       |  // Print the copyright information in the format Photographer, Editor
 2937|    140|  std::string val = value.toString();
 2938|    140|  std::string::size_type pos = val.find('\0');
 2939|    140|  if (pos != std::string::npos) {
  ------------------
  |  Branch (2939:7): [True: 0, False: 140]
  ------------------
 2940|      0|    std::string photographer(val, 0, pos);
 2941|      0|    if (photographer != " ")
  ------------------
  |  Branch (2941:9): [True: 0, False: 0]
  ------------------
 2942|      0|      os << photographer;
 2943|      0|    std::string editor(val, pos + 1);
 2944|      0|    if (!editor.empty()) {
  ------------------
  |  Branch (2944:9): [True: 0, False: 0]
  ------------------
 2945|      0|      if (photographer != " ")
  ------------------
  |  Branch (2945:11): [True: 0, False: 0]
  ------------------
 2946|      0|        os << ", ";
 2947|      0|      os << editor;
 2948|      0|    }
 2949|    140|  } else {
 2950|    140|    os << val;
 2951|    140|  }
 2952|    140|  return os;
 2953|    140|}
_ZN5Exiv28Internal11print0x829aERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2955|    456|std::ostream& print0x829a(std::ostream& os, const Value& value, const ExifData*) {
 2956|    456|  if (value.count() == 0)
  ------------------
  |  Branch (2956:7): [True: 0, False: 456]
  ------------------
 2957|      0|    return os;
 2958|    456|  if (value.typeId() != unsignedRational)
  ------------------
  |  Branch (2958:7): [True: 44, False: 412]
  ------------------
 2959|     44|    return os << "(" << value << ")";
 2960|       |
 2961|    412|  using Exiv2::operator<<;
 2962|    412|  URational t = value.toRational();
 2963|    412|  if (t.first == 0 || t.second == 0) {
  ------------------
  |  Branch (2963:7): [True: 72, False: 340]
  |  Branch (2963:23): [True: 72, False: 268]
  ------------------
 2964|    144|    os << "(" << t << ")";
 2965|    268|  } else if (t.second == t.first) {
  ------------------
  |  Branch (2965:14): [True: 36, False: 232]
  ------------------
 2966|     36|    os << "1 s";
 2967|    232|  } else if (t.second % t.first == 0) {
  ------------------
  |  Branch (2967:14): [True: 132, False: 100]
  ------------------
 2968|    132|    t.second = t.second / t.first;
 2969|    132|    t.first = 1;
 2970|    132|    os << t << " s";
 2971|    132|  } else {
 2972|    100|    os << static_cast<float>(t.first) / t.second << " s";
 2973|    100|  }
 2974|    412|  return os;
 2975|    456|}
_ZN5Exiv28Internal11print0x829dERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2977|    274|std::ostream& print0x829d(std::ostream& os, const Value& value, const ExifData*) {
 2978|    274|  Rational fnumber = value.toRational();
 2979|    274|  if (fnumber.second != 0)
  ------------------
  |  Branch (2979:7): [True: 202, False: 72]
  ------------------
 2980|    202|    return os << stringFormat("F{:.2g}", static_cast<float>(fnumber.first) / fnumber.second);
  ------------------
  |  |   18|    202|#define stringFormat std::format
  ------------------
 2981|     72|  return os << "(" << value << ")";
 2982|    274|}
_ZN5Exiv28Internal11print0x8822ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2991|    770|std::ostream& print0x8822(std::ostream& os, const Value& value, const ExifData* metadata) {
 2992|    770|  return EXV_PRINT_TAG(exifExposureProgram)(os, value, metadata);
  ------------------
  |  |  199|    770|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 2993|    770|}
_ZN5Exiv28Internal11print0x8827ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2995|    222|std::ostream& print0x8827(std::ostream& os, const Value& value, const ExifData*) {
 2996|    222|  return os << value.toInt64();
 2997|    222|}
_ZN5Exiv28Internal11print0x9101ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 2999|    224|std::ostream& print0x9101(std::ostream& os, const Value& value, const ExifData*) {
 3000|   132k|  for (size_t i = 0; i < value.count(); ++i) {
  ------------------
  |  Branch (3000:22): [True: 132k, False: 224]
  ------------------
 3001|   132k|    const auto l = value.toInt64(i);
 3002|   132k|    switch (l) {
 3003|  71.9k|      case 0:
  ------------------
  |  Branch (3003:7): [True: 71.9k, False: 60.2k]
  ------------------
 3004|  71.9k|        break;
 3005|  5.32k|      case 1:
  ------------------
  |  Branch (3005:7): [True: 5.32k, False: 126k]
  ------------------
 3006|  5.32k|        os << "Y";
 3007|  5.32k|        break;
 3008|  3.56k|      case 2:
  ------------------
  |  Branch (3008:7): [True: 3.56k, False: 128k]
  ------------------
 3009|  3.56k|        os << "Cb";
 3010|  3.56k|        break;
 3011|  3.76k|      case 3:
  ------------------
  |  Branch (3011:7): [True: 3.76k, False: 128k]
  ------------------
 3012|  3.76k|        os << "Cr";
 3013|  3.76k|        break;
 3014|  1.75k|      case 4:
  ------------------
  |  Branch (3014:7): [True: 1.75k, False: 130k]
  ------------------
 3015|  1.75k|        os << "R";
 3016|  1.75k|        break;
 3017|  1.42k|      case 5:
  ------------------
  |  Branch (3017:7): [True: 1.42k, False: 130k]
  ------------------
 3018|  1.42k|        os << "G";
 3019|  1.42k|        break;
 3020|    814|      case 6:
  ------------------
  |  Branch (3020:7): [True: 814, False: 131k]
  ------------------
 3021|    814|        os << "B";
 3022|    814|        break;
 3023|  43.6k|      default:
  ------------------
  |  Branch (3023:7): [True: 43.6k, False: 88.5k]
  ------------------
 3024|  43.6k|        os << "(" << l << ")";
 3025|  43.6k|        break;
 3026|   132k|    }
 3027|   132k|  }
 3028|    224|  return os;
 3029|    224|}
_ZN5Exiv28Internal11print0x9201ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3031|  1.18k|std::ostream& print0x9201(std::ostream& os, const Value& value, const ExifData*) {
 3032|  1.18k|  Rational r = value.toRational();
 3033|  1.18k|  if (!value.ok() || r.second == 0)
  ------------------
  |  Branch (3033:7): [True: 0, False: 1.18k]
  |  Branch (3033:22): [True: 246, False: 942]
  ------------------
 3034|    246|    return os << "(" << value << ")";
 3035|       |
 3036|    942|  URational ur = exposureTime(static_cast<float>(r.first) / r.second);
 3037|    942|  os << ur.first;
 3038|    942|  if (ur.second > 1) {
  ------------------
  |  Branch (3038:7): [True: 206, False: 736]
  ------------------
 3039|    206|    os << "/" << ur.second;
 3040|    206|  }
 3041|    942|  return os << " s";
 3042|  1.18k|}
_ZN5Exiv28Internal11print0x9202ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3044|    784|std::ostream& print0x9202(std::ostream& os, const Value& value, const ExifData*) {
 3045|    784|  if (value.count() == 0 || value.toRational().second == 0)
  ------------------
  |  Branch (3045:7): [True: 0, False: 784]
  |  Branch (3045:7): [True: 90, False: 694]
  |  Branch (3045:29): [True: 90, False: 694]
  ------------------
 3046|     90|    return os << "(" << value << ")";
 3047|    694|  return os << stringFormat("F{:.2g}", fnumber(value.toFloat()));
  ------------------
  |  |   18|    694|#define stringFormat std::format
  ------------------
 3048|    784|}
_ZN5Exiv28Internal11print0x9204ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3050|    948|std::ostream& print0x9204(std::ostream& os, const Value& value, const ExifData*) {
 3051|    948|  Rational bias = value.toRational();
 3052|       |
 3053|    948|  if (bias.first == 0 || bias.first == std::numeric_limits<std::int32_t>::min()) {
  ------------------
  |  Branch (3053:7): [True: 230, False: 718]
  |  Branch (3053:26): [True: 62, False: 656]
  ------------------
 3054|    292|    os << "0 EV";
 3055|    656|  } else if (bias.second <= 0) {
  ------------------
  |  Branch (3055:14): [True: 178, False: 478]
  ------------------
 3056|    178|    os << "(" << bias.first << "/" << bias.second << ")";
 3057|    478|  } else {
 3058|    478|    int32_t d = std::gcd(bias.first, bias.second);
 3059|    478|    int32_t num = std::abs(bias.first) / d;
 3060|    478|    int32_t den = bias.second / d;
 3061|    478|    os << (bias.first < 0 ? "-" : "+") << num;
  ------------------
  |  Branch (3061:12): [True: 132, False: 346]
  ------------------
 3062|    478|    if (den != 1) {
  ------------------
  |  Branch (3062:9): [True: 298, False: 180]
  ------------------
 3063|    298|      os << "/" << den;
 3064|    298|    }
 3065|    478|    os << " EV";
 3066|    478|  }
 3067|    948|  return os;
 3068|    948|}
_ZN5Exiv28Internal11print0x9206ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3070|    250|std::ostream& print0x9206(std::ostream& os, const Value& value, const ExifData*) {
 3071|    250|  Rational distance = value.toRational();
 3072|    250|  if (distance.first == 0)
  ------------------
  |  Branch (3072:7): [True: 56, False: 194]
  ------------------
 3073|     56|    return os << _("Unknown");
  ------------------
  |  |   40|     56|#define _(String) (String)
  ------------------
 3074|    194|  if (static_cast<uint32_t>(distance.first) == std::numeric_limits<uint32_t>::max())
  ------------------
  |  Branch (3074:7): [True: 30, False: 164]
  ------------------
 3075|     30|    return os << _("Infinity");
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
 3076|    164|  if (distance.second != 0)
  ------------------
  |  Branch (3076:7): [True: 130, False: 34]
  ------------------
 3077|    130|    return os << stringFormat("{:.2f} m", static_cast<float>(distance.first) / distance.second);
  ------------------
  |  |   18|    130|#define stringFormat std::format
  ------------------
 3078|     34|  return os << "(" << value << ")";
 3079|    164|}
_ZN5Exiv28Internal11print0x9207ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3088|  3.02k|std::ostream& print0x9207(std::ostream& os, const Value& value, const ExifData* metadata) {
 3089|  3.02k|  return EXV_PRINT_TAG(exifMeteringMode)(os, value, metadata);
  ------------------
  |  |  199|  3.02k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3090|  3.02k|}
_ZN5Exiv28Internal11print0x9208ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3092|  2.43k|std::ostream& print0x9208(std::ostream& os, const Value& value, const ExifData* metadata) {
 3093|  2.43k|  return EXV_PRINT_TAG(exifLightSource)(os, value, metadata);
  ------------------
  |  |  199|  2.43k|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3094|  2.43k|}
_ZN5Exiv28Internal11print0x920aERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3096|    904|std::ostream& print0x920a(std::ostream& os, const Value& value, const ExifData*) {
 3097|    904|  Rational length = value.toRational();
 3098|    904|  if (length.second != 0)
  ------------------
  |  Branch (3098:7): [True: 696, False: 208]
  ------------------
 3099|    696|    return os << stringFormat("{:.1f} mm", static_cast<float>(length.first) / length.second);
  ------------------
  |  |   18|    696|#define stringFormat std::format
  ------------------
 3100|    208|  return os << "(" << value << ")";
 3101|    904|}
_ZN5Exiv28Internal11print0xa001ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3110|    256|std::ostream& print0xa001(std::ostream& os, const Value& value, const ExifData* metadata) {
 3111|    256|  return EXV_PRINT_TAG(exifColorSpace)(os, value, metadata);
  ------------------
  |  |  199|    256|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3112|    256|}
_ZN5Exiv28Internal11print0xa217ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3125|    598|std::ostream& print0xa217(std::ostream& os, const Value& value, const ExifData* metadata) {
 3126|    598|  return EXV_PRINT_TAG(exifSensingMethod)(os, value, metadata);
  ------------------
  |  |  199|    598|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3127|    598|}
_ZN5Exiv28Internal11print0xa300ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3136|    170|std::ostream& print0xa300(std::ostream& os, const Value& value, const ExifData* metadata) {
 3137|    170|  return EXV_PRINT_TAG(exifFileSource)(os, value, metadata);
  ------------------
  |  |  199|    170|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3138|    170|}
_ZN5Exiv28Internal11print0xa301ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3145|     56|std::ostream& print0xa301(std::ostream& os, const Value& value, const ExifData* metadata) {
 3146|     56|  return EXV_PRINT_TAG(exifSceneType)(os, value, metadata);
  ------------------
  |  |  199|     56|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3147|     56|}
_ZN5Exiv28Internal11print0xa401ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3155|    172|std::ostream& print0xa401(std::ostream& os, const Value& value, const ExifData* metadata) {
 3156|    172|  return EXV_PRINT_TAG(exifCustomRendered)(os, value, metadata);
  ------------------
  |  |  199|    172|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3157|    172|}
_ZN5Exiv28Internal11print0xa402ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3166|    254|std::ostream& print0xa402(std::ostream& os, const Value& value, const ExifData* metadata) {
 3167|    254|  return EXV_PRINT_TAG(exifExposureMode)(os, value, metadata);
  ------------------
  |  |  199|    254|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3168|    254|}
_ZN5Exiv28Internal11print0xa403ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3176|    392|std::ostream& print0xa403(std::ostream& os, const Value& value, const ExifData* metadata) {
 3177|    392|  return EXV_PRINT_TAG(exifWhiteBalance)(os, value, metadata);
  ------------------
  |  |  199|    392|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3178|    392|}
_ZN5Exiv28Internal11print0xa404ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3180|    168|std::ostream& print0xa404(std::ostream& os, const Value& value, const ExifData*) {
 3181|    168|  Rational zoom = value.toRational();
 3182|    168|  if (zoom.second == 0)
  ------------------
  |  Branch (3182:7): [True: 36, False: 132]
  ------------------
 3183|     36|    return os << _("Digital zoom not used");
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
 3184|    132|  return os << stringFormat("{:.1f}", static_cast<float>(zoom.first) / zoom.second);
  ------------------
  |  |   18|    132|#define stringFormat std::format
  ------------------
 3185|    168|}
_ZN5Exiv28Internal11print0xa405ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3187|     98|std::ostream& print0xa405(std::ostream& os, const Value& value, const ExifData*) {
 3188|     98|  if (auto length = value.toInt64(); length != 0)
  ------------------
  |  Branch (3188:38): [True: 62, False: 36]
  ------------------
 3189|     62|    return os << length << ".0 mm";
 3190|     36|  return os << _("Unknown");
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
 3191|     98|}
_ZN5Exiv28Internal11print0xa406ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3201|    622|std::ostream& print0xa406(std::ostream& os, const Value& value, const ExifData* metadata) {
 3202|    622|  return EXV_PRINT_TAG(exifSceneCaptureType)(os, value, metadata);
  ------------------
  |  |  199|    622|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3203|    622|}
_ZN5Exiv28Internal11print0xa407ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3211|    604|std::ostream& print0xa407(std::ostream& os, const Value& value, const ExifData* metadata) {
 3212|    604|  return EXV_PRINT_TAG(exifGainControl)(os, value, metadata);
  ------------------
  |  |  199|    604|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3213|    604|}
_ZN5Exiv28Internal11print0xa409ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3222|    342|std::ostream& print0xa409(std::ostream& os, const Value& value, const ExifData* metadata) {
 3223|    342|  return EXV_PRINT_TAG(exifSaturation)(os, value, metadata);
  ------------------
  |  |  199|    342|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3224|    342|}
_ZN5Exiv28Internal11print0xa40cERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3234|    280|std::ostream& print0xa40c(std::ostream& os, const Value& value, const ExifData* metadata) {
 3235|    280|  return EXV_PRINT_TAG(exifSubjectDistanceRange)(os, value, metadata);
  ------------------
  |  |  199|    280|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3236|    280|}
_ZN5Exiv28Internal14printGPSDirRefERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3238|    152|std::ostream& printGPSDirRef(std::ostream& os, const Value& value, const ExifData* metadata) {
 3239|    152|  return EXV_PRINT_TAG(exifGPSDirRef)(os, value, metadata);
  ------------------
  |  |  199|    152|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3240|    152|}
_ZN5Exiv28Internal19printNormalSoftHardERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3249|    270|std::ostream& printNormalSoftHard(std::ostream& os, const Value& value, const ExifData* metadata) {
 3250|    270|  return EXV_PRINT_TAG(exifNormalSoftHard)(os, value, metadata);
  ------------------
  |  |  199|    270|#define EXV_PRINT_TAG(array) printTag<std::size(array), array>
  ------------------
 3251|    270|}
_ZN5Exiv28Internal16printExifVersionERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS_5ValueEPKNS_8ExifDataE:
 3253|  3.85k|std::ostream& printExifVersion(std::ostream& os, const Value& value, const ExifData*) {
 3254|  3.85k|  if (value.size() != 4 || value.typeId() != undefined) {
  ------------------
  |  Branch (3254:7): [True: 2.19k, False: 1.66k]
  |  Branch (3254:28): [True: 550, False: 1.11k]
  ------------------
 3255|  2.74k|    return os << "(" << value << ")";
 3256|  2.74k|  }
 3257|       |
 3258|  1.11k|  char s[5];
 3259|  5.56k|  for (int i = 0; i < 4; ++i) {
  ------------------
  |  Branch (3259:19): [True: 4.44k, False: 1.11k]
  ------------------
 3260|  4.44k|    s[i] = static_cast<char>(value.toInt64(i));
 3261|  4.44k|  }
 3262|  1.11k|  s[4] = '\0';
 3263|       |
 3264|  1.11k|  return printVersion(os, s);
 3265|  3.85k|}
_ZN5Exiv28Internal7tagListERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 3294|  4.84k|const TagInfo* tagList(const std::string& groupName) {
 3295|  4.84k|  auto ii = Exiv2::find(groupInfo, groupName);
 3296|  4.84k|  if (!ii || !ii->tagList_) {
  ------------------
  |  Branch (3296:7): [True: 0, False: 4.84k]
  |  Branch (3296:14): [True: 0, False: 4.84k]
  ------------------
 3297|      0|    return nullptr;
 3298|      0|  }
 3299|  4.84k|  return ii->tagList_();
 3300|  4.84k|}
tags_int.cpp:_ZN12_GLOBAL__N_112printVersionERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEENS0_17basic_string_viewIcS3_EE:
   33|  1.11k|std::ostream& printVersion(std::ostream& os, std::string_view str) {
   34|  1.11k|  if (str.size() != 4) {
  ------------------
  |  Branch (34:7): [True: 56, False: 1.05k]
  ------------------
   35|     56|    return os << "(" << str << ")";
   36|     56|  }
   37|  1.05k|  if (str.front() != '0')
  ------------------
  |  Branch (37:7): [True: 92, False: 964]
  ------------------
   38|     92|    os << str.front();
   39|  1.05k|  return os << str[1] << "." << str[2] << str[3];
   40|  1.11k|}

_ZNK5Exiv28Internal10TagDetailseqEl:
   50|  8.31M|  bool operator==(int64_t key) const {
   51|  8.31M|    return key == val_;
   52|  8.31M|  }
_ZNK5Exiv28Internal16StringTagDetailseqENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEE:
   64|  24.8k|  bool operator==(std::string_view key) const {
   65|  24.8k|    return key == val_;
   66|  24.8k|  }
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13nikon2QualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    410|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    410|  static_assert(N > 0, "Passed zero length printTag");
  195|    410|  return printTag<N, array>(os, value.toInt64(), data);
  196|    410|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13nikon2QualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    410|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    410|  static_assert(N > 0, "Passed zero length printTag");
  183|    410|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 256, False: 154]
  ------------------
  184|    256|    return os << _(td->label_);
  ------------------
  |  |   40|    256|#define _(String) (String)
  ------------------
  185|    154|  return os << "(" << value << ")";
  186|    410|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15nikon2ColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     68|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     68|  static_assert(N > 0, "Passed zero length printTag");
  195|     68|  return printTag<N, array>(os, value.toInt64(), data);
  196|     68|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15nikon2ColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     68|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     68|  static_assert(N > 0, "Passed zero length printTag");
  183|     68|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 38]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|     68|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21nikon2ImageAdjustmentEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    690|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    690|  static_assert(N > 0, "Passed zero length printTag");
  195|    690|  return printTag<N, array>(os, value.toInt64(), data);
  196|    690|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21nikon2ImageAdjustmentEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    690|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    690|  static_assert(N > 0, "Passed zero length printTag");
  183|    690|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 448, False: 242]
  ------------------
  184|    448|    return os << _(td->label_);
  ------------------
  |  |   40|    448|#define _(String) (String)
  ------------------
  185|    242|  return os << "(" << value << ")";
  186|    690|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14nikon2IsoSpeedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    960|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    960|  static_assert(N > 0, "Passed zero length printTag");
  195|    960|  return printTag<N, array>(os, value.toInt64(), data);
  196|    960|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14nikon2IsoSpeedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    960|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    960|  static_assert(N > 0, "Passed zero length printTag");
  183|    960|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 532, False: 428]
  ------------------
  184|    532|    return os << _(td->label_);
  ------------------
  |  |   40|    532|#define _(String) (String)
  ------------------
  185|    428|  return os << "(" << value << ")";
  186|    960|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18nikon2WhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.14k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.14k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.14k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.14k|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18nikon2WhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.14k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.14k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.14k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 726, False: 416]
  ------------------
  184|    726|    return os << _(td->label_);
  ------------------
  |  |   40|    726|#define _(String) (String)
  ------------------
  185|    416|  return os << "(" << value << ")";
  186|  1.14k|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14nikonFlashCompEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    698|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    698|  static_assert(N > 0, "Passed zero length printTag");
  195|    698|  return printTag<N, array>(os, value.toInt64(), data);
  196|    698|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14nikonFlashCompEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    698|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    698|  static_assert(N > 0, "Passed zero length printTag");
  183|    698|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 638, False: 60]
  ------------------
  184|    638|    return os << _(td->label_);
  ------------------
  |  |   40|    638|#define _(String) (String)
  ------------------
  185|     60|  return os << "(" << value << ")";
  186|    698|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15nikonColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    128|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    128|  static_assert(N > 0, "Passed zero length printTag");
  195|    128|  return printTag<N, array>(os, value.toInt64(), data);
  196|    128|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15nikonColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    128|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    128|  static_assert(N > 0, "Passed zero length printTag");
  183|    128|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 90, False: 38]
  ------------------
  184|     90|    return os << _(td->label_);
  ------------------
  |  |   40|     90|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|    128|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10nikonOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    240|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    240|  static_assert(N > 0, "Passed zero length printTag");
  195|    240|  return printTag<N, array>(os, value.toInt64(), data);
  196|    240|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10nikonOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    240|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    240|  static_assert(N > 0, "Passed zero length printTag");
  183|    240|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 86, False: 154]
  ------------------
  184|     86|    return os << _(td->label_);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  185|    154|  return os << "(" << value << ")";
  186|    240|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20nikonActiveDLightingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    314|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    314|  static_assert(N > 0, "Passed zero length printTag");
  195|    314|  return printTag<N, array>(os, value.toInt64(), data);
  196|    314|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20nikonActiveDLightingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    314|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    314|  static_assert(N > 0, "Passed zero length printTag");
  183|    314|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 248, False: 66]
  ------------------
  184|    248|    return os << _(td->label_);
  ------------------
  |  |   40|    248|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|    314|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9nikonOlnhEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    160|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    160|  static_assert(N > 0, "Passed zero length printTag");
  195|    160|  return printTag<N, array>(os, value.toInt64(), data);
  196|    160|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9nikonOlnhEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    160|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    160|  static_assert(N > 0, "Passed zero length printTag");
  183|    160|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 118, False: 42]
  ------------------
  184|    118|    return os << _(td->label_);
  ------------------
  |  |   40|    118|#define _(String) (String)
  ------------------
  185|     42|  return os << "(" << value << ")";
  186|    160|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonShutterModesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    236|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    236|  static_assert(N > 0, "Passed zero length printTag");
  195|    236|  return printTag<N, array>(os, value.toInt64(), data);
  196|    236|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonShutterModesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    236|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    236|  static_assert(N > 0, "Passed zero length printTag");
  183|    236|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 186, False: 50]
  ------------------
  184|    186|    return os << _(td->label_);
  ------------------
  |  |   40|    186|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|    236|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14nikonFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    512|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    512|  static_assert(N > 0, "Passed zero length printTag");
  195|    512|  return printTag<N, array>(os, value.toInt64(), data);
  196|    512|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14nikonFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    512|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    512|  static_assert(N > 0, "Passed zero length printTag");
  183|    512|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 428, False: 84]
  ------------------
  184|    428|    return os << _(td->label_);
  ------------------
  |  |   40|    428|#define _(String) (String)
  ------------------
  185|     84|  return os << "(" << value << ")";
  186|    512|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23nikonAutoBracketReleaseEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    188|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    188|  static_assert(N > 0, "Passed zero length printTag");
  195|    188|  return printTag<N, array>(os, value.toInt64(), data);
  196|    188|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23nikonAutoBracketReleaseEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    188|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    188|  static_assert(N > 0, "Passed zero length printTag");
  183|    188|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 134, False: 54]
  ------------------
  184|    134|    return os << _(td->label_);
  ------------------
  |  |   40|    134|#define _(String) (String)
  ------------------
  185|     54|  return os << "(" << value << ")";
  186|    188|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19nikonNefCompressionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    634|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    634|  static_assert(N > 0, "Passed zero length printTag");
  195|    634|  return printTag<N, array>(os, value.toInt64(), data);
  196|    634|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19nikonNefCompressionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    634|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    634|  static_assert(N > 0, "Passed zero length printTag");
  183|    634|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 280, False: 354]
  ------------------
  184|    280|    return os << _(td->label_);
  ------------------
  |  |   40|    280|#define _(String) (String)
  ------------------
  185|    354|  return os << "(" << value << ")";
  186|    634|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26nikonHighISONoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    164|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    164|  static_assert(N > 0, "Passed zero length printTag");
  195|    164|  return printTag<N, array>(os, value.toInt64(), data);
  196|    164|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26nikonHighISONoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    164|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    164|  static_assert(N > 0, "Passed zero length printTag");
  183|    164|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 114, False: 50]
  ------------------
  184|    114|    return os << _(td->label_);
  ------------------
  |  |   40|    114|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|    164|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10nikonOnOffEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     14|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     14|  static_assert(N > 0, "Passed zero length printTag");
  195|     14|  return printTag<N, array>(os, value.toInt64(), data);
  196|     14|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10nikonOnOffEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     14|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     14|  static_assert(N > 0, "Passed zero length printTag");
  183|     14|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 4, False: 10]
  ------------------
  184|      4|    return os << _(td->label_);
  ------------------
  |  |   40|      4|#define _(String) (String)
  ------------------
  185|     10|  return os << "(" << value << ")";
  186|     14|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11nikonAdjustEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     78|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     78|  static_assert(N > 0, "Passed zero length printTag");
  195|     78|  return printTag<N, array>(os, value.toInt64(), data);
  196|     78|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11nikonAdjustEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     78|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     78|  static_assert(N > 0, "Passed zero length printTag");
  183|     78|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 20, False: 58]
  ------------------
  184|     20|    return os << _(td->label_);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|     78|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonFilterEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     68|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     68|  static_assert(N > 0, "Passed zero length printTag");
  195|     68|  return printTag<N, array>(os, value.toInt64(), data);
  196|     68|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonFilterEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     68|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     68|  static_assert(N > 0, "Passed zero length printTag");
  183|     68|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 32, False: 36]
  ------------------
  184|     32|    return os << _(td->label_);
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|     68|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonToningEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     68|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     68|  static_assert(N > 0, "Passed zero length printTag");
  195|     68|  return printTag<N, array>(os, value.toInt64(), data);
  196|     68|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonToningEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     68|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     68|  static_assert(N > 0, "Passed zero length printTag");
  183|     68|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 46]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|     68|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8aftOnOffEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     92|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     92|  static_assert(N > 0, "Passed zero length printTag");
  195|     92|  return printTag<N, array>(os, value.toInt64(), data);
  196|     92|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8aftOnOffEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     92|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     92|  static_assert(N > 0, "Passed zero length printTag");
  183|     92|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 56]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|     56|  return os << "(" << value << ")";
  186|     92|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10nikonYesNoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    144|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    144|  static_assert(N > 0, "Passed zero length printTag");
  195|    144|  return printTag<N, array>(os, value.toInt64(), data);
  196|    144|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10nikonYesNoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    144|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    144|  static_assert(N > 0, "Passed zero length printTag");
  183|    144|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 26, False: 118]
  ------------------
  184|     26|    return os << _(td->label_);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  185|    118|  return os << "(" << value << ")";
  186|    144|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22nikonDateDisplayFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     60|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     60|  static_assert(N > 0, "Passed zero length printTag");
  195|     60|  return printTag<N, array>(os, value.toInt64(), data);
  196|     60|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22nikonDateDisplayFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     60|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     60|  static_assert(N > 0, "Passed zero length printTag");
  183|     60|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 46]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|     60|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm25ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonIsoExpansionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     40|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     40|  static_assert(N > 0, "Passed zero length printTag");
  195|     40|  return printTag<N, array>(os, value.toInt64(), data);
  196|     40|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm25ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonIsoExpansionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     40|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     40|  static_assert(N > 0, "Passed zero length printTag");
  183|     40|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 10, False: 30]
  ------------------
  184|     10|    return os << _(td->label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
  185|     30|  return os << "(" << value << ")";
  186|     40|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15nikonAfAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     98|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     98|  static_assert(N > 0, "Passed zero length printTag");
  195|     98|  return printTag<N, array>(os, value.toInt64(), data);
  196|     98|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15nikonAfAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     98|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     98|  static_assert(N > 0, "Passed zero length printTag");
  183|     98|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 58, False: 40]
  ------------------
  184|     58|    return os << _(td->label_);
  ------------------
  |  |   40|     58|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|     98|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12nikonAfPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     92|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     92|  static_assert(N > 0, "Passed zero length printTag");
  195|     92|  return printTag<N, array>(os, value.toInt64(), data);
  196|     92|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12nikonAfPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     92|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     92|  static_assert(N > 0, "Passed zero length printTag");
  183|     92|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 58, False: 34]
  ------------------
  184|     58|    return os << _(td->label_);
  ------------------
  |  |   40|     58|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|     92|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18nikonPhaseDetectAFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     78|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     78|  static_assert(N > 0, "Passed zero length printTag");
  195|     78|  return printTag<N, array>(os, value.toInt64(), data);
  196|     78|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18nikonPhaseDetectAFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     78|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     78|  static_assert(N > 0, "Passed zero length printTag");
  183|     78|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 48, False: 30]
  ------------------
  184|     48|    return os << _(td->label_);
  ------------------
  |  |   40|     48|#define _(String) (String)
  ------------------
  185|     30|  return os << "(" << value << ")";
  186|     78|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22nikonMultiExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     10|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     10|  static_assert(N > 0, "Passed zero length printTag");
  195|     10|  return printTag<N, array>(os, value.toInt64(), data);
  196|     10|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22nikonMultiExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     10|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     10|  static_assert(N > 0, "Passed zero length printTag");
  183|     10|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 4]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|      4|  return os << "(" << value << ")";
  186|     10|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16nikonFlashSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    102|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    102|  static_assert(N > 0, "Passed zero length printTag");
  195|    102|  return printTag<N, array>(os, value.toInt64(), data);
  196|    102|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16nikonFlashSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    102|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    102|  static_assert(N > 0, "Passed zero length printTag");
  183|    102|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 80]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    102|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm19ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18nikonFlashFirmwareEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     90|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     90|  static_assert(N > 0, "Passed zero length printTag");
  195|     90|  return printTag<N, array>(os, value.toInt64(), data);
  196|     90|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm19ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18nikonFlashFirmwareEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     90|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     90|  static_assert(N > 0, "Passed zero length printTag");
  183|     90|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 32, False: 58]
  ------------------
  184|     32|    return os << _(td->label_);
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|     90|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23nikonExternalFlashFlagsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     20|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     20|  static_assert(N > 0, "Passed zero length printTag");
  195|     20|  return printTag<N, array>(os, value.toInt64(), data);
  196|     20|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23nikonExternalFlashFlagsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     20|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     20|  static_assert(N > 0, "Passed zero length printTag");
  183|     20|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 12]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|     12|  return os << "(" << value << ")";
  186|     20|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm81ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20nikonFlashGNDistanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     82|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     82|  static_assert(N > 0, "Passed zero length printTag");
  195|     82|  return printTag<N, array>(os, value.toInt64(), data);
  196|     82|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm81ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20nikonFlashGNDistanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     82|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     82|  static_assert(N > 0, "Passed zero length printTag");
  183|     82|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 48, False: 34]
  ------------------
  184|     48|    return os << _(td->label_);
  ------------------
  |  |   40|     48|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|     82|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21nikonFlashControlModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|      8|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|      8|  static_assert(N > 0, "Passed zero length printTag");
  195|      8|  return printTag<N, array>(os, value.toInt64(), data);
  196|      8|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21nikonFlashColorFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     74|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     74|  static_assert(N > 0, "Passed zero length printTag");
  195|     74|  return printTag<N, array>(os, value.toInt64(), data);
  196|     74|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21nikonFlashColorFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     74|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     74|  static_assert(N > 0, "Passed zero length printTag");
  183|     74|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 20, False: 54]
  ------------------
  184|     20|    return os << _(td->label_);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  185|     54|  return os << "(" << value << ")";
  186|     74|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonFlashAWLModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     12|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     12|  static_assert(N > 0, "Passed zero length printTag");
  195|     12|  return printTag<N, array>(os, value.toInt64(), data);
  196|     12|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonFlashAWLModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     12|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     12|  static_assert(N > 0, "Passed zero length printTag");
  183|     12|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 12, False: 0]
  ------------------
  184|     12|    return os << _(td->label_);
  ------------------
  |  |   40|     12|#define _(String) (String)
  ------------------
  185|      0|  return os << "(" << value << ")";
  186|     12|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11nikonOffOn2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     34|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     34|  static_assert(N > 0, "Passed zero length printTag");
  195|     34|  return printTag<N, array>(os, value.toInt64(), data);
  196|     34|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11nikonOffOn2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     34|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     34|  static_assert(N > 0, "Passed zero length printTag");
  183|     34|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 10, False: 24]
  ------------------
  184|     10|    return os << _(td->label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
  185|     24|  return os << "(" << value << ")";
  186|     34|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11nikonOffOn3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|      8|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|      8|  static_assert(N > 0, "Passed zero length printTag");
  195|      8|  return printTag<N, array>(os, value.toInt64(), data);
  196|      8|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11nikonOffOn3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|      8|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|      8|  static_assert(N > 0, "Passed zero length printTag");
  183|      8|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 2]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|      2|  return os << "(" << value << ")";
  186|      8|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm53ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonZMountLensIdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    152|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    152|  static_assert(N > 0, "Passed zero length printTag");
  195|    152|  return printTag<N, array>(os, value.toInt64(), data);
  196|    152|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm53ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17nikonZMountLensIdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    152|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    152|  static_assert(N > 0, "Passed zero length printTag");
  183|    152|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 114, False: 38]
  ------------------
  184|    114|    return os << _(td->label_);
  ------------------
  |  |   40|    114|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|    152|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm18ETnRAT__KNS0_10TagDetailsEL_ZNS0_L35nikonAf2AreaModeContrastDetectAfOffEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     59|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     59|  static_assert(N > 0, "Passed zero length printTag");
  195|     59|  return printTag<N, array>(os, value.toInt64(), data);
  196|     59|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm18ETnRAT__KNS0_10TagDetailsEL_ZNS0_L35nikonAf2AreaModeContrastDetectAfOffEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     59|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     59|  static_assert(N > 0, "Passed zero length printTag");
  183|     59|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 54, False: 5]
  ------------------
  184|     54|    return os << _(td->label_);
  ------------------
  |  |   40|     54|#define _(String) (String)
  ------------------
  185|      5|  return os << "(" << value << ")";
  186|     59|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L34nikonAf2AreaModeContrastDetectAfOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     19|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     19|  static_assert(N > 0, "Passed zero length printTag");
  195|     19|  return printTag<N, array>(os, value.toInt64(), data);
  196|     19|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L34nikonAf2AreaModeContrastDetectAfOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     19|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     19|  static_assert(N > 0, "Passed zero length printTag");
  183|     19|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 5, False: 14]
  ------------------
  184|      5|    return os << _(td->label_);
  ------------------
  |  |   40|      5|#define _(String) (String)
  ------------------
  185|     14|  return os << "(" << value << ")";
  186|     19|}
nikonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm11ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L20nikonAfPointsInFocusEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|     90|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|     90|  static_assert(N > 0, "Passed zero length printTag");
  208|     90|  const auto val = value.toUint32();
  209|     90|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 2, False: 88]
  ------------------
  210|      2|    auto [mask, label] = *array;
  211|      2|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 2]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      2|  }
  214|     90|  bool sep = false;
  215|    990|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 990, False: 90]
  ------------------
  216|    990|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 231, False: 759]
  ------------------
  217|    231|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 145, False: 86]
  ------------------
  218|    145|        os << ", " << _(label);
  ------------------
  |  |   40|    145|#define _(String) (String)
  ------------------
  219|    145|      } else {
  220|     86|        os << _(label);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  221|     86|        sep = true;
  222|     86|      }
  223|    231|    }
  224|    990|  }
  225|     90|  return os;
  226|     90|}
nikonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm7ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L20nikonShootingModeD70EEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    158|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    158|  static_assert(N > 0, "Passed zero length printTag");
  208|    158|  const auto val = value.toUint32();
  209|    158|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 0, False: 158]
  ------------------
  210|      0|    auto [mask, label] = *array;
  211|      0|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 0]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      0|  }
  214|    158|  bool sep = false;
  215|  1.10k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 1.10k, False: 158]
  ------------------
  216|  1.10k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 461, False: 645]
  ------------------
  217|    461|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 314, False: 147]
  ------------------
  218|    314|        os << ", " << _(label);
  ------------------
  |  |   40|    314|#define _(String) (String)
  ------------------
  219|    314|      } else {
  220|    147|        os << _(label);
  ------------------
  |  |   40|    147|#define _(String) (String)
  ------------------
  221|    147|        sep = true;
  222|    147|      }
  223|    461|    }
  224|  1.10k|  }
  225|    158|  return os;
  226|    158|}
nikonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm9ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L17nikonShootingModeEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    804|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    804|  static_assert(N > 0, "Passed zero length printTag");
  208|    804|  const auto val = value.toUint32();
  209|    804|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 0, False: 804]
  ------------------
  210|      0|    auto [mask, label] = *array;
  211|      0|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 0]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      0|  }
  214|    804|  bool sep = false;
  215|  7.23k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 7.23k, False: 804]
  ------------------
  216|  7.23k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 2.25k, False: 4.98k]
  ------------------
  217|  2.25k|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 1.46k, False: 783]
  ------------------
  218|  1.46k|        os << ", " << _(label);
  ------------------
  |  |   40|  1.46k|#define _(String) (String)
  ------------------
  219|  1.46k|      } else {
  220|    783|        os << _(label);
  ------------------
  |  |   40|    783|#define _(String) (String)
  ------------------
  221|    783|        sep = true;
  222|    783|      }
  223|  2.25k|    }
  224|  7.23k|  }
  225|    804|  return os;
  226|    804|}
nikonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm3ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L18nikonFlashAdaptorsEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|     38|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|     38|  static_assert(N > 0, "Passed zero length printTag");
  208|     38|  const auto val = value.toUint32();
  209|     38|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 0, False: 38]
  ------------------
  210|      0|    auto [mask, label] = *array;
  211|      0|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 0]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      0|  }
  214|     38|  bool sep = false;
  215|    114|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 114, False: 38]
  ------------------
  216|    114|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 46, False: 68]
  ------------------
  217|     46|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 20, False: 26]
  ------------------
  218|     20|        os << ", " << _(label);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  219|     26|      } else {
  220|     26|        os << _(label);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  221|     26|        sep = true;
  222|     26|      }
  223|     46|    }
  224|    114|  }
  225|     38|  return os;
  226|     38|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21nikonFlashControlModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    246|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    246|  static_assert(N > 0, "Passed zero length printTag");
  183|    246|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 190, False: 56]
  ------------------
  184|    190|    return os << _(td->label_);
  ------------------
  |  |   40|    190|#define _(String) (String)
  ------------------
  185|     56|  return os << "(" << value << ")";
  186|    246|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22nikonFlashExposureCompEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     28|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     28|  static_assert(N > 0, "Passed zero length printTag");
  183|     28|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 0]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|      0|  return os << "(" << value << ")";
  186|     28|}
nikonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25nikonFlashIlluminationPatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     14|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     14|  static_assert(N > 0, "Passed zero length printTag");
  183|     14|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 8]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|      8|  return os << "(" << value << ")";
  186|     14|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifNewSubfileTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  4.45k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  4.45k|  static_assert(N > 0, "Passed zero length printTag");
  195|  4.45k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  4.45k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifNewSubfileTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  4.45k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  4.45k|  static_assert(N > 0, "Passed zero length printTag");
  183|  4.45k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 4.19k, False: 264]
  ------------------
  184|  4.19k|    return os << _(td->label_);
  ------------------
  |  |   40|  4.19k|#define _(String) (String)
  ------------------
  185|    264|  return os << "(" << value << ")";
  186|  4.45k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifSubfileTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    622|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    622|  static_assert(N > 0, "Passed zero length printTag");
  195|    622|  return printTag<N, array>(os, value.toInt64(), data);
  196|    622|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifSubfileTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    622|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    622|  static_assert(N > 0, "Passed zero length printTag");
  183|    622|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 242, False: 380]
  ------------------
  184|    242|    return os << _(td->label_);
  ------------------
  |  |   40|    242|#define _(String) (String)
  ------------------
  185|    380|  return os << "(" << value << ")";
  186|    622|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm34ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifCompressionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.69k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.69k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.69k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.69k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm34ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifCompressionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.69k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.69k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.69k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.22k, False: 476]
  ------------------
  184|  1.22k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.22k|#define _(String) (String)
  ------------------
  185|    476|  return os << "(" << value << ")";
  186|  1.69k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm16ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29exifPhotometricInterpretationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    972|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    972|  static_assert(N > 0, "Passed zero length printTag");
  195|    972|  return printTag<N, array>(os, value.toInt64(), data);
  196|    972|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm16ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29exifPhotometricInterpretationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    972|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    972|  static_assert(N > 0, "Passed zero length printTag");
  183|    972|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 736, False: 236]
  ------------------
  184|    736|    return os << _(td->label_);
  ------------------
  |  |   40|    736|#define _(String) (String)
  ------------------
  185|    236|  return os << "(" << value << ")";
  186|    972|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifThresholdingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    394|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    394|  static_assert(N > 0, "Passed zero length printTag");
  195|    394|  return printTag<N, array>(os, value.toInt64(), data);
  196|    394|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifThresholdingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    394|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    394|  static_assert(N > 0, "Passed zero length printTag");
  183|    394|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 184, False: 210]
  ------------------
  184|    184|    return os << _(td->label_);
  ------------------
  |  |   40|    184|#define _(String) (String)
  ------------------
  185|    210|  return os << "(" << value << ")";
  186|    394|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23exifPlanarConfigurationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    244|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    244|  static_assert(N > 0, "Passed zero length printTag");
  195|    244|  return printTag<N, array>(os, value.toInt64(), data);
  196|    244|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23exifPlanarConfigurationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    244|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    244|  static_assert(N > 0, "Passed zero length printTag");
  183|    244|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 170, False: 74]
  ------------------
  184|    170|    return os << _(td->label_);
  ------------------
  |  |   40|    170|#define _(String) (String)
  ------------------
  185|     74|  return os << "(" << value << ")";
  186|    244|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifPredictorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    444|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    444|  static_assert(N > 0, "Passed zero length printTag");
  195|    444|  return printTag<N, array>(os, value.toInt64(), data);
  196|    444|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifPredictorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    444|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    444|  static_assert(N > 0, "Passed zero length printTag");
  183|    444|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 214, False: 230]
  ------------------
  184|    214|    return os << _(td->label_);
  ------------------
  |  |   40|    214|#define _(String) (String)
  ------------------
  185|    230|  return os << "(" << value << ")";
  186|    444|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10exifInkSetEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    220|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    220|  static_assert(N > 0, "Passed zero length printTag");
  195|    220|  return printTag<N, array>(os, value.toInt64(), data);
  196|    220|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10exifInkSetEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    220|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    220|  static_assert(N > 0, "Passed zero length printTag");
  183|    220|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 130, False: 90]
  ------------------
  184|    130|    return os << _(td->label_);
  ------------------
  |  |   40|    130|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    220|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifSampleFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    428|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    428|  static_assert(N > 0, "Passed zero length printTag");
  195|    428|  return printTag<N, array>(os, value.toInt64(), data);
  196|    428|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifSampleFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    428|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    428|  static_assert(N > 0, "Passed zero length printTag");
  183|    428|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 270, False: 158]
  ------------------
  184|    270|    return os << _(td->label_);
  ------------------
  |  |   40|    270|#define _(String) (String)
  ------------------
  185|    158|  return os << "(" << value << ")";
  186|    428|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11exifIndexedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    218|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    218|  static_assert(N > 0, "Passed zero length printTag");
  195|    218|  return printTag<N, array>(os, value.toInt64(), data);
  196|    218|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11exifIndexedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    218|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    218|  static_assert(N > 0, "Passed zero length printTag");
  183|    218|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 88, False: 130]
  ------------------
  184|     88|    return os << _(td->label_);
  ------------------
  |  |   40|     88|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    218|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25exifJpegLosslessPredictorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.57k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.57k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.57k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.57k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25exifJpegLosslessPredictorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.57k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.57k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.57k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 746, False: 830]
  ------------------
  184|    746|    return os << _(td->label_);
  ------------------
  |  |   40|    746|#define _(String) (String)
  ------------------
  185|    830|  return os << "(" << value << ")";
  186|  1.57k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm27ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9exifFlashEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.41k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.41k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.41k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.41k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm27ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9exifFlashEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.41k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.41k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.41k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 3.03k, False: 384]
  ------------------
  184|  3.03k|    return os << _(td->label_);
  ------------------
  |  |   40|  3.03k|#define _(String) (String)
  ------------------
  185|    384|  return os << "(" << value << ")";
  186|  3.41k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28tiffFocalPlaneResolutionUnitEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    638|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    638|  static_assert(N > 0, "Passed zero length printTag");
  195|    638|  return printTag<N, array>(os, value.toInt64(), data);
  196|    638|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28tiffFocalPlaneResolutionUnitEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    638|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    638|  static_assert(N > 0, "Passed zero length printTag");
  183|    638|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 304, False: 334]
  ------------------
  184|    304|    return os << _(td->label_);
  ------------------
  |  |   40|    304|#define _(String) (String)
  ------------------
  185|    334|  return os << "(" << value << ")";
  186|    638|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17tiffSensingMethodEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    798|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    798|  static_assert(N > 0, "Passed zero length printTag");
  195|    798|  return printTag<N, array>(os, value.toInt64(), data);
  196|    798|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17tiffSensingMethodEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    798|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    798|  static_assert(N > 0, "Passed zero length printTag");
  183|    798|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 568, False: 230]
  ------------------
  184|    568|    return os << _(td->label_);
  ------------------
  |  |   40|    568|#define _(String) (String)
  ------------------
  185|    230|  return os << "(" << value << ")";
  186|    798|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12dngCfaLayoutEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    592|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    592|  static_assert(N > 0, "Passed zero length printTag");
  195|    592|  return printTag<N, array>(os, value.toInt64(), data);
  196|    592|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12dngCfaLayoutEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    592|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    592|  static_assert(N > 0, "Passed zero length printTag");
  183|    592|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 358, False: 234]
  ------------------
  184|    358|    return os << _(td->label_);
  ------------------
  |  |   40|    358|#define _(String) (String)
  ------------------
  185|    234|  return os << "(" << value << ")";
  186|    592|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18dngMakerNoteSafetyEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    522|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    522|  static_assert(N > 0, "Passed zero length printTag");
  195|    522|  return printTag<N, array>(os, value.toInt64(), data);
  196|    522|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18dngMakerNoteSafetyEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    522|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    522|  static_assert(N > 0, "Passed zero length printTag");
  183|    522|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 296, False: 226]
  ------------------
  184|    296|    return os << _(td->label_);
  ------------------
  |  |   40|    296|#define _(String) (String)
  ------------------
  185|    226|  return os << "(" << value << ")";
  186|    522|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24dngColorimetricReferenceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    252|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    252|  static_assert(N > 0, "Passed zero length printTag");
  195|    252|  return printTag<N, array>(os, value.toInt64(), data);
  196|    252|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24dngColorimetricReferenceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    252|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    252|  static_assert(N > 0, "Passed zero length printTag");
  183|    252|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 184, False: 68]
  ------------------
  184|    184|    return os << _(td->label_);
  ------------------
  |  |   40|    184|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|    252|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21dngProfileEmbedPolicyEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    218|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    218|  static_assert(N > 0, "Passed zero length printTag");
  195|    218|  return printTag<N, array>(os, value.toInt64(), data);
  196|    218|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21dngProfileEmbedPolicyEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    218|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    218|  static_assert(N > 0, "Passed zero length printTag");
  183|    218|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 150, False: 68]
  ------------------
  184|    150|    return os << _(td->label_);
  ------------------
  |  |   40|    150|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|    218|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20dngPreviewColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    310|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    310|  static_assert(N > 0, "Passed zero length printTag");
  195|    310|  return printTag<N, array>(os, value.toInt64(), data);
  196|    310|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20dngPreviewColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    310|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    310|  static_assert(N > 0, "Passed zero length printTag");
  183|    310|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 222, False: 88]
  ------------------
  184|    222|    return os << _(td->label_);
  ------------------
  |  |   40|    222|#define _(String) (String)
  ------------------
  185|     88|  return os << "(" << value << ")";
  186|    310|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18dngProfileEncodingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18dngProfileEncodingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 70, False: 38]
  ------------------
  184|     70|    return os << _(td->label_);
  ------------------
  |  |   40|     70|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|    108|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21dngDefaultBlackRenderEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    112|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    112|  static_assert(N > 0, "Passed zero length printTag");
  195|    112|  return printTag<N, array>(os, value.toInt64(), data);
  196|    112|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21dngDefaultBlackRenderEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    112|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    112|  static_assert(N > 0, "Passed zero length printTag");
  183|    112|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 94]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     94|  return os << "(" << value << ")";
  186|    112|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14dngDepthFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    136|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    136|  static_assert(N > 0, "Passed zero length printTag");
  195|    136|  return printTag<N, array>(os, value.toInt64(), data);
  196|    136|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14dngDepthFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    136|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    136|  static_assert(N > 0, "Passed zero length printTag");
  183|    136|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 80, False: 56]
  ------------------
  184|     80|    return os << _(td->label_);
  ------------------
  |  |   40|     80|#define _(String) (String)
  ------------------
  185|     56|  return os << "(" << value << ")";
  186|    136|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13dngDepthUnitsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     78|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     78|  static_assert(N > 0, "Passed zero length printTag");
  195|     78|  return printTag<N, array>(os, value.toInt64(), data);
  196|     78|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13dngDepthUnitsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     78|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     78|  static_assert(N > 0, "Passed zero length printTag");
  183|     78|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 48, False: 30]
  ------------------
  184|     48|    return os << _(td->label_);
  ------------------
  |  |   40|     48|#define _(String) (String)
  ------------------
  185|     30|  return os << "(" << value << ")";
  186|     78|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19dngDepthMeasureTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    104|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    104|  static_assert(N > 0, "Passed zero length printTag");
  195|    104|  return printTag<N, array>(os, value.toInt64(), data);
  196|    104|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19dngDepthMeasureTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    104|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    104|  static_assert(N > 0, "Passed zero length printTag");
  183|    104|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 76, False: 28]
  ------------------
  184|     76|    return os << _(td->label_);
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
  185|     28|  return os << "(" << value << ")";
  186|    104|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifLensCorrectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     52|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     52|  static_assert(N > 0, "Passed zero length printTag");
  195|     52|  return printTag<N, array>(os, value.toInt64(), data);
  196|     52|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifLensCorrectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     52|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     52|  static_assert(N > 0, "Passed zero length printTag");
  183|     52|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 34, False: 18]
  ------------------
  184|     34|    return os << _(td->label_);
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
  185|     18|  return os << "(" << value << ")";
  186|     52|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    110|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    110|  static_assert(N > 0, "Passed zero length printTag");
  195|    110|  return printTag<N, array>(os, value.toInt64(), data);
  196|    110|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    110|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    110|  static_assert(N > 0, "Passed zero length printTag");
  183|    110|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 74, False: 36]
  ------------------
  184|     74|    return os << _(td->label_);
  ------------------
  |  |   40|     74|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|    110|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifCompositeImageEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    202|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    202|  static_assert(N > 0, "Passed zero length printTag");
  195|    202|  return printTag<N, array>(os, value.toInt64(), data);
  196|    202|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifCompositeImageEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    202|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    202|  static_assert(N > 0, "Passed zero length printTag");
  183|    202|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 122, False: 80]
  ------------------
  184|    122|    return os << _(td->label_);
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    202|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifGPSLatitudeRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    222|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    222|  static_assert(N > 0, "Passed zero length printTag");
  195|    222|  return printTag<N, array>(os, value.toInt64(), data);
  196|    222|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifGPSLatitudeRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    222|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    222|  static_assert(N > 0, "Passed zero length printTag");
  183|    222|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 92, False: 130]
  ------------------
  184|     92|    return os << _(td->label_);
  ------------------
  |  |   40|     92|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    222|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19exifGPSLongitudeRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    154|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    154|  static_assert(N > 0, "Passed zero length printTag");
  195|    154|  return printTag<N, array>(os, value.toInt64(), data);
  196|    154|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19exifGPSLongitudeRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    154|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    154|  static_assert(N > 0, "Passed zero length printTag");
  183|    154|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 86]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    154|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm32ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifLightSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  2.46k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  2.46k|  static_assert(N > 0, "Passed zero length printTag");
  195|  2.46k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  2.46k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm32ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifLightSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  2.46k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  2.46k|  static_assert(N > 0, "Passed zero length printTag");
  183|  2.46k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.11k, False: 348]
  ------------------
  184|  2.11k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.11k|#define _(String) (String)
  ------------------
  185|    348|  return os << "(" << value << ")";
  186|  2.46k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8exifUnitEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    314|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    314|  static_assert(N > 0, "Passed zero length printTag");
  195|    314|  return printTag<N, array>(os, value.toInt64(), data);
  196|    314|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8exifUnitEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    314|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    314|  static_assert(N > 0, "Passed zero length printTag");
  183|    314|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 210, False: 104]
  ------------------
  184|    210|    return os << _(td->label_);
  ------------------
  |  |   40|    210|#define _(String) (String)
  ------------------
  185|    104|  return os << "(" << value << ")";
  186|    314|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifGPSAltitudeRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    140|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    140|  static_assert(N > 0, "Passed zero length printTag");
  195|    140|  return printTag<N, array>(os, value.toInt64(), data);
  196|    140|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifGPSAltitudeRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    140|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    140|  static_assert(N > 0, "Passed zero length printTag");
  183|    140|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 102, False: 38]
  ------------------
  184|    102|    return os << _(td->label_);
  ------------------
  |  |   40|    102|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|    140|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifGPSStatusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    134|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    134|  static_assert(N > 0, "Passed zero length printTag");
  195|    134|  return printTag<N, array>(os, value.toInt64(), data);
  196|    134|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifGPSStatusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    134|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    134|  static_assert(N > 0, "Passed zero length printTag");
  183|    134|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 104]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|    104|  return os << "(" << value << ")";
  186|    134|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifGPSMeasureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     70|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     70|  static_assert(N > 0, "Passed zero length printTag");
  195|     70|  return printTag<N, array>(os, value.toInt64(), data);
  196|     70|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifGPSMeasureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     70|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     70|  static_assert(N > 0, "Passed zero length printTag");
  183|     70|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 42]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     42|  return os << "(" << value << ")";
  186|     70|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifGPSSpeedRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    284|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    284|  static_assert(N > 0, "Passed zero length printTag");
  195|    284|  return printTag<N, array>(os, value.toInt64(), data);
  196|    284|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifGPSSpeedRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    284|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    284|  static_assert(N > 0, "Passed zero length printTag");
  183|    284|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 182, False: 102]
  ------------------
  184|    182|    return os << _(td->label_);
  ------------------
  |  |   40|    182|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    284|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22exifGPSDestDistanceRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    188|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    188|  static_assert(N > 0, "Passed zero length printTag");
  195|    188|  return printTag<N, array>(os, value.toInt64(), data);
  196|    188|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22exifGPSDestDistanceRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    188|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    188|  static_assert(N > 0, "Passed zero length printTag");
  183|    188|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 118, False: 70]
  ------------------
  184|    118|    return os << _(td->label_);
  ------------------
  |  |   40|    118|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|    188|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19exifGPSDifferentialEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    188|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    188|  static_assert(N > 0, "Passed zero length printTag");
  195|    188|  return printTag<N, array>(os, value.toInt64(), data);
  196|    188|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19exifGPSDifferentialEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    188|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    188|  static_assert(N > 0, "Passed zero length printTag");
  183|    188|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 128, False: 60]
  ------------------
  184|    128|    return os << _(td->label_);
  ------------------
  |  |   40|    128|#define _(String) (String)
  ------------------
  185|     60|  return os << "(" << value << ")";
  186|    188|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.16k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.16k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.16k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.16k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.16k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.16k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.16k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 696, False: 470]
  ------------------
  184|    696|    return os << _(td->label_);
  ------------------
  |  |   40|    696|#define _(String) (String)
  ------------------
  185|    470|  return os << "(" << value << ")";
  186|  1.16k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20exifYCbCrPositioningEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    264|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    264|  static_assert(N > 0, "Passed zero length printTag");
  195|    264|  return printTag<N, array>(os, value.toInt64(), data);
  196|    264|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20exifYCbCrPositioningEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    264|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    264|  static_assert(N > 0, "Passed zero length printTag");
  183|    264|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 218, False: 46]
  ------------------
  184|    218|    return os << _(td->label_);
  ------------------
  |  |   40|    218|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|    264|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19exifExposureProgramEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    770|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    770|  static_assert(N > 0, "Passed zero length printTag");
  195|    770|  return printTag<N, array>(os, value.toInt64(), data);
  196|    770|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19exifExposureProgramEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    770|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    770|  static_assert(N > 0, "Passed zero length printTag");
  183|    770|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 620, False: 150]
  ------------------
  184|    620|    return os << _(td->label_);
  ------------------
  |  |   40|    620|#define _(String) (String)
  ------------------
  185|    150|  return os << "(" << value << ")";
  186|    770|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.02k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.02k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.02k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.02k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.02k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.02k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.02k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.43k, False: 592]
  ------------------
  184|  2.43k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.43k|#define _(String) (String)
  ------------------
  185|    592|  return os << "(" << value << ")";
  186|  3.02k|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14exifColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    256|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    256|  static_assert(N > 0, "Passed zero length printTag");
  195|    256|  return printTag<N, array>(os, value.toInt64(), data);
  196|    256|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14exifColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    256|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    256|  static_assert(N > 0, "Passed zero length printTag");
  183|    256|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 196, False: 60]
  ------------------
  184|    196|    return os << _(td->label_);
  ------------------
  |  |   40|    196|#define _(String) (String)
  ------------------
  185|     60|  return os << "(" << value << ")";
  186|    256|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17exifSensingMethodEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    598|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    598|  static_assert(N > 0, "Passed zero length printTag");
  195|    598|  return printTag<N, array>(os, value.toInt64(), data);
  196|    598|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17exifSensingMethodEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    598|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    598|  static_assert(N > 0, "Passed zero length printTag");
  183|    598|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 498, False: 100]
  ------------------
  184|    498|    return os << _(td->label_);
  ------------------
  |  |   40|    498|#define _(String) (String)
  ------------------
  185|    100|  return os << "(" << value << ")";
  186|    598|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14exifFileSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    170|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    170|  static_assert(N > 0, "Passed zero length printTag");
  195|    170|  return printTag<N, array>(os, value.toInt64(), data);
  196|    170|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14exifFileSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    170|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    170|  static_assert(N > 0, "Passed zero length printTag");
  183|    170|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 56, False: 114]
  ------------------
  184|     56|    return os << _(td->label_);
  ------------------
  |  |   40|     56|#define _(String) (String)
  ------------------
  185|    114|  return os << "(" << value << ")";
  186|    170|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm1ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifSceneTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     56|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     56|  static_assert(N > 0, "Passed zero length printTag");
  195|     56|  return printTag<N, array>(os, value.toInt64(), data);
  196|     56|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm1ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifSceneTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     56|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     56|  static_assert(N > 0, "Passed zero length printTag");
  183|     56|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 48]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|     48|  return os << "(" << value << ")";
  186|     56|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifCustomRenderedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    172|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    172|  static_assert(N > 0, "Passed zero length printTag");
  195|    172|  return printTag<N, array>(os, value.toInt64(), data);
  196|    172|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifCustomRenderedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    172|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    172|  static_assert(N > 0, "Passed zero length printTag");
  183|    172|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 122, False: 50]
  ------------------
  184|    122|    return os << _(td->label_);
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|    172|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    254|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    254|  static_assert(N > 0, "Passed zero length printTag");
  195|    254|  return printTag<N, array>(os, value.toInt64(), data);
  196|    254|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    254|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    254|  static_assert(N > 0, "Passed zero length printTag");
  183|    254|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 202, False: 52]
  ------------------
  184|    202|    return os << _(td->label_);
  ------------------
  |  |   40|    202|#define _(String) (String)
  ------------------
  185|     52|  return os << "(" << value << ")";
  186|    254|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    392|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    392|  static_assert(N > 0, "Passed zero length printTag");
  195|    392|  return printTag<N, array>(os, value.toInt64(), data);
  196|    392|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16exifWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    392|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    392|  static_assert(N > 0, "Passed zero length printTag");
  183|    392|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 210, False: 182]
  ------------------
  184|    210|    return os << _(td->label_);
  ------------------
  |  |   40|    210|#define _(String) (String)
  ------------------
  185|    182|  return os << "(" << value << ")";
  186|    392|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20exifSceneCaptureTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    622|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    622|  static_assert(N > 0, "Passed zero length printTag");
  195|    622|  return printTag<N, array>(os, value.toInt64(), data);
  196|    622|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20exifSceneCaptureTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    622|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    622|  static_assert(N > 0, "Passed zero length printTag");
  183|    622|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 328, False: 294]
  ------------------
  184|    328|    return os << _(td->label_);
  ------------------
  |  |   40|    328|#define _(String) (String)
  ------------------
  185|    294|  return os << "(" << value << ")";
  186|    622|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifGainControlEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    604|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    604|  static_assert(N > 0, "Passed zero length printTag");
  195|    604|  return printTag<N, array>(os, value.toInt64(), data);
  196|    604|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15exifGainControlEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    604|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    604|  static_assert(N > 0, "Passed zero length printTag");
  183|    604|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 462, False: 142]
  ------------------
  184|    462|    return os << _(td->label_);
  ------------------
  |  |   40|    462|#define _(String) (String)
  ------------------
  185|    142|  return os << "(" << value << ")";
  186|    604|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14exifSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    342|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    342|  static_assert(N > 0, "Passed zero length printTag");
  195|    342|  return printTag<N, array>(os, value.toInt64(), data);
  196|    342|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14exifSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    342|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    342|  static_assert(N > 0, "Passed zero length printTag");
  183|    342|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 182, False: 160]
  ------------------
  184|    182|    return os << _(td->label_);
  ------------------
  |  |   40|    182|#define _(String) (String)
  ------------------
  185|    160|  return os << "(" << value << ")";
  186|    342|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24exifSubjectDistanceRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    280|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    280|  static_assert(N > 0, "Passed zero length printTag");
  195|    280|  return printTag<N, array>(os, value.toInt64(), data);
  196|    280|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24exifSubjectDistanceRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    280|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    280|  static_assert(N > 0, "Passed zero length printTag");
  183|    280|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 202, False: 78]
  ------------------
  184|    202|    return os << _(td->label_);
  ------------------
  |  |   40|    202|#define _(String) (String)
  ------------------
  185|     78|  return os << "(" << value << ")";
  186|    280|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifGPSDirRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    152|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    152|  static_assert(N > 0, "Passed zero length printTag");
  195|    152|  return printTag<N, array>(os, value.toInt64(), data);
  196|    152|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13exifGPSDirRefEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    152|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    152|  static_assert(N > 0, "Passed zero length printTag");
  183|    152|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 112, False: 40]
  ------------------
  184|    112|    return os << _(td->label_);
  ------------------
  |  |   40|    112|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|    152|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifNormalSoftHardEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    270|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    270|  static_assert(N > 0, "Passed zero length printTag");
  195|    270|  return printTag<N, array>(os, value.toInt64(), data);
  196|    270|}
tags_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18exifNormalSoftHardEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    270|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    270|  static_assert(N > 0, "Passed zero length printTag");
  183|    270|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 220, False: 50]
  ------------------
  184|    220|    return os << _(td->label_);
  ------------------
  |  |   40|    220|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|    270|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm534ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonCsLensTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     26|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     26|  static_assert(N > 0, "Passed zero length printTag");
  195|     26|  return printTag<N, array>(os, value.toInt64(), data);
  196|     26|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm534ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonCsLensTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     26|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     26|  static_assert(N > 0, "Passed zero length printTag");
  183|     26|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 26, False: 0]
  ------------------
  184|     26|    return os << _(td->label_);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  185|      0|  return os << "(" << value << ")";
  186|     26|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm357ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12canonModelIdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    128|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    128|  static_assert(N > 0, "Passed zero length printTag");
  195|    128|  return printTag<N, array>(os, value.toInt64(), data);
  196|    128|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm357ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12canonModelIdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    128|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    128|  static_assert(N > 0, "Passed zero length printTag");
  183|    128|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 90]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    128|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonSerialNumberFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     62|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     62|  static_assert(N > 0, "Passed zero length printTag");
  195|     62|  return printTag<N, array>(os, value.toInt64(), data);
  196|     62|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonSerialNumberFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     62|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     62|  static_assert(N > 0, "Passed zero length printTag");
  183|     62|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 22]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|     22|  return os << "(" << value << ")";
  186|     62|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonSuperMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    258|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    258|  static_assert(N > 0, "Passed zero length printTag");
  195|    258|  return printTag<N, array>(os, value.toInt64(), data);
  196|    258|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonSuperMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    258|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    258|  static_assert(N > 0, "Passed zero length printTag");
  183|    258|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 148, False: 110]
  ------------------
  184|    148|    return os << _(td->label_);
  ------------------
  |  |   40|    148|#define _(String) (String)
  ------------------
  185|    110|  return os << "(" << value << ")";
  186|    258|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonDateStampModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    374|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    374|  static_assert(N > 0, "Passed zero length printTag");
  195|    374|  return printTag<N, array>(os, value.toInt64(), data);
  196|    374|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonDateStampModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    374|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    374|  static_assert(N > 0, "Passed zero length printTag");
  183|    374|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 166, False: 208]
  ------------------
  184|    166|    return os << _(td->label_);
  ------------------
  |  |   40|    166|#define _(String) (String)
  ------------------
  185|    208|  return os << "(" << value << ")";
  186|    374|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    170|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    170|  static_assert(N > 0, "Passed zero length printTag");
  195|    170|  return printTag<N, array>(os, value.toInt64(), data);
  196|    170|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    170|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    170|  static_assert(N > 0, "Passed zero length printTag");
  183|    170|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 102]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    170|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonAFAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    888|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    888|  static_assert(N > 0, "Passed zero length printTag");
  195|    888|  return printTag<N, array>(os, value.toInt64(), data);
  196|    888|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonAFAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    888|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    888|  static_assert(N > 0, "Passed zero length printTag");
  183|    888|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 750, False: 138]
  ------------------
  184|    750|    return os << _(td->label_);
  ------------------
  |  |   40|    750|#define _(String) (String)
  ------------------
  185|    138|  return os << "(" << value << ")";
  186|    888|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonPictureStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    292|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    292|  static_assert(N > 0, "Passed zero length printTag");
  195|    292|  return printTag<N, array>(os, value.toInt64(), data);
  196|    292|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonPictureStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    292|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    292|  static_assert(N > 0, "Passed zero length printTag");
  183|    292|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 228, False: 64]
  ------------------
  184|    228|    return os << _(td->label_);
  ------------------
  |  |   40|    228|#define _(String) (String)
  ------------------
  185|     64|  return os << "(" << value << ")";
  186|    292|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonSiWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    460|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    460|  static_assert(N > 0, "Passed zero length printTag");
  195|    460|  return printTag<N, array>(os, value.toInt64(), data);
  196|    460|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonSiWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    460|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    460|  static_assert(N > 0, "Passed zero length printTag");
  183|    460|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 166, False: 294]
  ------------------
  184|    166|    return os << _(td->label_);
  ------------------
  |  |   40|    166|#define _(String) (String)
  ------------------
  185|    294|  return os << "(" << value << ")";
  186|    460|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonAFMicroAdjModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     22|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     22|  static_assert(N > 0, "Passed zero length printTag");
  195|     22|  return printTag<N, array>(os, value.toInt64(), data);
  196|     22|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonAFMicroAdjModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     22|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     22|  static_assert(N > 0, "Passed zero length printTag");
  183|     22|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 16]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|     16|  return os << "(" << value << ")";
  186|     22|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10canonOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    964|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    964|  static_assert(N > 0, "Passed zero length printTag");
  195|    964|  return printTag<N, array>(os, value.toInt64(), data);
  196|    964|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10canonOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    964|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    964|  static_assert(N > 0, "Passed zero length printTag");
  183|    964|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 134, False: 830]
  ------------------
  184|    134|    return os << _(td->label_);
  ------------------
  |  |   40|    134|#define _(String) (String)
  ------------------
  185|    830|  return os << "(" << value << ")";
  186|    964|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonAutoLightingOptimizerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    114|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    114|  static_assert(N > 0, "Passed zero length printTag");
  195|    114|  return printTag<N, array>(os, value.toInt64(), data);
  196|    114|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonAutoLightingOptimizerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    114|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    114|  static_assert(N > 0, "Passed zero length printTag");
  183|    114|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 106]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|    106|  return os << "(" << value << ")";
  186|    114|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31canonLongExposureNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    114|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    114|  static_assert(N > 0, "Passed zero length printTag");
  195|    114|  return printTag<N, array>(os, value.toInt64(), data);
  196|    114|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31canonLongExposureNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    114|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    114|  static_assert(N > 0, "Passed zero length printTag");
  183|    114|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 106]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|    106|  return os << "(" << value << ")";
  186|    114|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonHighISONoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonHighISONoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 12, False: 96]
  ------------------
  184|     12|    return os << _(td->label_);
  ------------------
  |  |   40|     12|#define _(String) (String)
  ------------------
  185|     96|  return os << "(" << value << ")";
  186|    108|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25canonDigitalLensOptimizerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25canonDigitalLensOptimizerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 94]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|     94|  return os << "(" << value << ")";
  186|    108|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonDualPixelRawEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonDualPixelRawEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 102]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    108|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonAmbienceSelectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     84|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     84|  static_assert(N > 0, "Passed zero length printTag");
  195|     84|  return printTag<N, array>(os, value.toInt64(), data);
  196|     84|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonAmbienceSelectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     84|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     84|  static_assert(N > 0, "Passed zero length printTag");
  183|     84|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 66]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|     84|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonMultiExposureEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonMultiExposureEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 70]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|     88|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25canonMultiExposureControlEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     48|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     48|  static_assert(N > 0, "Passed zero length printTag");
  195|     48|  return printTag<N, array>(os, value.toInt64(), data);
  196|     48|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25canonMultiExposureControlEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     48|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     48|  static_assert(N > 0, "Passed zero length printTag");
  183|     48|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 40]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|     48|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm1ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonFilterInfoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     34|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     34|  static_assert(N > 0, "Passed zero length printTag");
  195|     34|  return printTag<N, array>(os, value.toInt64(), data);
  196|     34|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm1ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonFilterInfoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     34|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     34|  static_assert(N > 0, "Passed zero length printTag");
  183|     34|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 12, False: 22]
  ------------------
  184|     12|    return os << _(td->label_);
  ------------------
  |  |   40|     12|#define _(String) (String)
  ------------------
  185|     22|  return os << "(" << value << ")";
  186|     34|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31canonMiniatureFilterOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|      6|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|      6|  static_assert(N > 0, "Passed zero length printTag");
  195|      6|  return printTag<N, array>(os, value.toInt64(), data);
  196|      6|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31canonMiniatureFilterOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|      6|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|      6|  static_assert(N > 0, "Passed zero length printTag");
  183|      6|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 4, False: 2]
  ------------------
  184|      4|    return os << _(td->label_);
  ------------------
  |  |   40|      4|#define _(String) (String)
  ------------------
  185|      2|  return os << "(" << value << ")";
  186|      6|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8canonHdrEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     82|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     82|  static_assert(N > 0, "Passed zero length printTag");
  195|     82|  return printTag<N, array>(os, value.toInt64(), data);
  196|     82|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8canonHdrEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     82|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     82|  static_assert(N > 0, "Passed zero length printTag");
  183|     82|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 74]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|     74|  return os << "(" << value << ")";
  186|     82|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonHdrEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     82|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     82|  static_assert(N > 0, "Passed zero length printTag");
  195|     82|  return printTag<N, array>(os, value.toInt64(), data);
  196|     82|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonHdrEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     82|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     82|  static_assert(N > 0, "Passed zero length printTag");
  183|     82|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 68]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|     82|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonAIServoFirstImageEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    430|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    430|  static_assert(N > 0, "Passed zero length printTag");
  195|    430|  return printTag<N, array>(os, value.toInt64(), data);
  196|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonAIServoFirstImageEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    430|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    430|  static_assert(N > 0, "Passed zero length printTag");
  183|    430|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 32, False: 398]
  ------------------
  184|     32|    return os << _(td->label_);
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  185|    398|  return os << "(" << value << ")";
  186|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonAIServoSecondImageEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    430|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    430|  static_assert(N > 0, "Passed zero length printTag");
  195|    430|  return printTag<N, array>(os, value.toInt64(), data);
  196|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonAIServoSecondImageEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    430|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    430|  static_assert(N > 0, "Passed zero length printTag");
  183|    430|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 62, False: 368]
  ------------------
  184|     62|    return os << _(td->label_);
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
  185|    368|  return os << "(" << value << ")";
  186|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24canonUSMLensElectronicMFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    430|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    430|  static_assert(N > 0, "Passed zero length printTag");
  195|    430|  return printTag<N, array>(os, value.toInt64(), data);
  196|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24canonUSMLensElectronicMFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    430|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    430|  static_assert(N > 0, "Passed zero length printTag");
  183|    430|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 42, False: 388]
  ------------------
  184|     42|    return os << _(td->label_);
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  185|    388|  return os << "(" << value << ")";
  186|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonAFAssistBeamEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    430|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    430|  static_assert(N > 0, "Passed zero length printTag");
  195|    430|  return printTag<N, array>(os, value.toInt64(), data);
  196|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonAFAssistBeamEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    430|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    430|  static_assert(N > 0, "Passed zero length printTag");
  183|    430|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 42, False: 388]
  ------------------
  184|     42|    return os << _(td->label_);
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  185|    388|  return os << "(" << value << ")";
  186|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21canonOneShotAFReleaseEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    430|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    430|  static_assert(N > 0, "Passed zero length printTag");
  195|    430|  return printTag<N, array>(os, value.toInt64(), data);
  196|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21canonOneShotAFReleaseEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    430|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    430|  static_assert(N > 0, "Passed zero length printTag");
  183|    430|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 384]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|    384|  return os << "(" << value << ")";
  186|    430|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27canonAutoAFPointSelEOSiTRAFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    428|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    428|  static_assert(N > 0, "Passed zero length printTag");
  195|    428|  return printTag<N, array>(os, value.toInt64(), data);
  196|    428|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27canonAutoAFPointSelEOSiTRAFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    428|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    428|  static_assert(N > 0, "Passed zero length printTag");
  183|    428|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 388]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|    388|  return os << "(" << value << ")";
  186|    428|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30canonLensDriveWhenAFImpossibleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    428|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    428|  static_assert(N > 0, "Passed zero length printTag");
  195|    428|  return printTag<N, array>(os, value.toInt64(), data);
  196|    428|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30canonLensDriveWhenAFImpossibleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    428|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    428|  static_assert(N > 0, "Passed zero length printTag");
  183|    428|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 50, False: 378]
  ------------------
  184|     50|    return os << _(td->label_);
  ------------------
  |  |   40|     50|#define _(String) (String)
  ------------------
  185|    378|  return os << "(" << value << ")";
  186|    428|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30canonSelectAFAreaSelectionModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    408|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    408|  static_assert(N > 0, "Passed zero length printTag");
  195|    408|  return printTag<N, array>(os, value.toInt64(), data);
  196|    408|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30canonSelectAFAreaSelectionModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    408|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    408|  static_assert(N > 0, "Passed zero length printTag");
  183|    408|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 54, False: 354]
  ------------------
  184|     54|    return os << _(td->label_);
  ------------------
  |  |   40|     54|#define _(String) (String)
  ------------------
  185|    354|  return os << "(" << value << ")";
  186|    408|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonAFAreaSelectionMethodEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    406|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    406|  static_assert(N > 0, "Passed zero length printTag");
  195|    406|  return printTag<N, array>(os, value.toInt64(), data);
  196|    406|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonAFAreaSelectionMethodEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    406|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    406|  static_assert(N > 0, "Passed zero length printTag");
  183|    406|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 360]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|    360|  return os << "(" << value << ")";
  186|    406|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24canonOrientationLinkedAFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    402|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    402|  static_assert(N > 0, "Passed zero length printTag");
  195|    402|  return printTag<N, array>(os, value.toInt64(), data);
  196|    402|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24canonOrientationLinkedAFEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    402|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    402|  static_assert(N > 0, "Passed zero length printTag");
  183|    402|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 364]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|    364|  return os << "(" << value << ")";
  186|    402|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28canonManualAFPointSelPatternEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    392|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    392|  static_assert(N > 0, "Passed zero length printTag");
  195|    392|  return printTag<N, array>(os, value.toInt64(), data);
  196|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28canonManualAFPointSelPatternEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    392|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    392|  static_assert(N > 0, "Passed zero length printTag");
  183|    392|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 34, False: 358]
  ------------------
  184|     34|    return os << _(td->label_);
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
  185|    358|  return os << "(" << value << ")";
  186|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30canonAFPointDisplayDuringFocusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    392|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    392|  static_assert(N > 0, "Passed zero length printTag");
  195|    392|  return printTag<N, array>(os, value.toInt64(), data);
  196|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30canonAFPointDisplayDuringFocusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    392|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    392|  static_assert(N > 0, "Passed zero length printTag");
  183|    392|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 352]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|    352|  return os << "(" << value << ")";
  186|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27canonAVFDisplayIlluminationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    392|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    392|  static_assert(N > 0, "Passed zero length printTag");
  195|    392|  return printTag<N, array>(os, value.toInt64(), data);
  196|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27canonAVFDisplayIlluminationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    392|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    392|  static_assert(N > 0, "Passed zero length printTag");
  183|    392|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 362]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|    362|  return os << "(" << value << ")";
  186|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonAFStatusViewfinderEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    392|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    392|  static_assert(N > 0, "Passed zero length printTag");
  195|    392|  return printTag<N, array>(os, value.toInt64(), data);
  196|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonAFStatusViewfinderEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    392|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    392|  static_assert(N > 0, "Passed zero length printTag");
  183|    392|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 34, False: 358]
  ------------------
  184|     34|    return os << _(td->label_);
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
  185|    358|  return os << "(" << value << ")";
  186|    392|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonInitialAFPointInServoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    316|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    316|  static_assert(N > 0, "Passed zero length printTag");
  195|    316|  return printTag<N, array>(os, value.toInt64(), data);
  196|    316|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26canonInitialAFPointInServoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    316|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    316|  static_assert(N > 0, "Passed zero length printTag");
  183|    316|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 26, False: 290]
  ------------------
  184|     26|    return os << _(td->label_);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  185|    290|  return os << "(" << value << ")";
  186|    316|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12canonCsMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.92k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.92k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.92k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.92k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12canonCsMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.92k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.92k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.92k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 3.88k]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|  3.88k|  return os << "(" << value << ")";
  186|  3.92k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonCsQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  4.34k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  4.34k|  static_assert(N > 0, "Passed zero length printTag");
  195|  4.34k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  4.34k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonCsQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  4.34k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  4.34k|  static_assert(N > 0, "Passed zero length printTag");
  183|  4.34k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 582, False: 3.76k]
  ------------------
  184|    582|    return os << _(td->label_);
  ------------------
  |  |   40|    582|#define _(String) (String)
  ------------------
  185|  3.76k|  return os << "(" << value << ")";
  186|  4.34k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.49k, False: 2.39k]
  ------------------
  184|  1.49k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.49k|#define _(String) (String)
  ------------------
  185|  2.39k|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsDriveModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsDriveModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 414, False: 3.48k]
  ------------------
  184|    414|    return os << _(td->label_);
  ------------------
  |  |   40|    414|#define _(String) (String)
  ------------------
  185|  3.48k|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 3.07k, False: 816]
  ------------------
  184|  3.07k|    return os << _(td->label_);
  ------------------
  |  |   40|  3.07k|#define _(String) (String)
  ------------------
  185|    816|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonCsRecordModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonCsRecordModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 192, False: 3.69k]
  ------------------
  184|    192|    return os << _(td->label_);
  ------------------
  |  |   40|    192|#define _(String) (String)
  ------------------
  185|  3.69k|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm18ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsImageSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm18ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsImageSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.51k, False: 2.38k]
  ------------------
  184|  1.51k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.51k|#define _(String) (String)
  ------------------
  185|  2.38k|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm71ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonCsEasyModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm71ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonCsEasyModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 3.30k, False: 584]
  ------------------
  184|  3.30k|    return os << _(td->label_);
  ------------------
  |  |   40|  3.30k|#define _(String) (String)
  ------------------
  185|    584|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonCsDigitalZoomEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.89k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.89k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonCsDigitalZoomEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.89k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.89k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.89k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.90k, False: 990]
  ------------------
  184|  2.90k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.90k|#define _(String) (String)
  ------------------
  185|    990|  return os << "(" << value << ")";
  186|  3.89k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10canonCsLnhEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  11.6k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  11.6k|  static_assert(N > 0, "Passed zero length printTag");
  195|  11.6k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  11.6k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10canonCsLnhEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  11.6k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  11.6k|  static_assert(N > 0, "Passed zero length printTag");
  183|  11.6k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 3.79k, False: 7.84k]
  ------------------
  184|  3.79k|    return os << _(td->label_);
  ------------------
  |  |   40|  3.79k|#define _(String) (String)
  ------------------
  185|  7.84k|  return os << "(" << value << ")";
  186|  11.6k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm38ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonCsISOSpeedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.86k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.86k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.86k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.86k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm38ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonCsISOSpeedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.86k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.86k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.86k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 936, False: 2.93k]
  ------------------
  184|    936|    return os << _(td->label_);
  ------------------
  |  |   40|    936|#define _(String) (String)
  ------------------
  185|  2.93k|  return os << "(" << value << ")";
  186|  3.86k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonCsMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.86k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.86k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.86k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.86k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonCsMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.86k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.86k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.86k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.23k, False: 2.63k]
  ------------------
  184|  1.23k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.23k|#define _(String) (String)
  ------------------
  185|  2.63k|  return os << "(" << value << ")";
  186|  3.86k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsFocusTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.86k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.86k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.86k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.86k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsFocusTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.86k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.86k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.86k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.84k, False: 2.02k]
  ------------------
  184|  1.84k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.84k|#define _(String) (String)
  ------------------
  185|  2.02k|  return os << "(" << value << ")";
  186|  3.86k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonCsAfPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.85k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.85k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.85k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.85k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonCsAfPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.85k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.85k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.85k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 78, False: 3.78k]
  ------------------
  184|     78|    return os << _(td->label_);
  ------------------
  |  |   40|     78|#define _(String) (String)
  ------------------
  185|  3.78k|  return os << "(" << value << ")";
  186|  3.85k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonCsExposureProgramEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.78k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.78k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.78k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.78k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonCsExposureProgramEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.78k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.78k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.78k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.33k, False: 1.45k]
  ------------------
  184|  2.33k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.33k|#define _(String) (String)
  ------------------
  185|  1.45k|  return os << "(" << value << ")";
  186|  3.78k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20canonCsFlashActivityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.65k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.65k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.65k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.65k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20canonCsFlashActivityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.65k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.65k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.65k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 390, False: 3.26k]
  ------------------
  184|    390|    return os << _(td->label_);
  ------------------
  |  |   40|    390|#define _(String) (String)
  ------------------
  185|  3.26k|  return os << "(" << value << ")";
  186|  3.65k|}
canonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm9ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L19canonCsFlashDetailsEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|  3.63k|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|  3.63k|  static_assert(N > 0, "Passed zero length printTag");
  208|  3.63k|  const auto val = value.toUint32();
  209|  3.63k|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 1.56k, False: 2.07k]
  ------------------
  210|  1.56k|    auto [mask, label] = *array;
  211|  1.56k|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 1.56k]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|  1.56k|  }
  214|  3.63k|  bool sep = false;
  215|  32.7k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 32.7k, False: 3.63k]
  ------------------
  216|  32.7k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 9.35k, False: 23.3k]
  ------------------
  217|  9.35k|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 7.35k, False: 1.99k]
  ------------------
  218|  7.35k|        os << ", " << _(label);
  ------------------
  |  |   40|  7.35k|#define _(String) (String)
  ------------------
  219|  7.35k|      } else {
  220|  1.99k|        os << _(label);
  ------------------
  |  |   40|  1.99k|#define _(String) (String)
  ------------------
  221|  1.99k|        sep = true;
  222|  1.99k|      }
  223|  9.35k|    }
  224|  32.7k|  }
  225|  3.63k|  return os;
  226|  3.63k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonCsFocusContinuousEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.59k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.59k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.59k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.59k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22canonCsFocusContinuousEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.59k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.59k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.59k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.53k, False: 2.05k]
  ------------------
  184|  1.53k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.53k|#define _(String) (String)
  ------------------
  185|  2.05k|  return os << "(" << value << ")";
  186|  3.59k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsAESettingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.59k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.59k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.59k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.59k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonCsAESettingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.59k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.59k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.59k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.71k, False: 878]
  ------------------
  184|  2.71k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.71k|#define _(String) (String)
  ------------------
  185|    878|  return os << "(" << value << ")";
  186|  3.59k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25canonCsImageStabilizationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.59k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.59k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.59k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.59k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25canonCsImageStabilizationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.59k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.59k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.59k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.65k, False: 1.94k]
  ------------------
  184|  1.65k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.65k|#define _(String) (String)
  ------------------
  185|  1.94k|  return os << "(" << value << ")";
  186|  3.59k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonCsSpotMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.54k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.54k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.54k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.54k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonCsSpotMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.54k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.54k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.54k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.68k, False: 858]
  ------------------
  184|  2.68k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.68k|#define _(String) (String)
  ------------------
  185|    858|  return os << "(" << value << ")";
  186|  3.54k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonCsPhotoEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.54k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.54k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.54k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.54k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonCsPhotoEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.54k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.54k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.54k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.41k, False: 2.13k]
  ------------------
  184|  1.41k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.41k|#define _(String) (String)
  ------------------
  185|  2.13k|  return os << "(" << value << ")";
  186|  3.54k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonCsSRAWQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  4.17k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  4.17k|  static_assert(N > 0, "Passed zero length printTag");
  195|  4.17k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  4.17k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonCsSRAWQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  4.17k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  4.17k|  static_assert(N > 0, "Passed zero length printTag");
  183|  4.17k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.91k, False: 1.26k]
  ------------------
  184|  2.91k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.91k|#define _(String) (String)
  ------------------
  185|  1.26k|  return os << "(" << value << ")";
  186|  4.17k|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11slowShutterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    410|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    410|  static_assert(N > 0, "Passed zero length printTag");
  195|    410|  return printTag<N, array>(os, value.toInt64(), data);
  196|    410|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11slowShutterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    410|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    410|  static_assert(N > 0, "Passed zero length printTag");
  183|    410|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 108, False: 302]
  ------------------
  184|    108|    return os << _(td->label_);
  ------------------
  |  |   40|    108|#define _(String) (String)
  ------------------
  185|    302|  return os << "(" << value << ")";
  186|    410|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonSiFlashBiasEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    408|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    408|  static_assert(N > 0, "Passed zero length printTag");
  195|    408|  return printTag<N, array>(os, value.toInt64(), data);
  196|    408|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonSiFlashBiasEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    408|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    408|  static_assert(N > 0, "Passed zero length printTag");
  183|    408|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 122, False: 286]
  ------------------
  184|    122|    return os << _(td->label_);
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
  185|    286|  return os << "(" << value << ")";
  186|    408|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22autoExposureBracketingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    404|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    404|  static_assert(N > 0, "Passed zero length printTag");
  195|    404|  return printTag<N, array>(os, value.toInt64(), data);
  196|    404|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22autoExposureBracketingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    404|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    404|  static_assert(N > 0, "Passed zero length printTag");
  183|    404|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 136, False: 268]
  ------------------
  184|    136|    return os << _(td->label_);
  ------------------
  |  |   40|    136|#define _(String) (String)
  ------------------
  185|    268|  return os << "(" << value << ")";
  186|    404|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10cameraTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    320|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    320|  static_assert(N > 0, "Passed zero length printTag");
  195|    320|  return printTag<N, array>(os, value.toInt64(), data);
  196|    320|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10cameraTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    320|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    320|  static_assert(N > 0, "Passed zero length printTag");
  183|    320|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 124, False: 196]
  ------------------
  184|    124|    return os << _(td->label_);
  ------------------
  |  |   40|    124|#define _(String) (String)
  ------------------
  185|    196|  return os << "(" << value << ")";
  186|    320|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10autoRotateEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    308|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    308|  static_assert(N > 0, "Passed zero length printTag");
  195|    308|  return printTag<N, array>(os, value.toInt64(), data);
  196|    308|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10autoRotateEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    308|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    308|  static_assert(N > 0, "Passed zero length printTag");
  183|    308|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 54, False: 254]
  ------------------
  184|     54|    return os << _(td->label_);
  ------------------
  |  |   40|     54|#define _(String) (String)
  ------------------
  185|    254|  return os << "(" << value << ")";
  186|    308|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8ndRotateEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    308|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    308|  static_assert(N > 0, "Passed zero length printTag");
  195|    308|  return printTag<N, array>(os, value.toInt64(), data);
  196|    308|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8ndRotateEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    308|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    308|  static_assert(N > 0, "Passed zero length printTag");
  183|    308|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 116, False: 192]
  ------------------
  184|    116|    return os << _(td->label_);
  ------------------
  |  |   40|    116|#define _(String) (String)
  ------------------
  185|    192|  return os << "(" << value << ")";
  186|    308|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10selfTimer2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    308|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    308|  static_assert(N > 0, "Passed zero length printTag");
  195|    308|  return printTag<N, array>(os, value.toInt64(), data);
  196|    308|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10selfTimer2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    308|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    308|  static_assert(N > 0, "Passed zero length printTag");
  183|    308|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 102, False: 206]
  ------------------
  184|    102|    return os << _(td->label_);
  ------------------
  |  |   40|    102|#define _(String) (String)
  ------------------
  185|    206|  return os << "(" << value << ")";
  186|    308|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonPaDirectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     16|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     16|  static_assert(N > 0, "Passed zero length printTag");
  195|     16|  return printTag<N, array>(os, value.toInt64(), data);
  196|     16|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonPaDirectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     16|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     16|  static_assert(N > 0, "Passed zero length printTag");
  183|     16|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 10, False: 6]
  ------------------
  184|     10|    return os << _(td->label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
  185|      6|  return os << "(" << value << ")";
  186|     16|}
canonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm7ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L19canonPiAFPointsUsedEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    158|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    158|  static_assert(N > 0, "Passed zero length printTag");
  208|    158|  const auto val = value.toUint32();
  209|    158|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 8, False: 150]
  ------------------
  210|      8|    auto [mask, label] = *array;
  211|      8|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 8]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      8|  }
  214|    158|  bool sep = false;
  215|  1.10k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 1.10k, False: 158]
  ------------------
  216|  1.10k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 530, False: 576]
  ------------------
  217|    530|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 382, False: 148]
  ------------------
  218|    382|        os << ", " << _(label);
  ------------------
  |  |   40|    382|#define _(String) (String)
  ------------------
  219|    382|      } else {
  220|    148|        os << _(label);
  ------------------
  |  |   40|    148|#define _(String) (String)
  ------------------
  221|    148|        sep = true;
  222|    148|      }
  223|    530|    }
  224|  1.10k|  }
  225|    158|  return os;
  226|    158|}
canonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm9ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L22canonPiAFPointsUsed20DEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    156|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    156|  static_assert(N > 0, "Passed zero length printTag");
  208|    156|  const auto val = value.toUint32();
  209|    156|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 2, False: 154]
  ------------------
  210|      2|    auto [mask, label] = *array;
  211|      2|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 2]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      2|  }
  214|    156|  bool sep = false;
  215|  1.40k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 1.40k, False: 156]
  ------------------
  216|  1.40k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 626, False: 778]
  ------------------
  217|    626|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 474, False: 152]
  ------------------
  218|    474|        os << ", " << _(label);
  ------------------
  |  |   40|    474|#define _(String) (String)
  ------------------
  219|    474|      } else {
  220|    152|        os << _(label);
  ------------------
  |  |   40|    152|#define _(String) (String)
  ------------------
  221|    152|        sep = true;
  222|    152|      }
  223|    626|    }
  224|  1.40k|  }
  225|    156|  return os;
  226|    156|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonBracketModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    494|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    494|  static_assert(N > 0, "Passed zero length printTag");
  195|    494|  return printTag<N, array>(os, value.toInt64(), data);
  196|    494|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonBracketModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    494|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    494|  static_assert(N > 0, "Passed zero length printTag");
  183|    494|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 108, False: 386]
  ------------------
  184|    108|    return os << _(td->label_);
  ------------------
  |  |   40|    108|#define _(String) (String)
  ------------------
  185|    386|  return os << "(" << value << ")";
  186|    494|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm19ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonRawJpgSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    438|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    438|  static_assert(N > 0, "Passed zero length printTag");
  195|    438|  return printTag<N, array>(os, value.toInt64(), data);
  196|    438|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm19ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonRawJpgSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    438|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    438|  static_assert(N > 0, "Passed zero length printTag");
  183|    438|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 188, False: 250]
  ------------------
  184|    188|    return os << _(td->label_);
  ------------------
  |  |   40|    188|#define _(String) (String)
  ------------------
  185|    250|  return os << "(" << value << ")";
  186|    438|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    434|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    434|  static_assert(N > 0, "Passed zero length printTag");
  195|    434|  return printTag<N, array>(os, value.toInt64(), data);
  196|    434|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19canonNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    434|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    434|  static_assert(N > 0, "Passed zero length printTag");
  183|    434|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 120, False: 314]
  ------------------
  184|    120|    return os << _(td->label_);
  ------------------
  |  |   40|    120|#define _(String) (String)
  ------------------
  185|    314|  return os << "(" << value << ")";
  186|    434|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonWBBracketModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    434|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    434|  static_assert(N > 0, "Passed zero length printTag");
  195|    434|  return printTag<N, array>(os, value.toInt64(), data);
  196|    434|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18canonWBBracketModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    434|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    434|  static_assert(N > 0, "Passed zero length printTag");
  183|    434|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 140, False: 294]
  ------------------
  184|    140|    return os << _(td->label_);
  ------------------
  |  |   40|    140|#define _(String) (String)
  ------------------
  185|    294|  return os << "(" << value << ")";
  186|    434|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonFilterEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    434|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    434|  static_assert(N > 0, "Passed zero length printTag");
  195|    434|  return printTag<N, array>(os, value.toInt64(), data);
  196|    434|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonFilterEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    434|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    434|  static_assert(N > 0, "Passed zero length printTag");
  183|    434|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 134, False: 300]
  ------------------
  184|    134|    return os << _(td->label_);
  ------------------
  |  |   40|    134|#define _(String) (String)
  ------------------
  185|    300|  return os << "(" << value << ")";
  186|    434|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonToningEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    428|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    428|  static_assert(N > 0, "Passed zero length printTag");
  195|    428|  return printTag<N, array>(os, value.toInt64(), data);
  196|    428|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonToningEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    428|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    428|  static_assert(N > 0, "Passed zero length printTag");
  183|    428|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 130, False: 298]
  ------------------
  184|    130|    return os << _(td->label_);
  ------------------
  |  |   40|    130|#define _(String) (String)
  ------------------
  185|    298|  return os << "(" << value << ")";
  186|    428|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonShutterModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    260|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    260|  static_assert(N > 0, "Passed zero length printTag");
  195|    260|  return printTag<N, array>(os, value.toInt64(), data);
  196|    260|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16canonShutterModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    260|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    260|  static_assert(N > 0, "Passed zero length printTag");
  183|    260|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 44, False: 216]
  ------------------
  184|     44|    return os << _(td->label_);
  ------------------
  |  |   40|     44|#define _(String) (String)
  ------------------
  185|    216|  return os << "(" << value << ")";
  186|    260|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm76ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonRFLensTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    150|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    150|  static_assert(N > 0, "Passed zero length printTag");
  195|    150|  return printTag<N, array>(os, value.toInt64(), data);
  196|    150|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm76ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15canonRFLensTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    150|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    150|  static_assert(N > 0, "Passed zero length printTag");
  183|    150|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 112]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|    112|  return os << "(" << value << ")";
  186|    150|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonToneCurveEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     68|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     68|  static_assert(N > 0, "Passed zero length printTag");
  195|     68|  return printTag<N, array>(os, value.toInt64(), data);
  196|     68|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14canonToneCurveEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     68|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     68|  static_assert(N > 0, "Passed zero length printTag");
  183|     68|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 16, False: 52]
  ------------------
  184|     16|    return os << _(td->label_);
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
  185|     52|  return os << "(" << value << ")";
  186|     68|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonSharpnessFrequencyEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     66|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     66|  static_assert(N > 0, "Passed zero length printTag");
  195|     66|  return printTag<N, array>(os, value.toInt64(), data);
  196|     66|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23canonSharpnessFrequencyEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     66|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     66|  static_assert(N > 0, "Passed zero length printTag");
  183|     66|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 16, False: 50]
  ------------------
  184|     16|    return os << _(td->label_);
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|     66|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm35ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonTimeZoneCityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    260|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    260|  static_assert(N > 0, "Passed zero length printTag");
  195|    260|  return printTag<N, array>(os, value.toInt64(), data);
  196|    260|}
canonmn_int.cpp:_ZN5Exiv28Internal8printTagILm35ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17canonTimeZoneCityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    260|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    260|  static_assert(N > 0, "Passed zero length printTag");
  183|    260|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 94, False: 166]
  ------------------
  184|     94|    return os << _(td->label_);
  ------------------
  |  |   40|     94|#define _(String) (String)
  ------------------
  185|    166|  return os << "(" << value << ")";
  186|    260|}
canonmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm3ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L18canonSiAFPointUsedEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    356|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    356|  static_assert(N > 0, "Passed zero length printTag");
  208|    356|  const auto val = value.toUint32();
  209|    356|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 0, False: 356]
  ------------------
  210|      0|    auto [mask, label] = *array;
  211|      0|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 0]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|      0|  }
  214|    356|  bool sep = false;
  215|  1.06k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 1.06k, False: 356]
  ------------------
  216|  1.06k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 458, False: 610]
  ------------------
  217|    458|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 190, False: 268]
  ------------------
  218|    190|        os << ", " << _(label);
  ------------------
  |  |   40|    190|#define _(String) (String)
  ------------------
  219|    268|      } else {
  220|    268|        os << _(label);
  ------------------
  |  |   40|    268|#define _(String) (String)
  ------------------
  221|    268|        sep = true;
  222|    268|      }
  223|    458|    }
  224|  1.06k|  }
  225|    356|  return os;
  226|    356|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casioRecordingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    660|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    660|  static_assert(N > 0, "Passed zero length printTag");
  195|    660|  return printTag<N, array>(os, value.toInt64(), data);
  196|    660|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casioRecordingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    660|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    660|  static_assert(N > 0, "Passed zero length printTag");
  183|    660|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 492, False: 168]
  ------------------
  184|    492|    return os << _(td->label_);
  ------------------
  |  |   40|    492|#define _(String) (String)
  ------------------
  185|    168|  return os << "(" << value << ")";
  186|    660|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12casioQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    228|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    228|  static_assert(N > 0, "Passed zero length printTag");
  195|    228|  return printTag<N, array>(os, value.toInt64(), data);
  196|    228|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12casioQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    228|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    228|  static_assert(N > 0, "Passed zero length printTag");
  183|    228|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 120, False: 108]
  ------------------
  184|    120|    return os << _(td->label_);
  ------------------
  |  |   40|    120|#define _(String) (String)
  ------------------
  185|    108|  return os << "(" << value << ")";
  186|    228|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casioFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    264|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    264|  static_assert(N > 0, "Passed zero length printTag");
  195|    264|  return printTag<N, array>(os, value.toInt64(), data);
  196|    264|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casioFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    264|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    264|  static_assert(N > 0, "Passed zero length printTag");
  183|    264|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 182, False: 82]
  ------------------
  184|    182|    return os << _(td->label_);
  ------------------
  |  |   40|    182|#define _(String) (String)
  ------------------
  185|     82|  return os << "(" << value << ")";
  186|    264|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casioFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    426|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    426|  static_assert(N > 0, "Passed zero length printTag");
  195|    426|  return printTag<N, array>(os, value.toInt64(), data);
  196|    426|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casioFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    426|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    426|  static_assert(N > 0, "Passed zero length printTag");
  183|    426|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 276, False: 150]
  ------------------
  184|    276|    return os << _(td->label_);
  ------------------
  |  |   40|    276|#define _(String) (String)
  ------------------
  185|    150|  return os << "(" << value << ")";
  186|    426|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19casioFlashIntensityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    562|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    562|  static_assert(N > 0, "Passed zero length printTag");
  195|    562|  return printTag<N, array>(os, value.toInt64(), data);
  196|    562|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19casioFlashIntensityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    562|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    562|  static_assert(N > 0, "Passed zero length printTag");
  183|    562|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 278, False: 284]
  ------------------
  184|    278|    return os << _(td->label_);
  ------------------
  |  |   40|    278|#define _(String) (String)
  ------------------
  185|    284|  return os << "(" << value << ")";
  186|    562|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casioWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    660|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    660|  static_assert(N > 0, "Passed zero length printTag");
  195|    660|  return printTag<N, array>(os, value.toInt64(), data);
  196|    660|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casioWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    660|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    660|  static_assert(N > 0, "Passed zero length printTag");
  183|    660|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 330, False: 330]
  ------------------
  184|    330|    return os << _(td->label_);
  ------------------
  |  |   40|    330|#define _(String) (String)
  ------------------
  185|    330|  return os << "(" << value << ")";
  186|    660|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casioDigitalZoomEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    132|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    132|  static_assert(N > 0, "Passed zero length printTag");
  195|    132|  return printTag<N, array>(os, value.toInt64(), data);
  196|    132|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casioDigitalZoomEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    132|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    132|  static_assert(N > 0, "Passed zero length printTag");
  183|    132|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 92, False: 40]
  ------------------
  184|     92|    return os << _(td->label_);
  ------------------
  |  |   40|     92|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|    132|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casioSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    178|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    178|  static_assert(N > 0, "Passed zero length printTag");
  195|    178|  return printTag<N, array>(os, value.toInt64(), data);
  196|    178|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casioSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    178|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    178|  static_assert(N > 0, "Passed zero length printTag");
  183|    178|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 114, False: 64]
  ------------------
  184|    114|    return os << _(td->label_);
  ------------------
  |  |   40|    114|#define _(String) (String)
  ------------------
  185|     64|  return os << "(" << value << ")";
  186|    178|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casioContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    242|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    242|  static_assert(N > 0, "Passed zero length printTag");
  195|    242|  return printTag<N, array>(os, value.toInt64(), data);
  196|    242|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casioContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    242|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    242|  static_assert(N > 0, "Passed zero length printTag");
  183|    242|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 170, False: 72]
  ------------------
  184|    170|    return os << _(td->label_);
  ------------------
  |  |   40|    170|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|    242|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casioSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    686|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    686|  static_assert(N > 0, "Passed zero length printTag");
  195|    686|  return printTag<N, array>(os, value.toInt64(), data);
  196|    686|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casioSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    686|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    686|  static_assert(N > 0, "Passed zero length printTag");
  183|    686|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 336, False: 350]
  ------------------
  184|    336|    return os << _(td->label_);
  ------------------
  |  |   40|    336|#define _(String) (String)
  ------------------
  185|    350|  return os << "(" << value << ")";
  186|    686|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casioEnhancementEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    286|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    286|  static_assert(N > 0, "Passed zero length printTag");
  195|    286|  return printTag<N, array>(os, value.toInt64(), data);
  196|    286|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casioEnhancementEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    286|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    286|  static_assert(N > 0, "Passed zero length printTag");
  183|    286|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 156, False: 130]
  ------------------
  184|    156|    return os << _(td->label_);
  ------------------
  |  |   40|    156|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    286|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casioColorFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    308|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    308|  static_assert(N > 0, "Passed zero length printTag");
  195|    308|  return printTag<N, array>(os, value.toInt64(), data);
  196|    308|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casioColorFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    308|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    308|  static_assert(N > 0, "Passed zero length printTag");
  183|    308|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 214, False: 94]
  ------------------
  184|    214|    return os << _(td->label_);
  ------------------
  |  |   40|    214|#define _(String) (String)
  ------------------
  185|     94|  return os << "(" << value << ")";
  186|    308|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20casioFlashIntensity2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    218|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    218|  static_assert(N > 0, "Passed zero length printTag");
  195|    218|  return printTag<N, array>(os, value.toInt64(), data);
  196|    218|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20casioFlashIntensity2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    218|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    218|  static_assert(N > 0, "Passed zero length printTag");
  183|    218|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 138, False: 80]
  ------------------
  184|    138|    return os << _(td->label_);
  ------------------
  |  |   40|    138|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    218|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19casioCCDSensitivityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    286|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    286|  static_assert(N > 0, "Passed zero length printTag");
  195|    286|  return printTag<N, array>(os, value.toInt64(), data);
  196|    286|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19casioCCDSensitivityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    286|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    286|  static_assert(N > 0, "Passed zero length printTag");
  183|    286|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 204, False: 82]
  ------------------
  184|    204|    return os << _(td->label_);
  ------------------
  |  |   40|    204|#define _(String) (String)
  ------------------
  185|     82|  return os << "(" << value << ")";
  186|    286|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2QualityModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    162|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    162|  static_assert(N > 0, "Passed zero length printTag");
  195|    162|  return printTag<N, array>(os, value.toInt64(), data);
  196|    162|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2QualityModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    162|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    162|  static_assert(N > 0, "Passed zero length printTag");
  183|    162|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 62, False: 100]
  ------------------
  184|     62|    return os << _(td->label_);
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
  185|    100|  return os << "(" << value << ")";
  186|    162|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2ImageSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    338|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    338|  static_assert(N > 0, "Passed zero length printTag");
  195|    338|  return printTag<N, array>(os, value.toInt64(), data);
  196|    338|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2ImageSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    338|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    338|  static_assert(N > 0, "Passed zero length printTag");
  183|    338|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 300, False: 38]
  ------------------
  184|    300|    return os << _(td->label_);
  ------------------
  |  |   40|    300|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|    338|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2FocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    158|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    158|  static_assert(N > 0, "Passed zero length printTag");
  195|    158|  return printTag<N, array>(os, value.toInt64(), data);
  196|    158|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2FocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    158|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    158|  static_assert(N > 0, "Passed zero length printTag");
  183|    158|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 78, False: 80]
  ------------------
  184|     78|    return os << _(td->label_);
  ------------------
  |  |   40|     78|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    158|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casio2IsoSpeedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    192|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    192|  static_assert(N > 0, "Passed zero length printTag");
  195|    192|  return printTag<N, array>(os, value.toInt64(), data);
  196|    192|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casio2IsoSpeedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    192|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    192|  static_assert(N > 0, "Passed zero length printTag");
  183|    192|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 94, False: 98]
  ------------------
  184|     94|    return os << _(td->label_);
  ------------------
  |  |   40|     94|#define _(String) (String)
  ------------------
  185|     98|  return os << "(" << value << ")";
  186|    192|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casio2WhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    356|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    356|  static_assert(N > 0, "Passed zero length printTag");
  195|    356|  return printTag<N, array>(os, value.toInt64(), data);
  196|    356|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casio2WhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    356|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    356|  static_assert(N > 0, "Passed zero length printTag");
  183|    356|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 296, False: 60]
  ------------------
  184|    296|    return os << _(td->label_);
  ------------------
  |  |   40|    296|#define _(String) (String)
  ------------------
  185|     60|  return os << "(" << value << ")";
  186|    356|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casio2SaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    248|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    248|  static_assert(N > 0, "Passed zero length printTag");
  195|    248|  return printTag<N, array>(os, value.toInt64(), data);
  196|    248|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casio2SaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    248|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    248|  static_assert(N > 0, "Passed zero length printTag");
  183|    248|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 178, False: 70]
  ------------------
  184|    178|    return os << _(td->label_);
  ------------------
  |  |   40|    178|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|    248|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casio2ContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    262|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    262|  static_assert(N > 0, "Passed zero length printTag");
  195|    262|  return printTag<N, array>(os, value.toInt64(), data);
  196|    262|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14casio2ContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    262|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    262|  static_assert(N > 0, "Passed zero length printTag");
  183|    262|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 208, False: 54]
  ------------------
  184|    208|    return os << _(td->label_);
  ------------------
  |  |   40|    208|#define _(String) (String)
  ------------------
  185|     54|  return os << "(" << value << ")";
  186|    262|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2SharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    304|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    304|  static_assert(N > 0, "Passed zero length printTag");
  195|    304|  return printTag<N, array>(os, value.toInt64(), data);
  196|    304|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2SharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    304|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    304|  static_assert(N > 0, "Passed zero length printTag");
  183|    304|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 234, False: 70]
  ------------------
  184|    234|    return os << _(td->label_);
  ------------------
  |  |   40|    234|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|    304|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19casio2WhiteBalance2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    202|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    202|  static_assert(N > 0, "Passed zero length printTag");
  195|    202|  return printTag<N, array>(os, value.toInt64(), data);
  196|    202|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19casio2WhiteBalance2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    202|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    202|  static_assert(N > 0, "Passed zero length printTag");
  183|    202|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 182, False: 20]
  ------------------
  184|    182|    return os << _(td->label_);
  ------------------
  |  |   40|    182|#define _(String) (String)
  ------------------
  185|     20|  return os << "(" << value << ")";
  186|    202|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2ReleaseModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    184|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    184|  static_assert(N > 0, "Passed zero length printTag");
  195|    184|  return printTag<N, array>(os, value.toInt64(), data);
  196|    184|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2ReleaseModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    184|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    184|  static_assert(N > 0, "Passed zero length printTag");
  183|    184|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 110, False: 74]
  ------------------
  184|    110|    return os << _(td->label_);
  ------------------
  |  |   40|    110|#define _(String) (String)
  ------------------
  185|     74|  return os << "(" << value << ")";
  186|    184|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casio2QualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    180|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    180|  static_assert(N > 0, "Passed zero length printTag");
  195|    180|  return printTag<N, array>(os, value.toInt64(), data);
  196|    180|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casio2QualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    180|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    180|  static_assert(N > 0, "Passed zero length printTag");
  183|    180|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 118, False: 62]
  ------------------
  184|    118|    return os << _(td->label_);
  ------------------
  |  |   40|    118|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|    180|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casio2FocusMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    380|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    380|  static_assert(N > 0, "Passed zero length printTag");
  195|    380|  return printTag<N, array>(os, value.toInt64(), data);
  196|    380|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16casio2FocusMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    380|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    380|  static_assert(N > 0, "Passed zero length printTag");
  183|    380|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 282, False: 98]
  ------------------
  184|    282|    return os << _(td->label_);
  ------------------
  |  |   40|    282|#define _(String) (String)
  ------------------
  185|     98|  return os << "(" << value << ")";
  186|    380|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casio2AutoISOEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    256|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    256|  static_assert(N > 0, "Passed zero length printTag");
  195|    256|  return printTag<N, array>(os, value.toInt64(), data);
  196|    256|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casio2AutoISOEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    256|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    256|  static_assert(N > 0, "Passed zero length printTag");
  183|    256|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 156, False: 100]
  ------------------
  184|    156|    return os << _(td->label_);
  ------------------
  |  |   40|    156|#define _(String) (String)
  ------------------
  185|    100|  return os << "(" << value << ")";
  186|    256|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12casio2AFModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    172|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    172|  static_assert(N > 0, "Passed zero length printTag");
  195|    172|  return printTag<N, array>(os, value.toInt64(), data);
  196|    172|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12casio2AFModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    172|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    172|  static_assert(N > 0, "Passed zero length printTag");
  183|    172|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 136, False: 36]
  ------------------
  184|    136|    return os << _(td->label_);
  ------------------
  |  |   40|    136|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|    172|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2ColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    222|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    222|  static_assert(N > 0, "Passed zero length printTag");
  195|    222|  return printTag<N, array>(os, value.toInt64(), data);
  196|    222|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2ColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    222|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    222|  static_assert(N > 0, "Passed zero length printTag");
  183|    222|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 146, False: 76]
  ------------------
  184|    146|    return os << _(td->label_);
  ------------------
  |  |   40|    146|#define _(String) (String)
  ------------------
  185|     76|  return os << "(" << value << ")";
  186|    222|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2EnhancementEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     92|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     92|  static_assert(N > 0, "Passed zero length printTag");
  195|     92|  return printTag<N, array>(os, value.toInt64(), data);
  196|     92|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2EnhancementEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     92|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     92|  static_assert(N > 0, "Passed zero length printTag");
  183|     92|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 34, False: 58]
  ------------------
  184|     34|    return os << _(td->label_);
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|     92|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2ColorFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    288|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    288|  static_assert(N > 0, "Passed zero length printTag");
  195|    288|  return printTag<N, array>(os, value.toInt64(), data);
  196|    288|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17casio2ColorFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    288|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    288|  static_assert(N > 0, "Passed zero length printTag");
  183|    288|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 208, False: 80]
  ------------------
  184|    208|    return os << _(td->label_);
  ------------------
  |  |   40|    208|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    288|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casio2ArtModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    554|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    554|  static_assert(N > 0, "Passed zero length printTag");
  195|    554|  return printTag<N, array>(os, value.toInt64(), data);
  196|    554|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13casio2ArtModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    554|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    554|  static_assert(N > 0, "Passed zero length printTag");
  183|    554|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 488, False: 66]
  ------------------
  184|    488|    return os << _(td->label_);
  ------------------
  |  |   40|    488|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|    554|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casio2LightingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    102|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    102|  static_assert(N > 0, "Passed zero length printTag");
  195|    102|  return printTag<N, array>(os, value.toInt64(), data);
  196|    102|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casio2LightingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    102|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    102|  static_assert(N > 0, "Passed zero length printTag");
  183|    102|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 62]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|    102|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21casio2PortraitRefinerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    120|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    120|  static_assert(N > 0, "Passed zero length printTag");
  195|    120|  return printTag<N, array>(os, value.toInt64(), data);
  196|    120|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21casio2PortraitRefinerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    120|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    120|  static_assert(N > 0, "Passed zero length printTag");
  183|    120|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 74]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|     74|  return os << "(" << value << ")";
  186|    120|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26casio2SpecialEffectSettingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    180|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    180|  static_assert(N > 0, "Passed zero length printTag");
  195|    180|  return printTag<N, array>(os, value.toInt64(), data);
  196|    180|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26casio2SpecialEffectSettingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    180|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    180|  static_assert(N > 0, "Passed zero length printTag");
  183|    180|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 150, False: 30]
  ------------------
  184|    150|    return os << _(td->label_);
  ------------------
  |  |   40|    150|#define _(String) (String)
  ------------------
  185|     30|  return os << "(" << value << ")";
  186|    180|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm16ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2DriveModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    634|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    634|  static_assert(N > 0, "Passed zero length printTag");
  195|    634|  return printTag<N, array>(os, value.toInt64(), data);
  196|    634|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm16ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15casio2DriveModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    634|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    634|  static_assert(N > 0, "Passed zero length printTag");
  183|    634|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 544, False: 90]
  ------------------
  184|    544|    return os << _(td->label_);
  ------------------
  |  |   40|    544|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    634|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casio2VideoQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    132|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    132|  static_assert(N > 0, "Passed zero length printTag");
  195|    132|  return printTag<N, array>(os, value.toInt64(), data);
  196|    132|}
casiomn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18casio2VideoQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    132|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    132|  static_assert(N > 0, "Passed zero length printTag");
  183|    132|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 110, False: 22]
  ------------------
  184|    110|    return os << _(td->label_);
  ------------------
  |  |   40|    110|#define _(String) (String)
  ------------------
  185|     22|  return os << "(" << value << ")";
  186|    132|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    282|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    282|  static_assert(N > 0, "Passed zero length printTag");
  195|    282|  return printTag<N, array>(os, value.toInt64(), data);
  196|    282|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    282|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    282|  static_assert(N > 0, "Passed zero length printTag");
  183|    282|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 170, False: 112]
  ------------------
  184|    170|    return os << _(td->label_);
  ------------------
  |  |   40|    170|#define _(String) (String)
  ------------------
  185|    112|  return os << "(" << value << ")";
  186|    282|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16fujiWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    856|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    856|  static_assert(N > 0, "Passed zero length printTag");
  195|    856|  return printTag<N, array>(os, value.toInt64(), data);
  196|    856|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16fujiWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    856|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    856|  static_assert(N > 0, "Passed zero length printTag");
  183|    856|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 472, False: 384]
  ------------------
  184|    472|    return os << _(td->label_);
  ------------------
  |  |   40|    472|#define _(String) (String)
  ------------------
  185|    384|  return os << "(" << value << ")";
  186|    856|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm20ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9fujiColorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    540|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    540|  static_assert(N > 0, "Passed zero length printTag");
  195|    540|  return printTag<N, array>(os, value.toInt64(), data);
  196|    540|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm20ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9fujiColorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    540|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    540|  static_assert(N > 0, "Passed zero length printTag");
  183|    540|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 226, False: 314]
  ------------------
  184|    226|    return os << _(td->label_);
  ------------------
  |  |   40|    226|#define _(String) (String)
  ------------------
  185|    314|  return os << "(" << value << ")";
  186|    540|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8fujiToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    340|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    340|  static_assert(N > 0, "Passed zero length printTag");
  195|    340|  return printTag<N, array>(os, value.toInt64(), data);
  196|    340|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L8fujiToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    340|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    340|  static_assert(N > 0, "Passed zero length printTag");
  183|    340|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 110, False: 230]
  ------------------
  184|    110|    return os << _(td->label_);
  ------------------
  |  |   40|    110|#define _(String) (String)
  ------------------
  185|    230|  return os << "(" << value << ")";
  186|    340|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12fujiContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    270|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    270|  static_assert(N > 0, "Passed zero length printTag");
  195|    270|  return printTag<N, array>(os, value.toInt64(), data);
  196|    270|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12fujiContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    270|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    270|  static_assert(N > 0, "Passed zero length printTag");
  183|    270|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 76, False: 194]
  ------------------
  184|     76|    return os << _(td->label_);
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
  185|    194|  return os << "(" << value << ")";
  186|    270|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18fujiNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    330|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    330|  static_assert(N > 0, "Passed zero length printTag");
  195|    330|  return printTag<N, array>(os, value.toInt64(), data);
  196|    330|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18fujiNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    330|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    330|  static_assert(N > 0, "Passed zero length printTag");
  183|    330|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 292]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|    292|  return os << "(" << value << ")";
  186|    330|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiHighIsoNREEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    258|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    258|  static_assert(N > 0, "Passed zero length printTag");
  195|    258|  return printTag<N, array>(os, value.toInt64(), data);
  196|    258|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiHighIsoNREEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    258|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    258|  static_assert(N > 0, "Passed zero length printTag");
  183|    258|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 116, False: 142]
  ------------------
  184|    116|    return os << _(td->label_);
  ------------------
  |  |   40|    116|#define _(String) (String)
  ------------------
  185|    142|  return os << "(" << value << ")";
  186|    258|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11fujiClarityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    220|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    220|  static_assert(N > 0, "Passed zero length printTag");
  195|    220|  return printTag<N, array>(os, value.toInt64(), data);
  196|    220|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11fujiClarityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    220|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    220|  static_assert(N > 0, "Passed zero length printTag");
  183|    220|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 184]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|    184|  return os << "(" << value << ")";
  186|    220|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm25ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    174|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    174|  static_assert(N > 0, "Passed zero length printTag");
  195|    174|  return printTag<N, array>(os, value.toInt64(), data);
  196|    174|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm25ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    174|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    174|  static_assert(N > 0, "Passed zero length printTag");
  183|    174|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 86, False: 88]
  ------------------
  184|     86|    return os << _(td->label_);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  185|     88|  return os << "(" << value << ")";
  186|    174|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9fujiOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    310|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    310|  static_assert(N > 0, "Passed zero length printTag");
  195|    310|  return printTag<N, array>(os, value.toInt64(), data);
  196|    310|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9fujiOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    310|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    310|  static_assert(N > 0, "Passed zero length printTag");
  183|    310|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 102, False: 208]
  ------------------
  184|    102|    return os << _(td->label_);
  ------------------
  |  |   40|    102|#define _(String) (String)
  ------------------
  185|    208|  return os << "(" << value << ")";
  186|    310|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    104|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    104|  static_assert(N > 0, "Passed zero length printTag");
  195|    104|  return printTag<N, array>(os, value.toInt64(), data);
  196|    104|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    104|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    104|  static_assert(N > 0, "Passed zero length printTag");
  183|    104|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 50, False: 54]
  ------------------
  184|     50|    return os << _(td->label_);
  ------------------
  |  |   40|     50|#define _(String) (String)
  ------------------
  185|     54|  return os << "(" << value << ")";
  186|    104|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiFocusAreaEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    204|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    204|  static_assert(N > 0, "Passed zero length printTag");
  195|    204|  return printTag<N, array>(os, value.toInt64(), data);
  196|    204|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13fujiFocusAreaEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    204|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    204|  static_assert(N > 0, "Passed zero length printTag");
  183|    204|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 80, False: 124]
  ------------------
  184|     80|    return os << _(td->label_);
  ------------------
  |  |   40|     80|#define _(String) (String)
  ------------------
  185|    124|  return os << "(" << value << ")";
  186|    204|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm33ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15fujiPictureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.86k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.86k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.86k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.86k|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm33ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15fujiPictureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.86k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.86k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.86k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.56k, False: 298]
  ------------------
  184|  1.56k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.56k|#define _(String) (String)
  ------------------
  185|    298|  return os << "(" << value << ")";
  186|  1.86k|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11fujiExrModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    196|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    196|  static_assert(N > 0, "Passed zero length printTag");
  195|    196|  return printTag<N, array>(os, value.toInt64(), data);
  196|    196|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11fujiExrModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    196|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    196|  static_assert(N > 0, "Passed zero length printTag");
  183|    196|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 62, False: 134]
  ------------------
  184|     62|    return os << _(td->label_);
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
  185|    134|  return os << "(" << value << ")";
  186|    196|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10fujiSHToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    566|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    566|  static_assert(N > 0, "Passed zero length printTag");
  195|    566|  return printTag<N, array>(os, value.toInt64(), data);
  196|    566|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10fujiSHToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    566|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    566|  static_assert(N > 0, "Passed zero length printTag");
  183|    566|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 366, False: 200]
  ------------------
  184|    366|    return os << _(td->label_);
  ------------------
  |  |   40|    366|#define _(String) (String)
  ------------------
  185|    200|  return os << "(" << value << ")";
  186|    566|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22fujiOff0Weak32Strong64EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    310|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    310|  static_assert(N > 0, "Passed zero length printTag");
  195|    310|  return printTag<N, array>(os, value.toInt64(), data);
  196|    310|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22fujiOff0Weak32Strong64EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    310|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    310|  static_assert(N > 0, "Passed zero length printTag");
  183|    310|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 86, False: 224]
  ------------------
  184|     86|    return os << _(td->label_);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  185|    224|  return os << "(" << value << ")";
  186|    310|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12fujiCropModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    196|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    196|  static_assert(N > 0, "Passed zero length printTag");
  195|    196|  return printTag<N, array>(os, value.toInt64(), data);
  196|    196|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12fujiCropModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    196|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    196|  static_assert(N > 0, "Passed zero length printTag");
  183|    196|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 128, False: 68]
  ------------------
  184|    128|    return os << _(td->label_);
  ------------------
  |  |   40|    128|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|    196|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15fujiShutterTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    258|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    258|  static_assert(N > 0, "Passed zero length printTag");
  195|    258|  return printTag<N, array>(os, value.toInt64(), data);
  196|    258|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15fujiShutterTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    258|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    258|  static_assert(N > 0, "Passed zero length printTag");
  183|    258|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 172, False: 86]
  ------------------
  184|    172|    return os << _(td->label_);
  ------------------
  |  |   40|    172|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    258|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14fujiContinuousEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    178|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    178|  static_assert(N > 0, "Passed zero length printTag");
  195|    178|  return printTag<N, array>(os, value.toInt64(), data);
  196|    178|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14fujiContinuousEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    178|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    178|  static_assert(N > 0, "Passed zero length printTag");
  183|    178|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 122, False: 56]
  ------------------
  184|    122|    return os << _(td->label_);
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
  185|     56|  return os << "(" << value << ")";
  186|    178|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21fujiPanoramaDirectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21fujiPanoramaDirectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 70, False: 72]
  ------------------
  184|     70|    return os << _(td->label_);
  ------------------
  |  |   40|     70|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|    142|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18fujiAdvancedFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    698|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    698|  static_assert(N > 0, "Passed zero length printTag");
  195|    698|  return printTag<N, array>(os, value.toInt64(), data);
  196|    698|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18fujiAdvancedFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    698|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    698|  static_assert(N > 0, "Passed zero length printTag");
  183|    698|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 206, False: 492]
  ------------------
  184|    206|    return os << _(td->label_);
  ------------------
  |  |   40|    206|#define _(String) (String)
  ------------------
  185|    492|  return os << "(" << value << ")";
  186|    698|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16fujiFinePixColorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    222|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    222|  static_assert(N > 0, "Passed zero length printTag");
  195|    222|  return printTag<N, array>(os, value.toInt64(), data);
  196|    222|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16fujiFinePixColorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    222|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    222|  static_assert(N > 0, "Passed zero length printTag");
  183|    222|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 120, False: 102]
  ------------------
  184|    120|    return os << _(td->label_);
  ------------------
  |  |   40|    120|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    222|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16fujiDynamicRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    330|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    330|  static_assert(N > 0, "Passed zero length printTag");
  195|    330|  return printTag<N, array>(os, value.toInt64(), data);
  196|    330|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16fujiDynamicRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    330|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    330|  static_assert(N > 0, "Passed zero length printTag");
  183|    330|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 26, False: 304]
  ------------------
  184|     26|    return os << _(td->label_);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  185|    304|  return os << "(" << value << ")";
  186|    330|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm16ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12fujiFilmModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.24k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.24k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.24k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.24k|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm16ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12fujiFilmModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.24k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.24k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.24k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 796, False: 444]
  ------------------
  184|    796|    return os << _(td->label_);
  ------------------
  |  |   40|    796|#define _(String) (String)
  ------------------
  185|    444|  return os << "(" << value << ")";
  186|  1.24k|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23fujiDynamicRangeSettingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    376|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    376|  static_assert(N > 0, "Passed zero length printTag");
  195|    376|  return printTag<N, array>(os, value.toInt64(), data);
  196|    376|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23fujiDynamicRangeSettingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    376|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    376|  static_assert(N > 0, "Passed zero length printTag");
  183|    376|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 178, False: 198]
  ------------------
  184|    178|    return os << _(td->label_);
  ------------------
  |  |   40|    178|#define _(String) (String)
  ------------------
  185|    198|  return os << "(" << value << ")";
  186|    376|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20fujiSceneRecognitionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    534|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    534|  static_assert(N > 0, "Passed zero length printTag");
  195|    534|  return printTag<N, array>(os, value.toInt64(), data);
  196|    534|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20fujiSceneRecognitionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    534|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    534|  static_assert(N > 0, "Passed zero length printTag");
  183|    534|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 212, False: 322]
  ------------------
  184|    212|    return os << _(td->label_);
  ------------------
  |  |   40|    212|#define _(String) (String)
  ------------------
  185|    322|  return os << "(" << value << ")";
  186|    534|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19fujiImageGenerationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     72|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     72|  static_assert(N > 0, "Passed zero length printTag");
  195|     72|  return printTag<N, array>(os, value.toInt64(), data);
  196|     72|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19fujiImageGenerationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     72|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     72|  static_assert(N > 0, "Passed zero length printTag");
  183|     72|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 44]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     44|  return os << "(" << value << ")";
  186|     72|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18fujiDRangePriorityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     70|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     70|  static_assert(N > 0, "Passed zero length printTag");
  195|     70|  return printTag<N, array>(os, value.toInt64(), data);
  196|     70|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18fujiDRangePriorityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     70|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     70|  static_assert(N > 0, "Passed zero length printTag");
  183|     70|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 42, False: 28]
  ------------------
  184|     42|    return os << _(td->label_);
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  185|     28|  return os << "(" << value << ")";
  186|     70|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23fujiDRangePriorityFixedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    124|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    124|  static_assert(N > 0, "Passed zero length printTag");
  195|    124|  return printTag<N, array>(os, value.toInt64(), data);
  196|    124|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23fujiDRangePriorityFixedEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    124|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    124|  static_assert(N > 0, "Passed zero length printTag");
  183|    124|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 44, False: 80]
  ------------------
  184|     44|    return os << _(td->label_);
  ------------------
  |  |   40|     44|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    124|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22fujiDRangePriorityAutoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     80|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     80|  static_assert(N > 0, "Passed zero length printTag");
  195|     80|  return printTag<N, array>(os, value.toInt64(), data);
  196|     80|}
fujimn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22fujiDRangePriorityAutoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     80|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     80|  static_assert(N > 0, "Passed zero length printTag");
  183|     80|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 42]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|     42|  return os << "(" << value << ")";
  186|     80|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16minoltaColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    618|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    618|  static_assert(N > 0, "Passed zero length printTag");
  195|    618|  return printTag<N, array>(os, value.toInt64(), data);
  196|    618|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16minoltaColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    618|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    618|  static_assert(N > 0, "Passed zero length printTag");
  183|    618|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 452, False: 166]
  ------------------
  184|    452|    return os << _(td->label_);
  ------------------
  |  |   40|    452|#define _(String) (String)
  ------------------
  185|    166|  return os << "(" << value << ")";
  186|    618|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaImageQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    688|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    688|  static_assert(N > 0, "Passed zero length printTag");
  195|    688|  return printTag<N, array>(os, value.toInt64(), data);
  196|    688|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaImageQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    688|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    688|  static_assert(N > 0, "Passed zero length printTag");
  183|    688|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 460, False: 228]
  ------------------
  184|    460|    return os << _(td->label_);
  ------------------
  |  |   40|    460|#define _(String) (String)
  ------------------
  185|    228|  return os << "(" << value << ")";
  186|    688|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25minoltaImageStabilizationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    206|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    206|  static_assert(N > 0, "Passed zero length printTag");
  195|    206|  return printTag<N, array>(os, value.toInt64(), data);
  196|    206|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25minoltaImageStabilizationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    206|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    206|  static_assert(N > 0, "Passed zero length printTag");
  183|    206|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 128, False: 78]
  ------------------
  184|    128|    return os << _(td->label_);
  ------------------
  |  |   40|    128|#define _(String) (String)
  ------------------
  185|     78|  return os << "(" << value << ")";
  186|    206|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28minoltaWhiteBalanceStd0x0115EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    720|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    720|  static_assert(N > 0, "Passed zero length printTag");
  195|    720|  return printTag<N, array>(os, value.toInt64(), data);
  196|    720|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28minoltaWhiteBalanceStd0x0115EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    720|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    720|  static_assert(N > 0, "Passed zero length printTag");
  183|    720|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 624, False: 96]
  ------------------
  184|    624|    return os << _(td->label_);
  ------------------
  |  |   40|    624|#define _(String) (String)
  ------------------
  185|     96|  return os << "(" << value << ")";
  186|    720|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaExposureModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    608|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    608|  static_assert(N > 0, "Passed zero length printTag");
  195|    608|  return printTag<N, array>(os, value.toInt64(), data);
  196|    608|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaExposureModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    608|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    608|  static_assert(N > 0, "Passed zero length printTag");
  183|    608|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 580]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|    580|  return os << "(" << value << ")";
  186|    608|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaFlashModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    604|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    604|  static_assert(N > 0, "Passed zero length printTag");
  195|    604|  return printTag<N, array>(os, value.toInt64(), data);
  196|    604|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaFlashModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    604|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    604|  static_assert(N > 0, "Passed zero length printTag");
  183|    604|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 88, False: 516]
  ------------------
  184|     88|    return os << _(td->label_);
  ------------------
  |  |   40|     88|#define _(String) (String)
  ------------------
  185|    516|  return os << "(" << value << ")";
  186|    604|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaWhiteBalanceStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    604|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    604|  static_assert(N > 0, "Passed zero length printTag");
  195|    604|  return printTag<N, array>(os, value.toInt64(), data);
  196|    604|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaWhiteBalanceStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    604|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    604|  static_assert(N > 0, "Passed zero length printTag");
  183|    604|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 72, False: 532]
  ------------------
  184|     72|    return os << _(td->label_);
  ------------------
  |  |   40|     72|#define _(String) (String)
  ------------------
  185|    532|  return os << "(" << value << ")";
  186|    604|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaImageSizeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    604|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    604|  static_assert(N > 0, "Passed zero length printTag");
  195|    604|  return printTag<N, array>(os, value.toInt64(), data);
  196|    604|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaImageSizeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    604|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    604|  static_assert(N > 0, "Passed zero length printTag");
  183|    604|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 64, False: 540]
  ------------------
  184|     64|    return os << _(td->label_);
  ------------------
  |  |   40|     64|#define _(String) (String)
  ------------------
  185|    540|  return os << "(" << value << ")";
  186|    604|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaImageQualityStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    602|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    602|  static_assert(N > 0, "Passed zero length printTag");
  195|    602|  return printTag<N, array>(os, value.toInt64(), data);
  196|    602|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaImageQualityStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    602|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    602|  static_assert(N > 0, "Passed zero length printTag");
  183|    602|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 146, False: 456]
  ------------------
  184|    146|    return os << _(td->label_);
  ------------------
  |  |   40|    146|#define _(String) (String)
  ------------------
  185|    456|  return os << "(" << value << ")";
  186|    602|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaDriveModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    602|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    602|  static_assert(N > 0, "Passed zero length printTag");
  195|    602|  return printTag<N, array>(os, value.toInt64(), data);
  196|    602|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaDriveModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    602|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    602|  static_assert(N > 0, "Passed zero length printTag");
  183|    602|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 76, False: 526]
  ------------------
  184|     76|    return os << _(td->label_);
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
  185|    526|  return os << "(" << value << ")";
  186|    602|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaMeteringModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    602|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    602|  static_assert(N > 0, "Passed zero length printTag");
  195|    602|  return printTag<N, array>(os, value.toInt64(), data);
  196|    602|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaMeteringModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    602|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    602|  static_assert(N > 0, "Passed zero length printTag");
  183|    602|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 26, False: 576]
  ------------------
  184|     26|    return os << _(td->label_);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  185|    576|  return os << "(" << value << ")";
  186|    602|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaDigitalZoomStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    560|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    560|  static_assert(N > 0, "Passed zero length printTag");
  195|    560|  return printTag<N, array>(os, value.toInt64(), data);
  196|    560|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaDigitalZoomStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    560|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    560|  static_assert(N > 0, "Passed zero length printTag");
  183|    560|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 492]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|    492|  return os << "(" << value << ")";
  186|    560|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaBracketStepStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    560|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    560|  static_assert(N > 0, "Passed zero length printTag");
  195|    560|  return printTag<N, array>(os, value.toInt64(), data);
  196|    560|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaBracketStepStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    560|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    560|  static_assert(N > 0, "Passed zero length printTag");
  183|    560|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 514]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|    514|  return os << "(" << value << ")";
  186|    560|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaFlashFiredEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.29k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.29k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.29k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.29k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaFlashFiredEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.29k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.29k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.29k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 176, False: 1.12k]
  ------------------
  184|    176|    return os << _(td->label_);
  ------------------
  |  |   40|    176|#define _(String) (String)
  ------------------
  185|  1.12k|  return os << "(" << value << ")";
  186|  1.29k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaSharpnessStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    548|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    548|  static_assert(N > 0, "Passed zero length printTag");
  195|    548|  return printTag<N, array>(os, value.toInt64(), data);
  196|    548|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaSharpnessStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    548|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    548|  static_assert(N > 0, "Passed zero length printTag");
  183|    548|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 52, False: 496]
  ------------------
  184|     52|    return os << _(td->label_);
  ------------------
  |  |   40|     52|#define _(String) (String)
  ------------------
  185|    496|  return os << "(" << value << ")";
  186|    548|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24minoltaSubjectProgramStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    548|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    548|  static_assert(N > 0, "Passed zero length printTag");
  195|    548|  return printTag<N, array>(os, value.toInt64(), data);
  196|    548|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24minoltaSubjectProgramStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    548|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    548|  static_assert(N > 0, "Passed zero length printTag");
  183|    548|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 76, False: 472]
  ------------------
  184|     76|    return os << _(td->label_);
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
  185|    472|  return os << "(" << value << ")";
  186|    548|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaISOSettingStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    538|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    538|  static_assert(N > 0, "Passed zero length printTag");
  195|    538|  return printTag<N, array>(os, value.toInt64(), data);
  196|    538|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaISOSettingStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    538|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    538|  static_assert(N > 0, "Passed zero length printTag");
  183|    538|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 80, False: 458]
  ------------------
  184|     80|    return os << _(td->label_);
  ------------------
  |  |   40|     80|#define _(String) (String)
  ------------------
  185|    458|  return os << "(" << value << ")";
  186|    538|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15minoltaModelStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    538|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    538|  static_assert(N > 0, "Passed zero length printTag");
  195|    538|  return printTag<N, array>(os, value.toInt64(), data);
  196|    538|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15minoltaModelStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    538|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    538|  static_assert(N > 0, "Passed zero length printTag");
  183|    538|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 80, False: 458]
  ------------------
  184|     80|    return os << _(td->label_);
  ------------------
  |  |   40|     80|#define _(String) (String)
  ------------------
  185|    458|  return os << "(" << value << ")";
  186|    538|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaIntervalModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    536|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    536|  static_assert(N > 0, "Passed zero length printTag");
  195|    536|  return printTag<N, array>(os, value.toInt64(), data);
  196|    536|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaIntervalModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    536|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    536|  static_assert(N > 0, "Passed zero length printTag");
  183|    536|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 44, False: 492]
  ------------------
  184|     44|    return os << _(td->label_);
  ------------------
  |  |   40|     44|#define _(String) (String)
  ------------------
  185|    492|  return os << "(" << value << ")";
  186|    536|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaFolderNameStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    536|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    536|  static_assert(N > 0, "Passed zero length printTag");
  195|    536|  return printTag<N, array>(os, value.toInt64(), data);
  196|    536|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaFolderNameStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    536|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    536|  static_assert(N > 0, "Passed zero length printTag");
  183|    536|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 20, False: 516]
  ------------------
  184|     20|    return os << _(td->label_);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  185|    516|  return os << "(" << value << ")";
  186|    536|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaColorModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    536|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    536|  static_assert(N > 0, "Passed zero length printTag");
  195|    536|  return printTag<N, array>(os, value.toInt64(), data);
  196|    536|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaColorModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    536|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    536|  static_assert(N > 0, "Passed zero length printTag");
  183|    536|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 66, False: 470]
  ------------------
  184|     66|    return os << _(td->label_);
  ------------------
  |  |   40|     66|#define _(String) (String)
  ------------------
  185|    470|  return os << "(" << value << ")";
  186|    536|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaWideFocusZoneStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    524|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    524|  static_assert(N > 0, "Passed zero length printTag");
  195|    524|  return printTag<N, array>(os, value.toInt64(), data);
  196|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaWideFocusZoneStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    524|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    524|  static_assert(N > 0, "Passed zero length printTag");
  183|    524|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 456]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|    456|  return os << "(" << value << ")";
  186|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaFocusModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    594|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    594|  static_assert(N > 0, "Passed zero length printTag");
  195|    594|  return printTag<N, array>(os, value.toInt64(), data);
  196|    594|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaFocusModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    594|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    594|  static_assert(N > 0, "Passed zero length printTag");
  183|    594|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 66, False: 528]
  ------------------
  184|     66|    return os << _(td->label_);
  ------------------
  |  |   40|     66|#define _(String) (String)
  ------------------
  185|    528|  return os << "(" << value << ")";
  186|    594|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaFocusAreaStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    524|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    524|  static_assert(N > 0, "Passed zero length printTag");
  195|    524|  return printTag<N, array>(os, value.toInt64(), data);
  196|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaFocusAreaStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    524|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    524|  static_assert(N > 0, "Passed zero length printTag");
  183|    524|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 58, False: 466]
  ------------------
  184|     58|    return os << _(td->label_);
  ------------------
  |  |   40|     58|#define _(String) (String)
  ------------------
  185|    466|  return os << "(" << value << ")";
  186|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaDECPositionStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    524|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    524|  static_assert(N > 0, "Passed zero length printTag");
  195|    524|  return printTag<N, array>(os, value.toInt64(), data);
  196|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaDECPositionStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    524|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    524|  static_assert(N > 0, "Passed zero length printTag");
  183|    524|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 456]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|    456|  return os << "(" << value << ")";
  186|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaColorProfileStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    524|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    524|  static_assert(N > 0, "Passed zero length printTag");
  195|    524|  return printTag<N, array>(os, value.toInt64(), data);
  196|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaColorProfileStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    524|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    524|  static_assert(N > 0, "Passed zero length printTag");
  183|    524|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 60, False: 464]
  ------------------
  184|     60|    return os << _(td->label_);
  ------------------
  |  |   40|     60|#define _(String) (String)
  ------------------
  185|    464|  return os << "(" << value << ")";
  186|    524|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaDataImprintStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    522|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    522|  static_assert(N > 0, "Passed zero length printTag");
  195|    522|  return printTag<N, array>(os, value.toInt64(), data);
  196|    522|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaDataImprintStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    522|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    522|  static_assert(N > 0, "Passed zero length printTag");
  183|    522|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 84, False: 438]
  ------------------
  184|     84|    return os << _(td->label_);
  ------------------
  |  |   40|     84|#define _(String) (String)
  ------------------
  185|    438|  return os << "(" << value << ")";
  186|    522|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaFlashMeteringStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    578|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    578|  static_assert(N > 0, "Passed zero length printTag");
  195|    578|  return printTag<N, array>(os, value.toInt64(), data);
  196|    578|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaFlashMeteringStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    578|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    578|  static_assert(N > 0, "Passed zero length printTag");
  183|    578|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 78, False: 500]
  ------------------
  184|     78|    return os << _(td->label_);
  ------------------
  |  |   40|     78|#define _(String) (String)
  ------------------
  185|    500|  return os << "(" << value << ")";
  186|    578|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaExposureMode7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    112|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    112|  static_assert(N > 0, "Passed zero length printTag");
  195|    112|  return printTag<N, array>(os, value.toInt64(), data);
  196|    112|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaExposureMode7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    112|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    112|  static_assert(N > 0, "Passed zero length printTag");
  183|    112|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 82]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|     82|  return os << "(" << value << ")";
  186|    112|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaImageSize7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    104|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    104|  static_assert(N > 0, "Passed zero length printTag");
  195|    104|  return printTag<N, array>(os, value.toInt64(), data);
  196|    104|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaImageSize7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    104|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    104|  static_assert(N > 0, "Passed zero length printTag");
  183|    104|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 68]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|    104|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaImageQuality7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    104|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    104|  static_assert(N > 0, "Passed zero length printTag");
  195|    104|  return printTag<N, array>(os, value.toInt64(), data);
  196|    104|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaImageQuality7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    104|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    104|  static_assert(N > 0, "Passed zero length printTag");
  183|    104|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 76]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     76|  return os << "(" << value << ")";
  186|    104|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaWhiteBalance7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    100|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    100|  static_assert(N > 0, "Passed zero length printTag");
  195|    100|  return printTag<N, array>(os, value.toInt64(), data);
  196|    100|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaWhiteBalance7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    100|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    100|  static_assert(N > 0, "Passed zero length printTag");
  183|    100|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 42, False: 58]
  ------------------
  184|     42|    return os << _(td->label_);
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|    100|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaFocusMode7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     94|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     94|  static_assert(N > 0, "Passed zero length printTag");
  195|     94|  return printTag<N, array>(os, value.toInt64(), data);
  196|     94|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaFocusMode7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     94|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     94|  static_assert(N > 0, "Passed zero length printTag");
  183|     94|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 32, False: 62]
  ------------------
  184|     32|    return os << _(td->label_);
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|     94|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaAFPoints7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     92|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     92|  static_assert(N > 0, "Passed zero length printTag");
  195|     92|  return printTag<N, array>(os, value.toInt64(), data);
  196|     92|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaAFPoints7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     92|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     92|  static_assert(N > 0, "Passed zero length printTag");
  183|     92|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 70]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|     92|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaISOSetting7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     62|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     62|  static_assert(N > 0, "Passed zero length printTag");
  195|     62|  return printTag<N, array>(os, value.toInt64(), data);
  196|     62|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaISOSetting7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     62|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     62|  static_assert(N > 0, "Passed zero length printTag");
  183|     62|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 34]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|     62|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaColorSpace7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     48|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     48|  static_assert(N > 0, "Passed zero length printTag");
  195|     48|  return printTag<N, array>(os, value.toInt64(), data);
  196|     48|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaColorSpace7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     48|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     48|  static_assert(N > 0, "Passed zero length printTag");
  183|     48|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 30]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     30|  return os << "(" << value << ")";
  186|     48|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaRotation7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     36|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     36|  static_assert(N > 0, "Passed zero length printTag");
  195|     36|  return printTag<N, array>(os, value.toInt64(), data);
  196|     36|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaRotation7DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     36|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     36|  static_assert(N > 0, "Passed zero length printTag");
  183|     36|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 30]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|     30|  return os << "(" << value << ")";
  186|     36|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaExposureMode5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    284|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    284|  static_assert(N > 0, "Passed zero length printTag");
  195|    284|  return printTag<N, array>(os, value.toInt64(), data);
  196|    284|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaExposureMode5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    284|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    284|  static_assert(N > 0, "Passed zero length printTag");
  183|    284|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 64, False: 220]
  ------------------
  184|     64|    return os << _(td->label_);
  ------------------
  |  |   40|     64|#define _(String) (String)
  ------------------
  185|    220|  return os << "(" << value << ")";
  186|    284|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaImageSize5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    138|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    138|  static_assert(N > 0, "Passed zero length printTag");
  195|    138|  return printTag<N, array>(os, value.toInt64(), data);
  196|    138|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaImageSize5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    138|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    138|  static_assert(N > 0, "Passed zero length printTag");
  183|    138|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 58, False: 80]
  ------------------
  184|     58|    return os << _(td->label_);
  ------------------
  |  |   40|     58|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    138|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaImageQuality5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    138|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    138|  static_assert(N > 0, "Passed zero length printTag");
  195|    138|  return printTag<N, array>(os, value.toInt64(), data);
  196|    138|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaImageQuality5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    138|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    138|  static_assert(N > 0, "Passed zero length printTag");
  183|    138|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 44, False: 94]
  ------------------
  184|     44|    return os << _(td->label_);
  ------------------
  |  |   40|     44|#define _(String) (String)
  ------------------
  185|     94|  return os << "(" << value << ")";
  186|    138|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaWhiteBalance5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    280|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    280|  static_assert(N > 0, "Passed zero length printTag");
  195|    280|  return printTag<N, array>(os, value.toInt64(), data);
  196|    280|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaWhiteBalance5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    280|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    280|  static_assert(N > 0, "Passed zero length printTag");
  183|    280|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 92, False: 188]
  ------------------
  184|     92|    return os << _(td->label_);
  ------------------
  |  |   40|     92|#define _(String) (String)
  ------------------
  185|    188|  return os << "(" << value << ")";
  186|    280|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaFocusPosition5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    126|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    126|  static_assert(N > 0, "Passed zero length printTag");
  195|    126|  return printTag<N, array>(os, value.toInt64(), data);
  196|    126|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaFocusPosition5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    126|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    126|  static_assert(N > 0, "Passed zero length printTag");
  183|    126|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 80]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|     80|  return os << "(" << value << ")";
  186|    126|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaFocusArea5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    126|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    126|  static_assert(N > 0, "Passed zero length printTag");
  195|    126|  return printTag<N, array>(os, value.toInt64(), data);
  196|    126|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18minoltaFocusArea5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    126|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    126|  static_assert(N > 0, "Passed zero length printTag");
  183|    126|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 90]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    126|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaMeteringMode5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    124|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    124|  static_assert(N > 0, "Passed zero length printTag");
  195|    124|  return printTag<N, array>(os, value.toInt64(), data);
  196|    124|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaMeteringMode5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    124|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    124|  static_assert(N > 0, "Passed zero length printTag");
  183|    124|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 88]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|     88|  return os << "(" << value << ")";
  186|    124|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaISOSetting5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    124|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    124|  static_assert(N > 0, "Passed zero length printTag");
  195|    124|  return printTag<N, array>(os, value.toInt64(), data);
  196|    124|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaISOSetting5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    124|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    124|  static_assert(N > 0, "Passed zero length printTag");
  183|    124|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 78]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|     78|  return os << "(" << value << ")";
  186|    124|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaColorSpace5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     98|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     98|  static_assert(N > 0, "Passed zero length printTag");
  195|     98|  return printTag<N, array>(os, value.toInt64(), data);
  196|     98|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaColorSpace5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     98|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     98|  static_assert(N > 0, "Passed zero length printTag");
  183|     98|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 62]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|     98|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaRotation5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     70|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     70|  static_assert(N > 0, "Passed zero length printTag");
  195|     70|  return printTag<N, array>(os, value.toInt64(), data);
  196|     70|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaRotation5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     70|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     70|  static_assert(N > 0, "Passed zero length printTag");
  183|     70|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 8, False: 62]
  ------------------
  184|      8|    return os << _(td->label_);
  ------------------
  |  |   40|      8|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|     70|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaPictureFinish5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     70|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     70|  static_assert(N > 0, "Passed zero length printTag");
  195|     70|  return printTag<N, array>(os, value.toInt64(), data);
  196|     70|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22minoltaPictureFinish5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     70|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     70|  static_assert(N > 0, "Passed zero length printTag");
  183|     70|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 34, False: 36]
  ------------------
  184|     34|    return os << _(td->label_);
  ------------------
  |  |   40|     34|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|     70|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15minoltaAFMode5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     62|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     62|  static_assert(N > 0, "Passed zero length printTag");
  195|     62|  return printTag<N, array>(os, value.toInt64(), data);
  196|     62|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15minoltaAFMode5DEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     62|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     62|  static_assert(N > 0, "Passed zero length printTag");
  183|     62|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 44]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     44|  return os << "(" << value << ")";
  186|     62|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonyDriveMode2A100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonyDriveMode2A100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 42, False: 100]
  ------------------
  184|     42|    return os << _(td->label_);
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  185|    100|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyFocusModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyFocusModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 120]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|    120|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyFlashModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyFlashModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 32, False: 110]
  ------------------
  184|     32|    return os << _(td->label_);
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  185|    110|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyMeteringModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyMeteringModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 114]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|    114|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24sonyZoneMatchingModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24sonyZoneMatchingModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 112]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|    112|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonyColorSpaceA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonyColorSpaceA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 112]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|    112|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyDriveModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyDriveModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 104]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|    104|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21sonySelfTimerTimeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21sonySelfTimerTimeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 114]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|    114|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28sonyContinuousBracketingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28sonyContinuousBracketingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2, False: 140]
  ------------------
  184|      2|    return os << _(td->label_);
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
  185|    140|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29sonySingleFrameBracketingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29sonySingleFrameBracketingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 4, False: 138]
  ------------------
  184|      4|    return os << _(td->label_);
  ------------------
  |  |   40|      4|#define _(String) (String)
  ------------------
  185|    138|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30sonyWhiteBalanceBracketingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30sonyWhiteBalanceBracketingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 6, False: 136]
  ------------------
  184|      6|    return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  185|    136|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27sonyWhiteBalanceSettingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27sonyWhiteBalanceSettingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 46, False: 96]
  ------------------
  184|     46|    return os << _(td->label_);
  ------------------
  |  |   40|     46|#define _(String) (String)
  ------------------
  185|     96|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26sonyPresetWhiteBalanceA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26sonyPresetWhiteBalanceA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 12, False: 130]
  ------------------
  184|     12|    return os << _(td->label_);
  ------------------
  |  |   40|     12|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31sonyColorTemperatureSettingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31sonyColorTemperatureSettingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 32, False: 110]
  ------------------
  184|     32|    return os << _(td->label_);
  ------------------
  |  |   40|     32|#define _(String) (String)
  ------------------
  185|    110|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyCustomWBSettingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyCustomWBSettingA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 102]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21sonyCustomWBErrorA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21sonyCustomWBErrorA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 20, False: 122]
  ------------------
  184|     20|    return os << _(td->label_);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  185|    122|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyImageSizeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    140|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    140|  static_assert(N > 0, "Passed zero length printTag");
  195|    140|  return printTag<N, array>(os, value.toInt64(), data);
  196|    140|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyImageSizeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    140|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    140|  static_assert(N > 0, "Passed zero length printTag");
  183|    140|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 112]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|    112|  return os << "(" << value << ")";
  186|    140|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28sonyInstantPlaybackSetupA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    140|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    140|  static_assert(N > 0, "Passed zero length printTag");
  195|    140|  return printTag<N, array>(os, value.toInt64(), data);
  196|    140|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28sonyInstantPlaybackSetupA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    140|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    140|  static_assert(N > 0, "Passed zero length printTag");
  183|    140|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 24, False: 116]
  ------------------
  184|     24|    return os << _(td->label_);
  ------------------
  |  |   40|     24|#define _(String) (String)
  ------------------
  185|    116|  return os << "(" << value << ")";
  186|    140|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyFlashDefaultA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyFlashDefaultA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 16, False: 72]
  ------------------
  184|     16|    return os << _(td->label_);
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24sonyAutoBracketOrderA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24sonyAutoBracketOrderA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 74]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|     74|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyFocusHoldButtonA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyFocusHoldButtonA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 16, False: 72]
  ------------------
  184|     16|    return os << _(td->label_);
  ------------------
  |  |   40|     16|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyAELButtonA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyAELButtonA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 60]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     60|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22sonyControlDialSetA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22sonyControlDialSetA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 70]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L32sonyExposureCompensationModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L32sonyExposureCompensationModeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 24, False: 64]
  ------------------
  184|     24|    return os << _(td->label_);
  ------------------
  |  |   40|     24|#define _(String) (String)
  ------------------
  185|     64|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26sonyAFAreaIlluminationA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26sonyAFAreaIlluminationA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 26, False: 62]
  ------------------
  184|     26|    return os << _(td->label_);
  ------------------
  |  |   40|     26|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyMonitorDisplayOffA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyMonitorDisplayOffA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 20, False: 68]
  ------------------
  184|     20|    return os << _(td->label_);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21sonyRecordDisplayA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21sonyRecordDisplayA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 66]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyPlayDisplayA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     88|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     88|  static_assert(N > 0, "Passed zero length printTag");
  195|     88|  return printTag<N, array>(os, value.toInt64(), data);
  196|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyPlayDisplayA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     88|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     88|  static_assert(N > 0, "Passed zero length printTag");
  183|     88|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 66]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|     88|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyExposureIndicatorA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    362|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    362|  static_assert(N > 0, "Passed zero length printTag");
  195|    362|  return printTag<N, array>(os, value.toInt64(), data);
  196|    362|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyExposureIndicatorA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    362|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    362|  static_assert(N > 0, "Passed zero length printTag");
  183|    362|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 84, False: 278]
  ------------------
  184|     84|    return os << _(td->label_);
  ------------------
  |  |   40|     84|#define _(String) (String)
  ------------------
  185|    278|  return os << "(" << value << ")";
  186|    362|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L33sonyMeteringOffScaleIndicatorA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     46|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     46|  static_assert(N > 0, "Passed zero length printTag");
  195|     46|  return printTag<N, array>(os, value.toInt64(), data);
  196|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L33sonyMeteringOffScaleIndicatorA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     46|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     46|  static_assert(N > 0, "Passed zero length printTag");
  183|     46|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 22, False: 24]
  ------------------
  184|     22|    return os << _(td->label_);
  ------------------
  |  |   40|     22|#define _(String) (String)
  ------------------
  185|     24|  return os << "(" << value << ")";
  186|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyFocusModeSwitchA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     46|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     46|  static_assert(N > 0, "Passed zero length printTag");
  195|     46|  return printTag<N, array>(os, value.toInt64(), data);
  196|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyFocusModeSwitchA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     46|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     46|  static_assert(N > 0, "Passed zero length printTag");
  183|     46|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 10, False: 36]
  ------------------
  184|     10|    return os << _(td->label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyFlashTypeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     46|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     46|  static_assert(N > 0, "Passed zero length printTag");
  195|     46|  return printTag<N, array>(os, value.toInt64(), data);
  196|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyFlashTypeA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     46|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     46|  static_assert(N > 0, "Passed zero length printTag");
  183|     46|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 18, False: 28]
  ------------------
  184|     18|    return os << _(td->label_);
  ------------------
  |  |   40|     18|#define _(String) (String)
  ------------------
  185|     28|  return os << "(" << value << ")";
  186|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyBatteryLevelA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     46|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     46|  static_assert(N > 0, "Passed zero length printTag");
  195|     46|  return printTag<N, array>(os, value.toInt64(), data);
  196|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyBatteryLevelA100EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     46|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     46|  static_assert(N > 0, "Passed zero length printTag");
  183|     46|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 10, False: 36]
  ------------------
  184|     10|    return os << _(td->label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|     46|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm205ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaSonyLensIDEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  3.47k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  3.47k|  static_assert(N > 0, "Passed zero length printTag");
  195|  3.47k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  3.47k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm205ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17minoltaSonyLensIDEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  3.47k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  3.47k|  static_assert(N > 0, "Passed zero length printTag");
  183|  3.47k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.99k, False: 480]
  ------------------
  184|  2.99k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.99k|#define _(String) (String)
  ------------------
  185|    480|  return os << "(" << value << ")";
  186|  3.47k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaSonyColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaSonyColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 56, False: 86]
  ------------------
  184|     56|    return os << _(td->label_);
  ------------------
  |  |   40|     56|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    142|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaSonyBoolFunctionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  2.58k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  2.58k|  static_assert(N > 0, "Passed zero length printTag");
  195|  2.58k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  2.58k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaSonyBoolFunctionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  2.58k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  2.58k|  static_assert(N > 0, "Passed zero length printTag");
  183|  2.58k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 656, False: 1.93k]
  ------------------
  184|    656|    return os << _(td->label_);
  ------------------
  |  |   40|    656|#define _(String) (String)
  ------------------
  185|  1.93k|  return os << "(" << value << ")";
  186|  2.58k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30minoltaSonyBoolInverseFunctionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    698|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    698|  static_assert(N > 0, "Passed zero length printTag");
  195|    698|  return printTag<N, array>(os, value.toInt64(), data);
  196|    698|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30minoltaSonyBoolInverseFunctionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    698|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    698|  static_assert(N > 0, "Passed zero length printTag");
  183|    698|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 186, False: 512]
  ------------------
  184|    186|    return os << _(td->label_);
  ------------------
  |  |   40|    186|#define _(String) (String)
  ------------------
  185|    512|  return os << "(" << value << ")";
  186|    698|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaSonyAFAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    566|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    566|  static_assert(N > 0, "Passed zero length printTag");
  195|    566|  return printTag<N, array>(os, value.toInt64(), data);
  196|    566|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21minoltaSonyAFAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    566|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    566|  static_assert(N > 0, "Passed zero length printTag");
  183|    566|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 146, False: 420]
  ------------------
  184|    146|    return os << _(td->label_);
  ------------------
  |  |   40|    146|#define _(String) (String)
  ------------------
  185|    420|  return os << "(" << value << ")";
  186|    566|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27minoltaSonyLocalAFAreaPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    566|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    566|  static_assert(N > 0, "Passed zero length printTag");
  195|    566|  return printTag<N, array>(os, value.toInt64(), data);
  196|    566|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27minoltaSonyLocalAFAreaPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    566|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    566|  static_assert(N > 0, "Passed zero length printTag");
  183|    566|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 96, False: 470]
  ------------------
  184|     96|    return os << _(td->label_);
  ------------------
  |  |   40|     96|#define _(String) (String)
  ------------------
  185|    470|  return os << "(" << value << ")";
  186|    566|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L36minoltaSonyDynamicRangeOptimizerModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    708|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    708|  static_assert(N > 0, "Passed zero length printTag");
  195|    708|  return printTag<N, array>(os, value.toInt64(), data);
  196|    708|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L36minoltaSonyDynamicRangeOptimizerModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    708|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    708|  static_assert(N > 0, "Passed zero length printTag");
  183|    708|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 172, False: 536]
  ------------------
  184|    172|    return os << _(td->label_);
  ------------------
  |  |   40|    172|#define _(String) (String)
  ------------------
  185|    536|  return os << "(" << value << ")";
  186|    708|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L38minoltaSonyPrioritySetupShutterReleaseEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    488|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    488|  static_assert(N > 0, "Passed zero length printTag");
  195|    488|  return printTag<N, array>(os, value.toInt64(), data);
  196|    488|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L38minoltaSonyPrioritySetupShutterReleaseEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    488|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    488|  static_assert(N > 0, "Passed zero length printTag");
  183|    488|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 138, False: 350]
  ------------------
  184|    138|    return os << _(td->label_);
  ------------------
  |  |   40|    138|#define _(String) (String)
  ------------------
  185|    350|  return os << "(" << value << ")";
  186|    488|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaSonyQualityCsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    400|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    400|  static_assert(N > 0, "Passed zero length printTag");
  195|    400|  return printTag<N, array>(os, value.toInt64(), data);
  196|    400|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaSonyQualityCsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    400|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    400|  static_assert(N > 0, "Passed zero length printTag");
  183|    400|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 84, False: 316]
  ------------------
  184|     84|    return os << _(td->label_);
  ------------------
  |  |   40|     84|#define _(String) (String)
  ------------------
  185|    316|  return os << "(" << value << ")";
  186|    400|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaSonyRotationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    468|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    468|  static_assert(N > 0, "Passed zero length printTag");
  195|    468|  return printTag<N, array>(os, value.toInt64(), data);
  196|    468|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19minoltaSonyRotationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    468|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    468|  static_assert(N > 0, "Passed zero length printTag");
  183|    468|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 88, False: 380]
  ------------------
  184|     88|    return os << _(td->label_);
  ------------------
  |  |   40|     88|#define _(String) (String)
  ------------------
  185|    380|  return os << "(" << value << ")";
  186|    468|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm25ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaSonySceneModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  2.40k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  2.40k|  static_assert(N > 0, "Passed zero length printTag");
  195|  2.40k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  2.40k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm25ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20minoltaSonySceneModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  2.40k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  2.40k|  static_assert(N > 0, "Passed zero length printTag");
  183|  2.40k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.06k, False: 340]
  ------------------
  184|  2.06k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.06k|#define _(String) (String)
  ------------------
  185|    340|  return os << "(" << value << ")";
  186|  2.40k|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29minoltaSonyTeleconverterModelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    390|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    390|  static_assert(N > 0, "Passed zero length printTag");
  195|    390|  return printTag<N, array>(os, value.toInt64(), data);
  196|    390|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29minoltaSonyTeleconverterModelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    390|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    390|  static_assert(N > 0, "Passed zero length printTag");
  183|    390|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 318, False: 72]
  ------------------
  184|    318|    return os << _(td->label_);
  ------------------
  |  |   40|    318|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|    390|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaSonyZoneMatchingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    162|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    162|  static_assert(N > 0, "Passed zero length printTag");
  195|    162|  return printTag<N, array>(os, value.toInt64(), data);
  196|    162|}
minoltamn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23minoltaSonyZoneMatchingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    162|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    162|  static_assert(N > 0, "Passed zero length printTag");
  183|    162|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 104, False: 58]
  ------------------
  184|    104|    return os << _(td->label_);
  ------------------
  |  |   40|    104|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|    162|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14olympusQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    630|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    630|  static_assert(N > 0, "Passed zero length printTag");
  195|    630|  return printTag<N, array>(os, value.toInt64(), data);
  196|    630|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14olympusQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    630|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    630|  static_assert(N > 0, "Passed zero length printTag");
  183|    630|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 360, False: 270]
  ------------------
  184|    360|    return os << _(td->label_);
  ------------------
  |  |   40|    360|#define _(String) (String)
  ------------------
  185|    270|  return os << "(" << value << ")";
  186|    630|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12olympusMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    666|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    666|  static_assert(N > 0, "Passed zero length printTag");
  195|    666|  return printTag<N, array>(os, value.toInt64(), data);
  196|    666|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12olympusMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    666|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    666|  static_assert(N > 0, "Passed zero length printTag");
  183|    666|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 364, False: 302]
  ------------------
  184|    364|    return os << _(td->label_);
  ------------------
  |  |   40|    364|#define _(String) (String)
  ------------------
  185|    302|  return os << "(" << value << ")";
  186|    666|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12olympusOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    464|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    464|  static_assert(N > 0, "Passed zero length printTag");
  195|    464|  return printTag<N, array>(os, value.toInt64(), data);
  196|    464|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12olympusOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    464|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    464|  static_assert(N > 0, "Passed zero length printTag");
  183|    464|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 358, False: 106]
  ------------------
  184|    358|    return os << _(td->label_);
  ------------------
  |  |   40|    358|#define _(String) (String)
  ------------------
  185|    106|  return os << "(" << value << ")";
  186|    464|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17olympusOneTouchWbEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    202|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    202|  static_assert(N > 0, "Passed zero length printTag");
  195|    202|  return printTag<N, array>(os, value.toInt64(), data);
  196|    202|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17olympusOneTouchWbEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    202|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    202|  static_assert(N > 0, "Passed zero length printTag");
  183|    202|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 156, False: 46]
  ------------------
  184|    156|    return os << _(td->label_);
  ------------------
  |  |   40|    156|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|    202|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm45ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusSceneModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  2.34k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  2.34k|  static_assert(N > 0, "Passed zero length printTag");
  195|  2.34k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  2.34k|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm45ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusSceneModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  2.34k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  2.34k|  static_assert(N > 0, "Passed zero length printTag");
  183|  2.34k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.14k, False: 204]
  ------------------
  184|  2.14k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.14k|#define _(String) (String)
  ------------------
  185|    204|  return os << "(" << value << ")";
  186|  2.34k|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusFlashDeviceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusFlashDeviceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 40]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|    108|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17olympusFocusRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17olympusFocusRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 42, False: 66]
  ------------------
  184|     42|    return os << _(td->label_);
  ------------------
  |  |   40|     42|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|    108|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     62|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     62|  static_assert(N > 0, "Passed zero length printTag");
  195|     62|  return printTag<N, array>(os, value.toInt64(), data);
  196|     62|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     62|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     62|  static_assert(N > 0, "Passed zero length printTag");
  183|     62|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 34]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|     62|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    160|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    160|  static_assert(N > 0, "Passed zero length printTag");
  195|    160|  return printTag<N, array>(os, value.toInt64(), data);
  196|    160|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    160|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    160|  static_assert(N > 0, "Passed zero length printTag");
  183|    160|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 112, False: 48]
  ------------------
  184|    112|    return os << _(td->label_);
  ------------------
  |  |   40|    112|#define _(String) (String)
  ------------------
  185|     48|  return os << "(" << value << ")";
  186|    160|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15olympusContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    226|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    226|  static_assert(N > 0, "Passed zero length printTag");
  195|    226|  return printTag<N, array>(os, value.toInt64(), data);
  196|    226|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15olympusContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    226|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    226|  static_assert(N > 0, "Passed zero length printTag");
  183|    226|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 144, False: 82]
  ------------------
  184|    144|    return os << _(td->label_);
  ------------------
  |  |   40|    144|#define _(String) (String)
  ------------------
  185|     82|  return os << "(" << value << ")";
  186|    226|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusCCDScanModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    114|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    114|  static_assert(N > 0, "Passed zero length printTag");
  195|    114|  return printTag<N, array>(os, value.toInt64(), data);
  196|    114|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusCCDScanModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    114|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    114|  static_assert(N > 0, "Passed zero length printTag");
  183|    114|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 82, False: 32]
  ------------------
  184|     82|    return os << _(td->label_);
  ------------------
  |  |   40|     82|#define _(String) (String)
  ------------------
  185|     32|  return os << "(" << value << ")";
  186|    114|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12olympusNoYesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    406|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    406|  static_assert(N > 0, "Passed zero length printTag");
  195|    406|  return printTag<N, array>(os, value.toInt64(), data);
  196|    406|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12olympusNoYesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    406|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    406|  static_assert(N > 0, "Passed zero length printTag");
  183|    406|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 128, False: 278]
  ------------------
  184|    128|    return os << _(td->label_);
  ------------------
  |  |   40|    128|#define _(String) (String)
  ------------------
  185|    278|  return os << "(" << value << ")";
  186|    406|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    420|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    420|  static_assert(N > 0, "Passed zero length printTag");
  195|    420|  return printTag<N, array>(os, value.toInt64(), data);
  196|    420|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    420|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    420|  static_assert(N > 0, "Passed zero length printTag");
  183|    420|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 172, False: 248]
  ------------------
  184|    172|    return os << _(td->label_);
  ------------------
  |  |   40|    172|#define _(String) (String)
  ------------------
  185|    248|  return os << "(" << value << ")";
  186|    420|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    400|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    400|  static_assert(N > 0, "Passed zero length printTag");
  195|    400|  return printTag<N, array>(os, value.toInt64(), data);
  196|    400|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    400|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    400|  static_assert(N > 0, "Passed zero length printTag");
  183|    400|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 114, False: 286]
  ------------------
  184|    114|    return os << _(td->label_);
  ------------------
  |  |   40|    114|#define _(String) (String)
  ------------------
  185|    286|  return os << "(" << value << ")";
  186|    400|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusMacroModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    220|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    220|  static_assert(N > 0, "Passed zero length printTag");
  195|    220|  return printTag<N, array>(os, value.toInt64(), data);
  196|    220|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusMacroModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    220|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    220|  static_assert(N > 0, "Passed zero length printTag");
  183|    220|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 100, False: 120]
  ------------------
  184|    100|    return os << _(td->label_);
  ------------------
  |  |   40|    100|#define _(String) (String)
  ------------------
  185|    120|  return os << "(" << value << ")";
  186|    220|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusFocusProcessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    202|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    202|  static_assert(N > 0, "Passed zero length printTag");
  195|    202|  return printTag<N, array>(os, value.toInt64(), data);
  196|    202|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusFocusProcessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    202|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    202|  static_assert(N > 0, "Passed zero length printTag");
  183|    202|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 168, False: 34]
  ------------------
  184|    168|    return os << _(td->label_);
  ------------------
  |  |   40|    168|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|    202|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15olympusAFSearchEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    158|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    158|  static_assert(N > 0, "Passed zero length printTag");
  195|    158|  return printTag<N, array>(os, value.toInt64(), data);
  196|    158|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15olympusAFSearchEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    158|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    158|  static_assert(N > 0, "Passed zero length printTag");
  183|    158|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 124, False: 34]
  ------------------
  184|    124|    return os << _(td->label_);
  ------------------
  |  |   40|    124|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|    158|}
olympusmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm7ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L16olympusFlashModeEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    766|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    766|  static_assert(N > 0, "Passed zero length printTag");
  208|    766|  const auto val = value.toUint32();
  209|    766|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 194, False: 572]
  ------------------
  210|    194|    auto [mask, label] = *array;
  211|    194|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 194, False: 0]
  ------------------
  212|    194|      return os << _(label);
  ------------------
  |  |   40|    194|#define _(String) (String)
  ------------------
  213|    194|  }
  214|    572|  bool sep = false;
  215|  4.00k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 4.00k, False: 572]
  ------------------
  216|  4.00k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 1.30k, False: 2.70k]
  ------------------
  217|  1.30k|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 734, False: 568]
  ------------------
  218|    734|        os << ", " << _(label);
  ------------------
  |  |   40|    734|#define _(String) (String)
  ------------------
  219|    734|      } else {
  220|    568|        os << _(label);
  ------------------
  |  |   40|    568|#define _(String) (String)
  ------------------
  221|    568|        sep = true;
  222|    568|      }
  223|  1.30k|    }
  224|  4.00k|  }
  225|    572|  return os;
  226|    766|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25olympusFlashRemoteControlEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    860|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    860|  static_assert(N > 0, "Passed zero length printTag");
  195|    860|  return printTag<N, array>(os, value.toInt64(), data);
  196|    860|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25olympusFlashRemoteControlEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    860|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    860|  static_assert(N > 0, "Passed zero length printTag");
  183|    860|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 642, False: 218]
  ------------------
  184|    642|    return os << _(td->label_);
  ------------------
  |  |   40|    642|#define _(String) (String)
  ------------------
  185|    218|  return os << "(" << value << ")";
  186|    860|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23olympusFlashControlModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    110|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    110|  static_assert(N > 0, "Passed zero length printTag");
  195|    110|  return printTag<N, array>(os, value.toInt64(), data);
  196|    110|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23olympusFlashControlModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    110|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    110|  static_assert(N > 0, "Passed zero length printTag");
  183|    110|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 42]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|     42|  return os << "(" << value << ")";
  186|    110|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm23ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.20k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.20k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.20k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.20k|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm23ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.20k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.20k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.20k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 636, False: 564]
  ------------------
  184|    636|    return os << _(td->label_);
  ------------------
  |  |   40|    636|#define _(String) (String)
  ------------------
  185|    564|  return os << "(" << value << ")";
  186|  1.20k|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25olympusModifiedSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    214|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    214|  static_assert(N > 0, "Passed zero length printTag");
  195|    214|  return printTag<N, array>(os, value.toInt64(), data);
  196|    214|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25olympusModifiedSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    214|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    214|  static_assert(N > 0, "Passed zero length printTag");
  183|    214|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 146, False: 68]
  ------------------
  184|    146|    return os << _(td->label_);
  ------------------
  |  |   40|    146|#define _(String) (String)
  ------------------
  185|     68|  return os << "(" << value << ")";
  186|    214|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17olympusColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     82|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     82|  static_assert(N > 0, "Passed zero length printTag");
  195|     82|  return printTag<N, array>(os, value.toInt64(), data);
  196|     82|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17olympusColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     82|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     82|  static_assert(N > 0, "Passed zero length printTag");
  183|     82|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 62, False: 20]
  ------------------
  184|     62|    return os << _(td->label_);
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
  185|     20|  return os << "(" << value << ")";
  186|     82|}
olympusmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm4ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L21olympusNoiseReductionEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    236|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    236|  static_assert(N > 0, "Passed zero length printTag");
  208|    236|  const auto val = value.toUint32();
  209|    236|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 34, False: 202]
  ------------------
  210|     34|    auto [mask, label] = *array;
  211|     34|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 34]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|     34|  }
  214|    236|  bool sep = false;
  215|    944|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 944, False: 236]
  ------------------
  216|    944|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 340, False: 604]
  ------------------
  217|    340|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 140, False: 200]
  ------------------
  218|    140|        os << ", " << _(label);
  ------------------
  |  |   40|    140|#define _(String) (String)
  ------------------
  219|    200|      } else {
  220|    200|        os << _(label);
  ------------------
  |  |   40|    200|#define _(String) (String)
  ------------------
  221|    200|        sep = true;
  222|    200|      }
  223|    340|    }
  224|    944|  }
  225|    236|  return os;
  226|    236|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusPictureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    910|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    910|  static_assert(N > 0, "Passed zero length printTag");
  195|    910|  return printTag<N, array>(os, value.toInt64(), data);
  196|    910|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusPictureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    910|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    910|  static_assert(N > 0, "Passed zero length printTag");
  183|    910|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 642, False: 268]
  ------------------
  184|    642|    return os << _(td->label_);
  ------------------
  |  |   40|    642|#define _(String) (String)
  ------------------
  185|    268|  return os << "(" << value << ")";
  186|    910|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26olympusPictureModeBWFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    210|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    210|  static_assert(N > 0, "Passed zero length printTag");
  195|    210|  return printTag<N, array>(os, value.toInt64(), data);
  196|    210|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26olympusPictureModeBWFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    210|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    210|  static_assert(N > 0, "Passed zero length printTag");
  183|    210|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 158, False: 52]
  ------------------
  184|    158|    return os << _(td->label_);
  ------------------
  |  |   40|    158|#define _(String) (String)
  ------------------
  185|     52|  return os << "(" << value << ")";
  186|    210|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22olympusPictureModeToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    178|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    178|  static_assert(N > 0, "Passed zero length printTag");
  195|    178|  return printTag<N, array>(os, value.toInt64(), data);
  196|    178|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22olympusPictureModeToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    178|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    178|  static_assert(N > 0, "Passed zero length printTag");
  183|    178|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 122, False: 56]
  ------------------
  184|    122|    return os << _(td->label_);
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
  185|     56|  return os << "(" << value << ")";
  186|    178|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusCsQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     56|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     56|  static_assert(N > 0, "Passed zero length printTag");
  195|     56|  return printTag<N, array>(os, value.toInt64(), data);
  196|     56|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusCsQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     56|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     56|  static_assert(N > 0, "Passed zero length printTag");
  183|     56|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 38, False: 18]
  ------------------
  184|     38|    return os << _(td->label_);
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  185|     18|  return os << "(" << value << ")";
  186|     56|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25olympusImageStabilizationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    122|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    122|  static_assert(N > 0, "Passed zero length printTag");
  195|    122|  return printTag<N, array>(os, value.toInt64(), data);
  196|    122|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25olympusImageStabilizationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    122|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    122|  static_assert(N > 0, "Passed zero length printTag");
  183|    122|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 88, False: 34]
  ------------------
  184|     88|    return os << _(td->label_);
  ------------------
  |  |   40|     88|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|    122|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusEqFlashTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.19k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.19k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.19k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.19k|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18olympusEqFlashTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.19k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.19k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.19k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 524, False: 666]
  ------------------
  184|    524|    return os << _(td->label_);
  ------------------
  |  |   40|    524|#define _(String) (String)
  ------------------
  185|    666|  return os << "(" << value << ")";
  186|  1.19k|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusEqFlashModelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    320|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    320|  static_assert(N > 0, "Passed zero length printTag");
  195|    320|  return printTag<N, array>(os, value.toInt64(), data);
  196|    320|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusEqFlashModelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    320|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    320|  static_assert(N > 0, "Passed zero length printTag");
  183|    320|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 270, False: 50]
  ------------------
  184|    270|    return os << _(td->label_);
  ------------------
  |  |   40|    270|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|    320|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusRdColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    216|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    216|  static_assert(N > 0, "Passed zero length printTag");
  195|    216|  return printTag<N, array>(os, value.toInt64(), data);
  196|    216|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusRdColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    216|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    216|  static_assert(N > 0, "Passed zero length printTag");
  183|    216|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 162, False: 54]
  ------------------
  184|    162|    return os << _(td->label_);
  ------------------
  |  |   40|    162|#define _(String) (String)
  ------------------
  185|     54|  return os << "(" << value << ")";
  186|    216|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15olympusRdEngineEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    462|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    462|  static_assert(N > 0, "Passed zero length printTag");
  195|    462|  return printTag<N, array>(os, value.toInt64(), data);
  196|    462|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15olympusRdEngineEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    462|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    462|  static_assert(N > 0, "Passed zero length printTag");
  183|    462|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 344, False: 118]
  ------------------
  184|    344|    return os << _(td->label_);
  ------------------
  |  |   40|    344|#define _(String) (String)
  ------------------
  185|    118|  return os << "(" << value << ")";
  186|    462|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusRdEditStatusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    204|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    204|  static_assert(N > 0, "Passed zero length printTag");
  195|    204|  return printTag<N, array>(os, value.toInt64(), data);
  196|    204|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19olympusRdEditStatusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    204|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    204|  static_assert(N > 0, "Passed zero length printTag");
  183|    204|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 122, False: 82]
  ------------------
  184|    122|    return os << _(td->label_);
  ------------------
  |  |   40|    122|#define _(String) (String)
  ------------------
  185|     82|  return os << "(" << value << ")";
  186|    204|}
olympusmn_int.cpp:_ZN5Exiv28Internal15printTagBitmaskILm8ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L17olympusRdSettingsEEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  206|    854|std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
  207|    854|  static_assert(N > 0, "Passed zero length printTag");
  208|    854|  const auto val = value.toUint32();
  209|    854|  if (val == 0) {
  ------------------
  |  Branch (209:7): [True: 38, False: 816]
  ------------------
  210|     38|    auto [mask, label] = *array;
  211|     38|    if (mask == 0)
  ------------------
  |  Branch (211:9): [True: 0, False: 38]
  ------------------
  212|      0|      return os << _(label);
  ------------------
  |  |   40|      0|#define _(String) (String)
  ------------------
  213|     38|  }
  214|    854|  bool sep = false;
  215|  6.83k|  for (auto [mask, label] : array) {
  ------------------
  |  Branch (215:27): [True: 6.83k, False: 854]
  ------------------
  216|  6.83k|    if (val & mask) {
  ------------------
  |  Branch (216:9): [True: 2.22k, False: 4.61k]
  ------------------
  217|  2.22k|      if (sep) {
  ------------------
  |  Branch (217:11): [True: 1.46k, False: 756]
  ------------------
  218|  1.46k|        os << ", " << _(label);
  ------------------
  |  |   40|  1.46k|#define _(String) (String)
  ------------------
  219|  1.46k|      } else {
  220|    756|        os << _(label);
  ------------------
  |  |   40|    756|#define _(String) (String)
  ------------------
  221|    756|        sep = true;
  222|    756|      }
  223|  2.22k|    }
  224|  6.83k|  }
  225|    854|  return os;
  226|    854|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22olympusRd2WhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    168|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    168|  static_assert(N > 0, "Passed zero length printTag");
  195|    168|  return printTag<N, array>(os, value.toInt64(), data);
  196|    168|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22olympusRd2WhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    168|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    168|  static_assert(N > 0, "Passed zero length printTag");
  183|    168|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 66, False: 102]
  ------------------
  184|     66|    return os << _(td->label_);
  ------------------
  |  |   40|     66|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    168|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20olympusRd2ColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    414|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    414|  static_assert(N > 0, "Passed zero length printTag");
  195|    414|  return printTag<N, array>(os, value.toInt64(), data);
  196|    414|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20olympusRd2ColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    414|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    414|  static_assert(N > 0, "Passed zero length printTag");
  183|    414|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 282, False: 132]
  ------------------
  184|    282|    return os << _(td->label_);
  ------------------
  |  |   40|    282|#define _(String) (String)
  ------------------
  185|    132|  return os << "(" << value << ")";
  186|    414|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusRd2EngineEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    140|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    140|  static_assert(N > 0, "Passed zero length printTag");
  195|    140|  return printTag<N, array>(os, value.toInt64(), data);
  196|    140|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16olympusRd2EngineEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    140|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    140|  static_assert(N > 0, "Passed zero length printTag");
  183|    140|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 86, False: 54]
  ------------------
  184|     86|    return os << _(td->label_);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  185|     54|  return os << "(" << value << ")";
  186|    140|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21olympusRd2PictureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    542|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    542|  static_assert(N > 0, "Passed zero length printTag");
  195|    542|  return printTag<N, array>(os, value.toInt64(), data);
  196|    542|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21olympusRd2PictureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    542|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    542|  static_assert(N > 0, "Passed zero length printTag");
  183|    542|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 216, False: 326]
  ------------------
  184|    216|    return os << _(td->label_);
  ------------------
  |  |   40|    216|#define _(String) (String)
  ------------------
  185|    326|  return os << "(" << value << ")";
  186|    542|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21olympusRd2PM_BWFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    222|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    222|  static_assert(N > 0, "Passed zero length printTag");
  195|    222|  return printTag<N, array>(os, value.toInt64(), data);
  196|    222|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21olympusRd2PM_BWFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    222|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    222|  static_assert(N > 0, "Passed zero length printTag");
  183|    222|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 152, False: 70]
  ------------------
  184|    152|    return os << _(td->label_);
  ------------------
  |  |   40|    152|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|    222|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23olympusRd2PMPictureToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    134|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    134|  static_assert(N > 0, "Passed zero length printTag");
  195|    134|  return printTag<N, array>(os, value.toInt64(), data);
  196|    134|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23olympusRd2PMPictureToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    134|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    134|  static_assert(N > 0, "Passed zero length printTag");
  183|    134|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 94, False: 40]
  ------------------
  184|     94|    return os << _(td->label_);
  ------------------
  |  |   40|     94|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|    134|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29olympusIpMultipleExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     42|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     42|  static_assert(N > 0, "Passed zero length printTag");
  195|     42|  return printTag<N, array>(os, value.toInt64(), data);
  196|     42|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L29olympusIpMultipleExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     42|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     42|  static_assert(N > 0, "Passed zero length printTag");
  183|     42|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 36, False: 6]
  ------------------
  184|     36|    return os << _(td->label_);
  ------------------
  |  |   40|     36|#define _(String) (String)
  ------------------
  185|      6|  return os << "(" << value << ")";
  186|     42|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20olympusIpAspectRatioEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     52|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     52|  static_assert(N > 0, "Passed zero length printTag");
  195|     52|  return printTag<N, array>(os, value.toInt64(), data);
  196|     52|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20olympusIpAspectRatioEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     52|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     52|  static_assert(N > 0, "Passed zero length printTag");
  183|     52|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 12]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|     12|  return os << "(" << value << ")";
  186|     52|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28olympusFiExternalFlashBounceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     20|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     20|  static_assert(N > 0, "Passed zero length printTag");
  195|     20|  return printTag<N, array>(os, value.toInt64(), data);
  196|     20|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28olympusFiExternalFlashBounceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     20|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     20|  static_assert(N > 0, "Passed zero length printTag");
  183|     20|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 6]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|      6|  return os << "(" << value << ")";
  186|     20|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm12ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20olympusRiLightSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    358|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    358|  static_assert(N > 0, "Passed zero length printTag");
  195|    358|  return printTag<N, array>(os, value.toInt64(), data);
  196|    358|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm12ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20olympusRiLightSourceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    358|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    358|  static_assert(N > 0, "Passed zero length printTag");
  183|    358|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 300, False: 58]
  ------------------
  184|    300|    return os << _(td->label_);
  ------------------
  |  |   40|    300|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|    358|}
olympusmn_int.cpp:_ZN5Exiv28Internal8printTagILm38ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10artFiltersEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    932|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    932|  static_assert(N > 0, "Passed zero length printTag");
  183|    932|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 700, False: 232]
  ------------------
  184|    700|    return os << _(td->label_);
  ------------------
  |  |   40|    700|#define _(String) (String)
  ------------------
  185|    232|  return os << "(" << value << ")";
  186|    932|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16panasonicQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    774|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    774|  static_assert(N > 0, "Passed zero length printTag");
  195|    774|  return printTag<N, array>(os, value.toInt64(), data);
  196|    774|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16panasonicQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    774|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    774|  static_assert(N > 0, "Passed zero length printTag");
  183|    774|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 326, False: 448]
  ------------------
  184|    326|    return os << _(td->label_);
  ------------------
  |  |   40|    326|#define _(String) (String)
  ------------------
  185|    448|  return os << "(" << value << ")";
  186|    774|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    542|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    542|  static_assert(N > 0, "Passed zero length printTag");
  195|    542|  return printTag<N, array>(os, value.toInt64(), data);
  196|    542|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    542|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    542|  static_assert(N > 0, "Passed zero length printTag");
  183|    542|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 364, False: 178]
  ------------------
  184|    364|    return os << _(td->label_);
  ------------------
  |  |   40|    364|#define _(String) (String)
  ------------------
  185|    178|  return os << "(" << value << ")";
  186|    542|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    698|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    698|  static_assert(N > 0, "Passed zero length printTag");
  195|    698|  return printTag<N, array>(os, value.toInt64(), data);
  196|    698|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    698|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    698|  static_assert(N > 0, "Passed zero length printTag");
  183|    698|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 470, False: 228]
  ------------------
  184|    470|    return os << _(td->label_);
  ------------------
  |  |   40|    470|#define _(String) (String)
  ------------------
  185|    228|  return os << "(" << value << ")";
  186|    698|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24panasonicImageStabilizerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    356|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    356|  static_assert(N > 0, "Passed zero length printTag");
  195|    356|  return printTag<N, array>(os, value.toInt64(), data);
  196|    356|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24panasonicImageStabilizerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    356|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    356|  static_assert(N > 0, "Passed zero length printTag");
  183|    356|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 216, False: 140]
  ------------------
  184|    216|    return os << _(td->label_);
  ------------------
  |  |   40|    216|#define _(String) (String)
  ------------------
  185|    140|  return os << "(" << value << ")";
  186|    356|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14panasonicMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    406|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    406|  static_assert(N > 0, "Passed zero length printTag");
  195|    406|  return printTag<N, array>(os, value.toInt64(), data);
  196|    406|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14panasonicMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    406|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    406|  static_assert(N > 0, "Passed zero length printTag");
  183|    406|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 142, False: 264]
  ------------------
  184|    142|    return os << _(td->label_);
  ------------------
  |  |   40|    142|#define _(String) (String)
  ------------------
  185|    264|  return os << "(" << value << ")";
  186|    406|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm77ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicShootingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    374|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    374|  static_assert(N > 0, "Passed zero length printTag");
  195|    374|  return printTag<N, array>(os, value.toInt64(), data);
  196|    374|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm77ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicShootingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    374|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    374|  static_assert(N > 0, "Passed zero length printTag");
  183|    374|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 276, False: 98]
  ------------------
  184|    276|    return os << _(td->label_);
  ------------------
  |  |   40|    276|#define _(String) (String)
  ------------------
  185|     98|  return os << "(" << value << ")";
  186|    374|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14panasonicAudioEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    232|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    232|  static_assert(N > 0, "Passed zero length printTag");
  195|    232|  return printTag<N, array>(os, value.toInt64(), data);
  196|    232|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14panasonicAudioEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    232|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    232|  static_assert(N > 0, "Passed zero length printTag");
  183|    232|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 156, False: 76]
  ------------------
  184|    156|    return os << _(td->label_);
  ------------------
  |  |   40|    156|#define _(String) (String)
  ------------------
  185|     76|  return os << "(" << value << ")";
  186|    232|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20panasonicColorEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    226|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    226|  static_assert(N > 0, "Passed zero length printTag");
  195|    226|  return printTag<N, array>(os, value.toInt64(), data);
  196|    226|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20panasonicColorEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    226|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    226|  static_assert(N > 0, "Passed zero length printTag");
  183|    226|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 68, False: 158]
  ------------------
  184|     68|    return os << _(td->label_);
  ------------------
  |  |   40|     68|#define _(String) (String)
  ------------------
  185|    158|  return os << "(" << value << ")";
  186|    226|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicBurstModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    252|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    252|  static_assert(N > 0, "Passed zero length printTag");
  195|    252|  return printTag<N, array>(os, value.toInt64(), data);
  196|    252|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicBurstModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    252|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    252|  static_assert(N > 0, "Passed zero length printTag");
  183|    252|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 166, False: 86]
  ------------------
  184|    166|    return os << _(td->label_);
  ------------------
  |  |   40|    166|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    252|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17panasonicContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    546|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    546|  static_assert(N > 0, "Passed zero length printTag");
  195|    546|  return printTag<N, array>(os, value.toInt64(), data);
  196|    546|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17panasonicContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    546|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    546|  static_assert(N > 0, "Passed zero length printTag");
  183|    546|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 402, False: 144]
  ------------------
  184|    402|    return os << _(td->label_);
  ------------------
  |  |   40|    402|#define _(String) (String)
  ------------------
  185|    144|  return os << "(" << value << ")";
  186|    546|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23panasonicNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    328|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    328|  static_assert(N > 0, "Passed zero length printTag");
  195|    328|  return printTag<N, array>(os, value.toInt64(), data);
  196|    328|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23panasonicNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    328|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    328|  static_assert(N > 0, "Passed zero length printTag");
  183|    328|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 218, False: 110]
  ------------------
  184|    218|    return os << _(td->label_);
  ------------------
  |  |   40|    218|#define _(String) (String)
  ------------------
  185|    110|  return os << "(" << value << ")";
  186|    328|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicSelfTimerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    110|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    110|  static_assert(N > 0, "Passed zero length printTag");
  195|    110|  return printTag<N, array>(os, value.toInt64(), data);
  196|    110|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicSelfTimerEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    110|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    110|  static_assert(N > 0, "Passed zero length printTag");
  183|    110|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 70, False: 40]
  ------------------
  184|     70|    return os << _(td->label_);
  ------------------
  |  |   40|     70|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|    110|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17panasonicRotationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    272|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    272|  static_assert(N > 0, "Passed zero length printTag");
  195|    272|  return printTag<N, array>(os, value.toInt64(), data);
  196|    272|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17panasonicRotationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    272|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    272|  static_assert(N > 0, "Passed zero length printTag");
  183|    272|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 132, False: 140]
  ------------------
  184|    132|    return os << _(td->label_);
  ------------------
  |  |   40|    132|#define _(String) (String)
  ------------------
  185|    140|  return os << "(" << value << ")";
  186|    272|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicAFAssistLampEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    172|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    172|  static_assert(N > 0, "Passed zero length printTag");
  195|    172|  return printTag<N, array>(os, value.toInt64(), data);
  196|    172|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicAFAssistLampEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    172|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    172|  static_assert(N > 0, "Passed zero length printTag");
  183|    172|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 72, False: 100]
  ------------------
  184|     72|    return os << _(td->label_);
  ------------------
  |  |   40|     72|#define _(String) (String)
  ------------------
  185|    100|  return os << "(" << value << ")";
  186|    172|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    306|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    306|  static_assert(N > 0, "Passed zero length printTag");
  195|    306|  return printTag<N, array>(os, value.toInt64(), data);
  196|    306|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    306|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    306|  static_assert(N > 0, "Passed zero length printTag");
  183|    306|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 184, False: 122]
  ------------------
  184|    184|    return os << _(td->label_);
  ------------------
  |  |   40|    184|#define _(String) (String)
  ------------------
  185|    122|  return os << "(" << value << ")";
  186|    306|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24panasonicOpticalZoomModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    314|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    314|  static_assert(N > 0, "Passed zero length printTag");
  195|    314|  return printTag<N, array>(os, value.toInt64(), data);
  196|    314|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24panasonicOpticalZoomModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    314|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    314|  static_assert(N > 0, "Passed zero length printTag");
  183|    314|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 206, False: 108]
  ------------------
  184|    206|    return os << _(td->label_);
  ------------------
  |  |   40|    206|#define _(String) (String)
  ------------------
  185|    108|  return os << "(" << value << ")";
  186|    314|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23panasonicConversionLensEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    194|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    194|  static_assert(N > 0, "Passed zero length printTag");
  195|    194|  return printTag<N, array>(os, value.toInt64(), data);
  196|    194|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23panasonicConversionLensEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    194|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    194|  static_assert(N > 0, "Passed zero length printTag");
  183|    194|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 64, False: 130]
  ------------------
  184|     64|    return os << _(td->label_);
  ------------------
  |  |   40|     64|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    194|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26panasonicWorldTimeLocationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     54|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     54|  static_assert(N > 0, "Passed zero length printTag");
  195|     54|  return printTag<N, array>(os, value.toInt64(), data);
  196|     54|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26panasonicWorldTimeLocationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     54|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     54|  static_assert(N > 0, "Passed zero length printTag");
  183|     54|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 26]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     26|  return os << "(" << value << ")";
  186|     54|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicTextStampEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    100|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    100|  static_assert(N > 0, "Passed zero length printTag");
  195|    100|  return printTag<N, array>(os, value.toInt64(), data);
  196|    100|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18panasonicTextStampEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    100|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    100|  static_assert(N > 0, "Passed zero length printTag");
  183|    100|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 66, False: 34]
  ------------------
  184|     66|    return os << _(td->label_);
  ------------------
  |  |   40|     66|#define _(String) (String)
  ------------------
  185|     34|  return os << "(" << value << ")";
  186|    100|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17panasonicFilmModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    532|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    532|  static_assert(N > 0, "Passed zero length printTag");
  195|    532|  return printTag<N, array>(os, value.toInt64(), data);
  196|    532|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17panasonicFilmModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    532|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    532|  static_assert(N > 0, "Passed zero length printTag");
  183|    532|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 348, False: 184]
  ------------------
  184|    348|    return os << _(td->label_);
  ------------------
  |  |   40|    348|#define _(String) (String)
  ------------------
  185|    184|  return os << "(" << value << ")";
  186|    532|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24panasonicBracketSettingsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    266|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    266|  static_assert(N > 0, "Passed zero length printTag");
  195|    266|  return printTag<N, array>(os, value.toInt64(), data);
  196|    266|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24panasonicBracketSettingsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    266|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    266|  static_assert(N > 0, "Passed zero length printTag");
  183|    266|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 136, False: 130]
  ------------------
  184|    136|    return os << _(td->label_);
  ------------------
  |  |   40|    136|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    266|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicFlashCurtainEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    230|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    230|  static_assert(N > 0, "Passed zero length printTag");
  195|    230|  return printTag<N, array>(os, value.toInt64(), data);
  196|    230|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicFlashCurtainEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    230|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    230|  static_assert(N > 0, "Passed zero length printTag");
  183|    230|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 96, False: 134]
  ------------------
  184|     96|    return os << _(td->label_);
  ------------------
  |  |   40|     96|#define _(String) (String)
  ------------------
  185|    134|  return os << "(" << value << ")";
  186|    230|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L34panasonicLongShutterNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    126|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    126|  static_assert(N > 0, "Passed zero length printTag");
  195|    126|  return printTag<N, array>(os, value.toInt64(), data);
  196|    126|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L34panasonicLongShutterNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    126|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    126|  static_assert(N > 0, "Passed zero length printTag");
  183|    126|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 40, False: 86]
  ------------------
  184|     40|    return os << _(td->label_);
  ------------------
  |  |   40|     40|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    126|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28panasonicIntelligentExposureEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    232|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    232|  static_assert(N > 0, "Passed zero length printTag");
  195|    232|  return printTag<N, array>(os, value.toInt64(), data);
  196|    232|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28panasonicIntelligentExposureEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    232|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    232|  static_assert(N > 0, "Passed zero length printTag");
  183|    232|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 180, False: 52]
  ------------------
  184|    180|    return os << _(td->label_);
  ------------------
  |  |   40|    180|#define _(String) (String)
  ------------------
  185|     52|  return os << "(" << value << ")";
  186|    232|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicFlashWarningEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    142|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    142|  static_assert(N > 0, "Passed zero length printTag");
  195|    142|  return printTag<N, array>(os, value.toInt64(), data);
  196|    142|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicFlashWarningEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    142|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    142|  static_assert(N > 0, "Passed zero length printTag");
  183|    142|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 72, False: 70]
  ------------------
  184|     72|    return os << _(td->label_);
  ------------------
  |  |   40|     72|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|    142|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30panasonicIntelligentResolutionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    168|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    168|  static_assert(N > 0, "Passed zero length printTag");
  195|    168|  return printTag<N, array>(os, value.toInt64(), data);
  196|    168|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30panasonicIntelligentResolutionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    168|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    168|  static_assert(N > 0, "Passed zero length printTag");
  183|    168|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 116, False: 52]
  ------------------
  184|    116|    return os << _(td->label_);
  ------------------
  |  |   40|    116|#define _(String) (String)
  ------------------
  185|     52|  return os << "(" << value << ")";
  186|    168|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26panasonicIntelligentDRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    410|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    410|  static_assert(N > 0, "Passed zero length printTag");
  195|    410|  return printTag<N, array>(os, value.toInt64(), data);
  196|    410|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26panasonicIntelligentDRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    410|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    410|  static_assert(N > 0, "Passed zero length printTag");
  183|    410|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 320, False: 90]
  ------------------
  184|    320|    return os << _(td->label_);
  ------------------
  |  |   40|    320|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    410|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicClearRetouchEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     80|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     80|  static_assert(N > 0, "Passed zero length printTag");
  195|     80|  return printTag<N, array>(os, value.toInt64(), data);
  196|     80|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L21panasonicClearRetouchEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     80|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     80|  static_assert(N > 0, "Passed zero length printTag");
  183|     80|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 44, False: 36]
  ------------------
  184|     44|    return os << _(td->label_);
  ------------------
  |  |   40|     44|#define _(String) (String)
  ------------------
  185|     36|  return os << "(" << value << ")";
  186|     80|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19panasonicPhotoStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    338|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    338|  static_assert(N > 0, "Passed zero length printTag");
  195|    338|  return printTag<N, array>(os, value.toInt64(), data);
  196|    338|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19panasonicPhotoStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    338|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    338|  static_assert(N > 0, "Passed zero length printTag");
  183|    338|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 252, False: 86]
  ------------------
  184|    252|    return os << _(td->label_);
  ------------------
  |  |   40|    252|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    338|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28panasonicShadingCompensationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    128|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    128|  static_assert(N > 0, "Passed zero length printTag");
  195|    128|  return printTag<N, array>(os, value.toInt64(), data);
  196|    128|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28panasonicShadingCompensationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    128|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    128|  static_assert(N > 0, "Passed zero length printTag");
  183|    128|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 70, False: 58]
  ------------------
  184|     70|    return os << _(td->label_);
  ------------------
  |  |   40|     70|#define _(String) (String)
  ------------------
  185|     58|  return os << "(" << value << ")";
  186|    128|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26panasonicCameraOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    398|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    398|  static_assert(N > 0, "Passed zero length printTag");
  195|    398|  return printTag<N, array>(os, value.toInt64(), data);
  196|    398|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26panasonicCameraOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    398|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    398|  static_assert(N > 0, "Passed zero length printTag");
  183|    398|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 286, False: 112]
  ------------------
  184|    286|    return os << _(td->label_);
  ------------------
  |  |   40|    286|#define _(String) (String)
  ------------------
  185|    112|  return os << "(" << value << ")";
  186|    398|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31panasonicSweepPanoramaDirectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    380|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    380|  static_assert(N > 0, "Passed zero length printTag");
  195|    380|  return printTag<N, array>(os, value.toInt64(), data);
  196|    380|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L31panasonicSweepPanoramaDirectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    380|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    380|  static_assert(N > 0, "Passed zero length printTag");
  183|    380|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 308, False: 72]
  ------------------
  184|    308|    return os << _(td->label_);
  ------------------
  |  |   40|    308|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|    380|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23panasonicTimerRecordingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    102|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    102|  static_assert(N > 0, "Passed zero length printTag");
  195|    102|  return printTag<N, array>(os, value.toInt64(), data);
  196|    102|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23panasonicTimerRecordingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    102|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    102|  static_assert(N > 0, "Passed zero length printTag");
  183|    102|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 92, False: 10]
  ------------------
  184|     92|    return os << _(td->label_);
  ------------------
  |  |   40|     92|#define _(String) (String)
  ------------------
  185|     10|  return os << "(" << value << ")";
  186|    102|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12panasonicHDREEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    392|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    392|  static_assert(N > 0, "Passed zero length printTag");
  195|    392|  return printTag<N, array>(os, value.toInt64(), data);
  196|    392|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12panasonicHDREEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    392|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    392|  static_assert(N > 0, "Passed zero length printTag");
  183|    392|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 240, False: 152]
  ------------------
  184|    240|    return os << _(td->label_);
  ------------------
  |  |   40|    240|#define _(String) (String)
  ------------------
  185|    152|  return os << "(" << value << ")";
  186|    392|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20panasonicShutterTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    176|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    176|  static_assert(N > 0, "Passed zero length printTag");
  195|    176|  return printTag<N, array>(os, value.toInt64(), data);
  196|    176|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20panasonicShutterTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    176|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    176|  static_assert(N > 0, "Passed zero length printTag");
  183|    176|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 92, False: 84]
  ------------------
  184|     92|    return os << _(td->label_);
  ------------------
  |  |   40|     92|#define _(String) (String)
  ------------------
  185|     84|  return os << "(" << value << ")";
  186|    176|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16panasonicTouchAEEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    254|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    254|  static_assert(N > 0, "Passed zero length printTag");
  195|    254|  return printTag<N, array>(os, value.toInt64(), data);
  196|    254|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16panasonicTouchAEEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    254|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    254|  static_assert(N > 0, "Passed zero length printTag");
  183|    254|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 168, False: 86]
  ------------------
  184|    168|    return os << _(td->label_);
  ------------------
  |  |   40|    168|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    254|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19panasonicFlashFiredEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    112|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    112|  static_assert(N > 0, "Passed zero length printTag");
  195|    112|  return printTag<N, array>(os, value.toInt64(), data);
  196|    112|}
panasonicmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19panasonicFlashFiredEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    112|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    112|  static_assert(N > 0, "Passed zero length printTag");
  183|    112|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 62, False: 50]
  ------------------
  184|     62|    return os << _(td->label_);
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
  185|     50|  return os << "(" << value << ")";
  186|    112|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxShootingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    338|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    338|  static_assert(N > 0, "Passed zero length printTag");
  195|    338|  return printTag<N, array>(os, value.toInt64(), data);
  196|    338|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxShootingModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    338|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    338|  static_assert(N > 0, "Passed zero length printTag");
  183|    338|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 266, False: 72]
  ------------------
  184|    266|    return os << _(td->label_);
  ------------------
  |  |   40|    266|#define _(String) (String)
  ------------------
  185|     72|  return os << "(" << value << ")";
  186|    338|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm147ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxModelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    192|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    192|  static_assert(N > 0, "Passed zero length printTag");
  195|    192|  return printTag<N, array>(os, value.toInt64(), data);
  196|    192|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm147ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxModelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    192|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    192|  static_assert(N > 0, "Passed zero length printTag");
  183|    192|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 178]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|    178|  return os << "(" << value << ")";
  186|    192|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13pentaxQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.05k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.05k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.05k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.05k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13pentaxQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.05k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.05k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.05k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 598, False: 458]
  ------------------
  184|    598|    return os << _(td->label_);
  ------------------
  |  |   40|    598|#define _(String) (String)
  ------------------
  185|    458|  return os << "(" << value << ")";
  186|  1.05k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10pentaxSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.06k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.06k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.06k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.06k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L10pentaxSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.06k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.06k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.06k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 882, False: 184]
  ------------------
  184|    882|    return os << _(td->label_);
  ------------------
  |  |   40|    882|#define _(String) (String)
  ------------------
  185|    184|  return os << "(" << value << ")";
  186|  1.06k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxFlashEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    840|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    840|  static_assert(N > 0, "Passed zero length printTag");
  195|    840|  return printTag<N, array>(os, value.toInt64(), data);
  196|    840|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxFlashEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    840|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    840|  static_assert(N > 0, "Passed zero length printTag");
  183|    840|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 682, False: 158]
  ------------------
  184|    682|    return os << _(td->label_);
  ------------------
  |  |   40|    682|#define _(String) (String)
  ------------------
  185|    158|  return os << "(" << value << ")";
  186|    840|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm12ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxFocusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    768|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    768|  static_assert(N > 0, "Passed zero length printTag");
  195|    768|  return printTag<N, array>(os, value.toInt64(), data);
  196|    768|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm12ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxFocusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    768|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    768|  static_assert(N > 0, "Passed zero length printTag");
  183|    768|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 620, False: 148]
  ------------------
  184|    620|    return os << _(td->label_);
  ------------------
  |  |   40|    620|#define _(String) (String)
  ------------------
  185|    148|  return os << "(" << value << ")";
  186|    768|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13pentaxAFPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    808|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    808|  static_assert(N > 0, "Passed zero length printTag");
  195|    808|  return printTag<N, array>(os, value.toInt64(), data);
  196|    808|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm17ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13pentaxAFPointEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    808|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    808|  static_assert(N > 0, "Passed zero length printTag");
  183|    808|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 582, False: 226]
  ------------------
  184|    582|    return os << _(td->label_);
  ------------------
  |  |   40|    582|#define _(String) (String)
  ------------------
  185|    226|  return os << "(" << value << ")";
  186|    808|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxAFPointFocusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.04k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.04k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.04k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.04k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxAFPointFocusEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.04k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.04k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.04k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 840, False: 202]
  ------------------
  184|    840|    return os << _(td->label_);
  ------------------
  |  |   40|    840|#define _(String) (String)
  ------------------
  185|    202|  return os << "(" << value << ")";
  186|  1.04k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm79ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9pentaxISOEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    782|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    782|  static_assert(N > 0, "Passed zero length printTag");
  195|    782|  return printTag<N, array>(os, value.toInt64(), data);
  196|    782|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm79ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9pentaxISOEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    782|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    782|  static_assert(N > 0, "Passed zero length printTag");
  183|    782|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 208, False: 574]
  ------------------
  184|    208|    return os << _(td->label_);
  ------------------
  |  |   40|    208|#define _(String) (String)
  ------------------
  185|    574|  return os << "(" << value << ")";
  186|    782|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    108|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    108|  static_assert(N > 0, "Passed zero length printTag");
  195|    108|  return printTag<N, array>(os, value.toInt64(), data);
  196|    108|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    108|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    108|  static_assert(N > 0, "Passed zero length printTag");
  183|    108|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 60, False: 48]
  ------------------
  184|     60|    return os << _(td->label_);
  ------------------
  |  |   40|     60|#define _(String) (String)
  ------------------
  185|     48|  return os << "(" << value << ")";
  186|    108|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    986|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    986|  static_assert(N > 0, "Passed zero length printTag");
  195|    986|  return printTag<N, array>(os, value.toInt64(), data);
  196|    986|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18pentaxWhiteBalanceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    986|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    986|  static_assert(N > 0, "Passed zero length printTag");
  183|    986|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 780, False: 206]
  ------------------
  184|    780|    return os << _(td->label_);
  ------------------
  |  |   40|    780|#define _(String) (String)
  ------------------
  185|    206|  return os << "(" << value << ")";
  186|    986|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22pentaxWhiteBalanceModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    706|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    706|  static_assert(N > 0, "Passed zero length printTag");
  195|    706|  return printTag<N, array>(os, value.toInt64(), data);
  196|    706|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22pentaxWhiteBalanceModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    706|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    706|  static_assert(N > 0, "Passed zero length printTag");
  183|    706|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 392, False: 314]
  ------------------
  184|    392|    return os << _(td->label_);
  ------------------
  |  |   40|    392|#define _(String) (String)
  ------------------
  185|    314|  return os << "(" << value << ")";
  186|    706|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16pentaxSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    676|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    676|  static_assert(N > 0, "Passed zero length printTag");
  195|    676|  return printTag<N, array>(os, value.toInt64(), data);
  196|    676|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16pentaxSaturationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    676|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    676|  static_assert(N > 0, "Passed zero length printTag");
  183|    676|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 598, False: 78]
  ------------------
  184|    598|    return os << _(td->label_);
  ------------------
  |  |   40|    598|#define _(String) (String)
  ------------------
  185|     78|  return os << "(" << value << ")";
  186|    676|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14pentaxContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    480|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    480|  static_assert(N > 0, "Passed zero length printTag");
  195|    480|  return printTag<N, array>(os, value.toInt64(), data);
  196|    480|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14pentaxContrastEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    480|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    480|  static_assert(N > 0, "Passed zero length printTag");
  183|    480|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 342, False: 138]
  ------------------
  184|    342|    return os << _(td->label_);
  ------------------
  |  |   40|    342|#define _(String) (String)
  ------------------
  185|    138|  return os << "(" << value << ")";
  186|    480|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15pentaxSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    678|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    678|  static_assert(N > 0, "Passed zero length printTag");
  195|    678|  return printTag<N, array>(os, value.toInt64(), data);
  196|    678|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15pentaxSharpnessEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    678|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    678|  static_assert(N > 0, "Passed zero length printTag");
  183|    678|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 510, False: 168]
  ------------------
  184|    510|    return os << _(td->label_);
  ------------------
  |  |   40|    510|#define _(String) (String)
  ------------------
  185|    168|  return os << "(" << value << ")";
  186|    678|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14pentaxLocationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    220|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    220|  static_assert(N > 0, "Passed zero length printTag");
  195|    220|  return printTag<N, array>(os, value.toInt64(), data);
  196|    220|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14pentaxLocationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    220|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    220|  static_assert(N > 0, "Passed zero length printTag");
  183|    220|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 134, False: 86]
  ------------------
  184|    134|    return os << _(td->label_);
  ------------------
  |  |   40|    134|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    220|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm75ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12pentaxCitiesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.90k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.90k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.90k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.90k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm75ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12pentaxCitiesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.90k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.90k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.90k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.25k, False: 646]
  ------------------
  184|  1.25k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.25k|#define _(String) (String)
  ------------------
  185|    646|  return os << "(" << value << ")";
  186|  1.90k|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxYesNoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    118|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    118|  static_assert(N > 0, "Passed zero length printTag");
  195|    118|  return printTag<N, array>(os, value.toInt64(), data);
  196|    118|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxYesNoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    118|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    118|  static_assert(N > 0, "Passed zero length printTag");
  183|    118|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 62, False: 56]
  ------------------
  184|     62|    return os << _(td->label_);
  ------------------
  |  |   40|     62|#define _(String) (String)
  ------------------
  185|     56|  return os << "(" << value << ")";
  186|    118|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16pentaxColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    132|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    132|  static_assert(N > 0, "Passed zero length printTag");
  195|    132|  return printTag<N, array>(os, value.toInt64(), data);
  196|    132|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16pentaxColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    132|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    132|  static_assert(N > 0, "Passed zero length printTag");
  183|    132|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 86, False: 46]
  ------------------
  184|     86|    return os << _(td->label_);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|    132|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    188|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    188|  static_assert(N > 0, "Passed zero length printTag");
  195|    188|  return printTag<N, array>(os, value.toInt64(), data);
  196|    188|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11pentaxOffOnEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    188|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    188|  static_assert(N > 0, "Passed zero length printTag");
  183|    188|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 98, False: 90]
  ------------------
  184|     98|    return os << _(td->label_);
  ------------------
  |  |   40|     98|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    188|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15pentaxImageToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    914|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    914|  static_assert(N > 0, "Passed zero length printTag");
  195|    914|  return printTag<N, array>(os, value.toInt64(), data);
  196|    914|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15pentaxImageToneEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    914|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    914|  static_assert(N > 0, "Passed zero length printTag");
  183|    914|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 728, False: 186]
  ------------------
  184|    728|    return os << _(td->label_);
  ------------------
  |  |   40|    728|#define _(String) (String)
  ------------------
  185|    186|  return os << "(" << value << ")";
  186|    914|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27pentaxHighISONoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    584|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    584|  static_assert(N > 0, "Passed zero length printTag");
  195|    584|  return printTag<N, array>(os, value.toInt64(), data);
  196|    584|}
pentaxmn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27pentaxHighISONoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    584|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    584|  static_assert(N > 0, "Passed zero length printTag");
  183|    584|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 398, False: 186]
  ------------------
  184|    398|    return os << _(td->label_);
  ------------------
  |  |   40|    398|#define _(String) (String)
  ------------------
  185|    186|  return os << "(" << value << ")";
  186|    584|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm18ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16samsung2LensTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  2.13k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  2.13k|  static_assert(N > 0, "Passed zero length printTag");
  195|  2.13k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  2.13k|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm18ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16samsung2LensTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  2.13k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  2.13k|  static_assert(N > 0, "Passed zero length printTag");
  183|  2.13k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.73k, False: 398]
  ------------------
  184|  1.73k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.73k|#define _(String) (String)
  ------------------
  185|    398|  return os << "(" << value << ")";
  186|  2.13k|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18samsung2ColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     92|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     92|  static_assert(N > 0, "Passed zero length printTag");
  195|     92|  return printTag<N, array>(os, value.toInt64(), data);
  196|     92|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18samsung2ColorSpaceEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     92|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     92|  static_assert(N > 0, "Passed zero length printTag");
  183|     92|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 60, False: 32]
  ------------------
  184|     60|    return os << _(td->label_);
  ------------------
  |  |   40|     60|#define _(String) (String)
  ------------------
  185|     32|  return os << "(" << value << ")";
  186|     92|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18samsung2SmartRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     44|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     44|  static_assert(N > 0, "Passed zero length printTag");
  195|     44|  return printTag<N, array>(os, value.toInt64(), data);
  196|     44|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18samsung2SmartRangeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     44|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     44|  static_assert(N > 0, "Passed zero length printTag");
  183|     44|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 14]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|     14|  return os << "(" << value << ")";
  186|     44|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm12ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13samsungPwModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     58|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     58|  static_assert(N > 0, "Passed zero length printTag");
  195|     58|  return printTag<N, array>(os, value.toInt64(), data);
  196|     58|}
samsungmn_int.cpp:_ZN5Exiv28Internal8printTagILm12ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13samsungPwModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     58|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     58|  static_assert(N > 0, "Passed zero length printTag");
  183|     58|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 28]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|     28|  return os << "(" << value << ")";
  186|     58|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyHDRStdPart1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    318|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    318|  static_assert(N > 0, "Passed zero length printTag");
  183|    318|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 278, False: 40]
  ------------------
  184|    278|    return os << _(td->label_);
  ------------------
  |  |   40|    278|#define _(String) (String)
  ------------------
  185|     40|  return os << "(" << value << ")";
  186|    318|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyHDRStdPart2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    318|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    318|  static_assert(N > 0, "Passed zero length printTag");
  183|    318|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 196, False: 122]
  ------------------
  184|    196|    return os << _(td->label_);
  ------------------
  |  |   40|    196|#define _(String) (String)
  ------------------
  185|    122|  return os << "(" << value << ")";
  186|    318|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyFocusMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    612|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    612|  static_assert(N > 0, "Passed zero length printTag");
  183|    612|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 240, False: 372]
  ------------------
  184|    240|    return os << _(td->label_);
  ------------------
  |  |   40|    240|#define _(String) (String)
  ------------------
  185|    372|  return os << "(" << value << ")";
  186|    612|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyAFAreaModeSettingSet1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    431|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    431|  static_assert(N > 0, "Passed zero length printTag");
  183|    431|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 298, False: 133]
  ------------------
  184|    298|    return os << _(td->label_);
  ------------------
  |  |   40|    298|#define _(String) (String)
  ------------------
  185|    133|  return os << "(" << value << ")";
  186|    431|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm7ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyAFAreaModeSettingSet2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.08k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.08k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.08k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 900, False: 181]
  ------------------
  184|    900|    return os << _(td->label_);
  ------------------
  |  |   40|    900|#define _(String) (String)
  ------------------
  185|    181|  return os << "(" << value << ")";
  186|  1.08k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyAFAreaModeSettingSet3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.40k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.40k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.40k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 951, False: 456]
  ------------------
  184|    951|    return os << _(td->label_);
  ------------------
  |  |   40|    951|#define _(String) (String)
  ------------------
  185|    456|  return os << "(" << value << ")";
  186|  1.40k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm20ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    903|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    903|  static_assert(N > 0, "Passed zero length printTag");
  183|    903|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 749, False: 154]
  ------------------
  184|    749|    return os << _(td->label_);
  ------------------
  |  |   40|    749|#define _(String) (String)
  ------------------
  185|    154|  return os << "(" << value << ")";
  186|    903|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm80ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    647|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    647|  static_assert(N > 0, "Passed zero length printTag");
  195|    647|  return printTag<N, array>(os, value.toInt64(), data);
  196|    647|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm80ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    647|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    647|  static_assert(N > 0, "Passed zero length printTag");
  183|    647|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 415, False: 232]
  ------------------
  184|    415|    return os << _(td->label_);
  ------------------
  |  |   40|    415|#define _(String) (String)
  ------------------
  185|    232|  return os << "(" << value << ")";
  186|    647|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm80ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    333|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    333|  static_assert(N > 0, "Passed zero length printTag");
  195|    333|  return printTag<N, array>(os, value.toInt64(), data);
  196|    333|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm80ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    333|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    333|  static_assert(N > 0, "Passed zero length printTag");
  183|    333|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 116, False: 217]
  ------------------
  184|    116|    return os << _(td->label_);
  ------------------
  |  |   40|    116|#define _(String) (String)
  ------------------
  185|    217|  return os << "(" << value << ")";
  186|    333|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet4EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    325|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    325|  static_assert(N > 0, "Passed zero length printTag");
  183|    325|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 197, False: 128]
  ------------------
  184|    197|    return os << _(td->label_);
  ------------------
  |  |   40|    197|#define _(String) (String)
  ------------------
  185|    128|  return os << "(" << value << ")";
  186|    325|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L23sonyAFPointSelectedSet5EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    805|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    805|  static_assert(N > 0, "Passed zero length printTag");
  183|    805|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 543, False: 262]
  ------------------
  184|    543|    return os << _(td->label_);
  ------------------
  |  |   40|    543|#define _(String) (String)
  ------------------
  185|    262|  return os << "(" << value << ")";
  186|    805|}
sonymn_int.cpp:_ZN5Exiv28Internal20printTagBitlistAllLEILm19ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L20sonyAFPointsUsedSet1EEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  238|    206|std::ostream& printTagBitlistAllLE(std::ostream& os, const Value& value, const ExifData*) {
  239|    206|  static_assert(N > 0, "Passed zero length TagDetailsBitlistSorted");
  240|       |
  241|    206|  uint32_t vN = 0;
  242|    206|  uint32_t currentVNBit = 0;
  243|    206|  size_t lastArrayPos = 0;  // Prevents unneeded searching of array
  244|    206|  constexpr auto maxArrayBit = (array + N - 1)->first;
  245|    206|  auto allVNZero = true;
  246|    206|  auto useSep = false;
  247|       |
  248|       |  // For each value
  249|  4.07k|  for (size_t i = 0; i < value.count(); i++) {
  ------------------
  |  Branch (249:22): [True: 3.87k, False: 206]
  ------------------
  250|  3.87k|    vN = value.toUint32(i);
  251|  3.87k|    if (vN == 0) {  // If all bits zero, then nothing to process
  ------------------
  |  Branch (251:9): [True: 1.25k, False: 2.61k]
  ------------------
  252|  1.25k|      currentVNBit += 8;
  253|  1.25k|      continue;
  254|  1.25k|    }
  255|  2.61k|    allVNZero = false;
  256|       |    // Cycle through every bit in that byte
  257|  23.5k|    for (auto j = 0; j < 8; j++, currentVNBit++) {
  ------------------
  |  Branch (257:22): [True: 20.9k, False: 2.61k]
  ------------------
  258|  20.9k|      if ((vN >> j & 0x01) == 0) {  // If bit not set, then nothing to process
  ------------------
  |  Branch (258:11): [True: 9.36k, False: 11.5k]
  ------------------
  259|  9.36k|        continue;
  260|  9.36k|      }
  261|  11.5k|      if (currentVNBit > maxArrayBit) {  // If beyond array values, output unknown index
  ------------------
  |  Branch (261:11): [True: 10.2k, False: 1.29k]
  ------------------
  262|  10.2k|        os << ", [" << currentVNBit << "]";
  263|  10.2k|        continue;
  264|  10.2k|      }
  265|       |
  266|       |      // Check to see if the numbered bit is found in the array
  267|  2.96k|      for (size_t k = lastArrayPos; k < N; ++k) {
  ------------------
  |  Branch (267:37): [True: 2.96k, False: 0]
  ------------------
  268|  2.96k|        auto [bit, label] = *(array + k);
  269|       |
  270|  2.96k|        if (currentVNBit == bit) {
  ------------------
  |  Branch (270:13): [True: 1.29k, False: 1.66k]
  ------------------
  271|  1.29k|          lastArrayPos = k;
  272|  1.29k|          if (useSep) {
  ------------------
  |  Branch (272:15): [True: 1.18k, False: 117]
  ------------------
  273|  1.18k|            os << ", " << _(label);
  ------------------
  |  |   40|  1.18k|#define _(String) (String)
  ------------------
  274|  1.18k|          } else {
  275|    117|            os << _(label);
  ------------------
  |  |   40|    117|#define _(String) (String)
  ------------------
  276|    117|            useSep = true;
  277|    117|          }
  278|  1.29k|          break;
  279|  1.29k|        }
  280|  2.96k|      }
  281|  1.29k|    }
  282|  2.61k|  }
  283|    206|  if (allVNZero)
  ------------------
  |  Branch (283:7): [True: 82, False: 124]
  ------------------
  284|     82|    os << _("None");
  ------------------
  |  |   40|     82|#define _(String) (String)
  ------------------
  285|    206|  return os;
  286|    206|}
sonymn_int.cpp:_ZN5Exiv28Internal20printTagBitlistAllLEILm80ETnRAT__KNSt3__14pairIjPKcEEL_ZNS0_L20sonyAFPointsUsedSet2EEEERNS2_13basic_ostreamIcNS2_11char_traitsIcEEEESE_RKNS_5ValueEPKNS_8ExifDataE:
  238|    159|std::ostream& printTagBitlistAllLE(std::ostream& os, const Value& value, const ExifData*) {
  239|    159|  static_assert(N > 0, "Passed zero length TagDetailsBitlistSorted");
  240|       |
  241|    159|  uint32_t vN = 0;
  242|    159|  uint32_t currentVNBit = 0;
  243|    159|  size_t lastArrayPos = 0;  // Prevents unneeded searching of array
  244|    159|  constexpr auto maxArrayBit = (array + N - 1)->first;
  245|    159|  auto allVNZero = true;
  246|    159|  auto useSep = false;
  247|       |
  248|       |  // For each value
  249|  4.53k|  for (size_t i = 0; i < value.count(); i++) {
  ------------------
  |  Branch (249:22): [True: 4.38k, False: 159]
  ------------------
  250|  4.38k|    vN = value.toUint32(i);
  251|  4.38k|    if (vN == 0) {  // If all bits zero, then nothing to process
  ------------------
  |  Branch (251:9): [True: 1.41k, False: 2.96k]
  ------------------
  252|  1.41k|      currentVNBit += 8;
  253|  1.41k|      continue;
  254|  1.41k|    }
  255|  2.96k|    allVNZero = false;
  256|       |    // Cycle through every bit in that byte
  257|  26.7k|    for (auto j = 0; j < 8; j++, currentVNBit++) {
  ------------------
  |  Branch (257:22): [True: 23.7k, False: 2.96k]
  ------------------
  258|  23.7k|      if ((vN >> j & 0x01) == 0) {  // If bit not set, then nothing to process
  ------------------
  |  Branch (258:11): [True: 12.7k, False: 11.0k]
  ------------------
  259|  12.7k|        continue;
  260|  12.7k|      }
  261|  11.0k|      if (currentVNBit > maxArrayBit) {  // If beyond array values, output unknown index
  ------------------
  |  Branch (261:11): [True: 4.75k, False: 6.27k]
  ------------------
  262|  4.75k|        os << ", [" << currentVNBit << "]";
  263|  4.75k|        continue;
  264|  4.75k|      }
  265|       |
  266|       |      // Check to see if the numbered bit is found in the array
  267|  23.4k|      for (size_t k = lastArrayPos; k < N; ++k) {
  ------------------
  |  Branch (267:37): [True: 21.9k, False: 1.49k]
  ------------------
  268|  21.9k|        auto [bit, label] = *(array + k);
  269|       |
  270|  21.9k|        if (currentVNBit == bit) {
  ------------------
  |  Branch (270:13): [True: 4.77k, False: 17.1k]
  ------------------
  271|  4.77k|          lastArrayPos = k;
  272|  4.77k|          if (useSep) {
  ------------------
  |  Branch (272:15): [True: 4.65k, False: 119]
  ------------------
  273|  4.65k|            os << ", " << _(label);
  ------------------
  |  |   40|  4.65k|#define _(String) (String)
  ------------------
  274|  4.65k|          } else {
  275|    119|            os << _(label);
  ------------------
  |  |   40|    119|#define _(String) (String)
  ------------------
  276|    119|            useSep = true;
  277|    119|          }
  278|  4.77k|          break;
  279|  4.77k|        }
  280|  21.9k|      }
  281|  6.27k|    }
  282|  2.96k|  }
  283|    159|  if (allVNZero)
  ------------------
  |  Branch (283:7): [True: 38, False: 121]
  ------------------
  284|     38|    os << _("None");
  ------------------
  |  |   40|     38|#define _(String) (String)
  ------------------
  285|    159|  return os;
  286|    159|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyAFTrackingEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    628|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    628|  static_assert(N > 0, "Passed zero length printTag");
  183|    628|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 541, False: 87]
  ------------------
  184|    541|    return os << _(td->label_);
  ------------------
  |  |   40|    541|#define _(String) (String)
  ------------------
  185|     87|  return os << "(" << value << ")";
  186|    628|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     84|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     84|  static_assert(N > 0, "Passed zero length printTag");
  183|     84|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 37, False: 47]
  ------------------
  184|     37|    return os << _(td->label_);
  ------------------
  |  |   40|     37|#define _(String) (String)
  ------------------
  185|     47|  return os << "(" << value << ")";
  186|     84|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm9ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyAFModeSet1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    278|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    278|  static_assert(N > 0, "Passed zero length printTag");
  183|    278|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 257, False: 21]
  ------------------
  184|    257|    return os << _(td->label_);
  ------------------
  |  |   40|    257|#define _(String) (String)
  ------------------
  185|     21|  return os << "(" << value << ")";
  186|    278|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyAFModeSet2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     82|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     82|  static_assert(N > 0, "Passed zero length printTag");
  183|     82|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 67, False: 15]
  ------------------
  184|     67|    return os << _(td->label_);
  ------------------
  |  |   40|     67|#define _(String) (String)
  ------------------
  185|     15|  return os << "(" << value << ")";
  186|     82|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyFocusMode3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     42|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     42|  static_assert(N > 0, "Passed zero length printTag");
  183|     42|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 30, False: 12]
  ------------------
  184|     30|    return os << _(td->label_);
  ------------------
  |  |   40|     30|#define _(String) (String)
  ------------------
  185|     12|  return os << "(" << value << ")";
  186|     42|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L26sonyHighISONoiseReduction2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    206|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    206|  static_assert(N > 0, "Passed zero length printTag");
  183|    206|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 120, False: 86]
  ------------------
  184|    120|    return os << _(td->label_);
  ------------------
  |  |   40|    120|#define _(String) (String)
  ------------------
  185|     86|  return os << "(" << value << ")";
  186|    206|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyImageQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.39k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.39k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.39k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.39k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyImageQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.39k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.39k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.39k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.18k, False: 210]
  ------------------
  184|  1.18k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.18k|#define _(String) (String)
  ------------------
  185|    210|  return os << "(" << value << ")";
  186|  1.39k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyWhiteBalanceStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    668|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    668|  static_assert(N > 0, "Passed zero length printTag");
  195|    668|  return printTag<N, array>(os, value.toInt64(), data);
  196|    668|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm10ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyWhiteBalanceStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    668|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    668|  static_assert(N > 0, "Passed zero length printTag");
  183|    668|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 486, False: 182]
  ------------------
  184|    486|    return os << _(td->label_);
  ------------------
  |  |   40|    486|#define _(String) (String)
  ------------------
  185|    182|  return os << "(" << value << ")";
  186|    668|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30sonyLongExposureNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    408|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    408|  static_assert(N > 0, "Passed zero length printTag");
  195|    408|  return printTag<N, array>(os, value.toInt64(), data);
  196|    408|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30sonyLongExposureNoiseReductionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    408|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    408|  static_assert(N > 0, "Passed zero length printTag");
  183|    408|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 262, False: 146]
  ------------------
  184|    262|    return os << _(td->label_);
  ------------------
  |  |   40|    262|#define _(String) (String)
  ------------------
  185|    146|  return os << "(" << value << ")";
  186|    408|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28sonyHighISONoiseReductionStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    702|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    702|  static_assert(N > 0, "Passed zero length printTag");
  195|    702|  return printTag<N, array>(os, value.toInt64(), data);
  196|    702|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L28sonyHighISONoiseReductionStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    702|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    702|  static_assert(N > 0, "Passed zero length printTag");
  183|    702|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 452, False: 250]
  ------------------
  184|    452|    return os << _(td->label_);
  ------------------
  |  |   40|    452|#define _(String) (String)
  ------------------
  185|    250|  return os << "(" << value << ")";
  186|    702|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12sonyOffOnNA1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    208|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    208|  static_assert(N > 0, "Passed zero length printTag");
  195|    208|  return printTag<N, array>(os, value.toInt64(), data);
  196|    208|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12sonyOffOnNA1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    208|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    208|  static_assert(N > 0, "Passed zero length printTag");
  183|    208|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 142, False: 66]
  ------------------
  184|    142|    return os << _(td->label_);
  ------------------
  |  |   40|    142|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|    208|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm36ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyPictureEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.37k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.37k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.37k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.37k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm36ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyPictureEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.37k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.37k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.37k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 1.25k, False: 120]
  ------------------
  184|  1.25k|    return os << _(td->label_);
  ------------------
  |  |   40|  1.25k|#define _(String) (String)
  ------------------
  185|    120|  return os << "(" << value << ")";
  186|  1.37k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonySoftSkinEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    166|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    166|  static_assert(N > 0, "Passed zero length printTag");
  195|    166|  return printTag<N, array>(os, value.toInt64(), data);
  196|    166|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonySoftSkinEffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    166|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    166|  static_assert(N > 0, "Passed zero length printTag");
  183|    166|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 76, False: 90]
  ------------------
  184|     76|    return os << _(td->label_);
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    166|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24sonyVignettingCorrectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    138|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    138|  static_assert(N > 0, "Passed zero length printTag");
  195|    138|  return printTag<N, array>(os, value.toInt64(), data);
  196|    138|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L24sonyVignettingCorrectionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    138|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    138|  static_assert(N > 0, "Passed zero length printTag");
  183|    138|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 48, False: 90]
  ------------------
  184|     48|    return os << _(td->label_);
  ------------------
  |  |   40|     48|#define _(String) (String)
  ------------------
  185|     90|  return os << "(" << value << ")";
  186|    138|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30sonyLateralChromaticAberrationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    324|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    324|  static_assert(N > 0, "Passed zero length printTag");
  195|    324|  return printTag<N, array>(os, value.toInt64(), data);
  196|    324|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L30sonyLateralChromaticAberrationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    324|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    324|  static_assert(N > 0, "Passed zero length printTag");
  183|    324|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 178, False: 146]
  ------------------
  184|    178|    return os << _(td->label_);
  ------------------
  |  |   40|    178|#define _(String) (String)
  ------------------
  185|    146|  return os << "(" << value << ")";
  186|    324|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L32sonyDistortionCorrectionSettingsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    198|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    198|  static_assert(N > 0, "Passed zero length printTag");
  195|    198|  return printTag<N, array>(os, value.toInt64(), data);
  196|    198|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L32sonyDistortionCorrectionSettingsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    198|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    198|  static_assert(N > 0, "Passed zero length printTag");
  183|    198|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 124, False: 74]
  ------------------
  184|    124|    return os << _(td->label_);
  ------------------
  |  |   40|    124|#define _(String) (String)
  ------------------
  185|     74|  return os << "(" << value << ")";
  186|    198|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9sonyNoYesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    196|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    196|  static_assert(N > 0, "Passed zero length printTag");
  195|    196|  return printTag<N, array>(os, value.toInt64(), data);
  196|    196|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9sonyNoYesEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    196|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    196|  static_assert(N > 0, "Passed zero length printTag");
  183|    196|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 158, False: 38]
  ------------------
  184|    158|    return os << _(td->label_);
  ------------------
  |  |   40|    158|#define _(String) (String)
  ------------------
  185|     38|  return os << "(" << value << ")";
  186|    196|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyFlashActionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    316|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    316|  static_assert(N > 0, "Passed zero length printTag");
  195|    316|  return printTag<N, array>(os, value.toInt64(), data);
  196|    316|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyFlashActionEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    316|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    316|  static_assert(N > 0, "Passed zero length printTag");
  183|    316|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 232, False: 84]
  ------------------
  184|    232|    return os << _(td->label_);
  ------------------
  |  |   40|    232|#define _(String) (String)
  ------------------
  185|     84|  return os << "(" << value << ")";
  186|    316|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22sonyMultiFrameNREffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     74|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     74|  static_assert(N > 0, "Passed zero length printTag");
  195|     74|  return printTag<N, array>(os, value.toInt64(), data);
  196|     74|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L22sonyMultiFrameNREffectEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     74|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     74|  static_assert(N > 0, "Passed zero length printTag");
  183|     74|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 28, False: 46]
  ------------------
  184|     28|    return os << _(td->label_);
  ------------------
  |  |   40|     28|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|     74|}
sonymn_int.cpp:_ZN5Exiv28Internal15printTagString2ILm5ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L25sonyVariableLowPassFilterEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  128|    838|std::ostream& printTagString2(std::ostream& os, const Value& value, const ExifData* data) {
  129|    838|  static_assert(N > 0, "Passed zero length printTagString2");
  130|    838|  if (value.count() < 2)
  ------------------
  |  Branch (130:7): [True: 22, False: 816]
  ------------------
  131|     22|    return os << "(" << value << ")";
  132|    816|  std::string temp = value.toString(0) + " " + value.toString(1);
  133|    816|  return printTagString<N, array>(os, temp, data);
  134|    838|}
sonymn_int.cpp:_ZN5Exiv28Internal14printTagStringILm5ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L25sonyVariableLowPassFilterEENSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEERNS6_13basic_ostreamIcS9_EESF_RKT1_PKNS_8ExifDataE:
  107|    816|std::ostream& printTagString(std::ostream& os, const T& value, const ExifData*) {
  108|    816|  static_assert(N > 0, "Passed zero length printTagString");
  109|       |  if constexpr (std::is_same_v<T, Value>) {
  110|       |    if (auto td = Exiv2::find(array, value.toString(0)))
  111|       |      return os << _(td->label_);
  112|       |    return os << "(" << value << ")";
  113|    816|  } else {
  114|    816|    if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (114:14): [True: 364, False: 452]
  ------------------
  115|    364|      return os << _(td->label_);
  ------------------
  |  |   40|    364|#define _(String) (String)
  ------------------
  116|    452|    return os << "(" << value << ")";
  117|    816|  }
  118|    816|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyRAWFileTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    380|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    380|  static_assert(N > 0, "Passed zero length printTag");
  195|    380|  return printTag<N, array>(os, value.toInt64(), data);
  196|    380|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyRAWFileTypeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    380|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    380|  static_assert(N > 0, "Passed zero length printTag");
  183|    380|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 288, False: 92]
  ------------------
  184|    288|    return os << _(td->label_);
  ------------------
  |  |   40|    288|#define _(String) (String)
  ------------------
  185|     92|  return os << "(" << value << ")";
  186|    380|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyPrioritySetInAWBEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    388|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    388|  static_assert(N > 0, "Passed zero length printTag");
  195|    388|  return printTag<N, array>(os, value.toInt64(), data);
  196|    388|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyPrioritySetInAWBEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    388|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    388|  static_assert(N > 0, "Passed zero length printTag");
  183|    388|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 322, False: 66]
  ------------------
  184|    322|    return os << _(td->label_);
  ------------------
  |  |   40|    322|#define _(String) (String)
  ------------------
  185|     66|  return os << "(" << value << ")";
  186|    388|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyMeteringMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    186|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    186|  static_assert(N > 0, "Passed zero length printTag");
  195|    186|  return printTag<N, array>(os, value.toInt64(), data);
  196|    186|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyMeteringMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    186|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    186|  static_assert(N > 0, "Passed zero length printTag");
  183|    186|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 82, False: 104]
  ------------------
  184|     82|    return os << _(td->label_);
  ------------------
  |  |   40|     82|#define _(String) (String)
  ------------------
  185|    104|  return os << "(" << value << ")";
  186|    186|}
sonymn_int.cpp:_ZN5Exiv28Internal15printTagString2ILm30ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L15sonyQuality2StdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  128|    424|std::ostream& printTagString2(std::ostream& os, const Value& value, const ExifData* data) {
  129|    424|  static_assert(N > 0, "Passed zero length printTagString2");
  130|    424|  if (value.count() < 2)
  ------------------
  |  Branch (130:7): [True: 50, False: 374]
  ------------------
  131|     50|    return os << "(" << value << ")";
  132|    374|  std::string temp = value.toString(0) + " " + value.toString(1);
  133|    374|  return printTagString<N, array>(os, temp, data);
  134|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal14printTagStringILm30ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L15sonyQuality2StdEENSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEERNS6_13basic_ostreamIcS9_EESF_RKT1_PKNS_8ExifDataE:
  107|    374|std::ostream& printTagString(std::ostream& os, const T& value, const ExifData*) {
  108|    374|  static_assert(N > 0, "Passed zero length printTagString");
  109|       |  if constexpr (std::is_same_v<T, Value>) {
  110|       |    if (auto td = Exiv2::find(array, value.toString(0)))
  111|       |      return os << _(td->label_);
  112|       |    return os << "(" << value << ")";
  113|    374|  } else {
  114|    374|    if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (114:14): [True: 48, False: 326]
  ------------------
  115|     48|      return os << _(td->label_);
  ------------------
  |  |   40|     48|#define _(String) (String)
  ------------------
  116|    326|    return os << "(" << value << ")";
  117|    374|  }
  118|    374|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonyJPEGHEIFSwitchEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    172|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    172|  static_assert(N > 0, "Passed zero length printTag");
  195|    172|  return printTag<N, array>(os, value.toInt64(), data);
  196|    172|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonyJPEGHEIFSwitchEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    172|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    172|  static_assert(N > 0, "Passed zero length printTag");
  183|    172|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 72, False: 100]
  ------------------
  184|     72|    return os << _(td->label_);
  ------------------
  |  |   40|     72|#define _(String) (String)
  ------------------
  185|    100|  return os << "(" << value << ")";
  186|    172|}
sonymn_int.cpp:_ZN5Exiv28Internal15printTagString4ILm16ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L14sonyFileFormatEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  144|    552|std::ostream& printTagString4(std::ostream& os, const Value& value, const ExifData* data) {
  145|    552|  static_assert(N > 0, "Passed zero length printTagString4");
  146|    552|  if (value.count() < 4)
  ------------------
  |  Branch (146:7): [True: 74, False: 478]
  ------------------
  147|     74|    return os << "(" << value << ")";
  148|    478|  std::string temp = value.toString(0) + " " + value.toString(1) + " " + value.toString(2) + " " + value.toString(3);
  149|    478|  return printTagString<N, array>(os, temp, data);
  150|    552|}
sonymn_int.cpp:_ZN5Exiv28Internal14printTagStringILm16ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L14sonyFileFormatEENSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEERNS6_13basic_ostreamIcS9_EESF_RKT1_PKNS_8ExifDataE:
  107|    478|std::ostream& printTagString(std::ostream& os, const T& value, const ExifData*) {
  108|    478|  static_assert(N > 0, "Passed zero length printTagString");
  109|       |  if constexpr (std::is_same_v<T, Value>) {
  110|       |    if (auto td = Exiv2::find(array, value.toString(0)))
  111|       |      return os << _(td->label_);
  112|       |    return os << "(" << value << ")";
  113|    478|  } else {
  114|    478|    if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (114:14): [True: 152, False: 326]
  ------------------
  115|    152|      return os << _(td->label_);
  ------------------
  |  |   40|    152|#define _(String) (String)
  ------------------
  116|    326|    return os << "(" << value << ")";
  117|    478|  }
  118|    478|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm115ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11sonyModelIdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  8.95k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  8.95k|  static_assert(N > 0, "Passed zero length printTag");
  195|  8.95k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  8.95k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm115ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11sonyModelIdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  8.95k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  8.95k|  static_assert(N > 0, "Passed zero length printTag");
  183|  8.95k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 7.91k, False: 1.04k]
  ------------------
  184|  7.91k|    return os << _(td->label_);
  ------------------
  |  |   40|  7.91k|#define _(String) (String)
  ------------------
  185|  1.04k|  return os << "(" << value << ")";
  186|  8.95k|}
sonymn_int.cpp:_ZN5Exiv28Internal14printTagStringILm19ETnRAT__KNS0_16StringTagDetailsEL_ZNS0_L20sonyCreativeStyleStdEENS_5ValueEEERNSt3__113basic_ostreamIcNS7_11char_traitsIcEEEESC_RKT1_PKNS_8ExifDataE:
  107|    276|std::ostream& printTagString(std::ostream& os, const T& value, const ExifData*) {
  108|    276|  static_assert(N > 0, "Passed zero length printTagString");
  109|    276|  if constexpr (std::is_same_v<T, Value>) {
  110|    276|    if (auto td = Exiv2::find(array, value.toString(0)))
  ------------------
  |  Branch (110:14): [True: 6, False: 270]
  ------------------
  111|      6|      return os << _(td->label_);
  ------------------
  |  |   40|      6|#define _(String) (String)
  ------------------
  112|    270|    return os << "(" << value << ")";
  113|       |  } else {
  114|       |    if (auto td = Exiv2::find(array, value))
  115|       |      return os << _(td->label_);
  116|       |    return os << "(" << value << ")";
  117|       |  }
  118|    276|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11print0xb025EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    628|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    628|  static_assert(N > 0, "Passed zero length printTag");
  195|    628|  return printTag<N, array>(os, value.toInt64(), data);
  196|    628|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11print0xb025EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    628|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    628|  static_assert(N > 0, "Passed zero length printTag");
  183|    628|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 514, False: 114]
  ------------------
  184|    514|    return os << _(td->label_);
  ------------------
  |  |   40|    514|#define _(String) (String)
  ------------------
  185|    114|  return os << "(" << value << ")";
  186|    628|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12sonyOffOnNA2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    300|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    300|  static_assert(N > 0, "Passed zero length printTag");
  195|    300|  return printTag<N, array>(os, value.toInt64(), data);
  196|    300|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12sonyOffOnNA2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    300|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    300|  static_assert(N > 0, "Passed zero length printTag");
  183|    300|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 118, False: 182]
  ------------------
  184|    118|    return os << _(td->label_);
  ------------------
  |  |   40|    118|#define _(String) (String)
  ------------------
  185|    182|  return os << "(" << value << ")";
  186|    300|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm26ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  2.80k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  2.80k|  static_assert(N > 0, "Passed zero length printTag");
  195|  2.80k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  2.80k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm26ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyColorModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  2.80k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  2.80k|  static_assert(N > 0, "Passed zero length printTag");
  183|  2.80k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2.33k, False: 470]
  ------------------
  184|  2.33k|    return os << _(td->label_);
  ------------------
  |  |   40|  2.33k|#define _(String) (String)
  ------------------
  185|    470|  return os << "(" << value << ")";
  186|  2.80k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9sonyMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    302|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    302|  static_assert(N > 0, "Passed zero length printTag");
  195|    302|  return printTag<N, array>(os, value.toInt64(), data);
  196|    302|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L9sonyMacroEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    302|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    302|  static_assert(N > 0, "Passed zero length printTag");
  183|    302|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 232, False: 70]
  ------------------
  184|    232|    return os << _(td->label_);
  ------------------
  |  |   40|    232|#define _(String) (String)
  ------------------
  185|     70|  return os << "(" << value << ")";
  186|    302|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm31ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  4.53k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  4.53k|  static_assert(N > 0, "Passed zero length printTag");
  195|  4.53k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  4.53k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm31ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyExposureModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  4.53k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  4.53k|  static_assert(N > 0, "Passed zero length printTag");
  183|  4.53k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 3.54k, False: 994]
  ------------------
  184|  3.54k|    return os << _(td->label_);
  ------------------
  |  |   40|  3.54k|#define _(String) (String)
  ------------------
  185|    994|  return os << "(" << value << ")";
  186|  4.53k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyAFIlluminatorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     96|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     96|  static_assert(N > 0, "Passed zero length printTag");
  195|     96|  return printTag<N, array>(os, value.toInt64(), data);
  196|     96|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyAFIlluminatorEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     96|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     96|  static_assert(N > 0, "Passed zero length printTag");
  183|     96|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 76, False: 20]
  ------------------
  184|     76|    return os << _(td->label_);
  ------------------
  |  |   40|     76|#define _(String) (String)
  ------------------
  185|     20|  return os << "(" << value << ")";
  186|     96|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyJPEGQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    192|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    192|  static_assert(N > 0, "Passed zero length printTag");
  195|    192|  return printTag<N, array>(os, value.toInt64(), data);
  196|    192|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyJPEGQualityEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    192|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    192|  static_assert(N > 0, "Passed zero length printTag");
  183|    192|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 130, False: 62]
  ------------------
  184|    130|    return os << _(td->label_);
  ------------------
  |  |   40|    130|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|    192|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyFlashLevelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    768|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    768|  static_assert(N > 0, "Passed zero length printTag");
  195|    768|  return printTag<N, array>(os, value.toInt64(), data);
  196|    768|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm22ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyFlashLevelEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    768|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    768|  static_assert(N > 0, "Passed zero length printTag");
  183|    768|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 590, False: 178]
  ------------------
  184|    590|    return os << _(td->label_);
  ------------------
  |  |   40|    590|#define _(String) (String)
  ------------------
  185|    178|  return os << "(" << value << ")";
  186|    768|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyReleaseModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|  1.21k|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|  1.21k|  static_assert(N > 0, "Passed zero length printTag");
  195|  1.21k|  return printTag<N, array>(os, value.toInt64(), data);
  196|  1.21k|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm6ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyReleaseModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|  1.21k|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|  1.21k|  static_assert(N > 0, "Passed zero length printTag");
  183|  1.21k|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 810, False: 408]
  ------------------
  184|    810|    return os << _(td->label_);
  ------------------
  |  |   40|    810|#define _(String) (String)
  ------------------
  185|    408|  return os << "(" << value << ")";
  186|  1.21k|}
sonymn_int.cpp:_ZN5Exiv28Internal15printTagNoErrorILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L18sonySequenceNumberEENS_5ValueEEERNSt3__113basic_ostreamIcNS7_11char_traitsIcEEEESC_RKT1_PKNS_8ExifDataE:
  160|    154|std::ostream& printTagNoError(std::ostream& os, const T& value, const ExifData*) {
  161|    154|  static_assert(N > 0, "Passed zero length printTagNoError");
  162|    154|  if constexpr (std::is_same_v<T, Value>) {
  163|    154|    if (auto td = Exiv2::find(array, value.toInt64()))
  ------------------
  |  Branch (163:14): [True: 86, False: 68]
  ------------------
  164|     86|      return os << _(td->label_);
  ------------------
  |  |   40|     86|#define _(String) (String)
  ------------------
  165|     68|    return os << value;
  166|       |  } else {
  167|       |    if (auto td = Exiv2::find(array, value))
  168|       |      return os << _(td->label_);
  169|       |    return os << value;
  170|       |  }
  171|    154|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12sonyAntiBlurEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    404|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    404|  static_assert(N > 0, "Passed zero length printTag");
  195|    404|  return printTag<N, array>(os, value.toInt64(), data);
  196|    404|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L12sonyAntiBlurEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    404|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    404|  static_assert(N > 0, "Passed zero length printTag");
  183|    404|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 192, False: 212]
  ------------------
  184|    192|    return os << _(td->label_);
  ------------------
  |  |   40|    192|#define _(String) (String)
  ------------------
  185|    212|  return os << "(" << value << ")";
  186|    404|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11print0xb04fEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    498|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    498|  static_assert(N > 0, "Passed zero length printTag");
  195|    498|  return printTag<N, array>(os, value.toInt64(), data);
  196|    498|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L11print0xb04fEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    498|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    498|  static_assert(N > 0, "Passed zero length printTag");
  183|    498|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 258, False: 240]
  ------------------
  184|    258|    return os << _(td->label_);
  ------------------
  |  |   40|    258|#define _(String) (String)
  ------------------
  185|    240|  return os << "(" << value << ")";
  186|    498|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyIntelligentAutoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     92|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     92|  static_assert(N > 0, "Passed zero length printTag");
  195|     92|  return printTag<N, array>(os, value.toInt64(), data);
  196|     92|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyIntelligentAutoEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     92|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     92|  static_assert(N > 0, "Passed zero length printTag");
  183|     92|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 66, False: 26]
  ------------------
  184|     66|    return os << _(td->label_);
  ------------------
  |  |   40|     66|#define _(String) (String)
  ------------------
  185|     26|  return os << "(" << value << ")";
  186|     92|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyWhiteBalance2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    868|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    868|  static_assert(N > 0, "Passed zero length printTag");
  195|    868|  return printTag<N, array>(os, value.toInt64(), data);
  196|    868|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyWhiteBalance2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    868|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    868|  static_assert(N > 0, "Passed zero length printTag");
  183|    868|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 736, False: 132]
  ------------------
  184|    736|    return os << _(td->label_);
  ------------------
  |  |   40|    736|#define _(String) (String)
  ------------------
  185|    132|  return os << "(" << value << ")";
  186|    868|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyDriveModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    452|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    452|  static_assert(N > 0, "Passed zero length printTag");
  195|    452|  return printTag<N, array>(os, value.toInt64(), data);
  196|    452|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm13ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyDriveModeStdEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    452|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    452|  static_assert(N > 0, "Passed zero length printTag");
  183|    452|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 82, False: 370]
  ------------------
  184|     82|    return os << _(td->label_);
  ------------------
  |  |   40|     82|#define _(String) (String)
  ------------------
  185|    370|  return os << "(" << value << ")";
  186|    452|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyCSFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    424|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    424|  static_assert(N > 0, "Passed zero length printTag");
  195|    424|  return printTag<N, array>(os, value.toInt64(), data);
  196|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyCSFocusModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    424|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    424|  static_assert(N > 0, "Passed zero length printTag");
  183|    424|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 114, False: 310]
  ------------------
  184|    114|    return os << _(td->label_);
  ------------------
  |  |   40|    114|#define _(String) (String)
  ------------------
  185|    310|  return os << "(" << value << ")";
  186|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    424|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    424|  static_assert(N > 0, "Passed zero length printTag");
  195|    424|  return printTag<N, array>(os, value.toInt64(), data);
  196|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyMeteringModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    424|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    424|  static_assert(N > 0, "Passed zero length printTag");
  183|    424|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 24, False: 400]
  ------------------
  184|     24|    return os << _(td->label_);
  ------------------
  |  |   40|     24|#define _(String) (String)
  ------------------
  185|    400|  return os << "(" << value << ")";
  186|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyCreativeStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    424|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    424|  static_assert(N > 0, "Passed zero length printTag");
  195|    424|  return printTag<N, array>(os, value.toInt64(), data);
  196|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sonyCreativeStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    424|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    424|  static_assert(N > 0, "Passed zero length printTag");
  183|    424|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 94, False: 330]
  ------------------
  184|     94|    return os << _(td->label_);
  ------------------
  |  |   40|     94|#define _(String) (String)
  ------------------
  185|    330|  return os << "(" << value << ")";
  186|    424|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    352|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    352|  static_assert(N > 0, "Passed zero length printTag");
  195|    352|  return printTag<N, array>(os, value.toInt64(), data);
  196|    352|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyFlashModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    352|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    352|  static_assert(N > 0, "Passed zero length printTag");
  183|    352|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 88, False: 264]
  ------------------
  184|     88|    return os << _(td->label_);
  ------------------
  |  |   40|     88|#define _(String) (String)
  ------------------
  185|    264|  return os << "(" << value << ")";
  186|    352|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyAFIlluminatorCSEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    346|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    346|  static_assert(N > 0, "Passed zero length printTag");
  195|    346|  return printTag<N, array>(os, value.toInt64(), data);
  196|    346|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyAFIlluminatorCSEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    346|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    346|  static_assert(N > 0, "Passed zero length printTag");
  183|    346|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 124, False: 222]
  ------------------
  184|    124|    return os << _(td->label_);
  ------------------
  |  |   40|    124|#define _(String) (String)
  ------------------
  185|    222|  return os << "(" << value << ")";
  186|    346|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyImageStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    346|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    346|  static_assert(N > 0, "Passed zero length printTag");
  195|    346|  return printTag<N, array>(os, value.toInt64(), data);
  196|    346|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm15ETnRAT__KNS0_10TagDetailsEL_ZNS0_L14sonyImageStyleEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    346|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    346|  static_assert(N > 0, "Passed zero length printTag");
  183|    346|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 102, False: 244]
  ------------------
  184|    102|    return os << _(td->label_);
  ------------------
  |  |   40|    102|#define _(String) (String)
  ------------------
  185|    244|  return os << "(" << value << ")";
  186|    346|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyExposureProgramEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    352|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    352|  static_assert(N > 0, "Passed zero length printTag");
  195|    352|  return printTag<N, array>(os, value.toInt64(), data);
  196|    352|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyExposureProgramEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    352|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    352|  static_assert(N > 0, "Passed zero length printTag");
  183|    352|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 142, False: 210]
  ------------------
  184|    142|    return os << _(td->label_);
  ------------------
  |  |   40|    142|#define _(String) (String)
  ------------------
  185|    210|  return os << "(" << value << ")";
  186|    352|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyImageSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    266|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    266|  static_assert(N > 0, "Passed zero length printTag");
  195|    266|  return printTag<N, array>(os, value.toInt64(), data);
  196|    266|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm3ETnRAT__KNS0_10TagDetailsEL_ZNS0_L13sonyImageSizeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    266|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    266|  static_assert(N > 0, "Passed zero length printTag");
  183|    266|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 20, False: 246]
  ------------------
  184|     20|    return os << _(td->label_);
  ------------------
  |  |   40|     20|#define _(String) (String)
  ------------------
  185|    246|  return os << "(" << value << ")";
  186|    266|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyAspectRatioEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    260|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    260|  static_assert(N > 0, "Passed zero length printTag");
  195|    260|  return printTag<N, array>(os, value.toInt64(), data);
  196|    260|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L15sonyAspectRatioEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    260|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    260|  static_assert(N > 0, "Passed zero length printTag");
  183|    260|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 14, False: 246]
  ------------------
  184|     14|    return os << _(td->label_);
  ------------------
  |  |   40|     14|#define _(String) (String)
  ------------------
  185|    246|  return os << "(" << value << ")";
  186|    260|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27sonyExposureLevelIncrementsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    260|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    260|  static_assert(N > 0, "Passed zero length printTag");
  195|    260|  return printTag<N, array>(os, value.toInt64(), data);
  196|    260|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm2ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27sonyExposureLevelIncrementsEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    260|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    260|  static_assert(N > 0, "Passed zero length printTag");
  183|    260|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 10, False: 250]
  ------------------
  184|     10|    return os << _(td->label_);
  ------------------
  |  |   40|     10|#define _(String) (String)
  ------------------
  185|    250|  return os << "(" << value << ")";
  186|    260|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sony2FpAFAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    252|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    252|  static_assert(N > 0, "Passed zero length printTag");
  195|    252|  return printTag<N, array>(os, value.toInt64(), data);
  196|    252|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm11ETnRAT__KNS0_10TagDetailsEL_ZNS0_L17sony2FpAFAreaModeEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    252|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    252|  static_assert(N > 0, "Passed zero length printTag");
  183|    252|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 190, False: 62]
  ------------------
  184|    190|    return os << _(td->label_);
  ------------------
  |  |   40|    190|#define _(String) (String)
  ------------------
  185|     62|  return os << "(" << value << ")";
  186|    252|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm33ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyExposureProgram3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|     58|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|     58|  static_assert(N > 0, "Passed zero length printTag");
  195|     58|  return printTag<N, array>(os, value.toInt64(), data);
  196|     58|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm33ETnRAT__KNS0_10TagDetailsEL_ZNS0_L20sonyExposureProgram3EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     58|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     58|  static_assert(N > 0, "Passed zero length printTag");
  183|     58|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 12, False: 46]
  ------------------
  184|     12|    return os << _(td->label_);
  ------------------
  |  |   40|     12|#define _(String) (String)
  ------------------
  185|     46|  return os << "(" << value << ")";
  186|     58|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm23ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyReleaseMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    202|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    202|  static_assert(N > 0, "Passed zero length printTag");
  195|    202|  return printTag<N, array>(os, value.toInt64(), data);
  196|    202|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm23ETnRAT__KNS0_10TagDetailsEL_ZNS0_L16sonyReleaseMode2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    202|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    202|  static_assert(N > 0, "Passed zero length printTag");
  183|    202|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 100, False: 102]
  ------------------
  184|    100|    return os << _(td->label_);
  ------------------
  |  |   40|    100|#define _(String) (String)
  ------------------
  185|    102|  return os << "(" << value << ")";
  186|    202|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyMisc3cSequenceLength1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    194|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    194|  static_assert(N > 0, "Passed zero length printTag");
  195|    194|  return printTag<N, array>(os, value.toInt64(), data);
  196|    194|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm14ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyMisc3cSequenceLength1EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    194|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    194|  static_assert(N > 0, "Passed zero length printTag");
  183|    194|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 134, False: 60]
  ------------------
  184|    134|    return os << _(td->label_);
  ------------------
  |  |   40|    134|#define _(String) (String)
  ------------------
  185|     60|  return os << "(" << value << ")";
  186|    194|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyMisc3cSequenceLength2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    184|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    184|  static_assert(N > 0, "Passed zero length printTag");
  195|    184|  return printTag<N, array>(os, value.toInt64(), data);
  196|    184|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm8ETnRAT__KNS0_10TagDetailsEL_ZNS0_L25sonyMisc3cSequenceLength2EEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    184|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    184|  static_assert(N > 0, "Passed zero length printTag");
  183|    184|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 108, False: 76]
  ------------------
  184|    108|    return os << _(td->label_);
  ------------------
  |  |   40|    108|#define _(String) (String)
  ------------------
  185|     76|  return os << "(" << value << ")";
  186|    184|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27sonyMisc3cCameraOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_RKNS_5ValueEPKNS_8ExifDataE:
  193|    184|std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
  194|    184|  static_assert(N > 0, "Passed zero length printTag");
  195|    184|  return printTag<N, array>(os, value.toInt64(), data);
  196|    184|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L27sonyMisc3cCameraOrientationEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|    184|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|    184|  static_assert(N > 0, "Passed zero length printTag");
  183|    184|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 54, False: 130]
  ------------------
  184|     54|    return os << _(td->label_);
  ------------------
  |  |   40|     54|#define _(String) (String)
  ------------------
  185|    130|  return os << "(" << value << ")";
  186|    184|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm5ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyMisc3cQuality2aEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|      3|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|      3|  static_assert(N > 0, "Passed zero length printTag");
  183|      3|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 2, False: 1]
  ------------------
  184|      2|    return os << _(td->label_);
  ------------------
  |  |   40|      2|#define _(String) (String)
  ------------------
  185|      1|  return os << "(" << value << ")";
  186|      3|}
sonymn_int.cpp:_ZN5Exiv28Internal8printTagILm4ETnRAT__KNS0_10TagDetailsEL_ZNS0_L19sonyMisc3cQuality2bEEEERNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEESB_lPKNS_8ExifDataE:
  181|     52|std::ostream& printTag(std::ostream& os, int64_t value, const ExifData*) {
  182|     52|  static_assert(N > 0, "Passed zero length printTag");
  183|     52|  if (auto td = Exiv2::find(array, value))
  ------------------
  |  Branch (183:12): [True: 27, False: 25]
  ------------------
  184|     27|    return os << _(td->label_);
  ------------------
  |  |   40|     27|#define _(String) (String)
  ------------------
  185|     25|  return os << "(" << value << ")";
  186|     52|}

_ZN5Exiv28TgaImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   22|      2|    Image(ImageType::tga, mdNone, std::move(io), params) {
   23|      2|}
_ZN5Exiv214newTgaInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
   96|      2|Image::UniquePtr newTgaInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
   97|      2|  auto image = std::make_unique<TgaImage>(std::move(io), params);
   98|      2|  if (!image->good()) {
  ------------------
  |  Branch (98:7): [True: 2, False: 0]
  ------------------
   99|      2|    return nullptr;
  100|      2|  }
  101|      0|  return image;
  102|      2|}
_ZN5Exiv29isTgaTypeERNS_7BasicIoEb:
  104|  10.1k|bool isTgaType(BasicIo& iIo, bool /*advance*/) {
  105|       |  // not all TARGA files have a signature string, so first just try to match the file name extension
  106|  10.1k|  const std::string& path = iIo.path();
  107|  10.1k|  if (path.ends_with(".tga") || path.ends_with(".TGA")) {
  ------------------
  |  Branch (107:7): [True: 0, False: 10.1k]
  |  Branch (107:33): [True: 0, False: 10.1k]
  ------------------
  108|      0|    return true;
  109|      0|  }
  110|  10.1k|  byte buf[26];
  111|  10.1k|  const size_t curPos = iIo.tell();
  112|  10.1k|  if (curPos < 26)
  ------------------
  |  Branch (112:7): [True: 10.0k, False: 93]
  ------------------
  113|  10.0k|    return false;
  114|       |
  115|     93|  iIo.seek(-26, BasicIo::end);
  116|     93|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (116:7): [True: 0, False: 93]
  |  Branch (116:22): [True: 0, False: 93]
  ------------------
  117|      0|    return false;
  118|      0|  }
  119|     93|  iIo.read(buf, sizeof(buf));
  120|     93|  if (iIo.error()) {
  ------------------
  |  Branch (120:7): [True: 0, False: 93]
  ------------------
  121|      0|    return false;
  122|      0|  }
  123|       |  // some TARGA files, but not all, have a signature string at the end
  124|     93|  bool matched = (memcmp(buf + 8, "TRUEVISION-XFILE", 16) == 0);
  125|     93|  iIo.seek(curPos, BasicIo::beg);
  126|     93|  return matched;
  127|     93|}

_ZNK5Exiv28Internal15TiffMappingInfoeqERKNS1_3KeyE:
   41|   116M|bool TiffMappingInfo::operator==(const TiffMappingInfo::Key& key) const {
   42|   116M|  return (make_ == "*" || key.m_.starts_with(make_)) && (Tag::all == extendedTag_ || key.e_ == extendedTag_) &&
  ------------------
  |  Branch (42:11): [True: 116M, False: 0]
  |  Branch (42:27): [True: 0, False: 0]
  |  Branch (42:58): [True: 23.3M, False: 93.5M]
  |  Branch (42:86): [True: 20.3k, False: 93.5M]
  ------------------
   43|  23.4M|         key.g_ == group_;
  ------------------
  |  Branch (43:10): [True: 5.40k, False: 23.4M]
  ------------------
   44|   116M|}
_ZN5Exiv28Internal9IoWrapperC2ERNS_7BasicIoEPKhmPNS0_12OffsetWriterE:
   47|  12.2k|    io_(io), pHeader_(pHeader), size_(size), pow_(pow) {
   48|  12.2k|  if (!pHeader_ || size_ == 0)
  ------------------
  |  Branch (48:7): [True: 4.65k, False: 7.60k]
  |  Branch (48:20): [True: 0, False: 7.60k]
  ------------------
   49|  4.65k|    wroteHeader_ = true;
   50|  12.2k|}
_ZN5Exiv28Internal9IoWrapper5writeEPKhm:
   52|  3.41M|size_t IoWrapper::write(const byte* pData, size_t wcount) {
   53|  3.41M|  if (!wroteHeader_ && wcount > 0) {
  ------------------
  |  Branch (53:7): [True: 7.57k, False: 3.40M]
  |  Branch (53:24): [True: 7.57k, False: 0]
  ------------------
   54|  7.57k|    io_.write(pHeader_, size_);
   55|  7.57k|    wroteHeader_ = true;
   56|  7.57k|  }
   57|  3.41M|  return io_.write(pData, wcount);
   58|  3.41M|}
_ZN5Exiv28Internal9IoWrapper4putbEh:
   60|  20.0k|int IoWrapper::putb(byte data) {
   61|  20.0k|  if (!wroteHeader_) {
  ------------------
  |  Branch (61:7): [True: 0, False: 20.0k]
  ------------------
   62|      0|    io_.write(pHeader_, size_);
   63|      0|    wroteHeader_ = true;
   64|      0|  }
   65|  20.0k|  return io_.putb(data);
   66|  20.0k|}
_ZN5Exiv28Internal13TiffDirectoryC2EtNS_5IfdIdEb:
   76|   140k|TiffDirectory::TiffDirectory(uint16_t tag, IfdId group, bool hasNext) : TiffComponent(tag, group), hasNext_(hasNext) {
   77|   140k|}
_ZN5Exiv28Internal10TiffSubIfdC2EtNS_5IfdIdES2_:
   80|  43.4k|    TiffEntryBase(tag, group, ttUnsignedLong), newGroup_(newGroup) {
   81|  43.4k|}
_ZN5Exiv28Internal16TiffIfdMakernoteC2EtNS_5IfdIdES2_NSt3__110unique_ptrINS0_8MnHeaderENS3_14default_deleteIS5_EEEEb:
   85|  35.5k|    TiffComponent(tag, group), pHeader_(std::move(pHeader)), ifd_(tag, mnGroup, hasNext) {
   86|  35.5k|}
_ZN5Exiv28Internal16TiffIfdMakernoteD2Ev:
   88|  35.5k|TiffIfdMakernote::~TiffIfdMakernote() = default;
_ZN5Exiv28Internal15TiffBinaryArrayC2EtNS_5IfdIdERKNS0_8ArrayCfgEPKNS0_8ArrayDefEm:
   92|  56.1k|    TiffEntryBase(tag, group, arrayCfg.elTiffType_), arrayCfg_(&arrayCfg), arrayDef_(arrayDef), defSize_(defSize) {
   93|  56.1k|}
_ZN5Exiv28Internal15TiffBinaryArrayC2EtNS_5IfdIdEPKNS0_8ArraySetEmPFitPKhmPNS0_13TiffComponentEE:
   97|  3.90k|    TiffEntryBase(tag, group),  // Todo: Does it make a difference that there is no type?
   98|  3.90k|    cfgSelFct_(cfgSelFct),
   99|  3.90k|    arraySet_(arraySet),
  100|  3.90k|    setSize_(setSize) {
  101|       |  // We'll figure out the correct cfg later
  102|  3.90k|}
_ZN5Exiv28Internal13TiffEntryBaseC2EtNS_5IfdIdENS0_8TiffTypeE:
  118|  26.4M|    TiffComponent(tag, group), tiffType_(tiffType) {
  119|  26.4M|}
_ZN5Exiv28Internal13TiffEntryBaseD2Ev:
  121|  26.4M|TiffEntryBase::~TiffEntryBase() = default;
_ZN5Exiv28Internal17TiffDataEntryBaseC2EtNS_5IfdIdEtS2_:
  142|  53.3k|    TiffEntryBase(tag, group), szTag_(szTag), szGroup_(szGroup) {
  143|  53.3k|}
_ZN5Exiv28Internal13TiffSizeEntryC2EtNS_5IfdIdEtS2_:
  148|  68.4k|    TiffEntryBase(tag, group), dtTag_(dtTag), dtGroup_(dtGroup) {
  149|  68.4k|}
_ZN5Exiv28Internal11TiffMnEntryC2EtNS_5IfdIdES2_:
  152|  48.5k|    TiffEntryBase(tag, group, ttUndefined), mnGroup_(mnGroup) {
  153|  48.5k|}
_ZN5Exiv28Internal11TiffMnEntryD2Ev:
  155|  48.5k|TiffMnEntry::~TiffMnEntry() = default;
_ZNK5Exiv28Internal13TiffEntryBase3idxEv:
  205|  29.0M|int TiffEntryBase::idx() const {
  206|  29.0M|  return idx_;
  207|  29.0M|}
_ZN5Exiv28Internal13TiffEntryBase7setDataENSt3__110shared_ptrINS_7DataBufEEE:
  209|   128k|void TiffEntryBase::setData(std::shared_ptr<DataBuf> buf) {
  210|   128k|  storage_ = std::move(buf);
  211|   128k|  pData_ = storage_->data();
  212|   128k|  size_ = storage_->size();
  213|   128k|}
_ZN5Exiv28Internal13TiffEntryBase7setDataEPhmNSt3__110shared_ptrINS_7DataBufEEE:
  215|  21.1M|void TiffEntryBase::setData(byte* pData, size_t size, std::shared_ptr<DataBuf> storage) {
  216|  21.1M|  pData_ = pData;
  217|  21.1M|  size_ = size;
  218|  21.1M|  storage_ = std::move(storage);
  219|  21.1M|  if (!pData_)
  ------------------
  |  Branch (219:7): [True: 0, False: 21.1M]
  ------------------
  220|      0|    size_ = 0;
  221|  21.1M|}
_ZN5Exiv28Internal13TiffEntryBase11updateValueENSt3__110unique_ptrINS_5ValueENS2_14default_deleteIS4_EEEENS_9ByteOrderE:
  223|  2.24M|void TiffEntryBase::updateValue(Value::UniquePtr value, ByteOrder byteOrder) {
  224|  2.24M|  if (!value)
  ------------------
  |  Branch (224:7): [True: 0, False: 2.24M]
  ------------------
  225|      0|    return;
  226|  2.24M|  if (size_t newSize = value->size(); newSize > size_) {
  ------------------
  |  Branch (226:39): [True: 128k, False: 2.11M]
  ------------------
  227|   128k|    auto d = std::make_shared<DataBuf>(newSize);
  228|   128k|    setData(std::move(d));
  229|   128k|  }
  230|  2.24M|  if (pData_) {
  ------------------
  |  Branch (230:7): [True: 132k, False: 2.11M]
  ------------------
  231|   132k|    memset(pData_, 0x0, size_);
  232|   132k|  }
  233|  2.24M|  size_ = value->copy(pData_, byteOrder);
  234|  2.24M|  setValue(std::move(value));
  235|  2.24M|}
_ZN5Exiv28Internal13TiffEntryBase8setValueENSt3__110unique_ptrINS_5ValueENS2_14default_deleteIS4_EEEE:
  237|  23.4M|void TiffEntryBase::setValue(Value::UniquePtr value) {
  238|  23.4M|  if (!value)
  ------------------
  |  Branch (238:7): [True: 0, False: 23.4M]
  ------------------
  239|      0|    return;
  240|  23.4M|  tiffType_ = toTiffType(value->typeId());
  241|  23.4M|  count_ = value->count();
  242|  23.4M|  pValue_ = std::move(value);
  243|  23.4M|}
_ZN5Exiv28Internal13TiffDataEntry9setStripsEPKNS_5ValueEPKhmm:
  245|  7.52k|void TiffDataEntry::setStrips(const Value* pSize, const byte* pData, size_t sizeData, size_t baseOffset) {
  246|  7.52k|  if (!pValue() || !pSize) {
  ------------------
  |  Branch (246:7): [True: 299, False: 7.22k]
  |  Branch (246:20): [True: 445, False: 6.78k]
  ------------------
  247|    744|#ifndef SUPPRESS_WARNINGS
  248|    744|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|    744|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 744]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    744|  LogMsg(LogMsg::warn).os()
  ------------------
  249|      0|                << tag() << ": Size or data offset value not set, ignoring them.\n";
  250|    744|#endif
  251|    744|    return;
  252|    744|  }
  253|  6.78k|  if (pValue()->count() == 0) {
  ------------------
  |  Branch (253:7): [True: 1.12k, False: 5.65k]
  ------------------
  254|  1.12k|#ifndef SUPPRESS_WARNINGS
  255|  1.12k|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|  1.12k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1.12k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  1.12k|  LogMsg(LogMsg::warn).os()
  ------------------
  256|      0|                << tag() << ": Data offset entry value is empty, ignoring it.\n";
  257|  1.12k|#endif
  258|  1.12k|    return;
  259|  1.12k|  }
  260|  5.65k|  if (pValue()->count() != pSize->count()) {
  ------------------
  |  Branch (260:7): [True: 1.81k, False: 3.83k]
  ------------------
  261|  1.81k|#ifndef SUPPRESS_WARNINGS
  262|  1.81k|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|  1.81k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1.81k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  1.81k|  LogMsg(LogMsg::warn).os()
  ------------------
  263|      0|                << tag() << ": Size and data offset entries have different"
  264|      0|                << " number of components, ignoring them.\n";
  265|  1.81k|#endif
  266|  1.81k|    return;
  267|  1.81k|  }
  268|  3.83k|  size_t size = 0;
  269|  8.15k|  for (size_t i = 0; i < pSize->count(); ++i) {
  ------------------
  |  Branch (269:22): [True: 4.31k, False: 3.83k]
  ------------------
  270|  4.31k|    size = Safe::add<size_t>(size, pSize->toUint32(i));
  271|  4.31k|  }
  272|  3.83k|  const size_t offset = pValue()->toUint32(0);
  273|  3.83k|  if (size > sizeData || offset > sizeData - size || baseOffset > sizeData - size - offset) {
  ------------------
  |  Branch (273:7): [True: 108, False: 3.73k]
  |  Branch (273:26): [True: 133, False: 3.59k]
  |  Branch (273:54): [True: 51, False: 3.54k]
  ------------------
  274|    292|#ifndef SUPPRESS_WARNINGS
  275|    292|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|    292|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 292]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    292|  LogMsg(LogMsg::warn).os()
  ------------------
  276|      0|                << tag() << ": Data area exceeds data buffer, ignoring it.\n";
  277|    292|#endif
  278|    292|    return;
  279|    292|  }
  280|       |  // Todo: Remove limitation of JPEG writer: strips must be contiguous
  281|       |  // Until then we check: last offset + last size - first offset == size?
  282|  3.54k|  if (pValue()->toUint32(pValue()->count() - 1) + pSize->toUint32(pSize->count() - 1) != size + offset) {
  ------------------
  |  Branch (282:7): [True: 53, False: 3.49k]
  ------------------
  283|     53|#ifndef SUPPRESS_WARNINGS
  284|     53|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|     53|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 53]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     53|  LogMsg(LogMsg::warn).os()
  ------------------
  285|      0|                << tag() << ": Data area is not contiguous, ignoring it.\n";
  286|     53|#endif
  287|     53|    return;
  288|     53|  }
  289|  3.49k|  pDataArea_ = const_cast<byte*>(pData) + baseOffset + offset;
  290|  3.49k|  sizeDataArea_ = size;
  291|  3.49k|  const_cast<Value*>(pValue())->setDataArea(pDataArea_, sizeDataArea_);
  292|  3.49k|}  // TiffDataEntry::setStrips
_ZN5Exiv28Internal14TiffImageEntry9setStripsEPKNS_5ValueEPKhmm:
  294|  25.5k|void TiffImageEntry::setStrips(const Value* pSize, const byte* pData, size_t sizeData, size_t baseOffset) {
  295|  25.5k|  if (!pValue() || !pSize) {
  ------------------
  |  Branch (295:7): [True: 1.65k, False: 23.9k]
  |  Branch (295:20): [True: 2.09k, False: 21.8k]
  ------------------
  296|  3.74k|#ifndef SUPPRESS_WARNINGS
  297|  3.74k|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|  3.74k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 3.74k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  3.74k|  LogMsg(LogMsg::warn).os()
  ------------------
  298|      0|                << tag() << ": Size or data offset value not set, ignoring them.\n";
  299|  3.74k|#endif
  300|  3.74k|    return;
  301|  3.74k|  }
  302|  21.8k|  if (pValue()->count() != pSize->count()) {
  ------------------
  |  Branch (302:7): [True: 4.42k, False: 17.4k]
  ------------------
  303|  4.42k|#ifndef SUPPRESS_WARNINGS
  304|  4.42k|    EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|  4.42k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 4.42k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  4.42k|  LogMsg(LogMsg::warn).os()
  ------------------
  305|      0|                << tag() << ": Size and data offset entries have different"
  306|      0|                << " number of components, ignoring them.\n";
  307|  4.42k|#endif
  308|  4.42k|    return;
  309|  4.42k|  }
  310|  39.9k|  for (size_t i = 0; i < pValue()->count(); ++i) {
  ------------------
  |  Branch (310:22): [True: 22.5k, False: 17.4k]
  ------------------
  311|  22.5k|    const size_t offset = pValue()->toUint32(i);
  312|  22.5k|    const size_t size = pSize->toUint32(i);
  313|       |
  314|  22.5k|    if (size > sizeData || offset > sizeData - size || baseOffset > sizeData - size - offset) {
  ------------------
  |  Branch (314:9): [True: 3.45k, False: 19.1k]
  |  Branch (314:28): [True: 3.38k, False: 15.7k]
  |  Branch (314:56): [True: 19, False: 15.7k]
  ------------------
  315|  6.85k|#ifndef SUPPRESS_WARNINGS
  316|  6.85k|      EXV_WARNING << "Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|  6.85k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 6.85k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  6.85k|  LogMsg(LogMsg::warn).os()
  ------------------
  317|      0|                  << tag() << ": Strip " << std::dec << i << " is outside of the data area; ignored.\n";
  318|  6.85k|#endif
  319|  15.7k|    } else if (size != 0) {
  ------------------
  |  Branch (319:16): [True: 10.9k, False: 4.78k]
  ------------------
  320|  10.9k|      const byte* pStrip = pData + baseOffset + offset;
  321|  10.9k|      strips_.emplace_back(pStrip, size);
  322|  10.9k|    }
  323|  22.5k|  }
  324|  17.4k|}  // TiffImageEntry::setStrips
_ZNK5Exiv28Internal16TiffIfdMakernote9ifdOffsetEv:
  326|  28.7k|size_t TiffIfdMakernote::ifdOffset() const {
  327|  28.7k|  if (!pHeader_)
  ------------------
  |  Branch (327:7): [True: 13.7k, False: 15.0k]
  ------------------
  328|  13.7k|    return 0;
  329|  15.0k|  return pHeader_->ifdOffset();
  330|  28.7k|}
_ZNK5Exiv28Internal16TiffIfdMakernote9byteOrderEv:
  332|  69.0k|ByteOrder TiffIfdMakernote::byteOrder() const {
  333|  69.0k|  if (!pHeader_ || pHeader_->byteOrder() == invalidByteOrder) {
  ------------------
  |  Branch (333:7): [True: 28.4k, False: 40.5k]
  |  Branch (333:20): [True: 31.4k, False: 9.07k]
  ------------------
  334|  59.9k|    return imageByteOrder_;
  335|  59.9k|  }
  336|  9.07k|  return pHeader_->byteOrder();
  337|  69.0k|}
_ZNK5Exiv28Internal16TiffIfdMakernote8mnOffsetEv:
  339|  28.4k|size_t TiffIfdMakernote::mnOffset() const {
  340|  28.4k|  return mnOffset_;
  341|  28.4k|}
_ZNK5Exiv28Internal16TiffIfdMakernote10baseOffsetEv:
  343|  34.6k|size_t TiffIfdMakernote::baseOffset() const {
  344|  34.6k|  if (!pHeader_)
  ------------------
  |  Branch (344:7): [True: 14.2k, False: 20.3k]
  ------------------
  345|  14.2k|    return 0;
  346|  20.3k|  return pHeader_->baseOffset(mnOffset_);
  347|  34.6k|}
_ZN5Exiv28Internal16TiffIfdMakernote10readHeaderEPKhmNS_9ByteOrderE:
  349|  29.6k|bool TiffIfdMakernote::readHeader(const byte* pData, size_t size, ByteOrder byteOrder) {
  350|  29.6k|  if (!pHeader_)
  ------------------
  |  Branch (350:7): [True: 13.7k, False: 15.9k]
  ------------------
  351|  13.7k|    return true;
  352|  15.9k|  return pHeader_->read(pData, size, byteOrder);
  353|  29.6k|}
_ZN5Exiv28Internal16TiffIfdMakernote12setByteOrderENS_9ByteOrderE:
  355|  4.48k|void TiffIfdMakernote::setByteOrder(ByteOrder byteOrder) {
  356|  4.48k|  if (pHeader_)
  ------------------
  |  Branch (356:7): [True: 3.99k, False: 484]
  ------------------
  357|  3.99k|    pHeader_->setByteOrder(byteOrder);
  358|  4.48k|}
_ZNK5Exiv28Internal16TiffIfdMakernote10sizeHeaderEv:
  360|  47.1k|size_t TiffIfdMakernote::sizeHeader() const {
  361|  47.1k|  if (!pHeader_)
  ------------------
  |  Branch (361:7): [True: 4.38k, False: 42.7k]
  ------------------
  362|  4.38k|    return 0;
  363|  42.7k|  return pHeader_->size();
  364|  47.1k|}
_ZNK5Exiv28Internal16TiffIfdMakernote11writeHeaderERNS0_9IoWrapperENS_9ByteOrderE:
  366|  5.84k|size_t TiffIfdMakernote::writeHeader(IoWrapper& ioWrapper, ByteOrder byteOrder) const {
  367|  5.84k|  if (!pHeader_)
  ------------------
  |  Branch (367:7): [True: 480, False: 5.36k]
  ------------------
  368|    480|    return 0;
  369|  5.36k|  return pHeader_->write(ioWrapper, byteOrder);
  370|  5.84k|}
_ZNK5Exiv28Internal8ArrayDef4sizeEtNS_5IfdIdE:
  372|  38.1M|size_t ArrayDef::size(uint16_t tag, IfdId group) const {
  373|  38.1M|  TypeId typeId = toTypeId(tiffType_, tag, group);
  374|  38.1M|  return count_ * TypeInfo::typeSize(typeId);
  375|  38.1M|}
_ZN5Exiv28Internal15TiffBinaryArray10initializeENS_5IfdIdE:
  377|   869k|bool TiffBinaryArray::initialize(IfdId group) {
  378|   869k|  if (arrayCfg_)
  ------------------
  |  Branch (378:7): [True: 869k, False: 23]
  ------------------
  379|   869k|    return true;  // Not a complex array or already initialized
  380|       |
  381|     78|  for (size_t idx = 0; idx < setSize_; ++idx) {
  ------------------
  |  Branch (381:24): [True: 78, False: 0]
  ------------------
  382|     78|    if (arraySet_[idx].cfg_.group_ == group) {
  ------------------
  |  Branch (382:9): [True: 23, False: 55]
  ------------------
  383|     23|      arrayCfg_ = &arraySet_[idx].cfg_;
  384|     23|      arrayDef_ = arraySet_[idx].def_;
  385|     23|      defSize_ = arraySet_[idx].defSize_;
  386|     23|      return true;
  387|     23|    }
  388|     78|  }
  389|      0|  return false;
  390|     23|}
_ZN5Exiv28Internal15TiffBinaryArray10initializeEPNS0_13TiffComponentE:
  392|  11.6k|bool TiffBinaryArray::initialize(TiffComponent* pRoot) {
  393|  11.6k|  if (!cfgSelFct_)
  ------------------
  |  Branch (393:7): [True: 9.69k, False: 1.94k]
  ------------------
  394|  9.69k|    return true;  // Not a complex array
  395|       |
  396|  1.94k|  int idx = cfgSelFct_(tag(), pData(), TiffEntryBase::doSize(), pRoot);
  397|  1.94k|  if (idx > -1) {
  ------------------
  |  Branch (397:7): [True: 1.54k, False: 393]
  ------------------
  398|  1.54k|    arrayCfg_ = &arraySet_[idx].cfg_;
  399|  1.54k|    arrayDef_ = arraySet_[idx].def_;
  400|  1.54k|    defSize_ = arraySet_[idx].defSize_;
  401|  1.54k|  }
  402|  1.94k|  return idx > -1;
  403|  11.6k|}
_ZN5Exiv28Internal15TiffBinaryArray14iniOrigDataBufEv:
  405|  44.6k|void TiffBinaryArray::iniOrigDataBuf() {
  406|  44.6k|  origData_ = const_cast<byte*>(pData());
  407|  44.6k|  origSize_ = TiffEntryBase::doSize();
  408|  44.6k|}
_ZN5Exiv28Internal15TiffBinaryArray10addElementEmRKNS0_8ArrayDefE:
  419|  18.5M|size_t TiffBinaryArray::addElement(size_t idx, const ArrayDef& def) {
  420|  18.5M|  auto tag = static_cast<uint16_t>(idx / cfg()->tagStep());
  421|  18.5M|  auto sz = std::min<size_t>(def.size(tag, cfg()->group_), TiffEntryBase::doSize() - idx);
  422|  18.5M|  auto tc = TiffCreator::create(tag, cfg()->group_);
  423|  18.5M|  auto tp = dynamic_cast<TiffBinaryElement*>(tc.get());
  424|  18.5M|  if (!tp)
  ------------------
  |  Branch (424:7): [True: 0, False: 18.5M]
  ------------------
  425|      0|    return 0;
  426|       |  // The assertion typically fails if a component is not configured in
  427|       |  // the TIFF structure table (TiffCreator::tiffTreeStruct_)
  428|  18.5M|  tp->setStart(pData() + idx);
  429|  18.5M|  auto s = storage();
  430|  18.5M|  tp->setData(const_cast<byte*>(pData() + idx), sz, std::move(s));
  431|  18.5M|  tp->setElDef(def);
  432|  18.5M|  tp->setElByteOrder(cfg()->byteOrder_);
  433|  18.5M|  addChild(std::move(tc));
  434|  18.5M|  return sz;
  435|  18.5M|}  // TiffBinaryArray::addElement
_ZN5Exiv28Internal13TiffComponent7addPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPS1_NS2_10unique_ptrIS1_NS2_14default_deleteIS1_EEEE:
  438|  13.8M|                                      TiffComponent::UniquePtr object) {
  439|  13.8M|  return doAddPath(tag, tiffPath, pRoot, std::move(object));
  440|  13.8M|}  // TiffComponent::addPath
_ZN5Exiv28Internal13TiffComponent9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPS1_NS2_10unique_ptrIS1_NS2_14default_deleteIS1_EEEE:
  443|  2.24M|                                        TiffComponent::UniquePtr /*object*/) {
  444|  2.24M|  return this;
  445|  2.24M|}  // TiffComponent::doAddPath
_ZN5Exiv28Internal13TiffDirectory9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEE:
  448|  5.65M|                                        TiffComponent::UniquePtr object) {
  449|  5.65M|  tiffPath.pop();
  450|  5.65M|  const TiffPathItem tpi = tiffPath.top();
  451|       |
  452|  5.65M|  TiffComponent* tc = nullptr;
  453|       |  // Try to use an existing component if there is still at least one
  454|       |  // composite tag on the stack or the tag to add is the MakerNote tag.
  455|       |  // This is used to prevent duplicate entries. Sub-IFDs also, but the > 1
  456|       |  // condition takes care of them, see below.
  457|  5.65M|  if (tiffPath.size() > 1 || (tpi.extendedTag() == 0x927c && tpi.group() == IfdId::exifId)) {
  ------------------
  |  Branch (457:7): [True: 4.25M, False: 1.40M]
  |  Branch (457:31): [True: 532, False: 1.40M]
  |  Branch (457:62): [True: 378, False: 154]
  ------------------
  458|  4.25M|    if (tpi.extendedTag() == Tag::next) {
  ------------------
  |  Branch (458:9): [True: 5.63k, False: 4.24M]
  ------------------
  459|  5.63k|      tc = pNext_.get();
  460|  4.24M|    } else {
  461|  36.8M|      for (auto&& component : components_) {
  ------------------
  |  Branch (461:29): [True: 36.8M, False: 16.3k]
  ------------------
  462|  36.8M|        if (component->tag() == tpi.tag() && component->group() == tpi.group()) {
  ------------------
  |  Branch (462:13): [True: 4.28M, False: 32.5M]
  |  Branch (462:46): [True: 4.22M, False: 60.7k]
  ------------------
  463|  4.22M|          tc = component.get();
  464|  4.22M|          break;
  465|  4.22M|        }
  466|  36.8M|      }
  467|  4.24M|    }
  468|  4.25M|  }
  469|       |
  470|  5.65M|  if (tc)
  ------------------
  |  Branch (470:7): [True: 4.23M, False: 1.42M]
  ------------------
  471|  4.23M|    return tc->addPath(tag, tiffPath, pRoot, std::move(object));
  472|       |
  473|  1.42M|  auto atc = [&] {
  474|  1.42M|    if (tiffPath.size() == 1 && object) {
  475|  1.42M|      return std::move(object);
  476|  1.42M|    }
  477|  1.42M|    return TiffCreator::create(tpi.extendedTag(), tpi.group());
  478|  1.42M|  }();
  479|       |
  480|       |  // Prevent dangling sub-IFD tags: Do not add a sub-IFD component without children.
  481|       |  // Todo: How to check before creating the component?
  482|  1.42M|  if (tiffPath.size() == 1 && dynamic_cast<const TiffSubIfd*>(atc.get()))
  ------------------
  |  Branch (482:7): [True: 1.40M, False: 16.5k]
  |  Branch (482:31): [True: 14.0k, False: 1.39M]
  ------------------
  483|  14.0k|    return nullptr;
  484|       |
  485|  1.40M|  tc = [&] {
  486|  1.40M|    if (tpi.extendedTag() == Tag::next)
  487|  1.40M|      return this->addNext(std::move(atc));
  488|  1.40M|    return this->addChild(std::move(atc));
  489|  1.40M|  }();
  490|  1.40M|  return tc->addPath(tag, tiffPath, pRoot, nullptr);
  491|  1.42M|}  // TiffDirectory::doAddPath
_ZN5Exiv28Internal10TiffSubIfd9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEE:
  494|  1.70M|                                     TiffComponent::UniquePtr object) {
  495|  1.70M|  const TiffPathItem tpi1 = tiffPath.top();
  496|  1.70M|  tiffPath.pop();
  497|  1.70M|  if (tiffPath.empty()) {
  ------------------
  |  Branch (497:7): [True: 0, False: 1.70M]
  ------------------
  498|       |    // If the last element in the path is the sub-IFD tag itself we're done.
  499|       |    // But that shouldn't happen - see TiffDirectory::doAddPath
  500|      0|    return this;
  501|      0|  }
  502|  1.70M|  const TiffPathItem tpi2 = tiffPath.top();
  503|  1.70M|  tiffPath.push(tpi1);
  504|  1.70M|  for (const auto& ifd : ifds_)
  ------------------
  |  Branch (504:24): [True: 1.69M, False: 7.49k]
  ------------------
  505|  1.69M|    if (ifd->group() == tpi2.group())
  ------------------
  |  Branch (505:9): [True: 1.69M, False: 0]
  ------------------
  506|  1.69M|      return ifd->addPath(tag, tiffPath, pRoot, std::move(object));
  507|       |
  508|  7.49k|  auto tc = [&] {
  509|  7.49k|    if (tiffPath.size() == 1 && object) {
  510|  7.49k|      return addChild(std::move(object));
  511|  7.49k|    }
  512|  7.49k|    return addChild(std::make_unique<TiffDirectory>(tpi1.tag(), tpi2.group()));
  513|  7.49k|  }();
  514|  7.49k|  setCount(ifds_.size());
  515|  7.49k|  return tc->addPath(tag, tiffPath, pRoot, nullptr);
  516|  1.70M|}  // TiffSubIfd::doAddPath
_ZN5Exiv28Internal11TiffMnEntry9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEE:
  519|  1.68M|                                      TiffComponent::UniquePtr object) {
  520|  1.68M|  const TiffPathItem tpi1 = tiffPath.top();
  521|  1.68M|  tiffPath.pop();
  522|  1.68M|  if (tiffPath.empty()) {
  ------------------
  |  Branch (522:7): [True: 7.27k, False: 1.67M]
  ------------------
  523|       |    // If the last element in the path is the makernote tag itself we're done
  524|  7.27k|    return this;
  525|  7.27k|  }
  526|  1.67M|  const TiffPathItem tpi2 = tiffPath.top();
  527|  1.67M|  tiffPath.push(tpi1);
  528|  1.67M|  if (!mn_) {
  ------------------
  |  Branch (528:7): [True: 5.88k, False: 1.66M]
  ------------------
  529|  5.88k|    mnGroup_ = tpi2.group();
  530|  5.88k|    mn_ = TiffMnCreator::create(tpi1.tag(), tpi1.group(), mnGroup_);
  531|  5.88k|  }
  532|  1.67M|  return mn_->addPath(tag, tiffPath, pRoot, std::move(object));
  533|  1.68M|}  // TiffMnEntry::doAddPath
_ZN5Exiv28Internal16TiffIfdMakernote9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEE:
  536|  1.67M|                                           TiffComponent::UniquePtr object) {
  537|  1.67M|  return ifd_.addPath(tag, tiffPath, pRoot, std::move(object));
  538|  1.67M|}
_ZN5Exiv28Internal15TiffBinaryArray9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEE:
  541|   880k|                                          TiffComponent::UniquePtr object) {
  542|   880k|  pRoot_ = pRoot;
  543|   880k|  if (tiffPath.size() == 1) {
  ------------------
  |  Branch (543:7): [True: 10.9k, False: 869k]
  ------------------
  544|       |    // An unknown complex binary array has no children and acts like a standard TIFF entry
  545|  10.9k|    return this;
  546|  10.9k|  }
  547|   869k|  tiffPath.pop();
  548|   869k|  const TiffPathItem tpi = tiffPath.top();
  549|       |  // Initialize the binary array (if it is a complex array)
  550|   869k|  initialize(tpi.group());
  551|       |  // Todo: Duplicates are not allowed!
  552|       |  // To allow duplicate entries, we only check if the new component already
  553|       |  // exists if there is still at least one composite tag on the stack
  554|   869k|  if (tiffPath.size() > 1) {
  ------------------
  |  Branch (554:7): [True: 0, False: 869k]
  ------------------
  555|      0|    for (const auto& element : elements_)
  ------------------
  |  Branch (555:30): [True: 0, False: 0]
  ------------------
  556|      0|      if (element->tag() == tpi.tag() && element->group() == tpi.group())
  ------------------
  |  Branch (556:11): [True: 0, False: 0]
  |  Branch (556:42): [True: 0, False: 0]
  ------------------
  557|      0|        return element->addPath(tag, tiffPath, pRoot, std::move(object));
  558|      0|  }
  559|       |
  560|   869k|  if (tiffPath.size() == 1 && object) {
  ------------------
  |  Branch (560:7): [True: 869k, False: 0]
  |  Branch (560:31): [True: 0, False: 869k]
  ------------------
  561|      0|    auto tc = addChild(std::move(object));
  562|      0|    setCount(elements_.size());
  563|      0|    return tc->addPath(tag, tiffPath, pRoot, nullptr);
  564|      0|  }
  565|       |
  566|   869k|  auto tc = addChild(TiffCreator::create(tpi.extendedTag(), tpi.group()));
  567|   869k|  setCount(elements_.size());
  568|   869k|  return tc->addPath(tag, tiffPath, pRoot, std::move(object));
  569|   869k|}  // TiffBinaryArray::doAddPath
_ZN5Exiv28Internal13TiffComponent8addChildENSt3__110shared_ptrIS1_EE:
  571|  26.4M|TiffComponent* TiffComponent::addChild(TiffComponent::SharedPtr tiffComponent) {
  572|  26.4M|  return doAddChild(std::move(tiffComponent));
  573|  26.4M|}  // TiffComponent::addChild
_ZN5Exiv28Internal13TiffDirectory10doAddChildENSt3__110shared_ptrINS0_13TiffComponentEEE:
  579|  7.00M|TiffComponent* TiffDirectory::doAddChild(TiffComponent::SharedPtr tiffComponent) {
  580|  7.00M|  return components_.emplace_back(std::move(tiffComponent)).get();
  581|  7.00M|}  // TiffDirectory::doAddChild
_ZN5Exiv28Internal10TiffSubIfd10doAddChildENSt3__110shared_ptrINS0_13TiffComponentEEE:
  583|  51.6k|TiffComponent* TiffSubIfd::doAddChild(TiffComponent::SharedPtr tiffComponent) {
  584|  51.6k|  auto d = std::dynamic_pointer_cast<TiffDirectory>(std::move(tiffComponent));
  585|  51.6k|  if (!d)
  ------------------
  |  Branch (585:7): [True: 0, False: 51.6k]
  ------------------
  586|      0|    throw Error(ErrorCode::kerErrorMessage, "dynamic_pointer_cast to TiffDirectory failed");
  587|       |
  588|  51.6k|  return ifds_.emplace_back(std::move(d)).get();
  589|  51.6k|}  // TiffSubIfd::doAddChild
_ZN5Exiv28Internal15TiffBinaryArray10doAddChildENSt3__110shared_ptrINS0_13TiffComponentEEE:
  602|  19.4M|TiffComponent* TiffBinaryArray::doAddChild(TiffComponent::SharedPtr tiffComponent) {
  603|  19.4M|  setDecoded(true);
  604|  19.4M|  return elements_.emplace_back(std::move(tiffComponent)).get();
  605|  19.4M|}  // TiffBinaryArray::doAddChild
_ZN5Exiv28Internal13TiffComponent7addNextENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE:
  607|  2.02k|TiffComponent* TiffComponent::addNext(TiffComponent::UniquePtr tiffComponent) {
  608|  2.02k|  return doAddNext(std::move(tiffComponent));
  609|  2.02k|}  // TiffComponent::addNext
_ZN5Exiv28Internal13TiffDirectory9doAddNextENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEE:
  615|  2.02k|TiffComponent* TiffDirectory::doAddNext(TiffComponent::UniquePtr tiffComponent) {
  616|  2.02k|  if (hasNext_) {
  ------------------
  |  Branch (616:7): [True: 2.02k, False: 0]
  ------------------
  617|  2.02k|    pNext_ = std::move(tiffComponent);
  618|  2.02k|    return pNext_.get();
  619|  2.02k|  }
  620|      0|  return nullptr;
  621|  2.02k|}  // TiffDirectory::doAddNext
_ZN5Exiv28Internal13TiffComponent6acceptERNS0_11TiffVisitorE:
  634|   143M|void TiffComponent::accept(TiffVisitor& visitor) {
  635|   143M|  if (visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (635:7): [True: 143M, False: 7.63k]
  ------------------
  636|   143M|    doAccept(visitor);  // one for NVI :)
  637|   143M|}  // TiffComponent::accept
_ZN5Exiv28Internal9TiffEntry8doAcceptERNS0_11TiffVisitorE:
  639|  37.5M|void TiffEntry::doAccept(TiffVisitor& visitor) {
  640|  37.5M|  visitor.visitEntry(this);
  641|  37.5M|}  // TiffEntry::doAccept
_ZN5Exiv28Internal13TiffDataEntry8doAcceptERNS0_11TiffVisitorE:
  643|  95.0k|void TiffDataEntry::doAccept(TiffVisitor& visitor) {
  644|  95.0k|  visitor.visitDataEntry(this);
  645|  95.0k|}  // TiffDataEntry::doAccept
_ZN5Exiv28Internal14TiffImageEntry8doAcceptERNS0_11TiffVisitorE:
  647|  1.32M|void TiffImageEntry::doAccept(TiffVisitor& visitor) {
  648|  1.32M|  visitor.visitImageEntry(this);
  649|  1.32M|}  // TiffImageEntry::doAccept
_ZN5Exiv28Internal13TiffSizeEntry8doAcceptERNS0_11TiffVisitorE:
  651|  1.77M|void TiffSizeEntry::doAccept(TiffVisitor& visitor) {
  652|  1.77M|  visitor.visitSizeEntry(this);
  653|  1.77M|}  // TiffSizeEntry::doAccept
_ZN5Exiv28Internal13TiffDirectory8doAcceptERNS0_11TiffVisitorE:
  655|  1.12M|void TiffDirectory::doAccept(TiffVisitor& visitor) {
  656|  1.12M|  visitor.visitDirectory(this);
  657|  42.2M|  for (auto&& component : components_) {
  ------------------
  |  Branch (657:25): [True: 42.2M, False: 891k]
  ------------------
  658|  42.2M|    if (!visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (658:9): [True: 237k, False: 42.0M]
  ------------------
  659|   237k|      break;
  660|  42.0M|    component->accept(visitor);
  661|  42.0M|  }
  662|  1.12M|  if (visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (662:7): [True: 884k, False: 245k]
  ------------------
  663|   884k|    visitor.visitDirectoryNext(this);
  664|  1.12M|  if (pNext_)
  ------------------
  |  Branch (664:7): [True: 22.0k, False: 1.10M]
  ------------------
  665|  22.0k|    pNext_->accept(visitor);
  666|  1.12M|  if (visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (666:7): [True: 878k, False: 251k]
  ------------------
  667|   878k|    visitor.visitDirectoryEnd(this);
  668|  1.12M|}  // TiffDirectory::doAccept
_ZN5Exiv28Internal10TiffSubIfd8doAcceptERNS0_11TiffVisitorE:
  670|   193k|void TiffSubIfd::doAccept(TiffVisitor& visitor) {
  671|   193k|  visitor.visitSubIfd(this);
  672|   707k|  for (auto&& ifd : ifds_) {
  ------------------
  |  Branch (672:19): [True: 707k, False: 163k]
  ------------------
  673|   707k|    if (!visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (673:9): [True: 29.5k, False: 677k]
  ------------------
  674|  29.5k|      break;
  675|   677k|    ifd->accept(visitor);
  676|   677k|  }
  677|   193k|}  // TiffSubIfd::doAccept
_ZN5Exiv28Internal11TiffMnEntry8doAcceptERNS0_11TiffVisitorE:
  679|   175k|void TiffMnEntry::doAccept(TiffVisitor& visitor) {
  680|   175k|  visitor.visitMnEntry(this);
  681|   175k|  if (mn_)
  ------------------
  |  Branch (681:7): [True: 130k, False: 45.0k]
  ------------------
  682|   130k|    mn_->accept(visitor);
  683|   175k|  if (!visitor.go(TiffVisitor::geKnownMakernote)) {
  ------------------
  |  Branch (683:7): [True: 1.21k, False: 174k]
  ------------------
  684|  1.21k|    mn_ = nullptr;
  685|  1.21k|  }
  686|       |
  687|   175k|}  // TiffMnEntry::doAccept
_ZN5Exiv28Internal16TiffIfdMakernote8doAcceptERNS0_11TiffVisitorE:
  689|   125k|void TiffIfdMakernote::doAccept(TiffVisitor& visitor) {
  690|   125k|  if (visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (690:7): [True: 125k, False: 0]
  ------------------
  691|   125k|    visitor.visitIfdMakernote(this);
  692|   125k|  if (visitor.go(TiffVisitor::geKnownMakernote))
  ------------------
  |  Branch (692:7): [True: 125k, False: 922]
  ------------------
  693|   125k|    ifd_.accept(visitor);
  694|   125k|  if (visitor.go(TiffVisitor::geKnownMakernote) && visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (694:7): [True: 125k, False: 922]
  |  Branch (694:52): [True: 88.6k, False: 36.3k]
  ------------------
  695|  88.6k|    visitor.visitIfdMakernoteEnd(this);
  696|   125k|}
_ZN5Exiv28Internal15TiffBinaryArray8doAcceptERNS0_11TiffVisitorE:
  698|   279k|void TiffBinaryArray::doAccept(TiffVisitor& visitor) {
  699|   279k|  visitor.visitBinaryArray(this);
  700|   100M|  for (auto&& element : elements_) {
  ------------------
  |  Branch (700:23): [True: 100M, False: 274k]
  ------------------
  701|   100M|    if (!visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (701:9): [True: 4.56k, False: 100M]
  ------------------
  702|  4.56k|      break;
  703|   100M|    element->accept(visitor);
  704|   100M|  }
  705|   279k|  if (visitor.go(TiffVisitor::geTraverse))
  ------------------
  |  Branch (705:7): [True: 234k, False: 44.9k]
  ------------------
  706|   234k|    visitor.visitBinaryArrayEnd(this);
  707|   279k|}
_ZN5Exiv28Internal17TiffBinaryElement8doAcceptERNS0_11TiffVisitorE:
  709|   101M|void TiffBinaryElement::doAccept(TiffVisitor& visitor) {
  710|   101M|  visitor.visitBinaryElement(this);
  711|   101M|}
_ZN5Exiv28Internal13TiffEntryBase6encodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  713|  2.26M|void TiffEntryBase::encode(TiffEncoder& encoder, const Exifdatum* datum) {
  714|  2.26M|  doEncode(encoder, datum);
  715|  2.26M|}
_ZN5Exiv28Internal17TiffBinaryElement8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  717|   870k|void TiffBinaryElement::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  718|   870k|  encoder.encodeBinaryElement(this, datum);
  719|   870k|}
_ZN5Exiv28Internal15TiffBinaryArray8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  721|  11.0k|void TiffBinaryArray::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  722|  11.0k|  encoder.encodeBinaryArray(this, datum);
  723|  11.0k|}
_ZN5Exiv28Internal13TiffDataEntry8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  725|  3.54k|void TiffDataEntry::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  726|  3.54k|  encoder.encodeDataEntry(this, datum);
  727|  3.54k|}
_ZN5Exiv28Internal9TiffEntry8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  729|  1.35M|void TiffEntry::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  730|  1.35M|  encoder.encodeTiffEntry(this, datum);
  731|  1.35M|}
_ZN5Exiv28Internal14TiffImageEntry8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  733|  9.08k|void TiffImageEntry::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  734|  9.08k|  encoder.encodeImageEntry(this, datum);
  735|  9.08k|}
_ZN5Exiv28Internal11TiffMnEntry8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  737|  7.34k|void TiffMnEntry::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  738|  7.34k|  encoder.encodeMnEntry(this, datum);
  739|  7.34k|}
_ZN5Exiv28Internal13TiffSizeEntry8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  741|  14.9k|void TiffSizeEntry::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  742|  14.9k|  encoder.encodeSizeEntry(this, datum);
  743|  14.9k|}
_ZN5Exiv28Internal10TiffSubIfd8doEncodeERNS0_11TiffEncoderEPKNS_9ExifdatumE:
  745|     89|void TiffSubIfd::doEncode(TiffEncoder& encoder, const Exifdatum* datum) {
  746|     89|  encoder.encodeSubIfd(this, datum);
  747|     89|}
_ZNK5Exiv28Internal13TiffComponent5countEv:
  749|  1.60M|size_t TiffComponent::count() const {
  750|  1.60M|  return doCount();
  751|  1.60M|}
_ZNK5Exiv28Internal13TiffDirectory7doCountEv:
  753|   120k|size_t TiffDirectory::doCount() const {
  754|   120k|  return components_.size();
  755|   120k|}
_ZNK5Exiv28Internal13TiffEntryBase7doCountEv:
  757|  1.47M|size_t TiffEntryBase::doCount() const {
  758|  1.47M|  return count_;
  759|  1.47M|}
_ZNK5Exiv28Internal11TiffMnEntry7doCountEv:
  761|  11.4k|size_t TiffMnEntry::doCount() const {
  762|  11.4k|  if (!mn_) {
  ------------------
  |  Branch (762:7): [True: 5.57k, False: 5.86k]
  ------------------
  763|  5.57k|    return TiffEntryBase::doCount();
  764|  5.57k|  }
  765|  5.86k|#ifndef SUPPRESS_WARNINGS
  766|       |  // Count of IFD makernote in tag Exif.Photo.MakerNote is the size of the
  767|       |  // Makernote in bytes
  768|  5.86k|  if (tiffType() != ttUndefined && tiffType() != ttUnsignedByte && tiffType() != ttSignedByte) {
  ------------------
  |  Branch (768:7): [True: 1.48k, False: 4.38k]
  |  Branch (768:36): [True: 1.46k, False: 22]
  |  Branch (768:68): [True: 1.42k, False: 37]
  ------------------
  769|  1.42k|    EXV_ERROR << stringFormat(
  ------------------
  |  |  142|  1.42k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 1.42k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  1.42k|  LogMsg(LogMsg::error).os()
  ------------------
                  EXV_ERROR << stringFormat(
  ------------------
  |  |   18|      0|#define stringFormat std::format
  ------------------
  770|      0|        "Makernote entry 0x{:04x} has incorrect Exif (TIFF) type {}. (Expected signed or unsigned byte.)\n", tag(),
  771|      0|        static_cast<uint16_t>(tiffType()));
  772|  1.42k|  }
  773|  5.86k|#endif
  774|  5.86k|  return mn_->size();
  775|  11.4k|}
_ZNK5Exiv28Internal15TiffBinaryArray7doCountEv:
  781|  15.3k|size_t TiffBinaryArray::doCount() const {
  782|  15.3k|  if (!cfg() || !decoded())
  ------------------
  |  Branch (782:7): [True: 147, False: 15.1k]
  |  Branch (782:17): [True: 10.4k, False: 4.65k]
  ------------------
  783|  10.6k|    return TiffEntryBase::doCount();
  784|       |
  785|  4.65k|  if (elements_.empty())
  ------------------
  |  Branch (785:7): [True: 0, False: 4.65k]
  ------------------
  786|      0|    return 0;
  787|       |
  788|  4.65k|  TypeId typeId = toTypeId(tiffType(), tag(), group());
  789|  4.65k|  size_t typeSize = TypeInfo::typeSize(typeId);
  790|  4.65k|  if (0 == typeSize) {
  ------------------
  |  Branch (790:7): [True: 250, False: 4.40k]
  ------------------
  791|    250|#ifndef SUPPRESS_WARNINGS
  792|    250|    EXV_WARNING << stringFormat("Directory {}, entry 0x{:04x} has unknown Exif (TIFF) type {}; setting type size 1.\n",
  ------------------
  |  |  138|    250|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 250]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    250|  LogMsg(LogMsg::warn).os()
  ------------------
                  EXV_WARNING << stringFormat("Directory {}, entry 0x{:04x} has unknown Exif (TIFF) type {}; setting type size 1.\n",
  ------------------
  |  |   18|      0|#define stringFormat std::format
  ------------------
  793|      0|                                groupName(group()), tag(), static_cast<uint16_t>(tiffType()));
  794|    250|#endif
  795|    250|    typeSize = 1;
  796|    250|  }
  797|       |
  798|  4.65k|  return size() / typeSize;
  799|  4.65k|}
_ZN5Exiv28Internal13TiffComponent5writeERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
  806|  2.30M|                            size_t& imageIdx) {
  807|  2.30M|  return doWrite(ioWrapper, byteOrder, offset, valueIdx, dataIdx, imageIdx);
  808|  2.30M|}  // TiffComponent::write
_ZN5Exiv28Internal13TiffDirectory7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
  811|  21.1k|                              size_t& imageIdx) {
  812|  21.1k|  bool isRootDir = (imageIdx == std::string::npos);
  813|       |
  814|       |  // Number of components to write
  815|  21.1k|  const size_t compCount = count();
  816|  21.1k|  if (compCount > 0xffff)
  ------------------
  |  Branch (816:7): [True: 0, False: 21.1k]
  ------------------
  817|      0|    throw Error(ErrorCode::kerTooManyTiffDirectoryEntries, groupName(group()));
  818|       |
  819|       |  // Size of next IFD, if any
  820|  21.1k|  size_t sizeNext = 0;
  821|  21.1k|  if (pNext_)
  ------------------
  |  Branch (821:7): [True: 251, False: 20.9k]
  ------------------
  822|    251|    sizeNext = pNext_->size();
  823|       |
  824|       |  // Nothing to do if there are no entries and the size of the next IFD is 0
  825|  21.1k|  if (compCount == 0 && sizeNext == 0)
  ------------------
  |  Branch (825:7): [True: 160, False: 20.9k]
  |  Branch (825:25): [True: 38, False: 122]
  ------------------
  826|     38|    return 0;
  827|       |
  828|       |  // Remember the offset of the CR2 RAW IFD
  829|  21.1k|  if (group() == IfdId::ifd3Id) {
  ------------------
  |  Branch (829:7): [True: 0, False: 21.1k]
  ------------------
  830|       |#ifdef EXIV2_DEBUG_MESSAGES
  831|       |    std::cerr << "Directory " << groupName(group()) << " offset is 0x" << std::setw(8) << std::setfill('0') << std::hex
  832|       |              << offset << std::dec << "\n";
  833|       |#endif
  834|      0|    ioWrapper.setTarget(OffsetWriter::cr2RawIfdOffset, offset);
  835|      0|  }
  836|       |  // Size of all directory entries, without values and additional data
  837|  21.1k|  const size_t sizeDir = 2 + (12 * compCount) + (hasNext_ ? 4 : 0);
  ------------------
  |  Branch (837:50): [True: 21.0k, False: 30]
  ------------------
  838|       |
  839|       |  // TIFF standard requires IFD entries to be sorted in ascending order by tag.
  840|       |  // Not sorting makernote directories sometimes preserves them better.
  841|  21.1k|  if (group() < IfdId::mnId) {
  ------------------
  |  Branch (841:7): [True: 12.4k, False: 8.62k]
  ------------------
  842|  12.4k|    std::sort(components_.begin(), components_.end(), cmpTagLt);
  843|  12.4k|  }
  844|       |  // Size of IFD values and additional data
  845|  21.1k|  size_t sizeValue = 0;
  846|  21.1k|  size_t sizeData = 0;
  847|  1.40M|  for (auto&& component : components_) {
  ------------------
  |  Branch (847:25): [True: 1.40M, False: 21.1k]
  ------------------
  848|  1.40M|    if (size_t sv = component->size(); sv > 4) {
  ------------------
  |  Branch (848:40): [True: 70.1k, False: 1.33M]
  ------------------
  849|  70.1k|      sv += sv & 1;  // Align value to word boundary
  850|  70.1k|      sizeValue += sv;
  851|  70.1k|    }
  852|       |    // Also add the size of data, but only if needed
  853|  1.40M|    if (isRootDir) {
  ------------------
  |  Branch (853:9): [True: 585k, False: 821k]
  ------------------
  854|   585k|      auto sd = component->sizeData();
  855|   585k|      sd += sd & 1;  // Align data to word boundary
  856|   585k|      sizeData += sd;
  857|   585k|    }
  858|  1.40M|  }
  859|       |
  860|  21.1k|  size_t idx = 0;                 // Current IFD index / bytes written
  861|  21.1k|  valueIdx = sizeDir;             // Offset to the current IFD value
  862|  21.1k|  dataIdx = sizeDir + sizeValue;  // Offset to the entry's data area
  863|  21.1k|  if (isRootDir) {                // Absolute offset to the image data
  ------------------
  |  Branch (863:7): [True: 7.57k, False: 13.5k]
  ------------------
  864|  7.57k|    imageIdx = offset + dataIdx + sizeData + sizeNext;
  865|  7.57k|    imageIdx += imageIdx & 1;  // Align image data to word boundary
  866|  7.57k|  }
  867|       |
  868|       |  // 1st: Write the IFD, a) Number of directory entries
  869|  21.1k|  byte buf[4];
  870|  21.1k|  us2Data(buf, static_cast<uint16_t>(compCount), byteOrder);
  871|  21.1k|  ioWrapper.write(buf, 2);
  872|  21.1k|  idx += 2;
  873|       |  // b) Directory entries - may contain pointers to the value or data
  874|  1.40M|  for (auto&& component : components_) {
  ------------------
  |  Branch (874:25): [True: 1.40M, False: 21.1k]
  ------------------
  875|  1.40M|    idx += writeDirEntry(ioWrapper, byteOrder, offset, component.get(), valueIdx, dataIdx, imageIdx);
  876|  1.40M|    if (size_t sv = component->size(); sv > 4) {
  ------------------
  |  Branch (876:40): [True: 70.0k, False: 1.33M]
  ------------------
  877|  70.0k|      sv += sv & 1;  // Align value to word boundary
  878|  70.0k|      valueIdx += sv;
  879|  70.0k|    }
  880|  1.40M|    auto sd = component->sizeData();
  881|  1.40M|    sd += sd & 1;  // Align data to word boundary
  882|  1.40M|    dataIdx += sd;
  883|  1.40M|  }
  884|       |  // c) Pointer to the next IFD
  885|  21.1k|  if (hasNext_) {
  ------------------
  |  Branch (885:7): [True: 21.0k, False: 66]
  ------------------
  886|  21.0k|    memset(buf, 0x0, 4);
  887|  21.0k|    if (pNext_ && sizeNext) {
  ------------------
  |  Branch (887:9): [True: 251, False: 20.7k]
  |  Branch (887:19): [True: 248, False: 3]
  ------------------
  888|    248|      l2Data(buf, static_cast<uint32_t>(offset + dataIdx), byteOrder);
  889|    248|    }
  890|  21.0k|    ioWrapper.write(buf, 4);
  891|  21.0k|    idx += 4;
  892|  21.0k|  }
  893|       |
  894|       |  // 2nd: Write IFD values - may contain pointers to additional data
  895|  21.1k|  valueIdx = sizeDir;
  896|  21.1k|  dataIdx = sizeDir + sizeValue;
  897|  1.40M|  for (auto&& component : components_) {
  ------------------
  |  Branch (897:25): [True: 1.40M, False: 21.1k]
  ------------------
  898|  1.40M|    if (size_t sv = component->size(); sv > 4) {
  ------------------
  |  Branch (898:40): [True: 69.9k, False: 1.33M]
  ------------------
  899|  69.9k|      size_t d = component->write(ioWrapper, byteOrder, offset, valueIdx, dataIdx, imageIdx);
  900|  69.9k|      enforce(sv == d, ErrorCode::kerImageWriteFailed);
  901|  69.9k|      if ((sv & 1) == 1) {
  ------------------
  |  Branch (901:11): [True: 19.8k, False: 50.1k]
  ------------------
  902|  19.8k|        ioWrapper.putb(0x0);  // Align value to word boundary
  903|  19.8k|        sv += 1;
  904|  19.8k|      }
  905|  69.9k|      idx += sv;
  906|  69.9k|      valueIdx += sv;
  907|  69.9k|    }
  908|  1.40M|    auto sd = component->sizeData();
  909|  1.40M|    sd += sd & 1;  // Align data to word boundary
  910|  1.40M|    dataIdx += sd;
  911|  1.40M|  }
  912|       |
  913|       |  // 3rd: Write data - may contain offsets too (eg sub-IFD)
  914|  21.1k|  dataIdx = sizeDir + sizeValue;
  915|  21.1k|  idx += writeData(ioWrapper, byteOrder, offset, dataIdx, imageIdx);
  916|       |
  917|       |  // 4th: Write next-IFD
  918|  21.1k|  if (pNext_ && sizeNext) {
  ------------------
  |  Branch (918:7): [True: 251, False: 20.8k]
  |  Branch (918:17): [True: 248, False: 3]
  ------------------
  919|    248|    idx += pNext_->write(ioWrapper, byteOrder, offset + idx, std::string::npos, std::string::npos, imageIdx);
  920|    248|  }
  921|       |
  922|       |  // 5th, at the root directory level only: write image data
  923|  21.1k|  if (isRootDir) {
  ------------------
  |  Branch (923:7): [True: 7.49k, False: 13.6k]
  ------------------
  924|  7.49k|    idx += writeImage(ioWrapper, byteOrder);
  925|  7.49k|  }
  926|       |
  927|  21.1k|  return idx;
  928|  21.1k|}
_ZN5Exiv28Internal13TiffDirectory13writeDirEntryERNS0_9IoWrapperENS_9ByteOrderEmPNS0_13TiffComponentEmmRm:
  931|  1.40M|                                    TiffComponent* pTiffComponent, size_t valueIdx, size_t dataIdx, size_t& imageIdx) {
  932|  1.40M|  auto pDirEntry = dynamic_cast<TiffEntryBase*>(pTiffComponent);
  933|  1.40M|  if (!pDirEntry)
  ------------------
  |  Branch (933:7): [True: 0, False: 1.40M]
  ------------------
  934|      0|    return 0;
  935|  1.40M|  byte buf[8];
  936|  1.40M|  us2Data(buf, pDirEntry->tag(), byteOrder);
  937|  1.40M|  us2Data(buf + 2, pDirEntry->tiffType(), byteOrder);
  938|  1.40M|  ul2Data(buf + 4, static_cast<uint32_t>(pDirEntry->count()), byteOrder);
  939|  1.40M|  ioWrapper.write(buf, 8);
  940|  1.40M|  if (pDirEntry->size() > 4) {
  ------------------
  |  Branch (940:7): [True: 70.0k, False: 1.33M]
  ------------------
  941|  70.0k|    pDirEntry->setOffset(Safe::add<size_t>(offset, valueIdx));
  942|  70.0k|    ul2Data(buf, static_cast<uint32_t>(pDirEntry->offset()), byteOrder);
  943|  70.0k|    ioWrapper.write(buf, 4);
  944|  1.33M|  } else {
  945|  1.33M|    const size_t len = pDirEntry->write(ioWrapper, byteOrder, offset, valueIdx, dataIdx, imageIdx);
  946|  1.33M|#ifndef SUPPRESS_WARNINGS
  947|  1.33M|    if (len > 4) {
  ------------------
  |  Branch (947:9): [True: 3, False: 1.33M]
  ------------------
  948|      3|      EXV_ERROR << "Unexpected length in TiffDirectory::writeDirEntry(): len == " << len << ".\n";
  ------------------
  |  |  142|      3|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 3]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      3|  LogMsg(LogMsg::error).os()
  ------------------
  949|      3|    }
  950|  1.33M|#endif
  951|  1.33M|    if (len < 4) {
  ------------------
  |  Branch (951:9): [True: 1.31M, False: 16.7k]
  ------------------
  952|  1.31M|      memset(buf, 0x0, 4);
  953|  1.31M|      ioWrapper.write(buf, 4 - len);
  954|  1.31M|    }
  955|  1.33M|  }
  956|  1.40M|  return 12;
  957|  1.40M|}  // TiffDirectory::writeDirEntry
_ZN5Exiv28Internal13TiffEntryBase7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
  960|  1.37M|                              size_t /*dataIdx*/, size_t& /*imageIdx*/) {
  961|  1.37M|  if (!pValue_ || pValue_->size() == 0)
  ------------------
  |  Branch (961:7): [True: 0, False: 1.37M]
  |  Branch (961:19): [True: 1.28M, False: 92.5k]
  ------------------
  962|  1.28M|    return 0;
  963|       |
  964|  92.5k|  DataBuf buf(pValue_->size());
  965|  92.5k|  pValue_->copy(buf.data(), byteOrder);
  966|  92.5k|  ioWrapper.write(buf.c_data(), buf.size());
  967|  92.5k|  return buf.size();
  968|  1.37M|}  // TiffEntryBase::doWrite
_ZN5Exiv28Internal13TiffEntryBase11writeOffsetEPhmNS0_8TiffTypeENS_9ByteOrderE:
  970|  11.8k|size_t TiffEntryBase::writeOffset(byte* buf, size_t offset, TiffType tiffType, ByteOrder byteOrder) {
  971|  11.8k|  size_t rc = 0;
  972|  11.8k|  switch (tiffType) {
  973|    516|    case ttUnsignedShort:
  ------------------
  |  Branch (973:5): [True: 516, False: 11.3k]
  ------------------
  974|  1.16k|    case ttSignedShort:
  ------------------
  |  Branch (974:5): [True: 650, False: 11.2k]
  ------------------
  975|  1.16k|      if (offset > std::numeric_limits<uint16_t>::max())
  ------------------
  |  Branch (975:11): [True: 3, False: 1.16k]
  ------------------
  976|      3|        throw Error(ErrorCode::kerOffsetOutOfRange);
  977|  1.16k|      rc = us2Data(buf, static_cast<uint16_t>(offset), byteOrder);
  978|  1.16k|      break;
  979|  10.0k|    case ttUnsignedLong:
  ------------------
  |  Branch (979:5): [True: 10.0k, False: 1.80k]
  ------------------
  980|  10.6k|    case ttSignedLong:
  ------------------
  |  Branch (980:5): [True: 565, False: 11.3k]
  ------------------
  981|  10.6k|      if (offset > std::numeric_limits<uint32_t>::max())
  ------------------
  |  Branch (981:11): [True: 1, False: 10.6k]
  ------------------
  982|      1|        throw Error(ErrorCode::kerOffsetOutOfRange);
  983|  10.6k|      rc = l2Data(buf, static_cast<uint32_t>(offset), byteOrder);
  984|  10.6k|      break;
  985|     69|    default:
  ------------------
  |  Branch (985:5): [True: 69, False: 11.8k]
  ------------------
  986|     69|      throw Error(ErrorCode::kerUnsupportedDataAreaOffsetType);
  987|  11.8k|  }
  988|  11.8k|  return rc;
  989|  11.8k|}  // TiffEntryBase::writeOffset
_ZN5Exiv28Internal13TiffDataEntry7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
  992|  3.45k|                              size_t dataIdx, size_t& /*imageIdx*/) {
  993|  3.45k|  if (!pValue() || pValue()->count() == 0)
  ------------------
  |  Branch (993:7): [True: 0, False: 3.45k]
  |  Branch (993:20): [True: 3.38k, False: 75]
  ------------------
  994|  3.38k|    return 0;
  995|       |
  996|     75|  DataBuf buf(pValue()->size());
  997|     75|  size_t idx = 0;
  998|     75|  const size_t prevOffset = pValue()->toUint32(0);
  999|  2.78k|  for (size_t i = 0; i < count(); ++i) {
  ------------------
  |  Branch (999:22): [True: 2.70k, False: 75]
  ------------------
 1000|  2.70k|    const size_t iOffset = pValue()->toUint32(i);
 1001|  2.70k|    enforce(prevOffset <= iOffset, ErrorCode::kerOffsetOutOfRange);
 1002|  2.70k|    const auto newDataIdx = Safe::add<size_t>(iOffset - prevOffset, dataIdx);
 1003|  2.70k|    idx += writeOffset(buf.data(idx), Safe::add(offset, newDataIdx), tiffType(), byteOrder);
 1004|  2.70k|  }
 1005|     75|  ioWrapper.write(buf.c_data(), buf.size());
 1006|     75|  return buf.size();
 1007|  3.45k|}
_ZN5Exiv28Internal14TiffImageEntry7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
 1010|  8.93k|                               size_t dataIdx, size_t& imageIdx) {
 1011|  8.93k|  size_t o2 = imageIdx;
 1012|       |  // For makernotes, write TIFF image data to the data area
 1013|  8.93k|  if (group() > IfdId::mnId)
  ------------------
  |  Branch (1013:7): [True: 43, False: 8.88k]
  ------------------
 1014|     43|    o2 = Safe::add<size_t>(offset, dataIdx);
 1015|       |#ifdef EXIV2_DEBUG_MESSAGES
 1016|       |  std::cerr << "TiffImageEntry, Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0')
 1017|       |            << std::hex << tag() << std::dec << ": Writing offset " << o2 << "\n";
 1018|       |#endif
 1019|  8.93k|  DataBuf buf(strips_.size() * 4);
 1020|  8.93k|  size_t idx = 0;
 1021|  8.93k|  for (const auto& [_, off] : strips_) {
  ------------------
  |  Branch (1021:29): [True: 1.71k, False: 8.93k]
  ------------------
 1022|  1.71k|    idx += writeOffset(buf.data(idx), o2, tiffType(), byteOrder);
 1023|       |    // Align strip data to word boundary
 1024|  1.71k|    const auto sz = Safe::add(off, off & 1);
 1025|  1.71k|    o2 = Safe::add(o2, sz);
 1026|  1.71k|    if (group() <= IfdId::mnId)
  ------------------
  |  Branch (1026:9): [True: 1.66k, False: 53]
  ------------------
 1027|  1.66k|      imageIdx = Safe::add(imageIdx, sz);
 1028|  1.71k|  }
 1029|  8.93k|  ioWrapper.write(buf.c_data(), buf.size());
 1030|  8.93k|  return buf.size();
 1031|  8.93k|}  // TiffImageEntry::doWrite
_ZN5Exiv28Internal10TiffSubIfd7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
 1034|  7.46k|                           size_t dataIdx, size_t& /*imageIdx*/) {
 1035|  7.46k|  DataBuf buf(ifds_.size() * 4);
 1036|  7.46k|  size_t idx = 0;
 1037|       |  // Sort IFDs by group, needed if image data tags were copied first
 1038|  7.46k|  std::sort(ifds_.begin(), ifds_.end(), [](const auto& lhs, const auto& rhs) { return lhs->group() < rhs->group(); });
 1039|  7.46k|  for (auto&& ifd : ifds_) {
  ------------------
  |  Branch (1039:19): [True: 7.46k, False: 7.46k]
  ------------------
 1040|  7.46k|    idx += writeOffset(buf.data(idx), offset + dataIdx, tiffType(), byteOrder);
 1041|  7.46k|    dataIdx += ifd->size();
 1042|  7.46k|  }
 1043|  7.46k|  ioWrapper.write(buf.c_data(), buf.size());
 1044|  7.46k|  return buf.size();
 1045|  7.46k|}  // TiffSubIfd::doWrite
_ZN5Exiv28Internal11TiffMnEntry7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
 1048|  11.3k|                            size_t& imageIdx) {
 1049|  11.3k|  if (!mn_) {
  ------------------
  |  Branch (1049:7): [True: 5.53k, False: 5.84k]
  ------------------
 1050|  5.53k|    return TiffEntryBase::doWrite(ioWrapper, byteOrder, offset, valueIdx, dataIdx, imageIdx);
 1051|  5.53k|  }
 1052|  5.84k|  return mn_->write(ioWrapper, byteOrder, offset + valueIdx, std::string::npos, std::string::npos, imageIdx);
 1053|  11.3k|}  // TiffMnEntry::doWrite
_ZN5Exiv28Internal16TiffIfdMakernote7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
 1056|  5.84k|                                 size_t /*dataIdx*/, size_t& imageIdx) {
 1057|  5.84k|  mnOffset_ = offset;
 1058|  5.84k|  setImageByteOrder(byteOrder);
 1059|  5.84k|  auto len = writeHeader(ioWrapper, this->byteOrder());
 1060|  5.84k|  len += ifd_.write(ioWrapper, this->byteOrder(), offset - baseOffset() + len, std::string::npos, std::string::npos,
 1061|  5.84k|                    imageIdx);
 1062|  5.84k|  return len;
 1063|  5.84k|}  // TiffIfdMakernote::doWrite
_ZN5Exiv28Internal15TiffBinaryArray7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
 1066|  15.2k|                                size_t dataIdx, size_t& imageIdx) {
 1067|  15.2k|  if (!cfg() || !decoded())
  ------------------
  |  Branch (1067:7): [True: 147, False: 15.1k]
  |  Branch (1067:17): [True: 10.4k, False: 4.65k]
  ------------------
 1068|  10.6k|    return TiffEntryBase::doWrite(ioWrapper, byteOrder, offset, valueIdx, dataIdx, imageIdx);
 1069|  4.65k|  if (cfg()->byteOrder_ != invalidByteOrder)
  ------------------
  |  Branch (1069:7): [True: 572, False: 4.08k]
  ------------------
 1070|    572|    byteOrder = cfg()->byteOrder_;
 1071|       |  // Tags must be sorted in ascending order
 1072|  4.65k|  std::sort(elements_.begin(), elements_.end(), cmpTagLt);
 1073|  4.65k|  size_t idx = 0;
 1074|  4.65k|  MemIo mio;  // memory stream in which to store data
 1075|  4.65k|  IoWrapper mioWrapper(mio, nullptr, 0, nullptr);
 1076|       |  // Some array entries need to have the size in the first element
 1077|  4.65k|  if (cfg()->hasSize_) {
  ------------------
  |  Branch (1077:7): [True: 108, False: 4.54k]
  ------------------
 1078|    108|    byte buf[4];
 1079|    108|    size_t elSize = TypeInfo::typeSize(toTypeId(cfg()->elTiffType_, 0, cfg()->group_));
 1080|    108|    switch (elSize) {
 1081|    104|      case 2:
  ------------------
  |  Branch (1081:7): [True: 104, False: 4]
  ------------------
 1082|    104|        idx += us2Data(buf, static_cast<uint16_t>(size()), byteOrder);
 1083|    104|        break;
 1084|      4|      case 4:
  ------------------
  |  Branch (1084:7): [True: 4, False: 104]
  ------------------
 1085|      4|        idx += ul2Data(buf, static_cast<uint32_t>(size()), byteOrder);
 1086|      4|        break;
 1087|      0|      default:
  ------------------
  |  Branch (1087:7): [True: 0, False: 108]
  ------------------
 1088|      0|        break;
 1089|    108|    }
 1090|    108|    mioWrapper.write(buf, elSize);
 1091|    108|  }
 1092|       |  // write all tags of the array (Todo: assumes that there are no duplicates, need check)
 1093|   868k|  for (auto&& element : elements_) {
  ------------------
  |  Branch (1093:23): [True: 868k, False: 4.65k]
  ------------------
 1094|       |    // Skip the manufactured tag, if it exists
 1095|   868k|    if (cfg()->hasSize_ && element->tag() == 0)
  ------------------
  |  Branch (1095:9): [True: 8.10k, False: 860k]
  |  Branch (1095:28): [True: 108, False: 7.99k]
  ------------------
 1096|    108|      continue;
 1097|   868k|    size_t newIdx = element->tag() * cfg()->tagStep();
 1098|   868k|    idx += fillGap(mioWrapper, idx, newIdx);
 1099|   868k|    idx += element->write(mioWrapper, byteOrder, offset + newIdx, valueIdx, dataIdx, imageIdx);
 1100|   868k|  }
 1101|  4.65k|  if (cfg()->hasFillers_ && def()) {
  ------------------
  |  Branch (1101:7): [True: 3.97k, False: 686]
  |  Branch (1101:29): [True: 3.97k, False: 0]
  ------------------
 1102|  3.97k|    const ArrayDef* lastDef = def() + defSize() - 1;
 1103|  3.97k|    auto lastTag = static_cast<uint16_t>(lastDef->idx_ / cfg()->tagStep());
 1104|  3.97k|    idx += fillGap(mioWrapper, idx, lastDef->idx_ + lastDef->size(lastTag, cfg()->group_));
 1105|  3.97k|  }
 1106|       |
 1107|  4.65k|  if (cfg()->cryptFct_) {
  ------------------
  |  Branch (1107:7): [True: 49, False: 4.60k]
  ------------------
 1108|       |    // Select sonyTagEncipher
 1109|     49|    CryptFct cryptFct = cfg()->cryptFct_;
 1110|     49|    if (cryptFct == &sonyTagDecipher) {
  ------------------
  |  Branch (1110:9): [True: 33, False: 16]
  ------------------
 1111|     33|      cryptFct = sonyTagEncipher;
 1112|     33|    }
 1113|     49|    DataBuf buf = cryptFct(tag(), mio.mmap(), mio.size(), pRoot_);
 1114|     49|    if (!buf.empty()) {
  ------------------
  |  Branch (1114:9): [True: 33, False: 16]
  ------------------
 1115|     33|      mio.seek(0, Exiv2::BasicIo::beg);
 1116|     33|      mio.write(buf.c_data(), buf.size());
 1117|     33|    }
 1118|     49|  }
 1119|  4.65k|  ioWrapper.write(mio.mmap(), mio.size());
 1120|       |
 1121|  4.65k|  return idx;
 1122|  4.65k|}  // TiffBinaryArray::doWrite
_ZN5Exiv28Internal17TiffBinaryElement7doWriteERNS0_9IoWrapperENS_9ByteOrderEmmmRm:
 1125|   868k|                                  size_t /*dataIdx*/, size_t& /*imageIdx*/) {
 1126|   868k|  auto pv = pValue();
 1127|   868k|  if (!pv || pv->count() == 0)
  ------------------
  |  Branch (1127:7): [True: 0, False: 868k]
  |  Branch (1127:14): [True: 838k, False: 30.0k]
  ------------------
 1128|   838k|    return 0;
 1129|  30.0k|  DataBuf buf(pv->size());
 1130|  30.0k|  pv->copy(buf.data(), byteOrder);
 1131|  30.0k|  ioWrapper.write(buf.c_data(), buf.size());
 1132|  30.0k|  return buf.size();
 1133|   868k|}  // TiffBinaryElement::doWrite
_ZNK5Exiv28Internal13TiffComponent9writeDataERNS0_9IoWrapperENS_9ByteOrderEmmRm:
 1136|  1.42M|                                size_t& imageIdx) const {
 1137|  1.42M|  return doWriteData(ioWrapper, byteOrder, offset, dataIdx, imageIdx);
 1138|  1.42M|}  // TiffComponent::writeData
_ZNK5Exiv28Internal13TiffDirectory11doWriteDataERNS0_9IoWrapperENS_9ByteOrderEmmRm:
 1141|  21.0k|                                  size_t& imageIdx) const {
 1142|  21.0k|  size_t len = 0;
 1143|  1.40M|  for (auto&& component : components_) {
  ------------------
  |  Branch (1143:25): [True: 1.40M, False: 21.0k]
  ------------------
 1144|  1.40M|    len += component->writeData(ioWrapper, byteOrder, offset, dataIdx + len, imageIdx);
 1145|  1.40M|  }
 1146|  21.0k|  return len;
 1147|  21.0k|}  // TiffDirectory::doWriteData
_ZNK5Exiv28Internal13TiffEntryBase11doWriteDataERNS0_9IoWrapperENS_9ByteOrderEmmRm:
 1150|  1.38M|                                  size_t /*dataIdx*/, size_t& /*imageIdx*/) const {
 1151|  1.38M|  return 0;
 1152|  1.38M|}  // TiffEntryBase::doWriteData
_ZNK5Exiv28Internal14TiffImageEntry11doWriteDataERNS0_9IoWrapperENS_9ByteOrderEmmRm:
 1155|  8.88k|                                   size_t& /*imageIdx*/) const {
 1156|  8.88k|  size_t len = 0;
 1157|       |  // For makernotes, write TIFF image data to the data area
 1158|  8.88k|  if (group() > IfdId::mnId) {  // Todo: FIX THIS HACK!!!
  ------------------
  |  Branch (1158:7): [True: 43, False: 8.84k]
  ------------------
 1159|     43|    len = writeImage(ioWrapper, byteOrder);
 1160|     43|  }
 1161|  8.88k|  return len;
 1162|  8.88k|}  // TiffImageEntry::doWriteData
_ZNK5Exiv28Internal13TiffDataEntry11doWriteDataERNS0_9IoWrapperENS_9ByteOrderEmmRm:
 1165|  3.41k|                                  size_t& /*imageIdx*/) const {
 1166|  3.41k|  if (!pValue())
  ------------------
  |  Branch (1166:7): [True: 0, False: 3.41k]
  ------------------
 1167|      0|    return 0;
 1168|       |
 1169|  3.41k|  DataBuf buf = pValue()->dataArea();
 1170|  3.41k|  if (!buf.empty())
  ------------------
  |  Branch (1170:7): [True: 5, False: 3.40k]
  ------------------
 1171|      5|    ioWrapper.write(buf.c_data(), buf.size());
 1172|       |  // Align data to word boundary
 1173|  3.41k|  size_t align = (buf.size() & 1);
 1174|  3.41k|  if (align)
  ------------------
  |  Branch (1174:7): [True: 4, False: 3.40k]
  ------------------
 1175|      4|    ioWrapper.putb(0x0);
 1176|       |
 1177|  3.41k|  return buf.size() + align;
 1178|  3.41k|}  // TiffDataEntry::doWriteData
_ZNK5Exiv28Internal10TiffSubIfd11doWriteDataERNS0_9IoWrapperENS_9ByteOrderEmmRm:
 1181|  7.45k|                               size_t& imageIdx) const {
 1182|  7.45k|  size_t len = 0;
 1183|  7.45k|  for (auto&& ifd : ifds_) {
  ------------------
  |  Branch (1183:19): [True: 7.45k, False: 7.45k]
  ------------------
 1184|  7.45k|    len += ifd->write(ioWrapper, byteOrder, offset + dataIdx + len, std::string::npos, std::string::npos, imageIdx);
 1185|  7.45k|  }
 1186|       |  // Align data to word boundary
 1187|  7.45k|  size_t align = (len & 1);
 1188|  7.45k|  if (align)
  ------------------
  |  Branch (1188:7): [True: 0, False: 7.45k]
  ------------------
 1189|      0|    ioWrapper.putb(0x0);
 1190|       |
 1191|  7.45k|  return len + align;
 1192|  7.45k|}  // TiffSubIfd::doWriteData
_ZNK5Exiv28Internal13TiffComponent10writeImageERNS0_9IoWrapperENS_9ByteOrderE:
 1199|   619k|size_t TiffComponent::writeImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const {
 1200|   619k|  return doWriteImage(ioWrapper, byteOrder);
 1201|   619k|}  // TiffComponent::writeImage
_ZNK5Exiv28Internal13TiffDirectory12doWriteImageERNS0_9IoWrapperENS_9ByteOrderE:
 1203|  12.3k|size_t TiffDirectory::doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const {
 1204|  12.3k|  size_t len = 0;
 1205|  12.3k|  const TiffComponent* pSubIfd = nullptr;
 1206|   607k|  for (const auto& component : components_) {
  ------------------
  |  Branch (1206:30): [True: 607k, False: 12.3k]
  ------------------
 1207|   607k|    if (component->tag() == 0x014a) {
  ------------------
  |  Branch (1207:9): [True: 37, False: 607k]
  ------------------
 1208|       |      // Hack: delay writing of sub-IFD image data to get the order correct
 1209|     37|#ifndef SUPPRESS_WARNINGS
 1210|     37|      if (pSubIfd) {
  ------------------
  |  Branch (1210:11): [True: 10, False: 27]
  ------------------
 1211|     10|        EXV_ERROR << "Multiple sub-IFD image data tags found\n";
  ------------------
  |  |  142|     10|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 10]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|     10|  LogMsg(LogMsg::error).os()
  ------------------
 1212|     10|      }
 1213|     37|#endif
 1214|     37|      pSubIfd = component.get();
 1215|     37|      continue;
 1216|     37|    }
 1217|   607k|    len += component->writeImage(ioWrapper, byteOrder);
 1218|   607k|  }
 1219|  12.3k|  if (pSubIfd) {
  ------------------
  |  Branch (1219:7): [True: 27, False: 12.3k]
  ------------------
 1220|     27|    len += pSubIfd->writeImage(ioWrapper, byteOrder);
 1221|     27|  }
 1222|  12.3k|  if (pNext_) {
  ------------------
  |  Branch (1222:7): [True: 229, False: 12.1k]
  ------------------
 1223|    229|    len += pNext_->writeImage(ioWrapper, byteOrder);
 1224|    229|  }
 1225|  12.3k|  return len;
 1226|  12.3k|}  // TiffDirectory::doWriteImage
_ZNK5Exiv28Internal13TiffEntryBase12doWriteImageERNS0_9IoWrapperENS_9ByteOrderE:
 1228|   593k|size_t TiffEntryBase::doWriteImage(IoWrapper& /*ioWrapper*/, ByteOrder /*byteOrder*/) const {
 1229|   593k|  return 0;
 1230|   593k|}  // TiffEntryBase::doWriteImage
_ZNK5Exiv28Internal10TiffSubIfd12doWriteImageERNS0_9IoWrapperENS_9ByteOrderE:
 1232|  4.65k|size_t TiffSubIfd::doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const {
 1233|  4.65k|  return std::transform_reduce(ifds_.begin(), ifds_.end(), size_t{}, std::plus(),
 1234|  4.65k|                               [&](const auto& ifd) { return ifd->writeImage(ioWrapper, byteOrder); });
 1235|  4.65k|}  // TiffSubIfd::doWriteImage
_ZNK5Exiv28Internal14TiffImageEntry12doWriteImageERNS0_9IoWrapperENS_9ByteOrderE:
 1245|  8.87k|size_t TiffImageEntry::doWriteImage(IoWrapper& ioWrapper, ByteOrder /*byteOrder*/) const {
 1246|  8.87k|  if (!pValue())
  ------------------
  |  Branch (1246:7): [True: 0, False: 8.87k]
  ------------------
 1247|      0|    throw Error(ErrorCode::kerImageWriteFailed);  // #1296
 1248|       |
 1249|  8.87k|  size_t len = pValue()->sizeDataArea();
 1250|  8.87k|  if (len > 0) {
  ------------------
  |  Branch (1250:7): [True: 119, False: 8.75k]
  ------------------
 1251|       |#ifdef EXIV2_DEBUG_MESSAGES
 1252|       |    std::cerr << "TiffImageEntry, Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0')
 1253|       |              << std::hex << tag() << std::dec << ": Writing data area, size = " << len;
 1254|       |#endif
 1255|    119|    DataBuf buf = pValue()->dataArea();
 1256|    119|    ioWrapper.write(buf.c_data(), buf.size());
 1257|    119|    size_t align = len & 1;  // Align image data to word boundary
 1258|    119|    if (align)
  ------------------
  |  Branch (1258:9): [True: 54, False: 65]
  ------------------
 1259|     54|      ioWrapper.putb(0x0);
 1260|    119|    len += align;
 1261|  8.75k|  } else {
 1262|       |#ifdef EXIV2_DEBUG_MESSAGES
 1263|       |    std::cerr << "TiffImageEntry, Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0')
 1264|       |              << std::hex << tag() << std::dec << ": Writing " << strips_.size() << " strips";
 1265|       |#endif
 1266|  8.75k|    len = 0;
 1267|  8.75k|    for (auto&& [f, s] : strips_) {
  ------------------
  |  Branch (1267:24): [True: 285, False: 8.75k]
  ------------------
 1268|    285|      ioWrapper.write(f, s);
 1269|    285|      len += s;
 1270|    285|      size_t align = s & 1;  // Align strip data to word boundary
 1271|    285|      if (align)
  ------------------
  |  Branch (1271:11): [True: 118, False: 167]
  ------------------
 1272|    118|        ioWrapper.putb(0x0);
 1273|    285|      len += align;
 1274|    285|    }
 1275|  8.75k|  }
 1276|       |#ifdef EXIV2_DEBUG_MESSAGES
 1277|       |  std::cerr << ", len = " << len << " bytes\n";
 1278|       |#endif
 1279|  8.87k|  return len;
 1280|  8.87k|}  // TiffImageEntry::doWriteImage
_ZNK5Exiv28Internal13TiffComponent4sizeEv:
 1282|  13.5M|size_t TiffComponent::size() const {
 1283|  13.5M|  return doSize();
 1284|  13.5M|}
_ZNK5Exiv28Internal13TiffDirectory6doSizeEv:
 1286|  99.6k|size_t TiffDirectory::doSize() const {
 1287|  99.6k|  size_t compCount = count();
 1288|       |  // Size of the directory, without values and additional data
 1289|  99.6k|  size_t len = 2 + (12 * compCount) + (hasNext_ ? 4 : 0);
  ------------------
  |  Branch (1289:40): [True: 99.3k, False: 270]
  ------------------
 1290|       |  // Size of IFD values and data
 1291|  7.18M|  for (auto&& component : components_) {
  ------------------
  |  Branch (1291:25): [True: 7.18M, False: 99.6k]
  ------------------
 1292|  7.18M|    if (size_t sv = component->size(); sv > 4) {
  ------------------
  |  Branch (1292:40): [True: 352k, False: 6.83M]
  ------------------
 1293|   352k|      sv += sv & 1;  // Align value to word boundary
 1294|   352k|      len += sv;
 1295|   352k|    }
 1296|  7.18M|    auto sd = component->sizeData();
 1297|  7.18M|    sd += sd & 1;  // Align data to word boundary
 1298|  7.18M|    len += sd;
 1299|  7.18M|  }
 1300|       |  // Size of next-IFD, if any
 1301|  99.6k|  size_t sizeNext = 0;
 1302|  99.6k|  if (pNext_) {
  ------------------
  |  Branch (1302:7): [True: 0, False: 99.6k]
  ------------------
 1303|      0|    sizeNext = pNext_->size();
 1304|      0|    len += sizeNext;
 1305|      0|  }
 1306|       |  // Reset size of IFD if it has no entries and no or empty next IFD.
 1307|  99.6k|  if (compCount == 0 && sizeNext == 0)
  ------------------
  |  Branch (1307:7): [True: 94, False: 99.5k]
  |  Branch (1307:25): [True: 94, False: 0]
  ------------------
 1308|     94|    len = 0;
 1309|  99.6k|  return len;
 1310|  99.6k|}
_ZNK5Exiv28Internal13TiffEntryBase6doSizeEv:
 1312|  68.3M|size_t TiffEntryBase::doSize() const {
 1313|  68.3M|  return size_;
 1314|  68.3M|}
_ZNK5Exiv28Internal14TiffImageEntry6doSizeEv:
 1316|  36.3k|size_t TiffImageEntry::doSize() const {
 1317|  36.3k|  return strips_.size() * 4;
 1318|  36.3k|}
_ZNK5Exiv28Internal10TiffSubIfd6doSizeEv:
 1320|  55.1k|size_t TiffSubIfd::doSize() const {
 1321|  55.1k|  return ifds_.size() * 4;
 1322|  55.1k|}
_ZNK5Exiv28Internal11TiffMnEntry6doSizeEv:
 1324|  63.7k|size_t TiffMnEntry::doSize() const {
 1325|  63.7k|  if (!mn_) {
  ------------------
  |  Branch (1325:7): [True: 22.4k, False: 41.2k]
  ------------------
 1326|  22.4k|    return TiffEntryBase::doSize();
 1327|  22.4k|  }
 1328|  41.2k|  return mn_->size();
 1329|  63.7k|}
_ZNK5Exiv28Internal16TiffIfdMakernote6doSizeEv:
 1331|  47.1k|size_t TiffIfdMakernote::doSize() const {
 1332|  47.1k|  return sizeHeader() + ifd_.size();
 1333|  47.1k|}
_ZNK5Exiv28Internal15TiffBinaryArray6doSizeEv:
 1335|   203k|size_t TiffBinaryArray::doSize() const {
 1336|   203k|  if (!cfg() || !decoded())
  ------------------
  |  Branch (1336:7): [True: 1.92k, False: 201k]
  |  Branch (1336:17): [True: 136k, False: 65.3k]
  ------------------
 1337|   138k|    return TiffEntryBase::doSize();
 1338|       |
 1339|  65.3k|  if (elements_.empty())
  ------------------
  |  Branch (1339:7): [True: 0, False: 65.3k]
  ------------------
 1340|      0|    return 0;
 1341|       |
 1342|       |  // Remaining assumptions:
 1343|       |  // - array elements don't "overlap"
 1344|       |  // - no duplicate tags in the array
 1345|  65.3k|  size_t idx = 0;
 1346|  65.3k|  size_t sz = cfg()->tagStep();
 1347|  12.1M|  for (auto&& element : elements_) {
  ------------------
  |  Branch (1347:23): [True: 12.1M, False: 65.3k]
  ------------------
 1348|  12.1M|    if (element->tag() > idx) {
  ------------------
  |  Branch (1348:9): [True: 601k, False: 11.5M]
  ------------------
 1349|   601k|      idx = element->tag();
 1350|   601k|      sz = element->size();
 1351|   601k|    }
 1352|  12.1M|  }
 1353|  65.3k|  idx *= cfg()->tagStep();
 1354|  65.3k|  idx += sz;
 1355|       |
 1356|  65.3k|  if (cfg()->hasFillers_ && def()) {
  ------------------
  |  Branch (1356:7): [True: 55.6k, False: 9.72k]
  |  Branch (1356:29): [True: 55.6k, False: 0]
  ------------------
 1357|  55.6k|    const ArrayDef* lastDef = def() + defSize() - 1;
 1358|  55.6k|    auto lastTag = static_cast<uint16_t>(lastDef->idx_ / cfg()->tagStep());
 1359|  55.6k|    idx = std::max<size_t>(idx, lastDef->idx_ + lastDef->size(lastTag, cfg()->group_));
 1360|  55.6k|  }
 1361|  65.3k|  return idx;
 1362|       |
 1363|  65.3k|}  // TiffBinaryArray::doSize
_ZNK5Exiv28Internal17TiffBinaryElement6doSizeEv:
 1365|   601k|size_t TiffBinaryElement::doSize() const {
 1366|   601k|  if (!pValue())
  ------------------
  |  Branch (1366:7): [True: 0, False: 601k]
  ------------------
 1367|      0|    return 0;
 1368|   601k|  return pValue()->size();
 1369|   601k|}
_ZNK5Exiv28Internal13TiffComponent8sizeDataEv:
 1371|  10.5M|size_t TiffComponent::sizeData() const {
 1372|  10.5M|  return doSizeData();
 1373|  10.5M|}
_ZNK5Exiv28Internal13TiffEntryBase10doSizeDataEv:
 1379|  10.4M|size_t TiffEntryBase::doSizeData() const {
 1380|  10.4M|  return 0;
 1381|  10.4M|}
_ZNK5Exiv28Internal14TiffImageEntry10doSizeDataEv:
 1383|  27.2k|size_t TiffImageEntry::doSizeData() const {
 1384|  27.2k|  size_t len = 0;
 1385|       |  // For makernotes, TIFF image data is written to the data area
 1386|  27.2k|  if (group() > IfdId::mnId) {  // Todo: Fix this hack!!
  ------------------
  |  Branch (1386:7): [True: 620, False: 26.6k]
  ------------------
 1387|    620|    len = sizeImage();
 1388|    620|  }
 1389|  27.2k|  return len;
 1390|  27.2k|}
_ZNK5Exiv28Internal13TiffDataEntry10doSizeDataEv:
 1392|  29.4k|size_t TiffDataEntry::doSizeData() const {
 1393|  29.4k|  if (!pValue())
  ------------------
  |  Branch (1393:7): [True: 0, False: 29.4k]
  ------------------
 1394|      0|    return 0;
 1395|  29.4k|  return pValue()->sizeDataArea();
 1396|  29.4k|}
_ZNK5Exiv28Internal10TiffSubIfd10doSizeDataEv:
 1398|  44.8k|size_t TiffSubIfd::doSizeData() const {
 1399|  44.8k|  return std::transform_reduce(ifds_.begin(), ifds_.end(), size_t{}, std::plus(), std::mem_fn(&TiffSubIfd::size));
 1400|  44.8k|}
_ZNK5Exiv28Internal13TiffComponent9sizeImageEv:
 1406|    620|size_t TiffComponent::sizeImage() const {
 1407|    620|  return doSizeImage();
 1408|    620|}
_ZNK5Exiv28Internal14TiffImageEntry11doSizeImageEv:
 1428|    620|size_t TiffImageEntry::doSizeImage() const {
 1429|    620|  if (!pValue())
  ------------------
  |  Branch (1429:7): [True: 0, False: 620]
  ------------------
 1430|      0|    return 0;
 1431|    620|  auto len = pValue()->sizeDataArea();
 1432|    620|  if (len != 0)
  ------------------
  |  Branch (1432:7): [True: 0, False: 620]
  ------------------
 1433|      0|    return len;
 1434|       |
 1435|    620|  return std::transform_reduce(strips_.begin(), strips_.end(), len, std::plus(),
 1436|    620|                               [](const auto& s) { return s.second; });
 1437|    620|}  // TiffImageEntry::doSizeImage
_ZN5Exiv28Internal8toTypeIdENS0_8TiffTypeEtNS_5IfdIdE:
 1454|  62.3M|TypeId toTypeId(TiffType tiffType, uint16_t tag, IfdId group) {
 1455|  62.3M|  auto ti = static_cast<TypeId>(tiffType);
 1456|       |  // On the fly type conversion for Exif.Photo.UserComment, Exif.GPSProcessingMethod, GPSAreaInformation
 1457|  62.3M|  if (const TagInfo* pTag = ti == undefined ? findTagInfo(tag, group) : nullptr) {
  ------------------
  |  Branch (1457:22): [True: 4.34k, False: 62.3M]
  ------------------
 1458|  4.34k|    if (pTag->typeId_ == comment) {
  ------------------
  |  Branch (1458:9): [True: 3.07k, False: 1.26k]
  ------------------
 1459|  3.07k|      ti = comment;
 1460|  3.07k|    }
 1461|  4.34k|  }
 1462|       |  // http://dev.exiv2.org/boards/3/topics/1337 change unsignedByte to signedByte
 1463|       |  // Exif.NikonAFT.AFFineTuneAdj || Exif.Pentax.Temperature
 1464|  62.3M|  if (ti == Exiv2::unsignedByte &&
  ------------------
  |  Branch (1464:7): [True: 3.52M, False: 58.7M]
  ------------------
 1465|  3.52M|      ((tag == 0x0002 && group == IfdId::nikonAFTId) || (tag == 0x0047 && group == IfdId::pentaxId))) {
  ------------------
  |  Branch (1465:9): [True: 3.88k, False: 3.52M]
  |  Branch (1465:26): [True: 265, False: 3.62k]
  |  Branch (1465:58): [True: 819, False: 3.52M]
  |  Branch (1465:75): [True: 51, False: 768]
  ------------------
 1466|    316|    ti = Exiv2::signedByte;
 1467|    316|  }
 1468|  62.3M|  return ti;
 1469|  62.3M|}
_ZN5Exiv28Internal10toTiffTypeENS_6TypeIdE:
 1471|  23.4M|TiffType toTiffType(TypeId typeId) {
 1472|  23.4M|  if (static_cast<uint32_t>(typeId) > 0xffff) {
  ------------------
  |  Branch (1472:7): [True: 0, False: 23.4M]
  ------------------
 1473|      0|#ifndef SUPPRESS_WARNINGS
 1474|      0|    EXV_ERROR << "'" << TypeInfo::typeName(typeId) << "' is not a valid Exif (TIFF) type; using type '"
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
 1475|      0|              << TypeInfo::typeName(undefined) << "'.\n";
 1476|      0|#endif
 1477|      0|    return ttUndefined;
 1478|      0|  }
 1479|  23.4M|  return static_cast<TiffType>(typeId);
 1480|  23.4M|}
_ZN5Exiv28Internal8cmpTagLtERKNSt3__110shared_ptrINS0_13TiffComponentEEES6_:
 1482|  12.8M|bool cmpTagLt(const TiffComponent::SharedPtr& lhs, const TiffComponent::SharedPtr& rhs) {
 1483|  12.8M|  if (lhs->tag() != rhs->tag())
  ------------------
  |  Branch (1483:7): [True: 8.95M, False: 3.91M]
  ------------------
 1484|  8.95M|    return lhs->tag() < rhs->tag();
 1485|  3.91M|  return lhs->idx() < rhs->idx();
 1486|  12.8M|}
_ZN5Exiv28Internal12newTiffEntryEtNS_5IfdIdE:
 1488|  6.65M|TiffComponent::UniquePtr newTiffEntry(uint16_t tag, IfdId group) {
 1489|  6.65M|  return std::make_unique<TiffEntry>(tag, group);
 1490|  6.65M|}
_ZN5Exiv28Internal14newTiffMnEntryEtNS_5IfdIdE:
 1492|  48.5k|TiffComponent::UniquePtr newTiffMnEntry(uint16_t tag, IfdId group) {
 1493|  48.5k|  return std::make_unique<TiffMnEntry>(tag, group, IfdId::mnId);
 1494|  48.5k|}
_ZN5Exiv28Internal20newTiffBinaryElementEtNS_5IfdIdE:
 1496|  19.4M|TiffComponent::UniquePtr newTiffBinaryElement(uint16_t tag, IfdId group) {
 1497|  19.4M|  return std::make_unique<TiffBinaryElement>(tag, group);
 1498|  19.4M|}
tiffcomposite_int.cpp:_ZZN5Exiv28Internal13TiffDirectory9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEEENK3$_0clEv:
  473|  1.42M|  auto atc = [&] {
  474|  1.42M|    if (tiffPath.size() == 1 && object) {
  ------------------
  |  Branch (474:9): [True: 1.40M, False: 16.5k]
  |  Branch (474:33): [True: 0, False: 1.40M]
  ------------------
  475|      0|      return std::move(object);
  476|      0|    }
  477|  1.42M|    return TiffCreator::create(tpi.extendedTag(), tpi.group());
  478|  1.42M|  }();
tiffcomposite_int.cpp:_ZZN5Exiv28Internal13TiffDirectory9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEEENK3$_1clEv:
  485|  1.40M|  tc = [&] {
  486|  1.40M|    if (tpi.extendedTag() == Tag::next)
  ------------------
  |  Branch (486:9): [True: 251, False: 1.40M]
  ------------------
  487|    251|      return this->addNext(std::move(atc));
  488|  1.40M|    return this->addChild(std::move(atc));
  489|  1.40M|  }();
tiffcomposite_int.cpp:_ZZN5Exiv28Internal10TiffSubIfd9doAddPathEtRNSt3__15stackINS0_12TiffPathItemENS2_5dequeIS4_NS2_9allocatorIS4_EEEEEEPNS0_13TiffComponentENS2_10unique_ptrISB_NS2_14default_deleteISB_EEEEENK3$_0clEv:
  508|  7.49k|  auto tc = [&] {
  509|  7.49k|    if (tiffPath.size() == 1 && object) {
  ------------------
  |  Branch (509:9): [True: 0, False: 7.49k]
  |  Branch (509:33): [True: 0, False: 0]
  ------------------
  510|      0|      return addChild(std::move(object));
  511|      0|    }
  512|  7.49k|    return addChild(std::make_unique<TiffDirectory>(tpi1.tag(), tpi2.group()));
  513|  7.49k|  }();
tiffcomposite_int.cpp:_ZZNK5Exiv28Internal10TiffSubIfd12doWriteImageERNS0_9IoWrapperENS_9ByteOrderEENK3$_0clINSt3__110shared_ptrINS0_13TiffDirectoryEEEEEDaRKT_:
 1234|  4.65k|                               [&](const auto& ifd) { return ifd->writeImage(ioWrapper, byteOrder); });
tiffcomposite_int.cpp:_ZZNK5Exiv28Internal14TiffImageEntry11doSizeImageEvENK3$_0clINSt3__14pairIPKhmEEEEDaRKT_:
 1436|    109|                               [](const auto& s) { return s.second; });
tiffcomposite_int.cpp:_ZN5Exiv28InternalL11findTagInfoEtNS_5IfdIdE:
 1439|   107k|static const TagInfo* findTagInfo(uint16_t tag, IfdId group) {
 1440|   107k|  const TagInfo* tags = [=] {
 1441|   107k|    if (group == IfdId::gpsId)
 1442|   107k|      return Internal::gpsTagList();
 1443|   107k|    return group == IfdId::exifId ? Internal::exifTagList() : nullptr;
 1444|   107k|  }();
 1445|   107k|  if (tags)
  ------------------
  |  Branch (1445:7): [True: 4.98k, False: 102k]
  ------------------
 1446|   151k|    for (size_t idx = 0; tags[idx].tag_ != 0xffff; ++idx)
  ------------------
  |  Branch (1446:26): [True: 150k, False: 637]
  ------------------
 1447|   150k|      if (tags[idx].tag_ == tag)
  ------------------
  |  Branch (1447:11): [True: 4.34k, False: 146k]
  ------------------
 1448|  4.34k|        return tags + idx;
 1449|   102k|  return nullptr;
 1450|   107k|}
tiffcomposite_int.cpp:_ZZN5Exiv28InternalL11findTagInfoEtNS_5IfdIdEENK3$_0clEv:
 1440|   107k|  const TagInfo* tags = [=] {
 1441|   107k|    if (group == IfdId::gpsId)
  ------------------
  |  Branch (1441:9): [True: 3.83k, False: 103k]
  ------------------
 1442|  3.83k|      return Internal::gpsTagList();
 1443|   103k|    return group == IfdId::exifId ? Internal::exifTagList() : nullptr;
  ------------------
  |  Branch (1443:12): [True: 1.14k, False: 102k]
  ------------------
 1444|   107k|  }();
tiffcomposite_int.cpp:_ZN12_GLOBAL__N_17fillGapERN5Exiv28Internal9IoWrapperEmm:
 1505|   872k|size_t fillGap(Exiv2::Internal::IoWrapper& ioWrapper, size_t curr, size_t tobe) {
 1506|   872k|  if (curr < tobe) {
  ------------------
  |  Branch (1506:7): [True: 428k, False: 444k]
  ------------------
 1507|   428k|    Exiv2::DataBuf buf(tobe - curr);
 1508|   428k|    ioWrapper.write(buf.c_data(), buf.size());
 1509|   428k|    return tobe - curr;
 1510|   428k|  }
 1511|   444k|  return 0;
 1512|   872k|}

_ZN5Exiv28Internal12TiffPathItemC2EjNS_5IfdIdE:
   74|  8.80M|  constexpr TiffPathItem(uint32_t extendedTag, IfdId group) : extendedTag_(extendedTag), group_(group) {
   75|  8.80M|  }
_ZNK5Exiv28Internal12TiffPathItem3tagEv:
   81|  36.8M|  [[nodiscard]] uint16_t tag() const {
   82|  36.8M|    return static_cast<uint16_t>(extendedTag_);
   83|  36.8M|  }
_ZNK5Exiv28Internal12TiffPathItem11extendedTagEv:
   85|  9.35M|  [[nodiscard]] uint32_t extendedTag() const {
   86|  9.35M|    return extendedTag_;
   87|  9.35M|  }
_ZNK5Exiv28Internal12TiffPathItem5groupEv:
   89|  9.16M|  [[nodiscard]] IfdId group() const {
   90|  9.16M|    return group_;
   91|  9.16M|  }
_ZN5Exiv28Internal13TiffComponentC2EtNS_5IfdIdE:
  170|  26.5M|  constexpr TiffComponent(uint16_t tag, IfdId group) : tag_(tag), group_(group) {
  171|  26.5M|  }
_ZN5Exiv28Internal13TiffComponent8setStartEPKh:
  216|  24.2M|  void setStart(const byte* pStart) {
  217|  24.2M|    pStart_ = const_cast<byte*>(pStart);
  218|  24.2M|  }
_ZNK5Exiv28Internal13TiffComponent3tagEv:
  240|   264M|  [[nodiscard]] uint16_t tag() const {
  241|   264M|    return tag_;
  242|   264M|  }
_ZNK5Exiv28Internal13TiffComponent5groupEv:
  244|   104M|  [[nodiscard]] IfdId group() const {
  245|   104M|    return group_;
  246|   104M|  }
_ZNK5Exiv28Internal13TiffComponent5startEv:
  248|  24.4M|  [[nodiscard]] byte* start() const {
  249|  24.4M|    return pStart_;
  250|  24.4M|  }
_ZN5Exiv28Internal13TiffEntryBase9setOffsetEm:
  416|  21.2M|  void setOffset(size_t offset) {
  417|  21.2M|    offset_ = offset;
  418|  21.2M|  }
_ZNK5Exiv28Internal13TiffEntryBase8tiffTypeEv:
  458|  1.46M|  [[nodiscard]] TiffType tiffType() const {
  459|  1.46M|    return tiffType_;
  460|  1.46M|  }
_ZNK5Exiv28Internal13TiffEntryBase6offsetEv:
  465|  70.0k|  [[nodiscard]] size_t offset() const {
  466|  70.0k|    return offset_;
  467|  70.0k|  }
_ZNK5Exiv28Internal13TiffEntryBase5pDataEv:
  476|  37.1M|  [[nodiscard]] const byte* pData() const {
  477|  37.1M|    return pData_;
  478|  37.1M|  }
_ZNK5Exiv28Internal13TiffEntryBase6pValueEv:
  480|  47.7M|  [[nodiscard]] const Value* pValue() const {
  481|  47.7M|    return pValue_.get();
  482|  47.7M|  }
_ZN5Exiv28Internal13TiffEntryBase8setCountEm:
  497|   876k|  void setCount(size_t count) {
  498|   876k|    count_ = count;
  499|   876k|  }
_ZN5Exiv28Internal13TiffEntryBase6setIdxEi:
  501|  21.2M|  void setIdx(int idx) {
  502|  21.2M|    idx_ = idx;
  503|  21.2M|  }
_ZNK5Exiv28Internal13TiffEntryBase7storageEv:
  540|  18.5M|  [[nodiscard]] std::shared_ptr<DataBuf> storage() const {
  541|  18.5M|    return storage_;
  542|  18.5M|  }
_ZNK5Exiv28Internal17TiffDataEntryBase5szTagEv:
  623|  40.9k|  [[nodiscard]] uint16_t szTag() const {
  624|  40.9k|    return szTag_;
  625|  40.9k|  }
_ZNK5Exiv28Internal17TiffDataEntryBase7szGroupEv:
  627|  40.9k|  [[nodiscard]] IfdId szGroup() const {
  628|  40.9k|    return szGroup_;
  629|  40.9k|  }
_ZNK5Exiv28Internal13TiffSizeEntry5dtTagEv:
  789|  53.5k|  [[nodiscard]] uint16_t dtTag() const {
  790|  53.5k|    return dtTag_;
  791|  53.5k|  }
_ZNK5Exiv28Internal13TiffSizeEntry7dtGroupEv:
  793|  53.5k|  [[nodiscard]] IfdId dtGroup() const {
  794|  53.5k|    return dtGroup_;
  795|  53.5k|  }
_ZNK5Exiv28Internal13TiffDirectory7hasNextEv:
  842|  21.4k|  [[nodiscard]] bool hasNext() const {
  843|  21.4k|    return hasNext_;
  844|  21.4k|  }
_ZN5Exiv28Internal16TiffIfdMakernote17setImageByteOrderENS_9ByteOrderE:
 1106|  35.5k|  void setImageByteOrder(ByteOrder byteOrder) {
 1107|  35.5k|    imageByteOrder_ = byteOrder;
 1108|  35.5k|  }
_ZNK5Exiv28Internal8ArrayDefeqEm:
 1217|  22.1M|  bool operator==(size_t idx) const {
 1218|  22.1M|    return idx_ == idx;
 1219|  22.1M|  }
_ZNK5Exiv28Internal8ArrayCfg7tagStepEv:
 1234|  19.5M|  [[nodiscard]] size_t tagStep() const {
 1235|  19.5M|    return elDefaultDef_.size(0, group_);
 1236|  19.5M|  }
_ZN5Exiv28Internal15TiffBinaryArray10setDecodedEb:
 1310|  19.4M|  void setDecoded(bool decoded) {
 1311|  19.4M|    decoded_ = decoded;
 1312|  19.4M|  }
_ZNK5Exiv28Internal15TiffBinaryArray3cfgEv:
 1318|  76.4M|  [[nodiscard]] const ArrayCfg* cfg() const {
 1319|  76.4M|    return arrayCfg_;
 1320|  76.4M|  }
_ZNK5Exiv28Internal15TiffBinaryArray3defEv:
 1322|   130k|  [[nodiscard]] const ArrayDef* def() const {
 1323|   130k|    return arrayDef_;
 1324|   130k|  }
_ZNK5Exiv28Internal15TiffBinaryArray7defSizeEv:
 1326|  70.8k|  [[nodiscard]] size_t defSize() const {
 1327|  70.8k|    return defSize_;
 1328|  70.8k|  }
_ZNK5Exiv28Internal15TiffBinaryArray7decodedEv:
 1330|   274k|  [[nodiscard]] bool decoded() const {
 1331|   274k|    return decoded_;
 1332|   274k|  }
_ZN5Exiv28Internal17TiffBinaryElement8setElDefERKNS0_8ArrayDefE:
 1404|  18.5M|  void setElDef(const ArrayDef& def) {
 1405|  18.5M|    elDef_ = def;
 1406|  18.5M|  }
_ZN5Exiv28Internal17TiffBinaryElement14setElByteOrderENS_9ByteOrderE:
 1410|  18.5M|  void setElByteOrder(ByteOrder byteOrder) {
 1411|  18.5M|    elByteOrder_ = byteOrder;
 1412|  18.5M|  }
_ZNK5Exiv28Internal17TiffBinaryElement5elDefEv:
 1420|  18.6M|  [[nodiscard]] const ArrayDef* elDef() const {
 1421|  18.6M|    return &elDef_;
 1422|  18.6M|  }
_ZNK5Exiv28Internal17TiffBinaryElement11elByteOrderEv:
 1426|  18.6M|  [[nodiscard]] ByteOrder elByteOrder() const {
 1427|  18.6M|    return elByteOrder_;
 1428|  18.6M|  }
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|  33.0k|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|  33.0k|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|  33.0k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE56EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|     70|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|     70|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|     70|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE5EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|    203|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|    203|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|    203|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE21EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|  10.4k|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|  10.4k|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|  10.4k|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE6EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|  1.09k|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|  1.09k|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|  1.09k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE5EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  9.31k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  9.31k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  9.31k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE6EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|     93|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|     93|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|     93|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  3.70k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  3.70k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  3.70k|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  3.08k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  3.08k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  3.08k|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    870|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    870|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    870|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  1.02k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  1.02k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  1.02k|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  9.61k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  9.61k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  9.61k|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE1EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  20.6k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  20.6k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  20.6k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  1.79k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  1.79k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  1.79k|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|  5.68k|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|  5.68k|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|  5.68k|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  1.09k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  1.09k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  1.09k|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  1.15k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  1.15k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  1.15k|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    172|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    172|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    172|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    464|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    464|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    464|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  4.19k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  4.19k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  4.19k|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE9EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  4.74k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  4.74k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  4.74k|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE10EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  1.22k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  1.22k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  1.22k|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE10EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    899|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    899|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    899|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE10EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    445|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    445|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    445|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE10EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    390|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    390|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    390|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE10EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  3.35k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  3.35k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  3.35k|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE10EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  4.52k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  4.52k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  4.52k|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE11EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  1.22k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  1.22k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  1.22k|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE11EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  1.01k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  1.01k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  1.01k|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE11EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    477|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    477|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    477|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE11EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    444|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    444|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    444|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE11EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  2.97k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  2.97k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  2.97k|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE11EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  3.51k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  3.51k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  3.51k|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE12EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    867|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    867|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    867|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE12EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    937|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    937|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    937|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE12EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    417|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    417|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    417|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE12EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    370|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    370|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    370|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE12EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  2.71k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  2.71k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  2.71k|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE12EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|  3.85k|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|  3.85k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|  3.85k|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE13EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    330|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    330|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    330|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE13EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    518|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    518|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    518|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE13EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    505|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    505|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    505|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE13EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    790|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    790|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    790|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE13EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|  1.15k|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|  1.15k|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|  1.15k|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE13EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    823|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    823|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    823|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE14EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    477|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    477|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    477|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE14EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    283|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    283|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    283|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE14EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    546|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    546|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    546|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE14EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    450|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    450|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    450|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE14EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    813|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    813|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    813|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE14EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    727|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    727|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    727|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE15EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    372|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    372|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    372|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE15EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    408|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    408|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    408|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE15EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    473|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    473|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    473|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE15EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    651|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    651|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    651|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE15EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    954|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    954|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    954|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE15EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    977|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    977|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    977|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE16EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    427|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    427|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    427|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE16EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    420|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    420|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    420|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE16EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    506|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    506|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    506|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE16EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    476|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    476|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    476|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE16EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    509|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    509|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    509|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE16EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    426|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    426|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    426|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE17EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    240|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    240|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    240|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE17EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    416|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    416|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    416|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE17EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    501|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    501|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    501|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE17EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    476|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    476|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    476|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE17EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    492|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    492|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    492|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE17EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    432|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    432|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    432|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE7EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    991|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    991|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    991|}
_ZN5Exiv28Internal16newTiffThumbDataILt279ELNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|    240|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|    240|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|    240|}
_ZN5Exiv28Internal16newTiffThumbSizeILt273ELNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|    259|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|    259|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|    259|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    342|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    342|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    342|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    578|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    578|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    578|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    120|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    120|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    120|}
_ZN5Exiv28Internal16newTiffThumbDataILt514ELNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|  1.53k|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|  1.53k|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|  1.53k|}
_ZN5Exiv28Internal16newTiffThumbSizeILt513ELNS_5IfdIdE2EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|  2.12k|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|  2.12k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|  2.12k|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE3EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|    453|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|    453|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|    453|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    234|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    234|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    234|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    251|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    251|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    251|}
_ZN5Exiv28Internal16newTiffImageDataILt325ELNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    147|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    147|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    147|}
_ZN5Exiv28Internal16newTiffImageSizeILt324ELNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    239|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    239|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    239|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    299|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    299|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    299|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE18EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    445|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    445|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    445|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE3EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|     72|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|     72|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|     72|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE3EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    156|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    156|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    156|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE3EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    159|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    159|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    159|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE3EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    215|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    215|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    215|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE4EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|     78|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|     78|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|     78|}
_ZN5Exiv28Internal16newTiffImageDataILt279ELNS_5IfdIdE4EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|     52|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|     52|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|     52|}
_ZN5Exiv28Internal16newTiffImageSizeILt273ELNS_5IfdIdE4EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    214|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    214|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    214|}
_ZN5Exiv28Internal16newTiffImageDataILt514ELNS_5IfdIdE4EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    121|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    121|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    121|}
_ZN5Exiv28Internal16newTiffImageSizeILt513ELNS_5IfdIdE4EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    357|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    357|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    357|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10minoCsoCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|  21.1k|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|  21.1k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|  21.1k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10minoCsnCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|  4.43k|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|  4.43k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|  4.43k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE100EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    323|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    323|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    323|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE99EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  10.1k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  10.1k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  10.1k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE101EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    866|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    866|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    866|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE102EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    150|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    150|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    150|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE103EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    633|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    633|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    633|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE104EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    141|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    141|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    141|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE105EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  1.17k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  1.17k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  1.17k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE106EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    174|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    174|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    174|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE107EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    485|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    485|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    485|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE108EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    395|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    395|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    395|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE109EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  1.55k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  1.55k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  1.55k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE110EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    461|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    461|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    461|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE111EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    216|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    216|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    216|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE112EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  3.47k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  3.47k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  3.47k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE113EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  6.96k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  6.96k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  6.96k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE114EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|  3.08k|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|  3.08k|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|  3.08k|}
_ZN5Exiv28Internal16newTiffImageDataILt258ELNS_5IfdIdE99EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1531|    660|TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group) {
 1532|    660|  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
 1533|    660|}
_ZN5Exiv28Internal16newTiffImageSizeILt257ELNS_5IfdIdE99EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1537|    338|TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group) {
 1538|       |  // Todo: Same as newTiffThumbSize - consolidate (rename)?
 1539|    338|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1540|    338|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10canonCsCfgEELm1ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10canonCsDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|  12.2k|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|  12.2k|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|  12.2k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|  12.2k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonSiCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|  2.16k|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|  2.16k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|  2.16k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonPaCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|  1.05k|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|  1.05k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|  1.05k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonCfCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    792|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    792|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    792|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonPiCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    520|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    520|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    520|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonTiCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    582|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    582|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    582|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10canonFiCfgEELm1ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10canonFiDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    781|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    781|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    781|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    781|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonPrCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    186|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    186|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    186|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L15canonAfMiAdjCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|     84|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|     84|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|     84|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L15canonVigCor2CfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|     23|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|     23|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|     23|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L12canonLiOpCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    235|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    235|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    235|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10canonLeCfgEELm2ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10canonLeDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|     29|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|     29|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|     29|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|     29|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonAmCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    244|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    244|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    244|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L10canonMeCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    105|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    105|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    105|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L11canonFilCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|     48|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|     48|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|     48|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L11canonHdrCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    222|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    222|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    222|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L11canonAfCCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    958|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    958|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    958|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L12canonRawBCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|     84|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|     84|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|     84|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE65EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    207|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    207|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    207|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonVrCfgEELm2ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonVrDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    113|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    113|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    113|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    113|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonPcCfgEELm13ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonPcDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    168|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    168|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    168|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    168|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonWtCfgEELm3ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonWtDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    222|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    222|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    222|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    222|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonIiCfgEELm5ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonIiDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    166|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    166|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    166|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    166|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonAfCfgEELm3ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonAfDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    159|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    159|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    159|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    159|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm6ETnRAT__KNS0_8ArraySetEL_ZNS0_L10nikonSiSetEEXadL_ZNS0_13nikonSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    170|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    170|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    170|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    170|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm6ETnRAT__KNS0_8ArraySetEL_ZNS0_L10nikonCbSetEEXadL_ZNS0_13nikonSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    230|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    230|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    230|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    230|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm4ETnRAT__KNS0_8ArraySetEL_ZNS0_L10nikonLdSetEEXadL_ZNS0_13nikonSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    244|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    244|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    244|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    244|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm5ETnRAT__KNS0_8ArraySetEL_ZNS0_L10nikonFlSetEEXadL_ZNS0_13nikonSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    227|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    227|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    227|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    227|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonMeCfgEELm4ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonMeDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    142|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    142|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    142|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    142|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm2ETnRAT__KNS0_8ArraySetEL_ZNS0_L11nikonAf2SetEEXadL_ZNS0_13nikonSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|     76|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|     76|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|     76|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|     76|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10nikonFiCfgEELm3ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10nikonFiDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    360|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    360|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    360|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    360|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L11nikonAFTCfgEELm3ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L11nikonAFTDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    220|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    220|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    220|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    220|}
_ZN5Exiv28Internal16newTiffThumbDataILt514ELNS_5IfdIdE65EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|    106|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|    106|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|    106|}
_ZN5Exiv28Internal16newTiffThumbSizeILt513ELNS_5IfdIdE65EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|    126|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|    126|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|    126|}
_ZN5Exiv28Internal16newTiffThumbSizeILt4ELNS_5IfdIdE117EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|  2.70k|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|  2.70k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|  2.70k|}
_ZN5Exiv28Internal16newTiffThumbDataILt3ELNS_5IfdIdE117EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|  3.37k|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|  3.37k|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|  3.37k|}
_ZN5Exiv28Internal16newTiffThumbSizeILt4ELNS_5IfdIdE116EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|  1.90k|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|  1.90k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|  1.90k|}
_ZN5Exiv28Internal16newTiffThumbDataILt3ELNS_5IfdIdE116EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|  1.90k|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|  1.90k|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|  1.90k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L12samsungPwCfgEELm5ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L12samsungPwDefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|  4.81k|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|  4.81k|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|  4.81k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|  4.81k|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE119EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    407|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    407|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    407|}
_ZN5Exiv28Internal16newTiffThumbDataILt514ELNS_5IfdIdE119EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|  2.14k|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|  2.14k|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|  2.14k|}
_ZN5Exiv28Internal16newTiffThumbSizeILt513ELNS_5IfdIdE119EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|  3.07k|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|  3.07k|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|  3.07k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm1ETnRAT__KNS0_8ArraySetEL_ZNS0_L12sony2010eSetEEXadL_ZNS0_17sony2010eSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|     87|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|     87|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|     87|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|     87|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm1ETnRAT__KNS0_8ArraySetEL_ZNS0_L10sony2FpSetEEXadL_ZNS0_15sony2FpSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    742|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    742|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    742|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    742|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm1ETnRAT__KNS0_8ArraySetEL_ZNS0_L13sonyMisc2bSetEEXadL_ZNS0_18sonyMisc2bSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    155|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    155|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    155|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    155|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm1ETnRAT__KNS0_8ArraySetEL_ZNS0_L13sonyMisc3cSetEEXadL_ZNS0_18sonyMisc3cSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    426|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    426|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    426|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    426|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L12sonyMisc1CfgEELm1ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L12sonyMisc1DefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    161|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    161|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    161|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    161|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L13sonySInfo1CfgEELm5ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L13sonySInfo1DefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|  1.08k|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|  1.08k|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|  1.08k|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|  1.08k|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm2ETnRAT__KNS0_8ArraySetEL_ZNS0_L10sony1CsSetEEXadL_ZNS0_14sonyCsSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    711|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    711|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    711|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    711|}
_ZN5Exiv28Internal13newTiffSubIfdILNS_5IfdIdE124EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1493|    271|TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group) {
 1494|    271|  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
 1495|    271|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray2ILm2ETnRAT__KNS0_8ArraySetEL_ZNS0_L10sony2CsSetEEXadL_ZNS0_14sonyCsSelectorEtPKhmPNS0_13TiffComponentEEEEENSt3__110unique_ptrIS8_NSA_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1512|    835|TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group) {
 1513|    835|  static_assert(N > 0, "Passed zero length newTiffBinaryArray2");
 1514|    835|  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
 1515|    835|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L12sony1MCsoCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    531|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    531|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    531|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray1IL_ZNS0_L12sony1MCsnCfgEEEENSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEEtNS_5IfdIdE:
 1506|    420|TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group) {
 1507|    420|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
 1508|    420|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L12sony1MCs7CfgEELm2ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10minoCs7DefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    384|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    384|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    384|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    384|}
_ZN5Exiv28Internal16newTiffThumbDataILt137ELNS_5IfdIdE124EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|    293|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|    293|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|    293|}
_ZN5Exiv28Internal16newTiffThumbSizeILt136ELNS_5IfdIdE124EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|     16|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|     16|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|     16|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L15sony1MCsA100CfgEELm3ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L15sony1MCsA100DefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    260|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    260|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    260|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    260|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10minoCs7CfgEELm2ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10minoCs7DefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    836|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    836|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    836|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    836|}
_ZN5Exiv28Internal16newTiffThumbDataILt137ELNS_5IfdIdE57EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1519|     24|TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group) {
 1520|     24|  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
 1521|     24|}
_ZN5Exiv28Internal16newTiffThumbSizeILt136ELNS_5IfdIdE57EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1525|     48|TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group) {
 1526|     48|  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
 1527|     48|}
tiffimage_int.cpp:_ZN5Exiv28Internal19newTiffBinaryArray0IL_ZNS0_L10minoCs5CfgEELm1ETnRAT0__KNS0_8ArrayDefEL_ZNS0_L10minoCs5DefEEEENSt3__110unique_ptrINS0_13TiffComponentENS6_14default_deleteIS8_EEEEtNS_5IfdIdE:
 1499|    148|TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group) {
 1500|    148|  static_assert(N > 0, "Passed zero length newTiffBinaryArray0");
 1501|    148|  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
 1502|    148|}
_ZN5Exiv28Internal16newTiffDirectoryILNS_5IfdIdE19EEENSt3__110unique_ptrINS0_13TiffComponentENS3_14default_deleteIS5_EEEEtS2_:
 1487|  2.26k|TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId /*group*/) {
 1488|  2.26k|  return std::make_unique<TiffDirectory>(tag, newGroup);
 1489|  2.26k|}
_ZN5Exiv28Internal13TiffComponentD2Ev:
  173|  26.5M|  virtual ~TiffComponent() = default;
_ZN5Exiv28Internal13TiffDirectoryD2Ev:
  830|   140k|  ~TiffDirectory() override = default;
_ZN5Exiv28Internal10TiffSubIfdD2Ev:
  937|  43.4k|  ~TiffSubIfd() override = default;
_ZN5Exiv28Internal15TiffBinaryArrayD2Ev:
 1269|  60.0k|  ~TiffBinaryArray() override = default;

_ZN5Exiv29TiffImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   44|  13.7k|    Image(ImageType::tiff, mdExif | mdIptc | mdXmp, std::move(io), params) {
   45|  13.7k|}  // TiffImage::TiffImage
_ZNK5Exiv29TiffImage12primaryGroupEv:
   76|    225|std::string TiffImage::primaryGroup() const {
   77|    225|  if (!primaryGroup_.empty())
  ------------------
  |  Branch (77:7): [True: 110, False: 115]
  ------------------
   78|    110|    return primaryGroup_;
   79|       |
   80|    115|  static constexpr auto keys = std::array{
   81|    115|      "Exif.Image.NewSubfileType",     "Exif.SubImage1.NewSubfileType", "Exif.SubImage2.NewSubfileType",
   82|    115|      "Exif.SubImage3.NewSubfileType", "Exif.SubImage4.NewSubfileType", "Exif.SubImage5.NewSubfileType",
   83|    115|      "Exif.SubImage6.NewSubfileType", "Exif.SubImage7.NewSubfileType", "Exif.SubImage8.NewSubfileType",
   84|    115|      "Exif.SubImage9.NewSubfileType",
   85|    115|  };
   86|       |  // Find the group of the primary image, default to "Image"
   87|    115|  primaryGroup_ = std::string("Image");
   88|  1.07k|  for (auto i : keys) {
  ------------------
  |  Branch (88:15): [True: 1.07k, False: 105]
  ------------------
   89|  1.07k|    auto md = exifData_.findKey(ExifKey(i));
   90|       |    // Is it the primary image?
   91|  1.07k|    if (md != exifData_.end() && md->count() > 0 && md->toInt64() == 0) {
  ------------------
  |  Branch (91:9): [True: 65, False: 1.00k]
  |  Branch (91:9): [True: 37, False: 1.03k]
  |  Branch (91:34): [True: 47, False: 18]
  |  Branch (91:53): [True: 37, False: 10]
  ------------------
   92|       |      // Sometimes there is a JPEG primary image; that's not our first choice
   93|     37|      primaryGroup_ = md->groupName();
   94|     37|      std::string key = "Exif." + primaryGroup_ + ".JPEGInterchangeFormat";
   95|     37|      if (exifData_.findKey(ExifKey(key)) == exifData_.end())
  ------------------
  |  Branch (95:11): [True: 10, False: 27]
  ------------------
   96|     10|        break;
   97|     37|    }
   98|  1.07k|  }
   99|    115|  return primaryGroup_;
  100|    225|}
_ZNK5Exiv29TiffImage10pixelWidthEv:
  102|    115|uint32_t TiffImage::pixelWidth() const {
  103|    115|  if (pixelWidthPrimary_ != 0) {
  ------------------
  |  Branch (103:7): [True: 0, False: 115]
  ------------------
  104|      0|    return pixelWidthPrimary_;
  105|      0|  }
  106|       |
  107|    115|  ExifKey key(std::string("Exif.") + primaryGroup() + std::string(".ImageWidth"));
  108|    115|  auto imageWidth = exifData_.findKey(key);
  109|    115|  if (imageWidth != exifData_.end() && imageWidth->count() > 0) {
  ------------------
  |  Branch (109:7): [True: 76, False: 39]
  |  Branch (109:7): [True: 25, False: 90]
  |  Branch (109:40): [True: 25, False: 51]
  ------------------
  110|     25|    pixelWidthPrimary_ = imageWidth->toUint32();
  111|     25|  }
  112|    115|  return pixelWidthPrimary_;
  113|    115|}
_ZNK5Exiv29TiffImage11pixelHeightEv:
  115|    110|uint32_t TiffImage::pixelHeight() const {
  116|    110|  if (pixelHeightPrimary_ != 0) {
  ------------------
  |  Branch (116:7): [True: 0, False: 110]
  ------------------
  117|      0|    return pixelHeightPrimary_;
  118|      0|  }
  119|       |
  120|    110|  ExifKey key(std::string("Exif.") + primaryGroup() + std::string(".ImageLength"));
  121|    110|  auto imageHeight = exifData_.findKey(key);
  122|    110|  if (imageHeight != exifData_.end() && imageHeight->count() > 0) {
  ------------------
  |  Branch (122:7): [True: 37, False: 73]
  |  Branch (122:7): [True: 22, False: 88]
  |  Branch (122:41): [True: 22, False: 15]
  ------------------
  123|     22|    pixelHeightPrimary_ = imageHeight->toUint32();
  124|     22|  }
  125|    110|  return pixelHeightPrimary_;
  126|    110|}
_ZN5Exiv29TiffImage12readMetadataEv:
  133|  13.7k|void TiffImage::readMetadata() {
  134|       |#ifdef EXIV2_DEBUG_MESSAGES
  135|       |  std::cerr << "Reading TIFF file " << io_->path() << "\n";
  136|       |#endif
  137|  13.7k|  if (io_->open() != 0) {
  ------------------
  |  Branch (137:7): [True: 0, False: 13.7k]
  ------------------
  138|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  139|      0|  }
  140|       |
  141|  13.7k|  IoCloser closer(*io_);
  142|       |  // Ensure that this is the correct image type
  143|  13.7k|  if (!isTiffType(*io_, false)) {
  ------------------
  |  Branch (143:7): [True: 0, False: 13.7k]
  ------------------
  144|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (144:9): [True: 0, False: 0]
  |  Branch (144:25): [True: 0, False: 0]
  ------------------
  145|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  146|      0|    throw Error(ErrorCode::kerNotAnImage, "TIFF");
  147|      0|  }
  148|  13.7k|  clearMetadata();
  149|       |
  150|  13.7k|  const DecodeParams dp(max_recursion_depth_);
  151|  13.7k|  ByteOrder bo = TiffParser::decode(exifData_, iptcData_, xmpData_, io_->mmap(), io_->size(), dp);
  152|  13.7k|  setByteOrder(bo);
  153|       |
  154|       |  // read profile from the metadata
  155|  13.7k|  Exiv2::ExifKey key("Exif.Image.InterColorProfile");
  156|  13.7k|  auto pos = exifData_.findKey(key);
  157|  13.7k|  if (pos != exifData_.end()) {
  ------------------
  |  Branch (157:7): [True: 48, False: 13.6k]
  ------------------
  158|     48|    size_t size = pos->count() * pos->typeSize();
  159|     48|    if (size == 0) {
  ------------------
  |  Branch (159:9): [True: 22, False: 26]
  ------------------
  160|     22|      throw Error(ErrorCode::kerFailedToReadImageData);
  161|     22|    }
  162|     26|    iccProfile_.alloc(size);
  163|     26|    pos->copy(iccProfile_.data(), bo);
  164|     26|  }
  165|  13.7k|}
_ZN5Exiv210TiffParser6decodeERNS_8ExifDataERNS_8IptcDataERNS_7XmpDataEPKhmRKNS_12DecodeParamsE:
  211|  14.9k|                             const DecodeParams& dp) {
  212|  14.9k|  uint32_t root = Tag::root;
  213|       |
  214|       |  // #1402  Fujifilm RAF. Change root when parsing embedded tiff
  215|  14.9k|  Exiv2::ExifKey key("Exif.Image.Make");
  216|  14.9k|  if (exifData.findKey(key) != exifData.end() && exifData.findKey(key)->toString() == "FUJIFILM") {
  ------------------
  |  Branch (216:7): [True: 26, False: 14.9k]
  |  Branch (216:7): [True: 0, False: 14.9k]
  |  Branch (216:50): [True: 0, False: 26]
  ------------------
  217|      0|    root = Tag::fuji;
  218|      0|  }
  219|       |
  220|  14.9k|  return TiffParserWorker::decode(exifData, iptcData, xmpData, pData, size, root, TiffMapping::findDecoder, dp);
  221|  14.9k|}  // TiffParser::decode
_ZN5Exiv210TiffParser6encodeERNS_7BasicIoEPKhmNS_9ByteOrderERNS_8ExifDataERKNS_8IptcDataERKNS_7XmpDataE:
  224|  2.26k|                               const IptcData& iptcData, const XmpData& xmpData) {
  225|       |  // Delete IFDs which do not occur in TIFF images
  226|  2.26k|  static constexpr auto filteredIfds = std::array{
  227|  2.26k|      IfdId::panaRawId,
  228|  2.26k|  };
  229|  2.26k|  for (auto filteredIfd : filteredIfds) {
  ------------------
  |  Branch (229:25): [True: 2.26k, False: 2.26k]
  ------------------
  230|       |#ifdef EXIV2_DEBUG_MESSAGES
  231|       |    std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
  232|       |#endif
  233|  2.26k|    exifData.erase(std::remove_if(exifData.begin(), exifData.end(), FindExifdatum(filteredIfd)), exifData.end());
  234|  2.26k|  }
  235|       |
  236|  2.26k|  TiffHeader header(byteOrder);
  237|  2.26k|  return TiffParserWorker::encode(io, pData, size, exifData, iptcData, xmpData, Tag::root, TiffMapping::findEncoder,
  238|  2.26k|                                  &header, nullptr);
  239|  2.26k|}  // TiffParser::encode
_ZN5Exiv215newTiffInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  243|  13.7k|Image::UniquePtr newTiffInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  244|  13.7k|  auto image = std::make_unique<TiffImage>(std::move(io), params);
  245|  13.7k|  if (!image->good()) {
  ------------------
  |  Branch (245:7): [True: 0, False: 13.7k]
  ------------------
  246|      0|    return nullptr;
  247|      0|  }
  248|  13.7k|  return image;
  249|  13.7k|}
_ZN5Exiv210isTiffTypeERNS_7BasicIoEb:
  251|   148k|bool isTiffType(BasicIo& iIo, bool advance) {
  252|   148k|  const int32_t len = 8;
  253|   148k|  byte buf[len];
  254|   148k|  iIo.read(buf, len);
  255|   148k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (255:7): [True: 0, False: 148k]
  |  Branch (255:22): [True: 719, False: 147k]
  ------------------
  256|    719|    return false;
  257|    719|  }
  258|   147k|  TiffHeader tiffHeader;
  259|   147k|  bool rc = tiffHeader.read(buf, len);
  260|   147k|  if (!advance || !rc) {
  ------------------
  |  Branch (260:7): [True: 147k, False: 0]
  |  Branch (260:19): [True: 0, False: 0]
  ------------------
  261|   147k|    iIo.seek(-len, BasicIo::cur);
  262|   147k|  }
  263|   147k|  return rc;
  264|   148k|}
_ZN5Exiv29TiffImage14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  266|  26.6k|void TiffImage::printStructure(std::ostream& out, Exiv2::PrintStructureOption option, size_t depth) {
  267|  26.6k|  if (io_->open() != 0)
  ------------------
  |  Branch (267:7): [True: 0, False: 26.6k]
  ------------------
  268|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  269|       |  // Ensure that this is the correct image type
  270|  26.6k|  if (imageType() == ImageType::none && !isTiffType(*io_, false)) {
  ------------------
  |  Branch (270:7): [True: 0, False: 26.6k]
  |  Branch (270:41): [True: 0, False: 0]
  ------------------
  271|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (271:9): [True: 0, False: 0]
  |  Branch (271:25): [True: 0, False: 0]
  ------------------
  272|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  273|      0|    throw Error(ErrorCode::kerNotAJpeg);
  274|      0|  }
  275|       |
  276|  26.6k|  io_->seek(0, BasicIo::beg);
  277|       |
  278|  26.6k|  printTiffStructure(io(), out, option, depth);
  279|  26.6k|}

_ZNK5Exiv28Internal13FindExifdatumclERKNS_9ExifdatumE:
   29|  15.5M|bool FindExifdatum::operator()(const Exiv2::Exifdatum& md) const {
   30|  15.5M|  return ifdId_ == md.ifdId();
   31|  15.5M|}
_ZN5Exiv28Internal11TiffMapping11findDecoderENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEjNS_5IfdIdE:
 1991|  21.1M|DecoderFct TiffMapping::findDecoder(std::string_view make, uint32_t extendedTag, IfdId group) {
 1992|  21.1M|  DecoderFct decoderFct = &TiffDecoder::decodeStdTiffEntry;
 1993|  21.1M|  if (auto td = Exiv2::find(tiffMappingInfo_, TiffMappingInfo::Key{make, extendedTag, group})) {
  ------------------
  |  Branch (1993:12): [True: 4.66k, False: 21.1M]
  ------------------
 1994|       |    // This may set decoderFct to 0, meaning that the tag should not be decoded
 1995|  4.66k|    decoderFct = td->decoderFct_;
 1996|  4.66k|  }
 1997|  21.1M|  return decoderFct;
 1998|  21.1M|}
_ZN5Exiv28Internal11TiffMapping11findEncoderENSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEjNS_5IfdIdE:
 2000|  2.26M|EncoderFct TiffMapping::findEncoder(std::string_view make, uint32_t extendedTag, IfdId group) {
 2001|  2.26M|  EncoderFct encoderFct = nullptr;
 2002|  2.26M|  if (auto td = Exiv2::find(tiffMappingInfo_, TiffMappingInfo::Key{make, extendedTag, group})) {
  ------------------
  |  Branch (2002:12): [True: 746, False: 2.26M]
  ------------------
 2003|       |    // Returns 0 if no special encoder function is found
 2004|    746|    encoderFct = td->encoderFct_;
 2005|    746|  }
 2006|  2.26M|  return encoderFct;
 2007|  2.26M|}
_ZN5Exiv28Internal11TiffCreator6createEjNS_5IfdIdE:
 2009|  26.5M|TiffComponent::UniquePtr TiffCreator::create(uint32_t extendedTag, IfdId group) {
 2010|  26.5M|  auto tag = static_cast<uint16_t>(extendedTag);
 2011|  26.5M|  auto i = tiffGroupTable_.find(TiffGroupKey(extendedTag, group));
 2012|       |  // If the lookup failed then try again with Tag::all.
 2013|  26.5M|  if (i == tiffGroupTable_.end()) {
  ------------------
  |  Branch (2013:7): [True: 26.2M, False: 337k]
  ------------------
 2014|  26.2M|    i = tiffGroupTable_.find(TiffGroupKey(Tag::all, group));
 2015|  26.2M|  }
 2016|  26.5M|  if (i != tiffGroupTable_.end() && i->second) {
  ------------------
  |  Branch (2016:7): [True: 26.4M, False: 58.3k]
  |  Branch (2016:7): [True: 26.4M, False: 68.8k]
  |  Branch (2016:37): [True: 26.4M, False: 10.4k]
  ------------------
 2017|  26.4M|    return i->second(tag, group);
 2018|  26.4M|  }
 2019|       |#ifdef EXIV2_DEBUG_MESSAGES
 2020|       |  if (i == tiffGroupTable_.end())
 2021|       |    std::cerr << "Warning: No TIFF structure entry found for ";
 2022|       |  else
 2023|       |    std::cerr << "Warning: No TIFF component creator found for ";
 2024|       |  std::cerr << "extended tag 0x" << std::setw(4) << std::setfill('0') << std::hex << std::right << extendedTag
 2025|       |            << ", group " << groupName(group) << "\n";
 2026|       |#endif
 2027|  68.8k|  return nullptr;
 2028|  26.5M|}  // TiffCreator::create
_ZN5Exiv28Internal11TiffCreator7getPathEjNS_5IfdIdEj:
 2030|  2.27M|TiffPath TiffCreator::getPath(uint32_t extendedTag, IfdId group, uint32_t root) {
 2031|  2.27M|  TiffPath ret;
 2032|  8.80M|  while (true) {
  ------------------
  |  Branch (2032:10): [True: 8.80M, Folded]
  ------------------
 2033|  8.80M|    ret.emplace(extendedTag, group);
 2034|  8.80M|    const auto ts = tiffTreeTable_.find(TiffGroupKey(root, group));
 2035|  8.80M|    assert(ts != tiffTreeTable_.end());
 2036|  8.80M|    extendedTag = ts->second.second;
 2037|  8.80M|    group = ts->second.first;
 2038|  8.80M|    if (ts->first == TiffGroupKey(root, IfdId::ifdIdNotSet)) {
  ------------------
  |  Branch (2038:9): [True: 2.27M, False: 6.52M]
  ------------------
 2039|  2.27M|      break;
 2040|  2.27M|    }
 2041|  8.80M|  }
 2042|  2.27M|  return ret;
 2043|  2.27M|}
_ZN5Exiv28Internal16TiffParserWorker6decodeERNS_8ExifDataERNS_8IptcDataERNS_7XmpDataEPKhmjPFMNS0_11TiffDecoderEFvPKNS0_13TiffEntryBaseEENSt3__117basic_string_viewIcNSG_11char_traitsIcEEEEjNS_5IfdIdEERKNS_12DecodeParamsEPNS0_14TiffHeaderBaseE:
 2047|  39.1k|                                   TiffHeaderBase* pHeader) {
 2048|       |  // Create standard TIFF header if necessary
 2049|  39.1k|  std::unique_ptr<TiffHeaderBase> ph;
 2050|  39.1k|  if (!pHeader) {
  ------------------
  |  Branch (2050:7): [True: 36.0k, False: 3.06k]
  ------------------
 2051|  36.0k|    ph = std::make_unique<TiffHeader>();
 2052|  36.0k|    pHeader = ph.get();
 2053|  36.0k|  }
 2054|       |
 2055|  39.1k|  if (auto rootDir = parse(pData, size, root, pHeader)) {
  ------------------
  |  Branch (2055:12): [True: 38.8k, False: 280]
  ------------------
 2056|  38.8k|    auto decoder = TiffDecoder(exifData, iptcData, xmpData, rootDir.get(), findDecoderFct, dp);
 2057|  38.8k|    rootDir->accept(decoder);
 2058|  38.8k|  }
 2059|  39.1k|  return pHeader->byteOrder();
 2060|       |
 2061|  39.1k|}  // TiffParserWorker::decode
_ZN5Exiv28Internal16TiffParserWorker6encodeERNS_7BasicIoEPKhmRKNS_8ExifDataERKNS_8IptcDataERKNS_7XmpDataEjPFMNS0_11TiffEncoderEFvPNS0_13TiffEntryBaseEPKNS_9ExifdatumEENSt3__117basic_string_viewIcNSN_11char_traitsIcEEEEjNS_5IfdIdEEPNS0_14TiffHeaderBaseEPNS0_12OffsetWriterE:
 2066|  7.65k|                                     OffsetWriter* pOffsetWriter) {
 2067|       |  /*
 2068|       |     1) parse the binary image, if one is provided, and
 2069|       |     2) attempt updating the parsed tree in-place ("non-intrusive writing")
 2070|       |     3) else, create a new tree and write a new TIFF structure ("intrusive
 2071|       |        writing"). If there is a parsed tree, it is only used to access the
 2072|       |        image data in this case.
 2073|       |   */
 2074|  7.65k|  WriteMethod writeMethod = wmIntrusive;
 2075|  7.65k|  auto parsedTree = parse(pData, size, root, pHeader);
 2076|  7.65k|  auto primaryGroups = findPrimaryGroups(parsedTree);
 2077|  7.65k|  if (parsedTree) {
  ------------------
  |  Branch (2077:7): [True: 656, False: 7.00k]
  ------------------
 2078|       |    // Attempt to update existing TIFF components based on metadata entries
 2079|    656|    TiffEncoder encoder(exifData, iptcData, xmpData, parsedTree.get(), false, primaryGroups, pHeader, findEncoderFct);
 2080|    656|    parsedTree->accept(encoder);
 2081|    656|    if (!encoder.dirty())
  ------------------
  |  Branch (2081:9): [True: 47, False: 609]
  ------------------
 2082|     47|      writeMethod = wmNonIntrusive;
 2083|    656|  }
 2084|  7.65k|  if (writeMethod == wmIntrusive) {
  ------------------
  |  Branch (2084:7): [True: 7.60k, False: 47]
  ------------------
 2085|  7.60k|    auto createdTree = TiffCreator::create(root, IfdId::ifdIdNotSet);
 2086|  7.60k|    if (parsedTree) {
  ------------------
  |  Branch (2086:9): [True: 609, False: 7.00k]
  ------------------
 2087|       |      // Copy image tags from the original image to the composite
 2088|    609|      TiffCopier copier(createdTree.get(), root, pHeader, primaryGroups);
 2089|    609|      parsedTree->accept(copier);
 2090|    609|    }
 2091|       |    // Add entries from metadata to composite
 2092|  7.60k|    TiffEncoder encoder(exifData, iptcData, xmpData, createdTree.get(), !parsedTree, std::move(primaryGroups), pHeader,
 2093|  7.60k|                        findEncoderFct);
 2094|  7.60k|    encoder.add(createdTree.get(), std::move(parsedTree), root);
 2095|       |    // Write binary representation from the composite tree
 2096|  7.60k|    DataBuf header = pHeader->write();
 2097|  7.60k|    auto tempIo = MemIo();
 2098|  7.60k|    IoWrapper ioWrapper(tempIo, header.c_data(), header.size(), pOffsetWriter);
 2099|  7.60k|    auto imageIdx(std::string::npos);
 2100|  7.60k|    createdTree->write(ioWrapper, pHeader->byteOrder(), header.size(), std::string::npos, std::string::npos, imageIdx);
 2101|  7.60k|    if (pOffsetWriter)
  ------------------
  |  Branch (2101:9): [True: 0, False: 7.60k]
  ------------------
 2102|      0|      pOffsetWriter->writeOffsets(tempIo);
 2103|  7.60k|    io.transfer(tempIo);  // may throw
 2104|  7.60k|#ifndef SUPPRESS_WARNINGS
 2105|  7.60k|    EXV_INFO << "Write strategy: Intrusive\n";
  ------------------
  |  |  134|  7.60k|  if (LogMsg::info >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (134:7): [True: 0, False: 7.60k]
  |  |  |  Branch (134:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  135|  7.60k|  LogMsg(LogMsg::info).os()
  ------------------
 2106|  7.60k|#endif
 2107|  7.60k|  }
 2108|     47|#ifndef SUPPRESS_WARNINGS
 2109|     47|  else {
 2110|     47|    EXV_INFO << "Write strategy: Non-intrusive\n";
  ------------------
  |  |  134|     47|  if (LogMsg::info >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (134:7): [True: 0, False: 47]
  |  |  |  Branch (134:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  135|     47|  LogMsg(LogMsg::info).os()
  ------------------
 2111|     47|  }
 2112|  7.65k|#endif
 2113|  7.65k|  return writeMethod;
 2114|  7.65k|}  // TiffParserWorker::encode
_ZN5Exiv28Internal16TiffParserWorker5parseEPKhmjPNS0_14TiffHeaderBaseE:
 2117|  46.7k|                                                 TiffHeaderBase* pHeader) {
 2118|  46.7k|  TiffComponent::UniquePtr rootDir;
 2119|  46.7k|  if (!pData || size == 0)
  ------------------
  |  Branch (2119:7): [True: 7.15k, False: 39.6k]
  |  Branch (2119:17): [True: 0, False: 39.6k]
  ------------------
 2120|  7.15k|    return rootDir;
 2121|  39.6k|  if (!pHeader->read(pData, size) || pHeader->offset() >= size) {
  ------------------
  |  Branch (2121:7): [True: 50, False: 39.5k]
  |  Branch (2121:38): [True: 67, False: 39.4k]
  ------------------
 2122|    117|    throw Error(ErrorCode::kerNotAnImage, "TIFF");
 2123|    117|  }
 2124|  39.4k|  rootDir = TiffCreator::create(root, IfdId::ifdIdNotSet);
 2125|  39.4k|  if (rootDir) {
  ------------------
  |  Branch (2125:7): [True: 39.4k, False: 0]
  ------------------
 2126|  39.4k|    rootDir->setStart(pData + pHeader->offset());
 2127|  39.4k|    auto state = TiffRwState{pHeader->byteOrder(), 0};
 2128|  39.4k|    auto reader = TiffReader{pData, size, rootDir.get(), state};
 2129|  39.4k|    rootDir->accept(reader);
 2130|  39.4k|    reader.postProcess();
 2131|  39.4k|  }
 2132|  39.4k|  return rootDir;
 2133|       |
 2134|  39.6k|}  // TiffParserWorker::parse
_ZN5Exiv28Internal16TiffParserWorker17findPrimaryGroupsERKNSt3__110unique_ptrINS0_13TiffComponentENS2_14default_deleteIS4_EEEE:
 2136|  7.65k|PrimaryGroups TiffParserWorker::findPrimaryGroups(const TiffComponent::UniquePtr& pSourceDir) {
 2137|  7.65k|  PrimaryGroups ret;
 2138|  7.65k|  if (!pSourceDir)
  ------------------
  |  Branch (2138:7): [True: 7.00k, False: 656]
  ------------------
 2139|  7.00k|    return ret;
 2140|       |
 2141|    656|  static constexpr auto imageGroups = std::array{
 2142|    656|      IfdId::ifd0Id,      IfdId::ifd1Id,      IfdId::ifd2Id,      IfdId::ifd3Id,      IfdId::subImage1Id,
 2143|    656|      IfdId::subImage2Id, IfdId::subImage3Id, IfdId::subImage4Id, IfdId::subImage5Id, IfdId::subImage6Id,
 2144|    656|      IfdId::subImage7Id, IfdId::subImage8Id, IfdId::subImage9Id,
 2145|    656|  };
 2146|       |
 2147|  8.52k|  for (auto imageGroup : imageGroups) {
  ------------------
  |  Branch (2147:24): [True: 8.52k, False: 656]
  ------------------
 2148|  8.52k|    TiffFinder finder(0x00fe, imageGroup);
 2149|  8.52k|    pSourceDir->accept(finder);
 2150|  8.52k|    auto te = dynamic_cast<const TiffEntryBase*>(finder.result());
 2151|  8.52k|    if (!te)
  ------------------
  |  Branch (2151:9): [True: 8.46k, False: 64]
  ------------------
 2152|  8.46k|      continue;
 2153|     64|    const Value* pV = te->pValue();
 2154|     64|    if (pV && pV->typeId() == unsignedLong && pV->count() == 1 && (pV->toInt64() & 1) == 0) {
  ------------------
  |  Branch (2154:9): [True: 53, False: 11]
  |  Branch (2154:15): [True: 32, False: 21]
  |  Branch (2154:47): [True: 14, False: 18]
  |  Branch (2154:67): [True: 7, False: 7]
  ------------------
 2155|      7|      ret.push_back(te->group());
 2156|      7|    }
 2157|     64|  }
 2158|    656|  return ret;
 2159|  7.65k|}  // TiffParserWorker::findPrimaryGroups
_ZN5Exiv28Internal14TiffHeaderBaseC2EtjNS_9ByteOrderEj:
 2162|   263k|    tag_(tag), size_(size), byteOrder_(byteOrder), offset_(offset) {
 2163|   263k|}
_ZN5Exiv28Internal14TiffHeaderBase4readEPKhm:
 2165|   211k|bool TiffHeaderBase::read(const byte* pData, size_t size) {
 2166|   211k|  if (!pData || size < 8)
  ------------------
  |  Branch (2166:7): [True: 0, False: 211k]
  |  Branch (2166:17): [True: 20, False: 211k]
  ------------------
 2167|     20|    return false;
 2168|       |
 2169|   211k|  if (pData[0] == 'I' && pData[0] == pData[1]) {
  ------------------
  |  Branch (2169:7): [True: 7.52k, False: 203k]
  |  Branch (2169:26): [True: 7.36k, False: 160]
  ------------------
 2170|  7.36k|    byteOrder_ = littleEndian;
 2171|   203k|  } else if (pData[0] == 'M' && pData[0] == pData[1]) {
  ------------------
  |  Branch (2171:14): [True: 95.7k, False: 108k]
  |  Branch (2171:33): [True: 95.4k, False: 263]
  ------------------
 2172|  95.4k|    byteOrder_ = bigEndian;
 2173|   108k|  } else {
 2174|   108k|    return false;
 2175|   108k|  }
 2176|   102k|  uint16_t t = getUShort(pData + 2, byteOrder_);
 2177|   102k|  if (t != 444 && t != 17234 && tag_ != t)
  ------------------
  |  Branch (2177:7): [True: 102k, False: 76]
  |  Branch (2177:19): [True: 102k, False: 128]
  |  Branch (2177:33): [True: 12.2k, False: 90.3k]
  ------------------
 2178|  12.2k|    return false;  // 444 is for the JPEG-XR; 17234 is for DCP
 2179|  90.5k|  tag_ = t;
 2180|  90.5k|  offset_ = getULong(pData + 4, byteOrder_);
 2181|       |
 2182|  90.5k|  return true;
 2183|   102k|}
_ZNK5Exiv28Internal14TiffHeaderBase5writeEv:
 2185|  7.68k|DataBuf TiffHeaderBase::write() const {
 2186|  7.68k|  DataBuf buf(8);
 2187|  7.68k|  switch (byteOrder_) {
  ------------------
  |  Branch (2187:11): [True: 7.68k, False: 0]
  ------------------
 2188|  7.05k|    case littleEndian:
  ------------------
  |  Branch (2188:5): [True: 7.05k, False: 630]
  ------------------
 2189|  7.05k|      buf.write_uint8(0, 'I');
 2190|  7.05k|      break;
 2191|    630|    case bigEndian:
  ------------------
  |  Branch (2191:5): [True: 630, False: 7.05k]
  ------------------
 2192|    630|      buf.write_uint8(0, 'M');
 2193|    630|      break;
 2194|      0|    case invalidByteOrder:
  ------------------
  |  Branch (2194:5): [True: 0, False: 7.68k]
  ------------------
 2195|      0|      break;
 2196|  7.68k|  }
 2197|  7.68k|  buf.write_uint8(1, buf.read_uint8(0));
 2198|  7.68k|  buf.write_uint16(2, tag_, byteOrder_);
 2199|  7.68k|  buf.write_uint32(4, 0x00000008, byteOrder_);
 2200|  7.68k|  return buf;
 2201|  7.68k|}
_ZNK5Exiv28Internal14TiffHeaderBase9byteOrderEv:
 2219|   135k|ByteOrder TiffHeaderBase::byteOrder() const {
 2220|   135k|  return byteOrder_;
 2221|   135k|}
_ZN5Exiv28Internal14TiffHeaderBase12setByteOrderENS_9ByteOrderE:
 2223|  19.5k|void TiffHeaderBase::setByteOrder(ByteOrder byteOrder) {
 2224|  19.5k|  byteOrder_ = byteOrder;
 2225|  19.5k|}
_ZNK5Exiv28Internal14TiffHeaderBase6offsetEv:
 2227|  80.9k|uint32_t TiffHeaderBase::offset() const {
 2228|  80.9k|  return offset_;
 2229|  80.9k|}
_ZN5Exiv28Internal14TiffHeaderBase9setOffsetEj:
 2231|  16.8k|void TiffHeaderBase::setOffset(uint32_t offset) {
 2232|  16.8k|  offset_ = offset;
 2233|  16.8k|}
_ZNK5Exiv28Internal14TiffHeaderBase3tagEv:
 2239|  21.4k|uint16_t TiffHeaderBase::tag() const {
 2240|  21.4k|  return tag_;
 2241|  21.4k|}
_ZN5Exiv28Internal14isTiffImageTagEtNS_5IfdIdE:
 2325|   135k|bool isTiffImageTag(uint16_t tag, IfdId group) {
 2326|   135k|  const bool result = isTiffImageTagLookup(tag, group);
 2327|       |#ifdef EXIV2_DEBUG_MESSAGES
 2328|       |  if (result) {
 2329|       |    ExifKey key(tag, groupName(group));
 2330|       |    std::cerr << "Image tag: " << key << " (3)\n";
 2331|       |  } else {
 2332|       |    std::cerr << "Not an image tag: " << tag << " (4)\n";
 2333|       |  }
 2334|       |#endif
 2335|   135k|  return result;
 2336|   135k|}
_ZN5Exiv28Internal10TiffHeaderC2ENS_9ByteOrderEjb:
 2339|   193k|    TiffHeaderBase(42, 8, byteOrder, offset), hasImageTags_(hasImageTags) {
 2340|   193k|}
_ZNK5Exiv28Internal10TiffHeader10isImageTagEtNS_5IfdIdERKNSt3__16vectorIS2_NS3_9allocatorIS2_EEEE:
 2342|   232k|bool TiffHeader::isImageTag(uint16_t tag, IfdId group, const PrimaryGroups& pPrimaryGroups) const {
 2343|   232k|  if (!hasImageTags_) {
  ------------------
  |  Branch (2343:7): [True: 232k, False: 0]
  ------------------
 2344|       |#ifdef EXIV2_DEBUG_MESSAGES
 2345|       |    std::cerr << "No image tags in this image\n";
 2346|       |#endif
 2347|   232k|    return false;
 2348|   232k|  }
 2349|       |#ifdef EXIV2_DEBUG_MESSAGES
 2350|       |  ExifKey key(tag, groupName(group));
 2351|       |#endif
 2352|       |  // If there are primary groups and none matches group, we're done
 2353|      0|  if (!pPrimaryGroups.empty() &&
  ------------------
  |  Branch (2353:7): [True: 0, False: 0]
  |  Branch (2353:7): [True: 0, False: 0]
  ------------------
 2354|      0|      std::find(pPrimaryGroups.begin(), pPrimaryGroups.end(), group) == pPrimaryGroups.end()) {
  ------------------
  |  Branch (2354:7): [True: 0, False: 0]
  ------------------
 2355|       |#ifdef EXIV2_DEBUG_MESSAGES
 2356|       |    std::cerr << "Not an image tag: " << key << " (1)\n";
 2357|       |#endif
 2358|      0|    return false;
 2359|      0|  }
 2360|       |  // All tags of marked primary groups other than IFD0 are considered
 2361|       |  // image tags. That should take care of NEFs until we know better.
 2362|      0|  if (!pPrimaryGroups.empty() && group != IfdId::ifd0Id) {
  ------------------
  |  Branch (2362:7): [True: 0, False: 0]
  |  Branch (2362:34): [True: 0, False: 0]
  ------------------
 2363|       |#ifdef EXIV2_DEBUG_MESSAGES
 2364|       |    ExifKey key(tag, groupName(group));
 2365|       |    std::cerr << "Image tag: " << key << " (2)\n";
 2366|       |#endif
 2367|      0|    return true;
 2368|      0|  }
 2369|       |  // Finally, if tag, group is one of the TIFF image tags -> bingo!
 2370|      0|  return isTiffImageTag(tag, group);
 2371|      0|}  // TiffHeader::isImageTag
tiffimage_int.cpp:_ZN5Exiv28InternalL20isTiffImageTagLookupEtNS_5IfdIdE:
 2247|   135k|static bool isTiffImageTagLookup(uint16_t tag, IfdId group) {
 2248|   135k|  if (group != IfdId::ifd0Id) {
  ------------------
  |  Branch (2248:7): [True: 0, False: 135k]
  ------------------
 2249|      0|    return false;
 2250|      0|  }
 2251|       |  //! List of TIFF image tags
 2252|   135k|  switch (tag) {
 2253|      0|    case 0x00fe:  // Exif.Image.NewSubfileType
  ------------------
  |  Branch (2253:5): [True: 0, False: 135k]
  ------------------
 2254|      0|    case 0x00ff:  // Exif.Image.SubfileType
  ------------------
  |  Branch (2254:5): [True: 0, False: 135k]
  ------------------
 2255|  4.45k|    case 0x0100:  // Exif.Image.ImageWidth
  ------------------
  |  Branch (2255:5): [True: 4.45k, False: 130k]
  ------------------
 2256|  50.0k|    case 0x0101:  // Exif.Image.ImageLength
  ------------------
  |  Branch (2256:5): [True: 45.6k, False: 89.6k]
  ------------------
 2257|  53.7k|    case 0x0102:  // Exif.Image.BitsPerSample
  ------------------
  |  Branch (2257:5): [True: 3.67k, False: 131k]
  ------------------
 2258|  53.8k|    case 0x0103:  // Exif.Image.Compression
  ------------------
  |  Branch (2258:5): [True: 109, False: 135k]
  ------------------
 2259|  53.9k|    case 0x0106:  // Exif.Image.PhotometricInterpretation
  ------------------
  |  Branch (2259:5): [True: 116, False: 135k]
  ------------------
 2260|  54.0k|    case 0x010a:  // Exif.Image.FillOrder
  ------------------
  |  Branch (2260:5): [True: 54, False: 135k]
  ------------------
 2261|  56.7k|    case 0x0111:  // Exif.Image.StripOffsets
  ------------------
  |  Branch (2261:5): [True: 2.75k, False: 132k]
  ------------------
 2262|  56.8k|    case 0x0115:  // Exif.Image.SamplesPerPixel
  ------------------
  |  Branch (2262:5): [True: 93, False: 135k]
  ------------------
 2263|  56.9k|    case 0x0116:  // Exif.Image.RowsPerStrip
  ------------------
  |  Branch (2263:5): [True: 24, False: 135k]
  ------------------
 2264|  59.2k|    case 0x0117:  // Exif.Image.StripByteCounts
  ------------------
  |  Branch (2264:5): [True: 2.32k, False: 132k]
  ------------------
 2265|  60.2k|    case 0x011a:  // Exif.Image.XResolution
  ------------------
  |  Branch (2265:5): [True: 1.04k, False: 134k]
  ------------------
 2266|  60.3k|    case 0x011b:  // Exif.Image.YResolution
  ------------------
  |  Branch (2266:5): [True: 120, False: 135k]
  ------------------
 2267|  60.4k|    case 0x011c:  // Exif.Image.PlanarConfiguration
  ------------------
  |  Branch (2267:5): [True: 80, False: 135k]
  ------------------
 2268|  60.5k|    case 0x0122:  // Exif.Image.GrayResponseUnit
  ------------------
  |  Branch (2268:5): [True: 98, False: 135k]
  ------------------
 2269|  60.7k|    case 0x0123:  // Exif.Image.GrayResponseCurve
  ------------------
  |  Branch (2269:5): [True: 190, False: 135k]
  ------------------
 2270|  60.8k|    case 0x0124:  // Exif.Image.T4Options
  ------------------
  |  Branch (2270:5): [True: 70, False: 135k]
  ------------------
 2271|  60.8k|    case 0x0125:  // Exif.Image.T6Options
  ------------------
  |  Branch (2271:5): [True: 15, False: 135k]
  ------------------
 2272|  60.9k|    case 0x0128:  // Exif.Image.ResolutionUnit
  ------------------
  |  Branch (2272:5): [True: 67, False: 135k]
  ------------------
 2273|  61.0k|    case 0x0129:  // Exif.Image.PageNumber
  ------------------
  |  Branch (2273:5): [True: 92, False: 135k]
  ------------------
 2274|  61.0k|    case 0x012d:  // Exif.Image.TransferFunction
  ------------------
  |  Branch (2274:5): [True: 65, False: 135k]
  ------------------
 2275|  61.1k|    case 0x013d:  // Exif.Image.Predictor
  ------------------
  |  Branch (2275:5): [True: 70, False: 135k]
  ------------------
 2276|  61.1k|    case 0x013e:  // Exif.Image.WhitePoint
  ------------------
  |  Branch (2276:5): [True: 30, False: 135k]
  ------------------
 2277|  61.3k|    case 0x013f:  // Exif.Image.PrimaryChromaticities
  ------------------
  |  Branch (2277:5): [True: 145, False: 135k]
  ------------------
 2278|  61.4k|    case 0x0140:  // Exif.Image.ColorMap
  ------------------
  |  Branch (2278:5): [True: 121, False: 135k]
  ------------------
 2279|  61.5k|    case 0x0141:  // Exif.Image.HalftoneHints
  ------------------
  |  Branch (2279:5): [True: 75, False: 135k]
  ------------------
 2280|  61.5k|    case 0x0142:  // Exif.Image.TileWidth
  ------------------
  |  Branch (2280:5): [True: 71, False: 135k]
  ------------------
 2281|  61.6k|    case 0x0143:  // Exif.Image.TileLength
  ------------------
  |  Branch (2281:5): [True: 26, False: 135k]
  ------------------
 2282|  61.7k|    case 0x0144:  // Exif.Image.TileOffsets
  ------------------
  |  Branch (2282:5): [True: 152, False: 135k]
  ------------------
 2283|  61.9k|    case 0x0145:  // Exif.Image.TileByteCounts
  ------------------
  |  Branch (2283:5): [True: 196, False: 135k]
  ------------------
 2284|  62.0k|    case 0x014c:  // Exif.Image.InkSet
  ------------------
  |  Branch (2284:5): [True: 80, False: 135k]
  ------------------
 2285|  62.1k|    case 0x014d:  // Exif.Image.InkNames
  ------------------
  |  Branch (2285:5): [True: 62, False: 135k]
  ------------------
 2286|  62.1k|    case 0x014e:  // Exif.Image.NumberOfInks
  ------------------
  |  Branch (2286:5): [True: 75, False: 135k]
  ------------------
 2287|  62.1k|    case 0x0150:  // Exif.Image.DotRange
  ------------------
  |  Branch (2287:5): [True: 21, False: 135k]
  ------------------
 2288|  62.3k|    case 0x0151:  // Exif.Image.TargetPrinter
  ------------------
  |  Branch (2288:5): [True: 128, False: 135k]
  ------------------
 2289|  62.3k|    case 0x0152:  // Exif.Image.ExtraSamples
  ------------------
  |  Branch (2289:5): [True: 25, False: 135k]
  ------------------
 2290|  62.3k|    case 0x0153:  // Exif.Image.SampleFormat
  ------------------
  |  Branch (2290:5): [True: 47, False: 135k]
  ------------------
 2291|  62.4k|    case 0x0154:  // Exif.Image.SMinSampleValue
  ------------------
  |  Branch (2291:5): [True: 73, False: 135k]
  ------------------
 2292|  62.4k|    case 0x0155:  // Exif.Image.SMaxSampleValue
  ------------------
  |  Branch (2292:5): [True: 13, False: 135k]
  ------------------
 2293|  62.5k|    case 0x0156:  // Exif.Image.TransferRange
  ------------------
  |  Branch (2293:5): [True: 70, False: 135k]
  ------------------
 2294|  62.5k|    case 0x0157:  // Exif.Image.ClipPath
  ------------------
  |  Branch (2294:5): [True: 21, False: 135k]
  ------------------
 2295|  62.7k|    case 0x0158:  // Exif.Image.XClipPathUnits
  ------------------
  |  Branch (2295:5): [True: 128, False: 135k]
  ------------------
 2296|  62.7k|    case 0x0159:  // Exif.Image.YClipPathUnits
  ------------------
  |  Branch (2296:5): [True: 71, False: 135k]
  ------------------
 2297|  62.8k|    case 0x015a:  // Exif.Image.Indexed
  ------------------
  |  Branch (2297:5): [True: 34, False: 135k]
  ------------------
 2298|  62.8k|    case 0x015b:  // Exif.Image.JPEGTables
  ------------------
  |  Branch (2298:5): [True: 68, False: 135k]
  ------------------
 2299|  64.5k|    case 0x0200:  // Exif.Image.JPEGProc
  ------------------
  |  Branch (2299:5): [True: 1.66k, False: 133k]
  ------------------
 2300|  69.5k|    case 0x0201:  // Exif.Image.JPEGInterchangeFormat
  ------------------
  |  Branch (2300:5): [True: 4.98k, False: 130k]
  ------------------
 2301|  76.0k|    case 0x0202:  // Exif.Image.JPEGInterchangeFormatLength
  ------------------
  |  Branch (2301:5): [True: 6.49k, False: 128k]
  ------------------
 2302|  76.1k|    case 0x0203:  // Exif.Image.JPEGRestartInterval
  ------------------
  |  Branch (2302:5): [True: 105, False: 135k]
  ------------------
 2303|  76.1k|    case 0x0205:  // Exif.Image.JPEGLosslessPredictors
  ------------------
  |  Branch (2303:5): [True: 66, False: 135k]
  ------------------
 2304|  76.2k|    case 0x0206:  // Exif.Image.JPEGPointTransforms
  ------------------
  |  Branch (2304:5): [True: 53, False: 135k]
  ------------------
 2305|  76.2k|    case 0x0207:  // Exif.Image.JPEGQTables
  ------------------
  |  Branch (2305:5): [True: 43, False: 135k]
  ------------------
 2306|  76.3k|    case 0x0208:  // Exif.Image.JPEGDCTables
  ------------------
  |  Branch (2306:5): [True: 107, False: 135k]
  ------------------
 2307|  76.4k|    case 0x0209:  // Exif.Image.JPEGACTables
  ------------------
  |  Branch (2307:5): [True: 71, False: 135k]
  ------------------
 2308|  76.5k|    case 0x0211:  // Exif.Image.YCbCrCoefficients
  ------------------
  |  Branch (2308:5): [True: 104, False: 135k]
  ------------------
 2309|  76.5k|    case 0x0212:  // Exif.Image.YCbCrSubSampling
  ------------------
  |  Branch (2309:5): [True: 28, False: 135k]
  ------------------
 2310|  76.7k|    case 0x0213:  // Exif.Image.YCbCrPositioning
  ------------------
  |  Branch (2310:5): [True: 124, False: 135k]
  ------------------
 2311|  76.7k|    case 0x0214:  // Exif.Image.ReferenceBlackWhite
  ------------------
  |  Branch (2311:5): [True: 32, False: 135k]
  ------------------
 2312|  76.7k|    case 0x828d:  // Exif.Image.CFARepeatPatternDim
  ------------------
  |  Branch (2312:5): [True: 18, False: 135k]
  ------------------
 2313|  76.8k|    case 0x828e:  // Exif.Image.CFAPattern
  ------------------
  |  Branch (2313:5): [True: 50, False: 135k]
  ------------------
 2314|       |    // case 0x8773:  // Exif.Image.InterColorProfile
 2315|  76.8k|    case 0x8824:  // Exif.Image.SpectralSensitivity
  ------------------
  |  Branch (2315:5): [True: 19, False: 135k]
  ------------------
 2316|  76.8k|    case 0x8828:  // Exif.Image.OECF
  ------------------
  |  Branch (2316:5): [True: 6, False: 135k]
  ------------------
 2317|  77.0k|    case 0x9102:  // Exif.Image.CompressedBitsPerPixel
  ------------------
  |  Branch (2317:5): [True: 216, False: 135k]
  ------------------
 2318|  77.0k|    case 0x9217:  // Exif.Image.SensingMethod
  ------------------
  |  Branch (2318:5): [True: 32, False: 135k]
  ------------------
 2319|  77.0k|      return true;
 2320|  58.1k|    default:
  ------------------
  |  Branch (2320:5): [True: 58.1k, False: 77.0k]
  ------------------
 2321|  58.1k|      return false;
 2322|   135k|  }
 2323|   135k|}

_ZN5Exiv28Internal13FindExifdatumC2ENS_5IfdIdE:
  359|  46.8k|  explicit FindExifdatum(Exiv2::IfdId ifdId) : ifdId_(ifdId) {
  360|  46.8k|  }
_ZNK5Exiv28Internal17TiffGroupKey_hashclENSt3__14pairIjNS_5IfdIdEEE:
  151|  61.5M|  std::size_t operator()(TiffGroupKey pair) const noexcept {
  152|  61.5M|    return std::hash<uint64_t>{}(static_cast<uint64_t>(pair.first) << 32 | static_cast<uint64_t>(pair.second));
  153|  61.5M|  }
_ZN5Exiv28Internal14TiffHeaderBaseD2Ev:
   49|  36.0k|  virtual ~TiffHeaderBase() = default;

_ZN5Exiv28Internal11TiffVisitor5setGoENS1_7GoEventEb:
   61|   286k|void TiffVisitor::setGo(GoEvent event, bool go) {
   62|   286k|  go_[event] = go;
   63|   286k|}
_ZNK5Exiv28Internal11TiffVisitor2goENS1_7GoEventE:
   65|   290M|bool TiffVisitor::go(GoEvent event) const {
   66|   290M|  return go_[event];
   67|   290M|}
_ZN5Exiv28Internal11TiffVisitor18visitDirectoryNextEPNS0_13TiffDirectoryE:
   69|   884k|void TiffVisitor::visitDirectoryNext(TiffDirectory* /*object*/) {
   70|   884k|}
_ZN5Exiv28Internal11TiffVisitor17visitDirectoryEndEPNS0_13TiffDirectoryE:
   72|   878k|void TiffVisitor::visitDirectoryEnd(TiffDirectory* /*object*/) {
   73|   878k|}
_ZN5Exiv28Internal11TiffVisitor20visitIfdMakernoteEndEPNS0_16TiffIfdMakernoteE:
   75|  59.8k|void TiffVisitor::visitIfdMakernoteEnd(TiffIfdMakernote* /*object*/) {
   76|  59.8k|}
_ZN5Exiv28Internal11TiffVisitor19visitBinaryArrayEndEPNS0_15TiffBinaryArrayE:
   78|   234k|void TiffVisitor::visitBinaryArrayEnd(TiffBinaryArray* /*object*/) {
   79|   234k|}
_ZN5Exiv28Internal10TiffFinder4initEtNS_5IfdIdE:
   81|     63|void TiffFinder::init(uint16_t tag, IfdId group) {
   82|     63|  tag_ = tag;
   83|     63|  group_ = group;
   84|     63|  tiffComponent_ = nullptr;
   85|     63|  setGo(geTraverse, true);
   86|     63|}
_ZN5Exiv28Internal10TiffFinder10findObjectEPNS0_13TiffComponentE:
   88|  95.0M|void TiffFinder::findObject(TiffComponent* object) {
   89|  95.0M|  if (object->tag() == tag_ && object->group() == group_) {
  ------------------
  |  Branch (89:7): [True: 691k, False: 94.3M]
  |  Branch (89:32): [True: 156k, False: 534k]
  ------------------
   90|   156k|    tiffComponent_ = object;
   91|   156k|    setGo(geTraverse, false);
   92|   156k|  }
   93|  95.0M|}
_ZN5Exiv28Internal10TiffFinder10visitEntryEPNS0_9TiffEntryE:
   95|  26.9M|void TiffFinder::visitEntry(TiffEntry* object) {
   96|  26.9M|  findObject(object);
   97|  26.9M|}
_ZN5Exiv28Internal10TiffFinder14visitDataEntryEPNS0_13TiffDataEntryE:
   99|  82.7k|void TiffFinder::visitDataEntry(TiffDataEntry* object) {
  100|  82.7k|  findObject(object);
  101|  82.7k|}
_ZN5Exiv28Internal10TiffFinder15visitImageEntryEPNS0_14TiffImageEntryE:
  103|  1.25M|void TiffFinder::visitImageEntry(TiffImageEntry* object) {
  104|  1.25M|  findObject(object);
  105|  1.25M|}
_ZN5Exiv28Internal10TiffFinder14visitSizeEntryEPNS0_13TiffSizeEntryE:
  107|  1.66M|void TiffFinder::visitSizeEntry(TiffSizeEntry* object) {
  108|  1.66M|  findObject(object);
  109|  1.66M|}
_ZN5Exiv28Internal10TiffFinder14visitDirectoryEPNS0_13TiffDirectoryE:
  111|   900k|void TiffFinder::visitDirectory(TiffDirectory* object) {
  112|   900k|  findObject(object);
  113|   900k|}
_ZN5Exiv28Internal10TiffFinder11visitSubIfdEPNS0_10TiffSubIfdE:
  115|   149k|void TiffFinder::visitSubIfd(TiffSubIfd* object) {
  116|   149k|  findObject(object);
  117|   149k|}
_ZN5Exiv28Internal10TiffFinder12visitMnEntryEPNS0_11TiffMnEntryE:
  119|   101k|void TiffFinder::visitMnEntry(TiffMnEntry* object) {
  120|   101k|  findObject(object);
  121|   101k|}
_ZN5Exiv28Internal10TiffFinder17visitIfdMakernoteEPNS0_16TiffIfdMakernoteE:
  123|  67.4k|void TiffFinder::visitIfdMakernote(TiffIfdMakernote* object) {
  124|  67.4k|  findObject(object);
  125|  67.4k|}
_ZN5Exiv28Internal10TiffFinder16visitBinaryArrayEPNS0_15TiffBinaryArrayE:
  127|   145k|void TiffFinder::visitBinaryArray(TiffBinaryArray* object) {
  128|   145k|  findObject(object);
  129|   145k|}
_ZN5Exiv28Internal10TiffFinder18visitBinaryElementEPNS0_17TiffBinaryElementE:
  131|  63.7M|void TiffFinder::visitBinaryElement(TiffBinaryElement* object) {
  132|  63.7M|  findObject(object);
  133|  63.7M|}
_ZN5Exiv28Internal10TiffCopierC2EPNS0_13TiffComponentEjPKNS0_14TiffHeaderBaseENSt3__16vectorINS_5IfdIdENS7_9allocatorIS9_EEEE:
  137|    609|    pRoot_(pRoot), root_(root), pHeader_(pHeader), pPrimaryGroups_(std::move(pPrimaryGroups)) {
  138|    609|}
_ZN5Exiv28Internal10TiffCopier10copyObjectEPKNS0_13TiffComponentE:
  140|   105k|void TiffCopier::copyObject(const TiffComponent* object) {
  141|   105k|  if (pHeader_->isImageTag(object->tag(), object->group(), pPrimaryGroups_)) {
  ------------------
  |  Branch (141:7): [True: 0, False: 105k]
  ------------------
  142|      0|    auto clone = object->clone();
  143|       |    // Assumption is that the corresponding TIFF entry doesn't exist
  144|      0|    auto tiffPath = TiffCreator::getPath(object->tag(), object->group(), root_);
  145|      0|    pRoot_->addPath(object->tag(), tiffPath, pRoot_, std::move(clone));
  146|       |#ifdef EXIV2_DEBUG_MESSAGES
  147|       |    ExifKey key(object->tag(), groupName(object->group()));
  148|       |    std::cerr << "Copied " << key << "\n";
  149|       |#endif
  150|      0|  }
  151|   105k|}
_ZN5Exiv28Internal10TiffCopier10visitEntryEPNS0_9TiffEntryE:
  153|  85.8k|void TiffCopier::visitEntry(TiffEntry* object) {
  154|  85.8k|  copyObject(object);
  155|  85.8k|}
_ZN5Exiv28Internal10TiffCopier14visitDataEntryEPNS0_13TiffDataEntryE:
  157|    400|void TiffCopier::visitDataEntry(TiffDataEntry* object) {
  158|    400|  copyObject(object);
  159|    400|}
_ZN5Exiv28Internal10TiffCopier15visitImageEntryEPNS0_14TiffImageEntryE:
  161|    497|void TiffCopier::visitImageEntry(TiffImageEntry* object) {
  162|    497|  copyObject(object);
  163|    497|}
_ZN5Exiv28Internal10TiffCopier14visitSizeEntryEPNS0_13TiffSizeEntryE:
  165|    940|void TiffCopier::visitSizeEntry(TiffSizeEntry* object) {
  166|    940|  copyObject(object);
  167|    940|}
_ZN5Exiv28Internal10TiffCopier14visitDirectoryEPNS0_13TiffDirectoryE:
  169|  2.55k|void TiffCopier::visitDirectory(TiffDirectory* /*object*/) {
  170|       |  // Do not copy directories (avoids problems with SubIfds)
  171|  2.55k|}
_ZN5Exiv28Internal10TiffCopier11visitSubIfdEPNS0_10TiffSubIfdE:
  173|    767|void TiffCopier::visitSubIfd(TiffSubIfd* object) {
  174|    767|  copyObject(object);
  175|    767|}
_ZN5Exiv28Internal10TiffCopier12visitMnEntryEPNS0_11TiffMnEntryE:
  177|    417|void TiffCopier::visitMnEntry(TiffMnEntry* object) {
  178|    417|  copyObject(object);
  179|    417|}
_ZN5Exiv28Internal10TiffCopier17visitIfdMakernoteEPNS0_16TiffIfdMakernoteE:
  181|    292|void TiffCopier::visitIfdMakernote(TiffIfdMakernote* object) {
  182|    292|  copyObject(object);
  183|    292|}
_ZN5Exiv28Internal10TiffCopier16visitBinaryArrayEPNS0_15TiffBinaryArrayE:
  185|    599|void TiffCopier::visitBinaryArray(TiffBinaryArray* object) {
  186|    599|  copyObject(object);
  187|    599|}
_ZN5Exiv28Internal10TiffCopier18visitBinaryElementEPNS0_17TiffBinaryElementE:
  189|  16.0k|void TiffCopier::visitBinaryElement(TiffBinaryElement* object) {
  190|  16.0k|  copyObject(object);
  191|  16.0k|}
_ZN5Exiv28Internal11TiffDecoderC2ERNS_8ExifDataERNS_8IptcDataERNS_7XmpDataEPNS0_13TiffComponentEPFMS1_FvPKNS0_13TiffEntryBaseEENSt3__117basic_string_viewIcNSF_11char_traitsIcEEEEjNS_5IfdIdEERKNS_12DecodeParamsE:
  195|  38.8k|    exifData_(exifData),
  196|  38.8k|    iptcData_(iptcData),
  197|  38.8k|    xmpData_(xmpData),
  198|  38.8k|    pRoot_(pRoot),
  199|  38.8k|    findDecoderFct_(findDecoderFct),
  200|  38.8k|    max_recursion_depth_(dp.max_recursion_depth()) {
  201|       |  // #1402 Fujifilm RAF. Search for the make
  202|       |  // Find camera make in existing metadata (read from the JPEG)
  203|  38.8k|  ExifKey key("Exif.Image.Make");
  204|  38.8k|  if (exifData_.findKey(key) != exifData_.end()) {
  ------------------
  |  Branch (204:7): [True: 3.77k, False: 35.0k]
  ------------------
  205|  3.77k|    make_ = exifData_.findKey(key)->toString();
  206|  35.0k|  } else {
  207|       |    // Find camera make by looking for tag 0x010f in IFD0
  208|  35.0k|    TiffFinder finder(0x010f, IfdId::ifd0Id);
  209|  35.0k|    pRoot_->accept(finder);
  210|  35.0k|    auto te = dynamic_cast<const TiffEntryBase*>(finder.result());
  211|  35.0k|    if (te && te->pValue()) {
  ------------------
  |  Branch (211:9): [True: 14.1k, False: 20.9k]
  |  Branch (211:15): [True: 13.9k, False: 142]
  ------------------
  212|  13.9k|      make_ = te->pValue()->toString();
  213|  13.9k|    }
  214|  35.0k|  }
  215|  38.8k|}
_ZN5Exiv28Internal11TiffDecoder10visitEntryEPNS0_9TiffEntryE:
  217|  5.22M|void TiffDecoder::visitEntry(TiffEntry* object) {
  218|  5.22M|  decodeTiffEntry(object);
  219|  5.22M|}
_ZN5Exiv28Internal11TiffDecoder14visitDataEntryEPNS0_13TiffDataEntryE:
  221|  5.71k|void TiffDecoder::visitDataEntry(TiffDataEntry* object) {
  222|  5.71k|  decodeTiffEntry(object);
  223|  5.71k|}
_ZN5Exiv28Internal11TiffDecoder15visitImageEntryEPNS0_14TiffImageEntryE:
  225|  34.2k|void TiffDecoder::visitImageEntry(TiffImageEntry* object) {
  226|  34.2k|  decodeTiffEntry(object);
  227|  34.2k|}
_ZN5Exiv28Internal11TiffDecoder14visitSizeEntryEPNS0_13TiffSizeEntryE:
  229|  52.6k|void TiffDecoder::visitSizeEntry(TiffSizeEntry* object) {
  230|  52.6k|  decodeTiffEntry(object);
  231|  52.6k|}
_ZN5Exiv28Internal11TiffDecoder14visitDirectoryEPNS0_13TiffDirectoryE:
  233|   111k|void TiffDecoder::visitDirectory(TiffDirectory* /* object */) {
  234|       |  // Nothing to do
  235|   111k|}
_ZN5Exiv28Internal11TiffDecoder11visitSubIfdEPNS0_10TiffSubIfdE:
  237|  21.1k|void TiffDecoder::visitSubIfd(TiffSubIfd* object) {
  238|  21.1k|  decodeTiffEntry(object);
  239|  21.1k|}
_ZN5Exiv28Internal11TiffDecoder12visitMnEntryEPNS0_11TiffMnEntryE:
  241|  36.6k|void TiffDecoder::visitMnEntry(TiffMnEntry* object) {
  242|       |  // Always decode binary makernote tag
  243|  36.6k|  decodeTiffEntry(object);
  244|  36.6k|}
_ZN5Exiv28Internal11TiffDecoder17visitIfdMakernoteEPNS0_16TiffIfdMakernoteE:
  246|  28.4k|void TiffDecoder::visitIfdMakernote(TiffIfdMakernote* object) {
  247|  28.4k|  exifData_["Exif.MakerNote.Offset"] = static_cast<uint32_t>(object->mnOffset());
  248|  28.4k|  switch (object->byteOrder()) {
  ------------------
  |  Branch (248:11): [True: 28.4k, False: 0]
  ------------------
  249|  1.91k|    case littleEndian:
  ------------------
  |  Branch (249:5): [True: 1.91k, False: 26.5k]
  ------------------
  250|  1.91k|      exifData_["Exif.MakerNote.ByteOrder"] = "II";
  251|  1.91k|      break;
  252|  26.5k|    case bigEndian:
  ------------------
  |  Branch (252:5): [True: 26.5k, False: 1.91k]
  ------------------
  253|  26.5k|      exifData_["Exif.MakerNote.ByteOrder"] = "MM";
  254|  26.5k|      break;
  255|      0|    case invalidByteOrder:
  ------------------
  |  Branch (255:5): [True: 0, False: 28.4k]
  ------------------
  256|      0|      break;
  257|  28.4k|  }
  258|  28.4k|}
_ZN5Exiv28Internal11TiffDecoder10getObjDataERPKhRmtNS_5IfdIdEPKNS0_13TiffEntryBaseE:
  260|  2.96k|void TiffDecoder::getObjData(const byte*& pData, size_t& size, uint16_t tag, IfdId group, const TiffEntryBase* object) {
  261|  2.96k|  if (object && object->tag() == tag && object->group() == group) {
  ------------------
  |  Branch (261:7): [True: 2.96k, False: 0]
  |  Branch (261:17): [True: 2.78k, False: 182]
  |  Branch (261:41): [True: 2.78k, False: 0]
  ------------------
  262|  2.78k|    pData = object->pData();
  263|  2.78k|    size = object->size();
  264|  2.78k|    return;
  265|  2.78k|  }
  266|    182|  TiffFinder finder(tag, group);
  267|    182|  pRoot_->accept(finder);
  268|    182|  if (auto te = dynamic_cast<const TiffEntryBase*>(finder.result())) {
  ------------------
  |  Branch (268:12): [True: 10, False: 172]
  ------------------
  269|     10|    pData = te->pData();
  270|     10|    size = te->size();
  271|     10|    return;
  272|     10|  }
  273|    182|}
_ZN5Exiv28Internal11TiffDecoder9decodeXmpEPKNS0_13TiffEntryBaseE:
  275|  2.14k|void TiffDecoder::decodeXmp(const TiffEntryBase* object) {
  276|       |  // add Exif tag anyway
  277|  2.14k|  decodeStdTiffEntry(object);
  278|       |
  279|  2.14k|  const byte* pData = nullptr;
  280|  2.14k|  size_t size = 0;
  281|  2.14k|  getObjData(pData, size, 0x02bc, IfdId::ifd0Id, object);
  282|  2.14k|  if (pData) {
  ------------------
  |  Branch (282:7): [True: 2.14k, False: 0]
  ------------------
  283|  2.14k|    std::string xmpPacket;
  284|  2.14k|    xmpPacket.assign(reinterpret_cast<const char*>(pData), size);
  285|  2.14k|    std::string::size_type idx = xmpPacket.find_first_of('<');
  286|  2.14k|    if (idx != std::string::npos && idx > 0) {
  ------------------
  |  Branch (286:9): [True: 1.73k, False: 412]
  |  Branch (286:37): [True: 1.67k, False: 64]
  ------------------
  287|  1.67k|#ifndef SUPPRESS_WARNINGS
  288|  1.67k|      EXV_WARNING << "Removing " << idx << " characters from the beginning of the XMP packet\n";
  ------------------
  |  |  138|  1.67k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1.67k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  1.67k|  LogMsg(LogMsg::warn).os()
  ------------------
  289|  1.67k|#endif
  290|  1.67k|      xmpPacket = xmpPacket.substr(idx);
  291|  1.67k|    }
  292|  2.14k|    const DecodeParams dp(max_recursion_depth_);
  293|  2.14k|    if (XmpParser::decode(xmpData_, xmpPacket, dp)) {
  ------------------
  |  Branch (293:9): [True: 887, False: 1.26k]
  ------------------
  294|    887|#ifndef SUPPRESS_WARNINGS
  295|    887|      EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|    887|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 887]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    887|  LogMsg(LogMsg::warn).os()
  ------------------
  296|    887|#endif
  297|    887|    }
  298|  2.14k|  }
  299|  2.14k|}  // TiffDecoder::decodeXmp
_ZN5Exiv28Internal11TiffDecoder10decodeIptcEPKNS0_13TiffEntryBaseE:
  301|    754|void TiffDecoder::decodeIptc(const TiffEntryBase* object) {
  302|       |  // add Exif tag anyway
  303|    754|  decodeStdTiffEntry(object);
  304|       |
  305|       |  // All tags are read at this point, so the first time we come here,
  306|       |  // find the relevant IPTC tag and decode IPTC if found
  307|    754|  if (decodedIptc_) {
  ------------------
  |  Branch (307:7): [True: 118, False: 636]
  ------------------
  308|    118|    return;
  309|    118|  }
  310|    636|  decodedIptc_ = true;
  311|       |  // 1st choice: IPTCNAA
  312|    636|  const byte* pData = nullptr;
  313|    636|  size_t size = 0;
  314|    636|  getObjData(pData, size, 0x83bb, IfdId::ifd0Id, object);
  315|    636|  if (pData) {
  ------------------
  |  Branch (315:7): [True: 586, False: 50]
  ------------------
  316|    586|    if (0 == IptcParser::decode(iptcData_, pData, size)) {
  ------------------
  |  Branch (316:9): [True: 457, False: 129]
  ------------------
  317|    457|      return;
  318|    457|    }
  319|    129|#ifndef SUPPRESS_WARNINGS
  320|    129|    EXV_WARNING << "Failed to decode IPTC block found in " << "Directory Image, entry 0x83bb\n";
  ------------------
  |  |  138|    129|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 129]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    129|  LogMsg(LogMsg::warn).os()
  ------------------
  321|       |
  322|    129|#endif
  323|    129|  }
  324|       |
  325|       |  // 2nd choice if no IPTCNAA record found or failed to decode it:
  326|       |  // ImageResources
  327|    179|  pData = nullptr;
  328|    179|  size = 0;
  329|    179|  getObjData(pData, size, 0x8649, IfdId::ifd0Id, object);
  330|    179|  if (pData) {
  ------------------
  |  Branch (330:7): [True: 51, False: 128]
  ------------------
  331|     51|    const byte* record = nullptr;
  332|     51|    uint32_t sizeHdr = 0;
  333|     51|    uint32_t sizeData = 0;
  334|     51|    if (0 != Photoshop::locateIptcIrb(pData, size, &record, sizeHdr, sizeData)) {
  ------------------
  |  Branch (334:9): [True: 51, False: 0]
  ------------------
  335|     51|      return;
  336|     51|    }
  337|      0|    if (0 == IptcParser::decode(iptcData_, record + sizeHdr, sizeData)) {
  ------------------
  |  Branch (337:9): [True: 0, False: 0]
  ------------------
  338|      0|      return;
  339|      0|    }
  340|      0|#ifndef SUPPRESS_WARNINGS
  341|      0|    EXV_WARNING << "Failed to decode IPTC block found in " << "Directory Image, entry 0x8649\n";
  ------------------
  |  |  138|      0|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 0]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|      0|  LogMsg(LogMsg::warn).os()
  ------------------
  342|       |
  343|      0|#endif
  344|      0|  }
  345|    179|}  // TiffMetadataDecoder::decodeIptc
_ZN5Exiv28Internal11TiffDecoder17decodeCanonAFInfoEPKNS0_13TiffEntryBaseE:
  353|  1.75k|void TiffDecoder::decodeCanonAFInfo(const TiffEntryBase* object) {
  354|       |  // report Exif.Canon.AFInfo as usual
  355|  1.75k|  TiffDecoder::decodeStdTiffEntry(object);
  356|  1.75k|  if (object->pValue()->count() < 3 || object->pValue()->typeId() != unsignedShort)
  ------------------
  |  Branch (356:7): [True: 826, False: 932]
  |  Branch (356:40): [True: 139, False: 793]
  ------------------
  357|    965|    return;  // insufficient data
  358|       |
  359|       |  // create vector of signedShorts from unsignedShorts in Exif.Canon.AFInfo
  360|    793|  std::vector<int16_t> ints;
  361|    793|  std::vector<uint16_t> uint;
  362|  29.5k|  for (size_t i = 0; i < object->pValue()->count(); i++) {
  ------------------
  |  Branch (362:22): [True: 28.7k, False: 793]
  ------------------
  363|  28.7k|    ints.push_back(object->pValue()->toInt64(i));
  364|  28.7k|    uint.push_back(object->pValue()->toUint32(i));
  365|  28.7k|  }
  366|       |  // Check this is AFInfo2 (ints[0] = bytes in object)
  367|    793|  if (ints.front() != static_cast<int16_t>(object->pValue()->count()) * 2)
  ------------------
  |  Branch (367:7): [True: 123, False: 670]
  ------------------
  368|    123|    return;
  369|       |
  370|    670|  std::string familyGroup(std::string("Exif.") + groupName(object->group()) + ".");
  371|       |
  372|    670|  const uint16_t nPoints = uint.at(2);
  373|    670|  const uint16_t nMasks = (nPoints + 15) / (sizeof(uint16_t) * 8);
  374|    670|  int nStart = 0;
  375|       |
  376|    670|  const std::tuple<uint16_t, uint16_t, bool> records[] = {
  377|    670|      {0x2600, 1, true},        // AFInfoSize
  378|    670|      {0x2601, 1, true},        // AFAreaMode
  379|    670|      {0x2602, 1, true},        // AFNumPoints
  380|    670|      {0x2603, 1, true},        // AFValidPoints
  381|    670|      {0x2604, 1, true},        // AFCanonImageWidth
  382|    670|      {0x2605, 1, true},        // AFCanonImageHeight
  383|    670|      {0x2606, 1, true},        // AFImageWidth"
  384|    670|      {0x2607, 1, true},        // AFImageHeight
  385|    670|      {0x2608, nPoints, true},  // AFAreaWidths
  386|    670|      {0x2609, nPoints, true},  // AFAreaHeights
  387|    670|      {0x260a, nPoints, true},  // AFXPositions
  388|    670|      {0x260b, nPoints, true},  // AFYPositions
  389|    670|      {0x260c, nMasks, false},  // AFPointsInFocus
  390|    670|      {0x260d, nMasks, false},  // AFPointsSelected
  391|    670|      {0x260e, nMasks, false},  // AFPointsUnusable
  392|    670|  };
  393|       |  // check we have enough data!
  394|    670|  uint16_t count = 0;
  395|  8.79k|  for (const auto& [tag, size, bSigned] : records) {
  ------------------
  |  Branch (395:41): [True: 8.79k, False: 323]
  ------------------
  396|  8.79k|    count += size;
  397|  8.79k|    if (count > ints.size())
  ------------------
  |  Branch (397:9): [True: 347, False: 8.44k]
  ------------------
  398|    347|      return;
  399|  8.79k|  }
  400|       |
  401|  4.84k|  for (const auto& [tag, size, bSigned] : records) {
  ------------------
  |  Branch (401:41): [True: 4.84k, False: 323]
  ------------------
  402|  4.84k|    auto pTags = ExifTags::tagList("Canon");
  403|  4.84k|    if (auto pTag = findTag(pTags, tag)) {
  ------------------
  |  Branch (403:14): [True: 4.84k, False: 0]
  ------------------
  404|  4.84k|      auto v = Exiv2::Value::create(bSigned ? Exiv2::signedShort : Exiv2::unsignedShort);
  ------------------
  |  Branch (404:37): [True: 3.87k, False: 969]
  ------------------
  405|  4.84k|      std::string s;
  406|  4.84k|      if (bSigned) {
  ------------------
  |  Branch (406:11): [True: 3.87k, False: 969]
  ------------------
  407|  11.7k|        for (uint16_t k = 0; k < size; k++)
  ------------------
  |  Branch (407:30): [True: 7.89k, False: 3.87k]
  ------------------
  408|  7.89k|          s += stringFormat(" {}", ints.at(nStart++));
  ------------------
  |  |   18|  7.89k|#define stringFormat std::format
  ------------------
  409|  3.87k|      } else {
  410|  1.77k|        for (uint16_t k = 0; k < size; k++)
  ------------------
  |  Branch (410:30): [True: 810, False: 969]
  ------------------
  411|    810|          s += stringFormat(" {}", uint.at(nStart++));
  ------------------
  |  |   18|    810|#define stringFormat std::format
  ------------------
  412|    969|      }
  413|       |
  414|  4.84k|      v->read(s);
  415|  4.84k|      exifData_[familyGroup + pTag->name_] = *v;
  416|  4.84k|    }
  417|  4.84k|  }
  418|    323|}
_ZN5Exiv28Internal11TiffDecoder15decodeTiffEntryEPKNS0_13TiffEntryBaseE:
  420|  24.0M|void TiffDecoder::decodeTiffEntry(const TiffEntryBase* object) {
  421|       |  // Don't decode the entry if value is not set
  422|  24.0M|  if (!object->pValue())
  ------------------
  |  Branch (422:7): [True: 2.88M, False: 21.1M]
  ------------------
  423|  2.88M|    return;
  424|       |
  425|       |  // skip decoding if decoderFct == 0
  426|  21.1M|  if (auto decoderFct = findDecoderFct_(make_, object->tag(), object->group()))
  ------------------
  |  Branch (426:12): [True: 21.1M, False: 0]
  ------------------
  427|  21.1M|    std::invoke(decoderFct, *this, object);
  428|  21.1M|}  // TiffDecoder::decodeTiffEntry
_ZN5Exiv28Internal11TiffDecoder18decodeStdTiffEntryEPKNS0_13TiffEntryBaseE:
  430|  21.1M|void TiffDecoder::decodeStdTiffEntry(const TiffEntryBase* object) {
  431|  21.1M|  ExifKey key(object->tag(), groupName(object->group()));
  432|  21.1M|  key.setIdx(object->idx());
  433|  21.1M|  exifData_.add(key, object->pValue());
  434|       |
  435|  21.1M|}  // TiffDecoder::decodeTiffEntry
_ZN5Exiv28Internal11TiffDecoder16visitBinaryArrayEPNS0_15TiffBinaryArrayE:
  437|  44.0k|void TiffDecoder::visitBinaryArray(TiffBinaryArray* object) {
  438|  44.0k|  if (!object->cfg() || !object->decoded()) {
  ------------------
  |  Branch (438:7): [True: 2.14k, False: 41.9k]
  |  Branch (438:25): [True: 30.8k, False: 11.1k]
  ------------------
  439|  32.9k|    decodeTiffEntry(object);
  440|  32.9k|  }
  441|  44.0k|}
_ZN5Exiv28Internal11TiffDecoder18visitBinaryElementEPNS0_17TiffBinaryElementE:
  443|  18.6M|void TiffDecoder::visitBinaryElement(TiffBinaryElement* object) {
  444|  18.6M|  decodeTiffEntry(object);
  445|  18.6M|}
_ZN5Exiv28Internal11TiffEncoderC2ENS_8ExifDataERKNS_8IptcDataERKNS_7XmpDataEPNS0_13TiffComponentEbNSt3__16vectorINS_5IfdIdENSB_9allocatorISD_EEEEPKNS0_14TiffHeaderBaseEPFMS1_FvPNS0_13TiffEntryBaseEPKNS_9ExifdatumEENSB_17basic_string_viewIcNSB_11char_traitsIcEEEEjSD_E:
  450|  8.26k|    exifData_(std::move(exifData)),
  451|  8.26k|    iptcData_(iptcData),
  452|  8.26k|    xmpData_(xmpData),
  453|  8.26k|    pHeader_(pHeader),
  454|  8.26k|    pRoot_(pRoot),
  455|  8.26k|    isNewImage_(isNewImage),
  456|  8.26k|    pPrimaryGroups_(std::move(pPrimaryGroups)),
  457|  8.26k|    byteOrder_(pHeader->byteOrder()),
  458|  8.26k|    origByteOrder_(byteOrder_),
  459|  8.26k|    findEncoderFct_(findEncoderFct) {
  460|  8.26k|  encodeIptc();
  461|  8.26k|  encodeXmp();
  462|       |
  463|       |  // Find camera make
  464|  8.26k|  ExifKey key("Exif.Image.Make");
  465|  8.26k|  if (auto pos = exifData_.findKey(key); pos != exifData_.end()) {
  ------------------
  |  Branch (465:42): [True: 5.16k, False: 3.10k]
  ------------------
  466|  5.16k|    make_ = pos->toString();
  467|  5.16k|  }
  468|  8.26k|  if (make_.empty() && pRoot_) {
  ------------------
  |  Branch (468:7): [True: 3.17k, False: 5.09k]
  |  Branch (468:24): [True: 3.17k, False: 0]
  ------------------
  469|  3.17k|    TiffFinder finder(0x010f, IfdId::ifd0Id);
  470|  3.17k|    pRoot_->accept(finder);
  471|  3.17k|    auto te = dynamic_cast<const TiffEntryBase*>(finder.result());
  472|  3.17k|    if (te && te->pValue()) {
  ------------------
  |  Branch (472:9): [True: 29, False: 3.14k]
  |  Branch (472:15): [True: 13, False: 16]
  ------------------
  473|     13|      make_ = te->pValue()->toString();
  474|     13|    }
  475|  3.17k|  }
  476|  8.26k|}
_ZN5Exiv28Internal11TiffEncoder10encodeIptcEv:
  478|  8.26k|void TiffEncoder::encodeIptc() {
  479|       |  // Update IPTCNAA Exif tag, if it exists. Delete the tag if there
  480|       |  // is no IPTC data anymore.
  481|       |  // If there is new IPTC data and Exif.Image.ImageResources does
  482|       |  // not exist, create a new IPTCNAA Exif tag.
  483|  8.26k|  bool del = false;
  484|  8.26k|  ExifKey iptcNaaKey("Exif.Image.IPTCNAA");
  485|  8.26k|  auto pos = exifData_.findKey(iptcNaaKey);
  486|  8.26k|  if (pos != exifData_.end()) {
  ------------------
  |  Branch (486:7): [True: 95, False: 8.17k]
  ------------------
  487|     95|    iptcNaaKey.setIdx(pos->idx());
  488|     95|    exifData_.erase(pos);
  489|     95|    del = true;
  490|     95|  }
  491|  8.26k|  DataBuf rawIptc = IptcParser::encode(iptcData_);
  492|  8.26k|  ExifKey irbKey("Exif.Image.ImageResources");
  493|  8.26k|  pos = exifData_.findKey(irbKey);
  494|  8.26k|  if (pos != exifData_.end()) {
  ------------------
  |  Branch (494:7): [True: 350, False: 7.91k]
  ------------------
  495|    350|    irbKey.setIdx(pos->idx());
  496|    350|  }
  497|  8.26k|  if (!rawIptc.empty() && (del || pos == exifData_.end())) {
  ------------------
  |  Branch (497:7): [True: 0, False: 8.26k]
  |  Branch (497:7): [True: 0, False: 8.26k]
  |  Branch (497:28): [True: 0, False: 0]
  |  Branch (497:35): [True: 0, False: 0]
  ------------------
  498|      0|    auto value = Value::create(unsignedLong);
  499|      0|    DataBuf buf;
  500|      0|    if (rawIptc.size() % 4 != 0) {
  ------------------
  |  Branch (500:9): [True: 0, False: 0]
  ------------------
  501|       |      // Pad the last unsignedLong value with 0s
  502|      0|      buf.alloc(((rawIptc.size() / 4) * 4) + 4);
  503|      0|      std::move(rawIptc.begin(), rawIptc.end(), buf.begin());
  504|      0|    } else {
  505|      0|      buf = std::move(rawIptc);  // Note: This resets rawIptc
  506|      0|    }
  507|      0|    value->read(buf.data(), buf.size(), byteOrder_);
  508|      0|    Exifdatum iptcDatum(iptcNaaKey, value.get());
  509|      0|    exifData_.add(iptcDatum);
  510|      0|    pos = exifData_.findKey(irbKey);  // needed after add()
  511|      0|  }
  512|       |  // Also update IPTC IRB in Exif.Image.ImageResources if it exists,
  513|       |  // but don't create it if not.
  514|  8.26k|  if (pos != exifData_.end()) {
  ------------------
  |  Branch (514:7): [True: 350, False: 7.91k]
  ------------------
  515|    350|    DataBuf irbBuf(pos->value().size());
  516|    350|    pos->value().copy(irbBuf.data(), invalidByteOrder);
  517|    350|    irbBuf = Photoshop::setIptcIrb(irbBuf.c_data(), irbBuf.size(), iptcData_);
  518|    350|    exifData_.erase(pos);
  519|    350|    if (!irbBuf.empty()) {
  ------------------
  |  Branch (519:9): [True: 120, False: 230]
  ------------------
  520|    120|      auto value = Value::create(unsignedByte);
  521|    120|      value->read(irbBuf.data(), irbBuf.size(), invalidByteOrder);
  522|    120|      Exifdatum iptcDatum(irbKey, value.get());
  523|    120|      exifData_.add(iptcDatum);
  524|    120|    }
  525|    350|  }
  526|  8.26k|}  // TiffEncoder::encodeIptc
_ZN5Exiv28Internal11TiffEncoder9encodeXmpEv:
  528|  8.26k|void TiffEncoder::encodeXmp() {
  529|  8.26k|#ifdef EXV_HAVE_XMP_TOOLKIT
  530|  8.26k|  ExifKey xmpKey("Exif.Image.XMLPacket");
  531|       |  // Remove any existing XMP Exif tag
  532|  8.26k|  if (auto pos = exifData_.findKey(xmpKey); pos != exifData_.end()) {
  ------------------
  |  Branch (532:45): [True: 72, False: 8.19k]
  ------------------
  533|     72|    xmpKey.setIdx(pos->idx());
  534|     72|    exifData_.erase(pos);
  535|     72|  }
  536|  8.26k|  std::string xmpPacket;
  537|  8.26k|  if (xmpData_.usePacket()) {
  ------------------
  |  Branch (537:7): [True: 0, False: 8.26k]
  ------------------
  538|      0|    xmpPacket = xmpData_.xmpPacket();
  539|  8.26k|  } else {
  540|  8.26k|    if (XmpParser::encode(xmpPacket, xmpData_) > 1) {
  ------------------
  |  Branch (540:9): [True: 0, False: 8.26k]
  ------------------
  541|      0|#ifndef SUPPRESS_WARNINGS
  542|      0|      EXV_ERROR << "Failed to encode XMP metadata.\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  543|      0|#endif
  544|      0|    }
  545|  8.26k|  }
  546|  8.26k|  if (!xmpPacket.empty()) {
  ------------------
  |  Branch (546:7): [True: 0, False: 8.26k]
  ------------------
  547|       |    // Set the XMP Exif tag to the new value
  548|      0|    auto value = Value::create(unsignedByte);
  549|      0|    value->read(reinterpret_cast<const byte*>(xmpPacket.data()), xmpPacket.size(), invalidByteOrder);
  550|      0|    Exifdatum xmpDatum(xmpKey, value.get());
  551|      0|    exifData_.add(xmpDatum);
  552|      0|  }
  553|  8.26k|#endif
  554|  8.26k|}  // TiffEncoder::encodeXmp
_ZN5Exiv28Internal11TiffEncoder8setDirtyEb:
  556|   128k|void TiffEncoder::setDirty(bool flag) {
  557|   128k|  dirty_ = flag;
  558|   128k|  setGo(geTraverse, !flag);
  559|   128k|}
_ZNK5Exiv28Internal11TiffEncoder5dirtyEv:
  561|    656|bool TiffEncoder::dirty() const {
  562|    656|  return dirty_ || !exifData_.empty();
  ------------------
  |  Branch (562:10): [True: 609, False: 47]
  |  Branch (562:20): [True: 0, False: 47]
  ------------------
  563|    656|}
_ZN5Exiv28Internal11TiffEncoder10visitEntryEPNS0_9TiffEntryE:
  565|  4.28k|void TiffEncoder::visitEntry(TiffEntry* object) {
  566|  4.28k|  encodeTiffComponent(object);
  567|  4.28k|}
_ZN5Exiv28Internal11TiffEncoder14visitDataEntryEPNS0_13TiffDataEntryE:
  569|     57|void TiffEncoder::visitDataEntry(TiffDataEntry* object) {
  570|     57|  encodeTiffComponent(object);
  571|     57|}
_ZN5Exiv28Internal11TiffEncoder15visitImageEntryEPNS0_14TiffImageEntryE:
  573|    105|void TiffEncoder::visitImageEntry(TiffImageEntry* object) {
  574|    105|  encodeTiffComponent(object);
  575|    105|}
_ZN5Exiv28Internal11TiffEncoder14visitSizeEntryEPNS0_13TiffSizeEntryE:
  577|    120|void TiffEncoder::visitSizeEntry(TiffSizeEntry* object) {
  578|    120|  encodeTiffComponent(object);
  579|    120|}
_ZN5Exiv28Internal11TiffEncoder14visitDirectoryEPNS0_13TiffDirectoryE:
  581|    955|void TiffEncoder::visitDirectory(TiffDirectory* /*object*/) {
  582|       |  // Nothing to do
  583|    955|}
_ZN5Exiv28Internal11TiffEncoder18visitDirectoryNextEPNS0_13TiffDirectoryE:
  585|    264|void TiffEncoder::visitDirectoryNext(TiffDirectory* object) {
  586|       |  // Update type and count in IFD entries, in case they changed
  587|    264|  byte* p = object->start() + 2;
  588|    683|  for (const auto& component : object->components_) {
  ------------------
  |  Branch (588:30): [True: 683, False: 264]
  ------------------
  589|    683|    p += updateDirEntry(p, byteOrder(), component);
  590|    683|  }
  591|    264|}
_ZN5Exiv28Internal11TiffEncoder14updateDirEntryEPhNS_9ByteOrderERKNSt3__110shared_ptrINS0_13TiffComponentEEE:
  593|    683|uint32_t TiffEncoder::updateDirEntry(byte* buf, ByteOrder byteOrder, const TiffComponent::SharedPtr& tiffComponent) {
  594|    683|  auto pTiffEntry = std::dynamic_pointer_cast<TiffEntryBase>(tiffComponent);
  595|    683|  if (!pTiffEntry)
  ------------------
  |  Branch (595:7): [True: 0, False: 683]
  ------------------
  596|      0|    return 0;
  597|    683|  us2Data(buf + 2, pTiffEntry->tiffType(), byteOrder);
  598|    683|  ul2Data(buf + 4, static_cast<uint32_t>(pTiffEntry->count()), byteOrder);
  599|       |  // Move data to offset field, if it fits and is not yet there.
  600|    683|  if (pTiffEntry->size() <= 4 && buf + 8 != pTiffEntry->pData()) {
  ------------------
  |  Branch (600:7): [True: 559, False: 124]
  |  Branch (600:34): [True: 113, False: 446]
  ------------------
  601|       |#ifdef EXIV2_DEBUG_MESSAGES
  602|       |    std::cerr << "Copying data for tag " << pTiffEntry->tag() << " to offset area.\n";
  603|       |#endif
  604|    113|    memset(buf + 8, 0x0, 4);
  605|    113|    if (pTiffEntry->size() > 0) {
  ------------------
  |  Branch (605:9): [True: 4, False: 109]
  ------------------
  606|      4|      std::copy_n(pTiffEntry->pData(), pTiffEntry->size(), buf + 8);
  607|      4|      memset(const_cast<byte*>(pTiffEntry->pData()), 0x0, pTiffEntry->size());
  608|      4|    }
  609|    113|  }
  610|    683|  return 12;
  611|    683|}
_ZN5Exiv28Internal11TiffEncoder11visitSubIfdEPNS0_10TiffSubIfdE:
  613|    106|void TiffEncoder::visitSubIfd(TiffSubIfd* object) {
  614|    106|  encodeTiffComponent(object);
  615|    106|}
_ZN5Exiv28Internal11TiffEncoder12visitMnEntryEPNS0_11TiffMnEntryE:
  617|    152|void TiffEncoder::visitMnEntry(TiffMnEntry* object) {
  618|       |  // Test is required here as well as in the callback encoder function
  619|    152|  if (!object->mn_) {
  ------------------
  |  Branch (619:7): [True: 65, False: 87]
  ------------------
  620|     65|    encodeTiffComponent(object);
  621|     87|  } else if (del_) {
  ------------------
  |  Branch (621:14): [True: 87, False: 0]
  ------------------
  622|       |    // The makernote is made up of decoded tags, delete binary tag
  623|     87|    ExifKey key(object->tag(), groupName(object->group()));
  624|     87|    auto pos = exifData_.findKey(key);
  625|     87|    if (pos != exifData_.end())
  ------------------
  |  Branch (625:9): [True: 87, False: 0]
  ------------------
  626|     87|      exifData_.erase(pos);
  627|     87|  }
  628|    152|}
_ZN5Exiv28Internal11TiffEncoder17visitIfdMakernoteEPNS0_16TiffIfdMakernoteE:
  630|     87|void TiffEncoder::visitIfdMakernote(TiffIfdMakernote* object) {
  631|     87|  auto pos = exifData_.findKey(ExifKey("Exif.MakerNote.ByteOrder"));
  632|     87|  if (pos != exifData_.end()) {
  ------------------
  |  Branch (632:7): [True: 64, False: 23]
  ------------------
  633|       |    // Set Makernote byte order
  634|     64|    ByteOrder bo = stringToByteOrder(pos->toString());
  635|     64|    if (bo != invalidByteOrder && bo != object->byteOrder()) {
  ------------------
  |  Branch (635:9): [True: 64, False: 0]
  |  Branch (635:35): [True: 0, False: 64]
  ------------------
  636|      0|      object->setByteOrder(bo);
  637|      0|      setDirty();
  638|      0|    }
  639|     64|    if (del_)
  ------------------
  |  Branch (639:9): [True: 64, False: 0]
  ------------------
  640|     64|      exifData_.erase(pos);
  641|     64|  }
  642|     87|  if (del_) {
  ------------------
  |  Branch (642:7): [True: 87, False: 0]
  ------------------
  643|       |    // Remove remaining synthesized tags
  644|     87|    for (auto synthesizedTag : {"Exif.MakerNote.Offset"}) {
  ------------------
  |  Branch (644:30): [True: 87, False: 87]
  ------------------
  645|     87|      pos = exifData_.findKey(ExifKey(synthesizedTag));
  646|     87|      if (pos != exifData_.end())
  ------------------
  |  Branch (646:11): [True: 64, False: 23]
  ------------------
  647|     64|        exifData_.erase(pos);
  648|     87|    }
  649|     87|  }
  650|       |  // Modify encoder for Makernote peculiarities, byte order
  651|     87|  byteOrder_ = object->byteOrder();
  652|       |
  653|     87|}  // TiffEncoder::visitIfdMakernote
_ZN5Exiv28Internal11TiffEncoder20visitIfdMakernoteEndEPNS0_16TiffIfdMakernoteE:
  655|     38|void TiffEncoder::visitIfdMakernoteEnd(TiffIfdMakernote* /*object*/) {
  656|       |  // Reset byte order back to that from the c'tor
  657|     38|  byteOrder_ = origByteOrder_;
  658|       |
  659|     38|}  // TiffEncoder::visitIfdMakernoteEnd
_ZN5Exiv28Internal11TiffEncoder16visitBinaryArrayEPNS0_15TiffBinaryArrayE:
  661|     75|void TiffEncoder::visitBinaryArray(TiffBinaryArray* object) {
  662|     75|  if (!object->cfg() || !object->decoded()) {
  ------------------
  |  Branch (662:7): [True: 9, False: 66]
  |  Branch (662:25): [True: 30, False: 36]
  ------------------
  663|     39|    encodeTiffComponent(object);
  664|     39|  }
  665|     75|}
_ZN5Exiv28Internal11TiffEncoder19visitBinaryArrayEndEPNS0_15TiffBinaryArrayE:
  667|     73|void TiffEncoder::visitBinaryArrayEnd(TiffBinaryArray* object) {
  668|     73|  if (!object->cfg() || !object->decoded())
  ------------------
  |  Branch (668:7): [True: 7, False: 66]
  |  Branch (668:25): [True: 30, False: 36]
  ------------------
  669|     37|    return;
  670|     36|  size_t size = object->TiffEntryBase::doSize();
  671|     36|  if (size == 0)
  ------------------
  |  Branch (671:7): [True: 0, False: 36]
  ------------------
  672|      0|    return;
  673|     36|  if (!object->initialize(pRoot_))
  ------------------
  |  Branch (673:7): [True: 0, False: 36]
  ------------------
  674|      0|    return;
  675|       |
  676|       |  // Re-encrypt buffer if necessary
  677|     36|  CryptFct cryptFct = object->cfg()->cryptFct_;
  678|     36|  if (cryptFct == &sonyTagDecipher) {
  ------------------
  |  Branch (678:7): [True: 0, False: 36]
  ------------------
  679|      0|    cryptFct = sonyTagEncipher;
  680|      0|  }
  681|     36|  if (cryptFct) {
  ------------------
  |  Branch (681:7): [True: 0, False: 36]
  ------------------
  682|      0|    const byte* pData = object->pData();
  683|      0|    DataBuf buf = cryptFct(object->tag(), pData, size, pRoot_);
  684|      0|    if (!buf.empty()) {
  ------------------
  |  Branch (684:9): [True: 0, False: 0]
  ------------------
  685|      0|      pData = buf.c_data();
  686|      0|      size = buf.size();
  687|      0|    }
  688|      0|    if (!object->updOrigDataBuf(pData, size)) {
  ------------------
  |  Branch (688:9): [True: 0, False: 0]
  ------------------
  689|      0|      setDirty();
  690|      0|    }
  691|      0|  }
  692|     36|}
_ZN5Exiv28Internal11TiffEncoder18visitBinaryElementEPNS0_17TiffBinaryElementE:
  694|    983|void TiffEncoder::visitBinaryElement(TiffBinaryElement* object) {
  695|       |  // Temporarily overwrite byte order according to that of the binary element
  696|    983|  ByteOrder boOrig = byteOrder_;
  697|    983|  if (object->elByteOrder() != invalidByteOrder)
  ------------------
  |  Branch (697:7): [True: 242, False: 741]
  ------------------
  698|    242|    byteOrder_ = object->elByteOrder();
  699|    983|  encodeTiffComponent(object);
  700|    983|  byteOrder_ = boOrig;
  701|    983|}
_ZNK5Exiv28Internal11TiffEncoder10isImageTagEtNS_5IfdIdE:
  703|  4.54M|bool TiffEncoder::isImageTag(uint16_t tag, IfdId group) const {
  704|  4.54M|  return !isNewImage_ && pHeader_->isImageTag(tag, group, pPrimaryGroups_);
  ------------------
  |  Branch (704:10): [True: 126k, False: 4.41M]
  |  Branch (704:26): [True: 0, False: 126k]
  ------------------
  705|  4.54M|}
_ZN5Exiv28Internal11TiffEncoder19encodeTiffComponentEPNS0_13TiffEntryBaseEPKNS_9ExifdatumE:
  707|  2.26M|void TiffEncoder::encodeTiffComponent(TiffEntryBase* object, const Exifdatum* datum) {
  708|  2.26M|  auto pos = exifData_.end();
  709|  2.26M|  const Exifdatum* ed = datum;
  710|  2.26M|  if (!ed) {
  ------------------
  |  Branch (710:7): [True: 5.75k, False: 2.26M]
  ------------------
  711|       |    // Non-intrusive writing: find matching tag
  712|  5.75k|    ExifKey key(object->tag(), groupName(object->group()));
  713|  5.75k|    pos = exifData_.findKey(key);
  714|  5.75k|    if (pos != exifData_.end()) {
  ------------------
  |  Branch (714:9): [True: 5.17k, False: 582]
  ------------------
  715|  5.17k|      ed = &(*pos);
  716|  5.17k|      if (object->idx() != pos->idx()) {
  ------------------
  |  Branch (716:11): [True: 1.06k, False: 4.10k]
  ------------------
  717|       |        // Try to find exact match (in case of duplicate tags)
  718|  1.06k|        auto pos2 = std::find_if(exifData_.begin(), exifData_.end(), FindExifdatum2(object->group(), object->idx()));
  719|  1.06k|        if (pos2 != exifData_.end() && pos2->key() == key.key()) {
  ------------------
  |  Branch (719:13): [True: 0, False: 1.06k]
  |  Branch (719:13): [True: 0, False: 1.06k]
  |  Branch (719:40): [True: 0, False: 0]
  ------------------
  720|      0|          ed = &(*pos2);
  721|      0|          pos = pos2;  // make sure we delete the correct tag below
  722|      0|        }
  723|  1.06k|      }
  724|  5.17k|    } else {
  725|    582|      setDirty();
  726|       |#ifdef EXIV2_DEBUG_MESSAGES
  727|       |      std::cerr << "DELETING          " << key << ", idx = " << object->idx() << "\n";
  728|       |#endif
  729|    582|    }
  730|  2.26M|  } else {
  731|       |    // For intrusive writing, the index is used to preserve the order of
  732|       |    // duplicate tags
  733|  2.26M|    object->idx_ = ed->idx();
  734|  2.26M|  }
  735|       |  // Skip encoding image tags of existing TIFF image - they were copied earlier -
  736|       |  // but encode image tags of new images (creation)
  737|  2.26M|  if (ed && !isImageTag(object->tag(), object->group())) {
  ------------------
  |  Branch (737:7): [True: 2.26M, False: 582]
  |  Branch (737:13): [True: 2.26M, False: 0]
  ------------------
  738|  2.26M|    if (auto fct = findEncoderFct_(make_, object->tag(), object->group())) {
  ------------------
  |  Branch (738:14): [True: 0, False: 2.26M]
  ------------------
  739|       |      // If an encoding function is registered for the tag, use it
  740|      0|      std::invoke(fct, *this, object, ed);
  741|  2.26M|    } else {
  742|       |      // Else use the encode function at the object (results in a double-dispatch
  743|       |      // to the appropriate encoding function of the encoder.
  744|  2.26M|      object->encode(*this, ed);
  745|  2.26M|    }
  746|  2.26M|  }
  747|  2.26M|  if (del_ && pos != exifData_.end()) {
  ------------------
  |  Branch (747:7): [True: 5.75k, False: 2.26M]
  |  Branch (747:7): [True: 5.17k, False: 2.26M]
  |  Branch (747:15): [True: 5.17k, False: 582]
  ------------------
  748|  5.17k|    exifData_.erase(pos);
  749|  5.17k|  }
  750|       |#ifdef EXIV2_DEBUG_MESSAGES
  751|       |  std::cerr << "\n";
  752|       |#endif
  753|  2.26M|}  // TiffEncoder::encodeTiffComponent
_ZN5Exiv28Internal11TiffEncoder17encodeBinaryArrayEPNS0_15TiffBinaryArrayEPKNS_9ExifdatumE:
  755|  11.0k|void TiffEncoder::encodeBinaryArray(TiffBinaryArray* object, const Exifdatum* datum) {
  756|  11.0k|  encodeOffsetEntry(object, datum);
  757|  11.0k|}  // TiffEncoder::encodeBinaryArray
_ZN5Exiv28Internal11TiffEncoder19encodeBinaryElementEPNS0_17TiffBinaryElementEPKNS_9ExifdatumE:
  759|   870k|void TiffEncoder::encodeBinaryElement(TiffBinaryElement* object, const Exifdatum* datum) {
  760|   870k|  encodeTiffEntryBase(object, datum);
  761|   870k|}  // TiffEncoder::encodeArrayElement
_ZN5Exiv28Internal11TiffEncoder15encodeDataEntryEPNS0_13TiffDataEntryEPKNS_9ExifdatumE:
  763|  3.54k|void TiffEncoder::encodeDataEntry(TiffDataEntry* object, const Exifdatum* datum) {
  764|  3.54k|  encodeOffsetEntry(object, datum);
  765|       |
  766|  3.54k|  if (!dirty_ && writeMethod() == wmNonIntrusive) {
  ------------------
  |  Branch (766:7): [True: 114, False: 3.43k]
  |  Branch (766:18): [True: 55, False: 59]
  ------------------
  767|     55|    if (object->sizeDataArea_ < object->pValue()->sizeDataArea()) {
  ------------------
  |  Branch (767:9): [True: 0, False: 55]
  ------------------
  768|       |#ifdef EXIV2_DEBUG_MESSAGES
  769|       |      ExifKey key(object->tag(), groupName(object->group()));
  770|       |      std::cerr << "DATAAREA GREW     " << key << "\n";
  771|       |#endif
  772|      0|      setDirty();
  773|     55|    } else {
  774|       |      // Write the new dataarea, fill with 0x0
  775|       |#ifdef EXIV2_DEBUG_MESSAGES
  776|       |      ExifKey key(object->tag(), groupName(object->group()));
  777|       |      std::cerr << "Writing data area for " << key << "\n";
  778|       |#endif
  779|     55|      DataBuf buf = object->pValue()->dataArea();
  780|     55|      if (!buf.empty()) {
  ------------------
  |  Branch (780:11): [True: 7, False: 48]
  ------------------
  781|      7|        std::copy(buf.begin(), buf.end(), object->pDataArea_);
  782|      7|        if (object->sizeDataArea_ > buf.size()) {
  ------------------
  |  Branch (782:13): [True: 0, False: 7]
  ------------------
  783|      0|          memset(object->pDataArea_ + buf.size(), 0x0, object->sizeDataArea_ - buf.size());
  784|      0|        }
  785|      7|      }
  786|     55|    }
  787|     55|  }
  788|       |
  789|  3.54k|}  // TiffEncoder::encodeDataEntry
_ZN5Exiv28Internal11TiffEncoder15encodeTiffEntryEPNS0_9TiffEntryEPKNS_9ExifdatumE:
  791|  1.35M|void TiffEncoder::encodeTiffEntry(TiffEntry* object, const Exifdatum* datum) {
  792|  1.35M|  encodeTiffEntryBase(object, datum);
  793|  1.35M|}  // TiffEncoder::encodeTiffEntry
_ZN5Exiv28Internal11TiffEncoder16encodeImageEntryEPNS0_14TiffImageEntryEPKNS_9ExifdatumE:
  795|  9.08k|void TiffEncoder::encodeImageEntry(TiffImageEntry* object, const Exifdatum* datum) {
  796|  9.08k|  encodeOffsetEntry(object, datum);
  797|       |
  798|  9.08k|  size_t sizeDataArea = object->pValue()->sizeDataArea();
  799|       |
  800|  9.08k|  if (sizeDataArea > 0 && writeMethod() == wmNonIntrusive) {
  ------------------
  |  Branch (800:7): [True: 126, False: 8.95k]
  |  Branch (800:27): [True: 0, False: 126]
  ------------------
  801|       |#ifdef EXIV2_DEBUG_MESSAGES
  802|       |    std::cerr << "\t DATAAREA IS SET (NON-INTRUSIVE WRITING)";
  803|       |#endif
  804|      0|    setDirty();
  805|      0|  }
  806|       |
  807|  9.08k|  if (sizeDataArea > 0 && writeMethod() == wmIntrusive) {
  ------------------
  |  Branch (807:7): [True: 126, False: 8.95k]
  |  Branch (807:27): [True: 126, False: 0]
  ------------------
  808|       |#ifdef EXIV2_DEBUG_MESSAGES
  809|       |    std::cerr << "\t DATAAREA IS SET (INTRUSIVE WRITING)";
  810|       |#endif
  811|       |    // Set pseudo strips (without a data pointer) from the size tag
  812|    126|    ExifKey key(object->szTag(), groupName(object->szGroup()));
  813|    126|    auto pos = exifData_.findKey(key);
  814|    126|    const byte* zero = nullptr;
  815|    126|    if (pos == exifData_.end()) {
  ------------------
  |  Branch (815:9): [True: 0, False: 126]
  ------------------
  816|      0|#ifndef SUPPRESS_WARNINGS
  817|      0|      EXV_ERROR << "Size tag " << key << " not found. Writing only one strip.\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  818|      0|#endif
  819|      0|      object->strips_.clear();
  820|      0|      object->strips_.emplace_back(zero, sizeDataArea);
  821|    126|    } else {
  822|    126|      size_t sizeTotal = 0;
  823|    126|      object->strips_.clear();
  824|  1.57k|      for (size_t i = 0; i < pos->count(); ++i) {
  ------------------
  |  Branch (824:26): [True: 1.44k, False: 126]
  ------------------
  825|  1.44k|        uint32_t len = pos->toUint32(i);
  826|  1.44k|        object->strips_.emplace_back(zero, len);
  827|  1.44k|        sizeTotal += len;
  828|  1.44k|      }
  829|    126|      if (sizeTotal != sizeDataArea) {
  ------------------
  |  Branch (829:11): [True: 0, False: 126]
  ------------------
  830|      0|#ifndef SUPPRESS_WARNINGS
  831|      0|        ExifKey key2(object->tag(), groupName(object->group()));
  832|      0|        EXV_ERROR << "Sum of all sizes of " << key << " != data size of " << key2 << ". "
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  833|      0|                  << "This results in an invalid image.\n";
  834|      0|#endif
  835|       |        // Todo: How to fix? Write only one strip?
  836|      0|      }
  837|    126|    }
  838|    126|  }
  839|       |
  840|  9.08k|  if (sizeDataArea == 0 && writeMethod() == wmIntrusive) {
  ------------------
  |  Branch (840:7): [True: 8.95k, False: 126]
  |  Branch (840:28): [True: 8.86k, False: 95]
  ------------------
  841|       |#ifdef EXIV2_DEBUG_MESSAGES
  842|       |    std::cerr << "\t USE STRIPS FROM SOURCE TREE IMAGE ENTRY";
  843|       |#endif
  844|       |    // Set strips from source tree
  845|  8.86k|    if (pSourceTree_) {
  ------------------
  |  Branch (845:9): [True: 313, False: 8.55k]
  ------------------
  846|    313|      TiffFinder finder(object->tag(), object->group());
  847|    313|      pSourceTree_->accept(finder);
  848|    313|      if (auto ti = dynamic_cast<const TiffImageEntry*>(finder.result())) {
  ------------------
  |  Branch (848:16): [True: 313, False: 0]
  ------------------
  849|    313|        object->strips_ = ti->strips_;
  850|    313|      }
  851|    313|    }
  852|  8.55k|#ifndef SUPPRESS_WARNINGS
  853|  8.55k|    else {
  854|  8.55k|      ExifKey key2(object->tag(), groupName(object->group()));
  855|  8.55k|      EXV_WARNING << "No image data to encode " << key2 << ".\n";
  ------------------
  |  |  138|  8.55k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 8.55k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  8.55k|  LogMsg(LogMsg::warn).os()
  ------------------
  856|  8.55k|    }
  857|  8.86k|#endif
  858|  8.86k|  }
  859|       |
  860|  9.08k|}  // TiffEncoder::encodeImageEntry
_ZN5Exiv28Internal11TiffEncoder13encodeMnEntryEPNS0_11TiffMnEntryEPKNS_9ExifdatumE:
  862|  7.34k|void TiffEncoder::encodeMnEntry(TiffMnEntry* object, const Exifdatum* datum) {
  863|       |  // Test is required here as well as in the visit function
  864|  7.34k|  if (!object->mn_)
  ------------------
  |  Branch (864:7): [True: 7.20k, False: 134]
  ------------------
  865|  7.20k|    encodeTiffEntryBase(object, datum);
  866|  7.34k|}  // TiffEncoder::encodeMnEntry
_ZN5Exiv28Internal11TiffEncoder15encodeSizeEntryEPNS0_13TiffSizeEntryEPKNS_9ExifdatumE:
  868|  14.9k|void TiffEncoder::encodeSizeEntry(TiffSizeEntry* object, const Exifdatum* datum) {
  869|  14.9k|  encodeTiffEntryBase(object, datum);
  870|  14.9k|}  // TiffEncoder::encodeSizeEntry
_ZN5Exiv28Internal11TiffEncoder12encodeSubIfdEPNS0_10TiffSubIfdEPKNS_9ExifdatumE:
  872|     89|void TiffEncoder::encodeSubIfd(TiffSubIfd* object, const Exifdatum* datum) {
  873|     89|  encodeOffsetEntry(object, datum);
  874|     89|}  // TiffEncoder::encodeSubIfd
_ZN5Exiv28Internal11TiffEncoder19encodeTiffEntryBaseEPNS0_13TiffEntryBaseEPKNS_9ExifdatumE:
  876|  2.24M|void TiffEncoder::encodeTiffEntryBase(TiffEntryBase* object, const Exifdatum* datum) {
  877|       |#ifdef EXIV2_DEBUG_MESSAGES
  878|       |  bool tooLarge = false;
  879|       |#endif
  880|  2.24M|  if (datum->size() > object->size_) {  // value doesn't fit, encode for intrusive writing
  ------------------
  |  Branch (880:7): [True: 123k, False: 2.11M]
  ------------------
  881|   123k|    setDirty();
  882|       |#ifdef EXIV2_DEBUG_MESSAGES
  883|       |    tooLarge = true;
  884|       |#endif
  885|   123k|  }
  886|  2.24M|  object->updateValue(datum->getValue(), byteOrder());  // clones the value
  887|       |#ifdef EXIV2_DEBUG_MESSAGES
  888|       |  ExifKey key(object->tag(), groupName(object->group()));
  889|       |  std::cerr << "UPDATING DATA     " << key;
  890|       |  if (tooLarge) {
  891|       |    std::cerr << "\t\t\t ALLOCATED " << std::dec << object->size_ << " BYTES";
  892|       |  }
  893|       |#endif
  894|  2.24M|}
_ZN5Exiv28Internal11TiffEncoder17encodeOffsetEntryEPNS0_13TiffEntryBaseEPKNS_9ExifdatumE:
  896|  23.7k|void TiffEncoder::encodeOffsetEntry(TiffEntryBase* object, const Exifdatum* datum) {
  897|  23.7k|  size_t newSize = datum->size();
  898|  23.7k|  if (newSize > object->size_) {  // value doesn't fit, encode for intrusive writing
  ------------------
  |  Branch (898:7): [True: 4.49k, False: 19.2k]
  ------------------
  899|  4.49k|    setDirty();
  900|  4.49k|    object->updateValue(datum->getValue(), byteOrder());  // clones the value
  901|       |#ifdef EXIV2_DEBUG_MESSAGES
  902|       |    ExifKey key(object->tag(), groupName(object->group()));
  903|       |    std::cerr << "UPDATING DATA     " << key;
  904|       |    std::cerr << "\t\t\t ALLOCATED " << object->size() << " BYTES";
  905|       |#endif
  906|  19.2k|  } else {
  907|  19.2k|    object->setValue(datum->getValue());  // clones the value
  908|       |#ifdef EXIV2_DEBUG_MESSAGES
  909|       |    ExifKey key(object->tag(), groupName(object->group()));
  910|       |    std::cerr << "NOT UPDATING      " << key;
  911|       |    std::cerr << "\t\t\t PRESERVE VALUE DATA";
  912|       |#endif
  913|  19.2k|  }
  914|  23.7k|}
_ZN5Exiv28Internal11TiffEncoder3addEPNS0_13TiffComponentENSt3__110unique_ptrIS2_NS4_14default_deleteIS2_EEEEj:
  916|  7.60k|void TiffEncoder::add(TiffComponent* pRootDir, TiffComponent::UniquePtr pSourceDir, uint32_t root) {
  917|  7.60k|  writeMethod_ = wmIntrusive;
  918|  7.60k|  pSourceTree_ = std::move(pSourceDir);
  919|       |
  920|       |  // Ensure that the exifData_ entries are not deleted, to be able to
  921|       |  // iterate over all remaining entries.
  922|  7.60k|  del_ = false;
  923|       |
  924|  7.60k|  auto posBo = exifData_.end();
  925|  2.29M|  for (auto i = exifData_.begin(); i != exifData_.end(); ++i) {
  ------------------
  |  Branch (925:36): [True: 2.28M, False: 7.60k]
  ------------------
  926|  2.28M|    IfdId group = groupId(i->groupName());
  927|       |    // Skip synthesized info tags
  928|  2.28M|    if (group == IfdId::mnId) {
  ------------------
  |  Branch (928:9): [True: 9.16k, False: 2.27M]
  ------------------
  929|  9.16k|      if (i->tag() == 0x0002) {
  ------------------
  |  Branch (929:11): [True: 4.58k, False: 4.58k]
  ------------------
  930|  4.58k|        posBo = i;
  931|  4.58k|      }
  932|  9.16k|      continue;
  933|  9.16k|    }
  934|       |
  935|       |    // Skip image tags of existing TIFF image - they were copied earlier -
  936|       |    // but add and encode image tags of new images (creation)
  937|  2.27M|    if (isImageTag(i->tag(), group))
  ------------------
  |  Branch (937:9): [True: 0, False: 2.27M]
  ------------------
  938|      0|      continue;
  939|       |
  940|       |    // Assumption is that the corresponding TIFF entry doesn't exist
  941|  2.27M|    auto tiffPath = TiffCreator::getPath(i->tag(), group, root);
  942|  2.27M|    TiffComponent* tc = pRootDir->addPath(i->tag(), tiffPath, pRootDir);
  943|  2.27M|    auto object = dynamic_cast<TiffEntryBase*>(tc);
  944|       |#ifdef EXIV2_DEBUG_MESSAGES
  945|       |    if (!object) {
  946|       |      std::cerr << "Warning: addPath() didn't add an entry for " << i->groupName() << " tag 0x" << std::setw(4)
  947|       |                << std::setfill('0') << std::hex << i->tag() << "\n";
  948|       |    }
  949|       |#endif
  950|  2.27M|    if (object) {
  ------------------
  |  Branch (950:9): [True: 2.26M, False: 14.0k]
  ------------------
  951|  2.26M|      encodeTiffComponent(object, &(*i));
  952|  2.26M|    }
  953|  2.27M|  }
  954|       |
  955|       |  /*
  956|       |    What follows is a hack. I can't think of a better way to set
  957|       |    the makernote byte order (and other properties maybe) in the
  958|       |    makernote header during intrusive writing. The thing is that
  959|       |    visit/encodeIfdMakernote is not called in this case and there
  960|       |    can't be an Exif tag which corresponds to this component.
  961|       |   */
  962|  7.60k|  if (posBo == exifData_.end())
  ------------------
  |  Branch (962:7): [True: 3.02k, False: 4.58k]
  ------------------
  963|  3.02k|    return;
  964|       |
  965|  4.58k|  TiffFinder finder(0x927c, IfdId::exifId);
  966|  4.58k|  pRootDir->accept(finder);
  967|  4.58k|  if (auto te = dynamic_cast<const TiffMnEntry*>(finder.result())) {
  ------------------
  |  Branch (967:12): [True: 4.54k, False: 36]
  ------------------
  968|  4.54k|    if (const auto& mn = te->mn_) {
  ------------------
  |  Branch (968:21): [True: 4.48k, False: 64]
  ------------------
  969|       |      // Set Makernote byte order
  970|  4.48k|      ByteOrder bo = stringToByteOrder(posBo->toString());
  971|  4.48k|      if (bo != invalidByteOrder)
  ------------------
  |  Branch (971:11): [True: 4.48k, False: 0]
  ------------------
  972|  4.48k|        mn->setByteOrder(bo);
  973|  4.48k|    }
  974|  4.54k|  }
  975|       |
  976|  4.58k|}  // TiffEncoder::add
_ZN5Exiv28Internal10TiffReaderC2EPKhmPNS0_13TiffComponentENS0_11TiffRwStateE:
  979|  39.4k|    pData_(pData), size_(size), pLast_(pData + size), pRoot_(pRoot), origState_(state), mnState_(state) {
  980|  39.4k|  pState_ = &origState_;
  981|       |
  982|  39.4k|}  // TiffReader::TiffReader
_ZN5Exiv28Internal10TiffReader12setOrigStateEv:
  984|  68.2k|void TiffReader::setOrigState() {
  985|  68.2k|  pState_ = &origState_;
  986|  68.2k|}
_ZN5Exiv28Internal10TiffReader10setMnStateEPKNS0_11TiffRwStateE:
  988|  68.2k|void TiffReader::setMnState(const TiffRwState* state) {
  989|  68.2k|  if (state) {
  ------------------
  |  Branch (989:7): [True: 28.7k, False: 39.4k]
  ------------------
  990|       |    // invalidByteOrder indicates 'no change'
  991|  28.7k|    if (state->byteOrder() == invalidByteOrder) {
  ------------------
  |  Branch (991:9): [True: 0, False: 28.7k]
  ------------------
  992|      0|      mnState_ = TiffRwState{origState_.byteOrder(), state->baseOffset()};
  993|  28.7k|    } else {
  994|  28.7k|      mnState_ = *state;
  995|  28.7k|    }
  996|  28.7k|  }
  997|  68.2k|  pState_ = &mnState_;
  998|  68.2k|}
_ZNK5Exiv28Internal10TiffReader9byteOrderEv:
 1000|  37.8M|ByteOrder TiffReader::byteOrder() const {
 1001|  37.8M|  return pState_->byteOrder();
 1002|  37.8M|}
_ZNK5Exiv28Internal10TiffReader10baseOffsetEv:
 1004|  3.38M|size_t TiffReader::baseOffset() const {
 1005|  3.38M|  return pState_->baseOffset();
 1006|  3.38M|}
_ZN5Exiv28Internal10TiffReader17readDataEntryBaseEPNS0_17TiffDataEntryBaseE:
 1008|  40.8k|void TiffReader::readDataEntryBase(TiffDataEntryBase* object) {
 1009|  40.8k|  readTiffEntry(object);
 1010|  40.8k|  TiffFinder finder(object->szTag(), object->szGroup());
 1011|  40.8k|  pRoot_->accept(finder);
 1012|  40.8k|  auto te = dynamic_cast<const TiffEntryBase*>(finder.result());
 1013|  40.8k|  if (te && te->pValue()) {
  ------------------
  |  Branch (1013:7): [True: 25.0k, False: 15.8k]
  |  Branch (1013:13): [True: 10.8k, False: 14.2k]
  ------------------
 1014|  10.8k|    object->setStrips(te->pValue(), pData_, size_, baseOffset());
 1015|  10.8k|  }
 1016|  40.8k|}
_ZN5Exiv28Internal10TiffReader10visitEntryEPNS0_9TiffEntryE:
 1018|  5.31M|void TiffReader::visitEntry(TiffEntry* object) {
 1019|  5.31M|  readTiffEntry(object);
 1020|  5.31M|}
_ZN5Exiv28Internal10TiffReader14visitDataEntryEPNS0_13TiffDataEntryE:
 1022|  6.12k|void TiffReader::visitDataEntry(TiffDataEntry* object) {
 1023|  6.12k|  readDataEntryBase(object);
 1024|  6.12k|}
_ZN5Exiv28Internal10TiffReader15visitImageEntryEPNS0_14TiffImageEntryE:
 1026|  34.7k|void TiffReader::visitImageEntry(TiffImageEntry* object) {
 1027|  34.7k|  readDataEntryBase(object);
 1028|  34.7k|}
_ZN5Exiv28Internal10TiffReader14visitSizeEntryEPNS0_13TiffSizeEntryE:
 1030|  53.5k|void TiffReader::visitSizeEntry(TiffSizeEntry* object) {
 1031|  53.5k|  readTiffEntry(object);
 1032|  53.5k|  TiffFinder finder(object->dtTag(), object->dtGroup());
 1033|  53.5k|  pRoot_->accept(finder);
 1034|  53.5k|  auto te = dynamic_cast<TiffDataEntryBase*>(finder.result());
 1035|  53.5k|  if (te && te->pValue()) {
  ------------------
  |  Branch (1035:7): [True: 29.6k, False: 23.9k]
  |  Branch (1035:13): [True: 22.2k, False: 7.35k]
  ------------------
 1036|  22.2k|    te->setStrips(object->pValue(), pData_, size_, baseOffset());
 1037|  22.2k|  }
 1038|  53.5k|}
_ZN5Exiv28Internal10TiffReader17circularReferenceEPKhNS_5IfdIdE:
 1040|   113k|bool TiffReader::circularReference(const byte* start, IfdId group) {
 1041|   113k|  if (auto pos = dirList_.find(start); pos != dirList_.end()) {
  ------------------
  |  Branch (1041:40): [True: 10.2k, False: 103k]
  ------------------
 1042|  10.2k|#ifndef SUPPRESS_WARNINGS
 1043|  10.2k|    EXV_ERROR << groupName(group) << " pointer references previously read " << groupName(pos->second)
  ------------------
  |  |  142|  10.2k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 10.2k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  10.2k|  LogMsg(LogMsg::error).os()
  ------------------
 1044|      0|              << " directory; ignored.\n";
 1045|  10.2k|#endif
 1046|  10.2k|    return true;
 1047|  10.2k|  }
 1048|   103k|  dirList_[start] = group;
 1049|   103k|  return false;
 1050|   113k|}
_ZN5Exiv28Internal10TiffReader7nextIdxENS_5IfdIdE:
 1052|  21.2M|int TiffReader::nextIdx(IfdId group) {
 1053|  21.2M|  return ++idxSeq_[group];
 1054|  21.2M|}
_ZN5Exiv28Internal10TiffReader11postProcessEv:
 1056|  39.4k|void TiffReader::postProcess() {
 1057|  39.4k|  setMnState();  // All components to be post-processed must be from the Makernote
 1058|  39.4k|  postProc_ = true;
 1059|  44.6k|  for (auto pos : postList_) {
  ------------------
  |  Branch (1059:17): [True: 44.6k, False: 39.4k]
  ------------------
 1060|  44.6k|    pos->accept(*this);
 1061|  44.6k|  }
 1062|  39.4k|  postProc_ = false;
 1063|  39.4k|  setOrigState();
 1064|  39.4k|}
_ZN5Exiv28Internal10TiffReader14visitDirectoryEPNS0_13TiffDirectoryE:
 1066|   113k|void TiffReader::visitDirectory(TiffDirectory* object) {
 1067|   113k|  const byte* p = object->start();
 1068|       |
 1069|   113k|  if (circularReference(object->start(), object->group()))
  ------------------
  |  Branch (1069:7): [True: 10.2k, False: 103k]
  ------------------
 1070|  10.2k|    return;
 1071|       |
 1072|   103k|  if (p + 2 > pLast_) {
  ------------------
  |  Branch (1072:7): [True: 67, False: 103k]
  ------------------
 1073|     67|#ifndef SUPPRESS_WARNINGS
 1074|     67|    EXV_ERROR << "Directory " << groupName(object->group()) << ": IFD exceeds data buffer, cannot read entry count.\n";
  ------------------
  |  |  142|     67|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 67]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|     67|  LogMsg(LogMsg::error).os()
  ------------------
 1075|     67|#endif
 1076|     67|    return;
 1077|     67|  }
 1078|   103k|  const uint16_t n = getUShort(p, byteOrder());
 1079|   103k|  p += 2;
 1080|       |  // Sanity check with an "unreasonably" large number
 1081|   103k|  if (n > 256) {
  ------------------
  |  Branch (1081:7): [True: 13.0k, False: 90.5k]
  ------------------
 1082|  13.0k|#ifndef SUPPRESS_WARNINGS
 1083|  13.0k|    EXV_ERROR << "Directory " << groupName(object->group()) << " with " << n
  ------------------
  |  |  142|  13.0k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 13.0k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  13.0k|  LogMsg(LogMsg::error).os()
  ------------------
 1084|      0|              << " entries considered invalid; not read.\n";
 1085|  13.0k|#endif
 1086|  13.0k|    return;
 1087|  13.0k|  }
 1088|  5.74M|  for (uint16_t i = 0; i < n; ++i) {
  ------------------
  |  Branch (1088:24): [True: 5.72M, False: 21.4k]
  ------------------
 1089|  5.72M|    if (p + 12 > pLast_) {
  ------------------
  |  Branch (1089:9): [True: 69.1k, False: 5.65M]
  ------------------
 1090|  69.1k|#ifndef SUPPRESS_WARNINGS
 1091|  69.1k|      EXV_ERROR << "Directory " << groupName(object->group()) << ": IFD entry " << i
  ------------------
  |  |  142|  69.1k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 69.1k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  69.1k|  LogMsg(LogMsg::error).os()
  ------------------
 1092|      0|                << " lies outside of the data buffer.\n";
 1093|  69.1k|#endif
 1094|  69.1k|      return;
 1095|  69.1k|    }
 1096|  5.65M|    uint16_t tag = getUShort(p, byteOrder());
 1097|  5.65M|    if (auto tc = TiffCreator::create(tag, object->group())) {
  ------------------
  |  Branch (1097:14): [True: 5.59M, False: 57.6k]
  ------------------
 1098|  5.59M|      tc->setStart(p);
 1099|  5.59M|      object->addChild(std::move(tc));
 1100|  5.59M|    } else {
 1101|  57.6k|#ifndef SUPPRESS_WARNINGS
 1102|  57.6k|      EXV_WARNING << "Unable to handle tag " << tag << ".\n";
  ------------------
  |  |  138|  57.6k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 57.6k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  57.6k|  LogMsg(LogMsg::warn).os()
  ------------------
 1103|  57.6k|#endif
 1104|  57.6k|    }
 1105|  5.65M|    p += 12;
 1106|  5.65M|  }
 1107|       |
 1108|  21.4k|  if (object->hasNext()) {
  ------------------
  |  Branch (1108:7): [True: 20.8k, False: 559]
  ------------------
 1109|  20.8k|    if (p + 4 > pLast_) {
  ------------------
  |  Branch (1109:9): [True: 152, False: 20.7k]
  ------------------
 1110|    152|#ifndef SUPPRESS_WARNINGS
 1111|    152|      EXV_ERROR << "Directory " << groupName(object->group())
  ------------------
  |  |  142|    152|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 152]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    152|  LogMsg(LogMsg::error).os()
  ------------------
 1112|      0|                << ": IFD exceeds data buffer, cannot read next pointer.\n";
 1113|    152|#endif
 1114|    152|      return;
 1115|    152|    }
 1116|  20.7k|    TiffComponent::UniquePtr tc;
 1117|  20.7k|    uint32_t next = getULong(p, byteOrder());
 1118|  20.7k|    if (next) {
  ------------------
  |  Branch (1118:9): [True: 18.8k, False: 1.85k]
  ------------------
 1119|  18.8k|      tc = TiffCreator::create(Tag::next, object->group());
 1120|  18.8k|#ifndef SUPPRESS_WARNINGS
 1121|  18.8k|      if (!tc) {
  ------------------
  |  Branch (1121:11): [True: 11.2k, False: 7.61k]
  ------------------
 1122|  11.2k|        EXV_WARNING << "Directory " << groupName(object->group()) << " has an unexpected next pointer; ignored.\n";
  ------------------
  |  |  138|  11.2k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 11.2k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  11.2k|  LogMsg(LogMsg::warn).os()
  ------------------
 1123|  11.2k|      }
 1124|  18.8k|#endif
 1125|  18.8k|    }
 1126|  20.7k|    if (tc) {
  ------------------
  |  Branch (1126:9): [True: 7.61k, False: 13.0k]
  ------------------
 1127|  7.61k|      if (next > size_ || baseOffset() > size_ - next) {
  ------------------
  |  Branch (1127:11): [True: 5.82k, False: 1.78k]
  |  Branch (1127:27): [True: 8, False: 1.77k]
  ------------------
 1128|  5.83k|#ifndef SUPPRESS_WARNINGS
 1129|  5.83k|        EXV_ERROR << "Directory " << groupName(object->group()) << ": Next pointer is out of bounds; ignored.\n";
  ------------------
  |  |  142|  5.83k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 5.83k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  5.83k|  LogMsg(LogMsg::error).os()
  ------------------
 1130|  5.83k|#endif
 1131|  5.83k|        return;
 1132|  5.83k|      }
 1133|  1.77k|      tc->setStart(pData_ + baseOffset() + next);
 1134|  1.77k|      object->addNext(std::move(tc));
 1135|  1.77k|    }
 1136|  20.7k|  }  // object->hasNext()
 1137|       |
 1138|  21.4k|}  // TiffReader::visitDirectory
_ZN5Exiv28Internal10TiffReader11visitSubIfdEPNS0_10TiffSubIfdE:
 1140|  21.9k|void TiffReader::visitSubIfd(TiffSubIfd* object) {
 1141|  21.9k|  readTiffEntry(object);
 1142|  21.9k|  if ((object->tiffType() == ttUnsignedLong || object->tiffType() == ttSignedLong || object->tiffType() == ttTiffIfd) &&
  ------------------
  |  Branch (1142:8): [True: 13.6k, False: 8.34k]
  |  Branch (1142:48): [True: 1.05k, False: 7.28k]
  |  Branch (1142:86): [True: 4.01k, False: 3.26k]
  ------------------
 1143|  18.7k|      object->count() >= 1) {
  ------------------
  |  Branch (1143:7): [True: 9.70k, False: 9.01k]
  ------------------
 1144|       |    // Todo: Fix hack
 1145|  9.70k|    uint32_t maxi = 9;
 1146|  9.70k|    if (object->group() == IfdId::ifd1Id)
  ------------------
  |  Branch (1146:9): [True: 110, False: 9.59k]
  ------------------
 1147|    110|      maxi = 1;
 1148|  53.8k|    for (uint32_t i = 0; i < object->count(); ++i) {
  ------------------
  |  Branch (1148:26): [True: 52.6k, False: 1.22k]
  ------------------
 1149|  52.6k|      const uint32_t offset = getULong(object->pData() + (4 * i), byteOrder());
 1150|  52.6k|      if (offset > size_ || baseOffset() > size_ - offset) {
  ------------------
  |  Branch (1150:11): [True: 8.29k, False: 44.3k]
  |  Branch (1150:29): [True: 34, False: 44.3k]
  ------------------
 1151|  8.33k|#ifndef SUPPRESS_WARNINGS
 1152|  8.33k|        EXV_ERROR << "Directory " << groupName(object->group()) << ", entry 0x" << std::setw(4) << std::setfill('0')
  ------------------
  |  |  142|  8.33k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 8.33k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  8.33k|  LogMsg(LogMsg::error).os()
  ------------------
 1153|      0|                  << std::hex << object->tag() << " Sub-IFD pointer " << i << " is out of bounds; ignoring it.\n";
 1154|  8.33k|#endif
 1155|  8.33k|        return;
 1156|  8.33k|      }
 1157|  44.3k|      if (i >= maxi) {
  ------------------
  |  Branch (1157:11): [True: 147, False: 44.1k]
  ------------------
 1158|    147|#ifndef SUPPRESS_WARNINGS
 1159|    147|        EXV_WARNING << "Directory " << groupName(object->group()) << ", entry 0x" << std::setw(4) << std::setfill('0')
  ------------------
  |  |  138|    147|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 147]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|    147|  LogMsg(LogMsg::warn).os()
  ------------------
 1160|      0|                    << std::hex << object->tag() << ": Skipping sub-IFDs beyond the first " << i << ".\n";
 1161|    147|#endif
 1162|    147|        break;
 1163|    147|      }
 1164|       |      // If there are multiple dirs, group is incremented for each
 1165|  44.1k|      auto td = std::make_unique<TiffDirectory>(object->tag(),
 1166|  44.1k|                                                static_cast<IfdId>(static_cast<uint32_t>(object->newGroup_) + i));
 1167|  44.1k|      td->setStart(pData_ + baseOffset() + offset);
 1168|  44.1k|      object->addChild(std::move(td));
 1169|  44.1k|    }
 1170|  9.70k|  }
 1171|  12.2k|#ifndef SUPPRESS_WARNINGS
 1172|  12.2k|  else {
 1173|  12.2k|    EXV_WARNING << "Directory " << groupName(object->group()) << ", entry 0x" << std::setw(4) << std::setfill('0')
  ------------------
  |  |  138|  12.2k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 12.2k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  12.2k|  LogMsg(LogMsg::warn).os()
  ------------------
 1174|      0|                << std::hex << object->tag() << " doesn't look like a sub-IFD.\n";
 1175|  12.2k|  }
 1176|  21.9k|#endif
 1177|       |
 1178|  21.9k|}  // TiffReader::visitSubIfd
_ZN5Exiv28Internal10TiffReader12visitMnEntryEPNS0_11TiffMnEntryE:
 1180|  37.1k|void TiffReader::visitMnEntry(TiffMnEntry* object) {
 1181|  37.1k|  readTiffEntry(object);
 1182|       |  // Find camera make
 1183|  37.1k|  TiffFinder finder(0x010f, IfdId::ifd0Id);
 1184|  37.1k|  pRoot_->accept(finder);
 1185|  37.1k|  auto te = dynamic_cast<const TiffEntryBase*>(finder.result());
 1186|  37.1k|  if (te && te->pValue()) {
  ------------------
  |  Branch (1186:7): [True: 36.7k, False: 324]
  |  Branch (1186:13): [True: 36.5k, False: 265]
  ------------------
 1187|  36.5k|    auto make = te->pValue()->toString();
 1188|       |    // create concrete makernote, based on make and makernote contents
 1189|  36.5k|    object->mn_ =
 1190|  36.5k|        TiffMnCreator::create(object->tag(), object->mnGroup_, make, object->pData_, object->size_, byteOrder());
 1191|  36.5k|  }
 1192|  37.1k|  if (object->mn_)
  ------------------
  |  Branch (1192:7): [True: 29.6k, False: 7.43k]
  ------------------
 1193|  29.6k|    object->mn_->setStart(object->pData());
 1194|       |
 1195|  37.1k|}  // TiffReader::visitMnEntry
_ZN5Exiv28Internal10TiffReader17visitIfdMakernoteEPNS0_16TiffIfdMakernoteE:
 1197|  29.6k|void TiffReader::visitIfdMakernote(TiffIfdMakernote* object) {
 1198|  29.6k|  object->setImageByteOrder(byteOrder());  // set the byte order for the image
 1199|       |
 1200|  29.6k|  if (!object->readHeader(object->start(), pLast_ - object->start(), byteOrder())) {
  ------------------
  |  Branch (1200:7): [True: 899, False: 28.7k]
  ------------------
 1201|    899|#ifndef SUPPRESS_WARNINGS
 1202|    899|    EXV_ERROR << "Failed to read " << groupName(object->ifd_.group()) << " IFD Makernote header.\n";
  ------------------
  |  |  142|    899|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 899]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|    899|  LogMsg(LogMsg::error).os()
  ------------------
 1203|       |#ifdef EXIV2_DEBUG_MESSAGES
 1204|       |    if (pLast_ - object->start() >= 16u) {
 1205|       |      hexdump(std::cerr, object->start(), 16u);
 1206|       |    }
 1207|       |#endif  // EXIV2_DEBUG_MESSAGES
 1208|    899|#endif  // SUPPRESS_WARNINGS
 1209|    899|    setGo(geKnownMakernote, false);
 1210|    899|    return;
 1211|    899|  }
 1212|       |
 1213|  28.7k|  auto start = object->start();
 1214|  28.7k|  auto offset = object->ifdOffset();
 1215|  28.7k|  enforce(pData_ <= start, ErrorCode::kerCorruptedMetadata);
 1216|  28.7k|  enforce(start <= pLast_, ErrorCode::kerCorruptedMetadata);
 1217|  28.7k|  enforce(offset <= static_cast<size_t>(pLast_ - start), ErrorCode::kerCorruptedMetadata);
 1218|  28.7k|  object->ifd_.setStart(start + offset);
 1219|       |
 1220|       |  // Modify reader for Makernote peculiarities, byte order and offset
 1221|  28.7k|  object->mnOffset_ = start - pData_;
 1222|  28.7k|  auto state = TiffRwState{object->byteOrder(), object->baseOffset()};
 1223|  28.7k|  setMnState(&state);
 1224|       |
 1225|  28.7k|}  // TiffReader::visitIfdMakernote
_ZN5Exiv28Internal10TiffReader20visitIfdMakernoteEndEPNS0_16TiffIfdMakernoteE:
 1227|  28.7k|void TiffReader::visitIfdMakernoteEnd(TiffIfdMakernote* /*object*/) {
 1228|       |  // Reset state (byte order, create function, offset) back to that for the image
 1229|  28.7k|  setOrigState();
 1230|  28.7k|}  // TiffReader::visitIfdMakernoteEnd
_ZN5Exiv28Internal10TiffReader13readTiffEntryEPNS0_13TiffEntryBaseE:
 1232|  5.50M|void TiffReader::readTiffEntry(TiffEntryBase* object) {
 1233|  5.50M|  try {
 1234|  5.50M|    byte* p = object->start();
 1235|       |
 1236|  5.50M|    if (p + 12 > pLast_) {
  ------------------
  |  Branch (1236:9): [True: 6, False: 5.50M]
  ------------------
 1237|      6|#ifndef SUPPRESS_WARNINGS
 1238|      6|      EXV_ERROR << "Entry in directory " << groupName(object->group())
  ------------------
  |  |  142|      6|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 6]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      6|  LogMsg(LogMsg::error).os()
  ------------------
 1239|      0|                << "requests access to memory beyond the data buffer. " << "Skipping entry.\n";
 1240|      6|#endif
 1241|      6|      return;
 1242|      6|    }
 1243|       |    // Component already has tag
 1244|  5.50M|    p += 2;
 1245|  5.50M|    auto tiffType = static_cast<TiffType>(getUShort(p, byteOrder()));
 1246|  5.50M|    TypeId typeId = toTypeId(tiffType, object->tag(), object->group());
 1247|  5.50M|    size_t typeSize = TypeInfo::typeSize(typeId);
 1248|  5.50M|    if (0 == typeSize) {
  ------------------
  |  Branch (1248:9): [True: 4.99M, False: 515k]
  ------------------
 1249|  4.99M|#ifndef SUPPRESS_WARNINGS
 1250|  4.99M|      EXV_WARNING << stringFormat(
  ------------------
  |  |  138|  4.99M|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 4.99M]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  4.99M|  LogMsg(LogMsg::warn).os()
  ------------------
                    EXV_WARNING << stringFormat(
  ------------------
  |  |   18|      0|#define stringFormat std::format
  ------------------
 1251|      0|          "Directory {}, entry 0x{:04x} has unknown Exif (TIFF) type {}; setting type size 1.\n",
 1252|      0|          groupName(object->group()), object->tag(), static_cast<uint16_t>(tiffType));
 1253|  4.99M|#endif
 1254|  4.99M|      typeSize = 1;
 1255|  4.99M|    }
 1256|  5.50M|    p += 2;
 1257|  5.50M|    uint32_t count = getULong(p, byteOrder());
 1258|  5.50M|    if (count >= 0x10000000) {
  ------------------
  |  Branch (1258:9): [True: 2.92M, False: 2.58M]
  ------------------
 1259|  2.92M|#ifndef SUPPRESS_WARNINGS
 1260|  2.92M|      EXV_ERROR << stringFormat("Directory {}, entry 0x{:04x} has invalid size {}*{}; skipping entry.\n",
  ------------------
  |  |  142|  2.92M|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 2.92M]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  2.92M|  LogMsg(LogMsg::error).os()
  ------------------
                    EXV_ERROR << stringFormat("Directory {}, entry 0x{:04x} has invalid size {}*{}; skipping entry.\n",
  ------------------
  |  |   18|      0|#define stringFormat std::format
  ------------------
 1261|      0|                                groupName(object->group()), object->tag(), count, typeSize);
 1262|  2.92M|#endif
 1263|  2.92M|      return;
 1264|  2.92M|    }
 1265|  2.58M|    p += 4;
 1266|       |
 1267|  2.58M|    if (count > std::numeric_limits<size_t>::max() / typeSize) {
  ------------------
  |  Branch (1267:9): [True: 0, False: 2.58M]
  ------------------
 1268|      0|      throw Error(ErrorCode::kerArithmeticOverflow);
 1269|      0|    }
 1270|  2.58M|    size_t size = typeSize * count;
 1271|  2.58M|    size_t offset = getULong(p, byteOrder());
 1272|  2.58M|    byte* pData = p;
 1273|  2.58M|    if (size > 4 && Safe::add<size_t>(baseOffset(), offset) >= size_) {
  ------------------
  |  Branch (1273:9): [True: 2.20M, False: 376k]
  |  Branch (1273:21): [True: 1.68M, False: 526k]
  ------------------
 1274|       |      // #1143
 1275|  1.68M|      if (object->tag() == 0x2001 && std::string(groupName(object->group())) == "Sony1") {
  ------------------
  |  Branch (1275:11): [True: 1.22k, False: 1.67M]
  |  Branch (1275:11): [True: 87, False: 1.68M]
  |  Branch (1275:38): [True: 87, False: 1.13k]
  ------------------
 1276|       |        // This tag is Exif.Sony1.PreviewImage, which refers to a preview image which is
 1277|       |        // not stored in the metadata. Instead it is stored at the end of the file, after
 1278|       |        // the main image. The value of `size` refers to the size of the preview image, not
 1279|       |        // the size of the tag's payload, so we set it to zero here so that we don't attempt
 1280|       |        // to read those bytes from the metadata. We currently leave this tag as "undefined",
 1281|       |        // although we may attempt to handle it better in the future. More discussion of
 1282|       |        // this issue can be found here:
 1283|       |        //
 1284|       |        //   https://github.com/Exiv2/exiv2/issues/2001
 1285|       |        //   https://github.com/Exiv2/exiv2/pull/2008
 1286|       |        //   https://github.com/Exiv2/exiv2/pull/2013
 1287|     87|        typeId = undefined;
 1288|     87|        size = 0;
 1289|  1.68M|      } else {
 1290|  1.68M|#ifndef SUPPRESS_WARNINGS
 1291|  1.68M|        EXV_ERROR << "Offset of directory " << groupName(object->group()) << ", entry 0x" << std::setw(4)
  ------------------
  |  |  142|  1.68M|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 1.68M]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  1.68M|  LogMsg(LogMsg::error).os()
  ------------------
 1292|      0|                  << std::setfill('0') << std::hex << object->tag() << " is out of bounds: " << "Offset = 0x"
 1293|      0|                  << std::setw(8) << std::setfill('0') << std::hex << offset << "; truncating the entry\n";
 1294|  1.68M|#endif
 1295|  1.68M|      }
 1296|  1.68M|      size = 0;
 1297|  1.68M|    }
 1298|  2.58M|    if (size > 4) {
  ------------------
  |  Branch (1298:9): [True: 526k, False: 2.05M]
  ------------------
 1299|       |      // setting pData to pData_ + baseOffset() + offset can result in pData pointing to invalid memory,
 1300|       |      // as offset can be arbitrarily large
 1301|   526k|      if (Safe::add<size_t>(baseOffset(), offset) > static_cast<size_t>(pLast_ - pData_)) {
  ------------------
  |  Branch (1301:11): [True: 0, False: 526k]
  ------------------
 1302|      0|        throw Error(ErrorCode::kerCorruptedMetadata);
 1303|      0|      }
 1304|   526k|      pData = const_cast<byte*>(pData_) + baseOffset() + offset;
 1305|       |
 1306|       |      // check for size being invalid
 1307|   526k|      if (size > static_cast<size_t>(pLast_ - pData)) {
  ------------------
  |  Branch (1307:11): [True: 212k, False: 314k]
  ------------------
 1308|   212k|#ifndef SUPPRESS_WARNINGS
 1309|   212k|        EXV_ERROR << "Upper boundary of data for " << "directory " << groupName(object->group()) << ", entry 0x"
  ------------------
  |  |  142|   212k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 212k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|   212k|  LogMsg(LogMsg::error).os()
  ------------------
 1310|      0|                  << std::setw(4) << std::setfill('0') << std::hex << object->tag()
 1311|      0|                  << " is out of bounds: " << "Offset = 0x" << std::setw(8) << std::setfill('0') << std::hex << offset
 1312|      0|                  << ", size = " << std::dec << size
 1313|      0|                  << ", exceeds buffer size by "
 1314|       |                  // cast to make MSVC happy
 1315|      0|                  << size - static_cast<size_t>(pLast_ - pData) << " Bytes; truncating the entry\n";
 1316|   212k|#endif
 1317|   212k|        size = 0;
 1318|   212k|      }
 1319|   526k|    }
 1320|  2.58M|    auto v = Value::create(typeId);
 1321|  2.58M|    enforce(v != nullptr, ErrorCode::kerCorruptedMetadata);
 1322|  2.58M|    v->read(pData, size, byteOrder());
 1323|       |
 1324|  2.58M|    object->setValue(std::move(v));
 1325|  2.58M|    auto d = std::make_shared<DataBuf>();
 1326|  2.58M|    object->setData(pData, size, std::move(d));
 1327|  2.58M|    object->setOffset(offset);
 1328|  2.58M|    object->setIdx(nextIdx(object->group()));
 1329|  2.58M|  } catch (std::overflow_error&) {
 1330|      0|    throw Error(ErrorCode::kerCorruptedMetadata);  // #562 don't throw std::overflow_error
 1331|      0|  }
 1332|  5.50M|}  // TiffReader::readTiffEntry
_ZN5Exiv28Internal10TiffReader16visitBinaryArrayEPNS0_15TiffBinaryArrayE:
 1334|  89.3k|void TiffReader::visitBinaryArray(TiffBinaryArray* object) {
 1335|  89.3k|  if (!postProc_) {
  ------------------
  |  Branch (1335:7): [True: 44.6k, False: 44.6k]
  ------------------
 1336|       |    // Defer reading children until after all other components are read, but
 1337|       |    // since state (offset) is not set during post-processing, read entry here
 1338|  44.6k|    readTiffEntry(object);
 1339|  44.6k|    object->iniOrigDataBuf();
 1340|  44.6k|    postList_.push_back(object);
 1341|  44.6k|    return;
 1342|  44.6k|  }
 1343|       |  // Check duplicates
 1344|  44.6k|  TiffFinder finder(object->tag(), object->group());
 1345|  44.6k|  pRoot_->accept(finder);
 1346|  44.6k|  if (auto te = dynamic_cast<const TiffEntryBase*>(finder.result())) {
  ------------------
  |  Branch (1346:12): [True: 44.6k, False: 88]
  ------------------
 1347|  44.6k|    if (te->idx() != object->idx()) {
  ------------------
  |  Branch (1347:9): [True: 19.9k, False: 24.6k]
  ------------------
 1348|  19.9k|#ifndef SUPPRESS_WARNINGS
 1349|  19.9k|      EXV_WARNING << "Not decoding duplicate binary array tag 0x" << std::setw(4) << std::setfill('0') << std::hex
  ------------------
  |  |  138|  19.9k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 19.9k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  19.9k|  LogMsg(LogMsg::warn).os()
  ------------------
 1350|      0|                  << object->tag() << std::dec << ", group " << groupName(object->group()) << ", idx " << object->idx()
 1351|      0|                  << "\n";
 1352|  19.9k|#endif
 1353|  19.9k|      object->setDecoded(false);
 1354|  19.9k|      return;
 1355|  19.9k|    }
 1356|  44.6k|  }
 1357|       |
 1358|  24.7k|  if (object->TiffEntryBase::doSize() == 0)
  ------------------
  |  Branch (1358:7): [True: 13.0k, False: 11.6k]
  ------------------
 1359|  13.0k|    return;
 1360|  11.6k|  if (!object->initialize(pRoot_))
  ------------------
  |  Branch (1360:7): [True: 393, False: 11.2k]
  ------------------
 1361|    393|    return;
 1362|  11.2k|  const ArrayCfg* cfg = object->cfg();
 1363|  11.2k|  if (!cfg)
  ------------------
  |  Branch (1363:7): [True: 0, False: 11.2k]
  ------------------
 1364|      0|    return;
 1365|       |
 1366|  11.2k|  if (auto cryptFct = cfg->cryptFct_) {
  ------------------
  |  Branch (1366:12): [True: 918, False: 10.2k]
  ------------------
 1367|    918|    const byte* pData = object->pData();
 1368|    918|    size_t size = object->TiffEntryBase::doSize();
 1369|    918|    auto buf = std::make_shared<DataBuf>(cryptFct(object->tag(), pData, size, pRoot_));
 1370|    918|    if (!buf->empty())
  ------------------
  |  Branch (1370:9): [True: 722, False: 196]
  ------------------
 1371|    722|      object->setData(std::move(buf));
 1372|    918|  }
 1373|       |
 1374|  11.2k|  const ArrayDef* defs = object->def();
 1375|  11.2k|  const ArrayDef* defsEnd = defs + object->defSize();
 1376|  11.2k|  const ArrayDef* def = &cfg->elDefaultDef_;
 1377|  11.2k|  ArrayDef gap = *def;
 1378|       |
 1379|  18.5M|  for (size_t idx = 0; idx < object->TiffEntryBase::doSize();) {
  ------------------
  |  Branch (1379:24): [True: 18.5M, False: 11.2k]
  ------------------
 1380|  18.5M|    if (defs) {
  ------------------
  |  Branch (1380:9): [True: 11.7M, False: 6.80M]
  ------------------
 1381|  11.7M|      def = std::find(defs, defsEnd, idx);
 1382|  11.7M|      if (def == defsEnd) {
  ------------------
  |  Branch (1382:11): [True: 11.7M, False: 13.7k]
  ------------------
 1383|  11.7M|        if (cfg->concat_) {
  ------------------
  |  Branch (1383:13): [True: 819, False: 11.7M]
  ------------------
 1384|       |          // Determine gap-size
 1385|    819|          const ArrayDef* xdef = defs;
 1386|  5.24k|          for (; xdef != defsEnd && xdef->idx_ <= idx; ++xdef) {
  ------------------
  |  Branch (1386:18): [True: 4.92k, False: 316]
  |  Branch (1386:37): [True: 4.42k, False: 503]
  ------------------
 1387|  4.42k|          }
 1388|    819|          size_t gapSize = 0;
 1389|    819|          if (xdef != defsEnd && xdef->idx_ > idx) {
  ------------------
  |  Branch (1389:15): [True: 503, False: 316]
  |  Branch (1389:34): [True: 503, False: 0]
  ------------------
 1390|    503|            gapSize = xdef->idx_ - idx;
 1391|    503|          } else {
 1392|    316|            gapSize = object->TiffEntryBase::doSize() - idx;
 1393|    316|          }
 1394|    819|          gap.idx_ = idx;
 1395|    819|          gap.tiffType_ = cfg->elDefaultDef_.tiffType_;
 1396|    819|          gap.count_ = gapSize / cfg->tagStep();
 1397|    819|          if (gap.count_ * cfg->tagStep() != gapSize) {
  ------------------
  |  Branch (1397:15): [True: 24, False: 795]
  ------------------
 1398|     24|            gap.tiffType_ = ttUndefined;
 1399|     24|            gap.count_ = gapSize;
 1400|     24|          }
 1401|    819|          def = &gap;
 1402|  11.7M|        } else {
 1403|  11.7M|          def = &cfg->elDefaultDef_;
 1404|  11.7M|        }
 1405|  11.7M|      }
 1406|  11.7M|    }
 1407|  18.5M|    idx += object->addElement(idx, *def);  // idx may be different from def->idx_
 1408|  18.5M|  }
 1409|       |
 1410|  11.2k|}  // TiffReader::visitBinaryArray
_ZN5Exiv28Internal10TiffReader18visitBinaryElementEPNS0_17TiffBinaryElementE:
 1412|  18.6M|void TiffReader::visitBinaryElement(TiffBinaryElement* object) {
 1413|  18.6M|  auto pData = object->start();
 1414|  18.6M|  size_t size = object->TiffEntryBase::doSize();
 1415|  18.6M|  ByteOrder bo = object->elByteOrder();
 1416|  18.6M|  if (bo == invalidByteOrder)
  ------------------
  |  Branch (1416:7): [True: 15.7M, False: 2.85M]
  ------------------
 1417|  15.7M|    bo = byteOrder();
 1418|  18.6M|  TypeId typeId = toTypeId(object->elDef()->tiffType_, object->tag(), object->group());
 1419|  18.6M|  auto v = Value::create(typeId);
 1420|  18.6M|  enforce(v != nullptr, ErrorCode::kerCorruptedMetadata);
 1421|  18.6M|  v->read(pData, size, bo);
 1422|       |
 1423|  18.6M|  object->setValue(std::move(v));
 1424|  18.6M|  object->setOffset(0);
 1425|  18.6M|  object->setIdx(nextIdx(object->group()));
 1426|  18.6M|}
tiffvisitor_int.cpp:_ZN5Exiv28InternalL7findTagEPKNS_7TagInfoEt:
  347|  4.84k|static const TagInfo* findTag(const TagInfo* pList, uint16_t tag) {
  348|   339k|  while (pList->tag_ != 0xffff && pList->tag_ != tag)
  ------------------
  |  Branch (348:10): [True: 339k, False: 0]
  |  Branch (348:35): [True: 334k, False: 4.84k]
  ------------------
  349|   334k|    pList++;
  350|  4.84k|  return pList->tag_ != 0xffff ? pList : nullptr;
  ------------------
  |  Branch (350:10): [True: 4.84k, False: 0]
  ------------------
  351|  4.84k|}
tiffvisitor_int.cpp:_ZN12_GLOBAL__N_117stringToByteOrderENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
   48|  4.54k|Exiv2::ByteOrder stringToByteOrder(std::string_view val) {
   49|  4.54k|  if (val == "II")
  ------------------
  |  Branch (49:7): [True: 78, False: 4.46k]
  ------------------
   50|     78|    return Exiv2::littleEndian;
   51|  4.46k|  if (val == "MM")
  ------------------
  |  Branch (51:7): [True: 4.46k, False: 0]
  ------------------
   52|  4.46k|    return Exiv2::bigEndian;
   53|       |
   54|      0|  return Exiv2::invalidByteOrder;
   55|  4.46k|}
tiffvisitor_int.cpp:_ZNK12_GLOBAL__N_114FindExifdatum2clERKN5Exiv29ExifdatumE:
   38|  86.4k|  bool operator()(const Exiv2::Exifdatum& md) const {
   39|  86.4k|    return idx_ == md.idx() && md.groupName() == groupName_;
  ------------------
  |  Branch (39:12): [True: 497, False: 85.9k]
  |  Branch (39:32): [True: 0, False: 497]
  ------------------
   40|  86.4k|  }
tiffvisitor_int.cpp:_ZN12_GLOBAL__N_114FindExifdatum2C2EN5Exiv25IfdIdEi:
   35|  1.06k|  FindExifdatum2(Exiv2::IfdId group, int idx) : groupName_(Exiv2::Internal::groupName(group)), idx_(idx) {
   36|  1.06k|  }

_ZN5Exiv28Internal11TiffVisitorD2Ev:
   64|  87.2k|  virtual ~TiffVisitor() = default;
_ZN5Exiv28Internal11TiffEncoderD2Ev:
  355|  8.26k|  ~TiffEncoder() override = default;
_ZN5Exiv28Internal11TiffRwStateC2ENS_9ByteOrderEm:
  538|  68.2k|  constexpr TiffRwState(ByteOrder byteOrder, size_t baseOffset) : byteOrder_(byteOrder), baseOffset_(baseOffset) {
  539|  68.2k|  }
_ZN5Exiv28Internal10TiffFinderC2EtNS_5IfdIdE:
  141|   229k|  constexpr TiffFinder(uint16_t tag, IfdId group) : tag_(tag), group_(group) {
  142|   229k|  }
_ZN5Exiv28Internal11TiffVisitorC2Ev:
   62|   317k|  TiffVisitor() = default;
_ZNK5Exiv28Internal10TiffFinder6resultEv:
  180|   230k|  [[nodiscard]] TiffComponent* result() const {
  181|   230k|    return tiffComponent_;
  182|   230k|  }
_ZNK5Exiv28Internal11TiffEncoder9byteOrderEv:
  458|  2.24M|  [[nodiscard]] ByteOrder byteOrder() const {
  459|  2.24M|    return byteOrder_;
  460|  2.24M|  }
_ZNK5Exiv28Internal11TiffEncoder11writeMethodEv:
  467|  9.32k|  [[nodiscard]] WriteMethod writeMethod() const {
  468|  9.32k|    return writeMethod_;
  469|  9.32k|  }
_ZNK5Exiv28Internal11TiffRwState9byteOrderEv:
  548|  37.9M|  [[nodiscard]] ByteOrder byteOrder() const {
  549|  37.9M|    return byteOrder_;
  550|  37.9M|  }
_ZNK5Exiv28Internal11TiffRwState10baseOffsetEv:
  562|  3.38M|  [[nodiscard]] size_t baseOffset() const {
  563|  3.38M|    return baseOffset_;
  564|  3.38M|  }

_ZN5Exiv28TypeInfo8typeSizeENS_6TypeIdE:
   96|  62.0M|size_t TypeInfo::typeSize(TypeId typeId) {
   97|  62.0M|  if (auto tit = Exiv2::find(typeInfoTable, typeId))
  ------------------
  |  Branch (97:12): [True: 57.0M, False: 4.99M]
  ------------------
   98|  57.0M|    return tit->size_;
   99|  4.99M|  return 0;
  100|  62.0M|}
_ZN5Exiv27DataBufC2Em:
  102|  1.69M|DataBuf::DataBuf(size_t size) : pData_(size) {
  103|  1.69M|}
_ZN5Exiv27DataBufC2EPKhm:
  105|  39.6k|DataBuf::DataBuf(const byte* pData, size_t size) : pData_(pData, pData + size) {
  106|  39.6k|}
_ZN5Exiv27DataBuf5allocEm:
  108|  47.0k|void DataBuf::alloc(size_t size) {
  109|  47.0k|  pData_.resize(size);
  110|  47.0k|}
_ZN5Exiv27DataBuf6resizeEm:
  112|   326k|void DataBuf::resize(size_t size) {
  113|   326k|  pData_.resize(size);
  114|   326k|}
_ZN5Exiv27DataBuf5resetEv:
  116|  31.0k|void DataBuf::reset() {
  117|  31.0k|  pData_.clear();
  118|  31.0k|}
_ZNK5Exiv27DataBuf10read_uint8Em:
  120|  1.22M|uint8_t Exiv2::DataBuf::read_uint8(size_t offset) const {
  121|  1.22M|  if (offset >= pData_.size()) {
  ------------------
  |  Branch (121:7): [True: 0, False: 1.22M]
  ------------------
  122|      0|    throw std::out_of_range("Overflow in Exiv2::DataBuf::read_uint8");
  123|      0|  }
  124|  1.22M|  return pData_[offset];
  125|  1.22M|}
_ZN5Exiv27DataBuf11write_uint8Emh:
  127|  1.54M|void Exiv2::DataBuf::write_uint8(size_t offset, uint8_t x) {
  128|  1.54M|  if (offset >= pData_.size()) {
  ------------------
  |  Branch (128:7): [True: 0, False: 1.54M]
  ------------------
  129|      0|    throw std::out_of_range("Overflow in Exiv2::DataBuf::write_uint8");
  130|      0|  }
  131|  1.54M|  pData_[offset] = x;
  132|  1.54M|}
_ZNK5Exiv27DataBuf11read_uint16EmNS_9ByteOrderE:
  134|   589k|uint16_t Exiv2::DataBuf::read_uint16(size_t offset, ByteOrder byteOrder) const {
  135|   589k|  if (pData_.size() < 2 || offset > (pData_.size() - 2)) {
  ------------------
  |  Branch (135:7): [True: 0, False: 589k]
  |  Branch (135:28): [True: 1, False: 589k]
  ------------------
  136|      1|    throw std::out_of_range("Overflow in Exiv2::DataBuf::read_uint16");
  137|      1|  }
  138|   589k|  return getUShort(&pData_[offset], byteOrder);
  139|   589k|}
_ZN5Exiv27DataBuf12write_uint16EmtNS_9ByteOrderE:
  141|  7.68k|void Exiv2::DataBuf::write_uint16(size_t offset, uint16_t x, ByteOrder byteOrder) {
  142|  7.68k|  if (pData_.size() < 2 || offset > (pData_.size() - 2)) {
  ------------------
  |  Branch (142:7): [True: 0, False: 7.68k]
  |  Branch (142:28): [True: 0, False: 7.68k]
  ------------------
  143|      0|    throw std::out_of_range("Overflow in Exiv2::DataBuf::write_uint16");
  144|      0|  }
  145|  7.68k|  us2Data(&pData_[offset], x, byteOrder);
  146|  7.68k|}
_ZNK5Exiv27DataBuf11read_uint32EmNS_9ByteOrderE:
  148|   358k|uint32_t Exiv2::DataBuf::read_uint32(size_t offset, ByteOrder byteOrder) const {
  149|   358k|  if (pData_.size() < 4 || offset > (pData_.size() - 4)) {
  ------------------
  |  Branch (149:7): [True: 0, False: 358k]
  |  Branch (149:28): [True: 1, False: 358k]
  ------------------
  150|      1|    throw std::out_of_range("Overflow in Exiv2::DataBuf::read_uint32");
  151|      1|  }
  152|   358k|  return getULong(&pData_[offset], byteOrder);
  153|   358k|}
_ZN5Exiv27DataBuf12write_uint32EmjNS_9ByteOrderE:
  155|  7.68k|void Exiv2::DataBuf::write_uint32(size_t offset, uint32_t x, ByteOrder byteOrder) {
  156|  7.68k|  if (pData_.size() < 4 || offset > (pData_.size() - 4)) {
  ------------------
  |  Branch (156:7): [True: 0, False: 7.68k]
  |  Branch (156:28): [True: 0, False: 7.68k]
  ------------------
  157|      0|    throw std::out_of_range("Overflow in Exiv2::DataBuf::write_uint32");
  158|      0|  }
  159|  7.68k|  ul2Data(&pData_[offset], x, byteOrder);
  160|  7.68k|}
_ZNK5Exiv27DataBuf11read_uint64EmNS_9ByteOrderE:
  162|  2.73k|uint64_t Exiv2::DataBuf::read_uint64(size_t offset, ByteOrder byteOrder) const {
  163|  2.73k|  if (pData_.size() < 8 || offset > (pData_.size() - 8)) {
  ------------------
  |  Branch (163:7): [True: 0, False: 2.73k]
  |  Branch (163:28): [True: 0, False: 2.73k]
  ------------------
  164|      0|    throw std::out_of_range("Overflow in Exiv2::DataBuf::read_uint64");
  165|      0|  }
  166|  2.73k|  return getULongLong(&pData_[offset], byteOrder);
  167|  2.73k|}
_ZNK5Exiv27DataBuf8cmpBytesEmPKvm:
  176|   302k|int Exiv2::DataBuf::cmpBytes(size_t offset, const void* buf, size_t bufsize) const {
  177|   302k|  if (pData_.size() < bufsize || offset > pData_.size() - bufsize) {
  ------------------
  |  Branch (177:7): [True: 1, False: 302k]
  |  Branch (177:34): [True: 0, False: 302k]
  ------------------
  178|      1|    throw std::out_of_range("Overflow in Exiv2::DataBuf::cmpBytes");
  179|      1|  }
  180|   302k|  return memcmp(&pData_[offset], buf, bufsize);
  181|   302k|}
_ZN5Exiv27DataBuf4dataEm:
  183|  4.31M|byte* Exiv2::DataBuf::data(size_t offset) {
  184|  4.31M|  return const_cast<byte*>(c_data(offset));
  185|  4.31M|}
_ZNK5Exiv27DataBuf6c_dataEm:
  187|  5.29M|const byte* Exiv2::DataBuf::c_data(size_t offset) const {
  188|  5.29M|  if (pData_.empty() || offset == pData_.size()) {
  ------------------
  |  Branch (188:7): [True: 16.8k, False: 5.28M]
  |  Branch (188:25): [True: 6.52k, False: 5.27M]
  ------------------
  189|  23.3k|    return nullptr;
  190|  23.3k|  }
  191|  5.27M|  if (offset > pData_.size()) {
  ------------------
  |  Branch (191:7): [True: 0, False: 5.27M]
  ------------------
  192|      0|    throw std::out_of_range("Overflow in Exiv2::DataBuf::c_data");
  193|      0|  }
  194|  5.27M|  return &pData_[offset];
  195|  5.27M|}
_ZNK5Exiv27DataBuf5c_strEm:
  197|   252k|const char* Exiv2::DataBuf::c_str(size_t offset) const {
  198|   252k|  return reinterpret_cast<const char*>(c_data(offset));
  199|   252k|}
_ZN5Exiv29makeSliceERNS_7DataBufEmm:
  210|  52.1k|Slice<byte*> makeSlice(DataBuf& buf, size_t begin, size_t end) {
  211|  52.1k|  checkDataBufBounds(buf, end);
  212|  52.1k|  return {buf.data(), begin, end};
  213|  52.1k|}
_ZN5Exiv2lsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS0_4pairIiiEE:
  220|  47.3k|std::ostream& operator<<(std::ostream& os, const Rational& r) {
  221|  47.3k|  return os << r.first << "/" << r.second;
  222|  47.3k|}
_ZN5Exiv2lsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS0_4pairIjjEE:
  249|  21.4k|std::ostream& operator<<(std::ostream& os, const URational& r) {
  250|  21.4k|  return os << r.first << "/" << r.second;
  251|  21.4k|}
_ZN5Exiv29getUShortEPKhNS_9ByteOrderE:
  257|  64.4M|uint16_t getUShort(const byte* buf, ByteOrder byteOrder) {
  258|  64.4M|  return getUShort(makeSliceUntil(buf, 2), byteOrder);
  259|  64.4M|}
_ZN5Exiv28getULongEPKhNS_9ByteOrderE:
  261|  46.9M|uint32_t getULong(const byte* buf, ByteOrder byteOrder) {
  262|  46.9M|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (262:7): [True: 1.23M, False: 45.6M]
  ------------------
  263|  1.23M|    return buf[3] << 24 | buf[2] << 16 | buf[1] << 8 | buf[0];
  264|  1.23M|  }
  265|  45.6M|  return buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3];
  266|  46.9M|}
_ZN5Exiv212getULongLongEPKhNS_9ByteOrderE:
  268|  18.4k|uint64_t getULongLong(const byte* buf, ByteOrder byteOrder) {
  269|  18.4k|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (269:7): [True: 2.61k, False: 15.8k]
  ------------------
  270|  2.61k|    return static_cast<uint64_t>(buf[7]) << 56 | static_cast<uint64_t>(buf[6]) << 48 |
  271|  2.61k|           static_cast<uint64_t>(buf[5]) << 40 | static_cast<uint64_t>(buf[4]) << 32 |
  272|  2.61k|           static_cast<uint64_t>(buf[3]) << 24 | static_cast<uint64_t>(buf[2]) << 16 |
  273|  2.61k|           static_cast<uint64_t>(buf[1]) << 8 | static_cast<uint64_t>(buf[0]);
  274|  2.61k|  }
  275|  15.8k|  return static_cast<uint64_t>(buf[0]) << 56 | static_cast<uint64_t>(buf[1]) << 48 |
  276|  15.8k|         static_cast<uint64_t>(buf[2]) << 40 | static_cast<uint64_t>(buf[3]) << 32 |
  277|  15.8k|         static_cast<uint64_t>(buf[4]) << 24 | static_cast<uint64_t>(buf[5]) << 16 |
  278|  15.8k|         static_cast<uint64_t>(buf[6]) << 8 | static_cast<uint64_t>(buf[7]);
  279|  18.4k|}
_ZN5Exiv212getURationalEPKhNS_9ByteOrderE:
  281|   395k|URational getURational(const byte* buf, ByteOrder byteOrder) {
  282|   395k|  uint32_t nominator = getULong(buf, byteOrder);
  283|   395k|  uint32_t denominator = getULong(buf + 4, byteOrder);
  284|   395k|  return {nominator, denominator};
  285|   395k|}
_ZN5Exiv28getShortEPKhNS_9ByteOrderE:
  287|  8.43M|int16_t getShort(const byte* buf, ByteOrder byteOrder) {
  288|  8.43M|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (288:7): [True: 200k, False: 8.23M]
  ------------------
  289|   200k|    return buf[1] << 8 | buf[0];
  290|   200k|  }
  291|  8.23M|  return buf[0] << 8 | buf[1];
  292|  8.43M|}
_ZN5Exiv27getLongEPKhNS_9ByteOrderE:
  294|  1.28M|int32_t getLong(const byte* buf, ByteOrder byteOrder) {
  295|  1.28M|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (295:7): [True: 51.2k, False: 1.23M]
  ------------------
  296|  51.2k|    return buf[3] << 24 | buf[2] << 16 | buf[1] << 8 | buf[0];
  297|  51.2k|  }
  298|  1.23M|  return buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3];
  299|  1.28M|}
_ZN5Exiv211getRationalEPKhNS_9ByteOrderE:
  301|   477k|Rational getRational(const byte* buf, ByteOrder byteOrder) {
  302|   477k|  int32_t nominator = getLong(buf, byteOrder);
  303|   477k|  int32_t denominator = getLong(buf + 4, byteOrder);
  304|   477k|  return {nominator, denominator};
  305|   477k|}
_ZN5Exiv28getFloatEPKhNS_9ByteOrderE:
  307|   119k|float getFloat(const byte* buf, ByteOrder byteOrder) {
  308|       |  // This algorithm assumes that the internal representation of the float
  309|       |  // type is the 4-byte IEEE 754 binary32 format, which is common but not
  310|       |  // required by the C++ standard.
  311|   119k|#ifdef __cpp_lib_bit_cast
  312|   119k|  return std::bit_cast<float>(getULong(buf, byteOrder));
  313|       |#else
  314|       |  union {
  315|       |    uint32_t ul_;
  316|       |    float f_;
  317|       |  } u;
  318|       |  u.ul_ = getULong(buf, byteOrder);
  319|       |  return u.f_;
  320|       |#endif
  321|   119k|}
_ZN5Exiv29getDoubleEPKhNS_9ByteOrderE:
  323|  20.3k|double getDouble(const byte* buf, ByteOrder byteOrder) {
  324|       |  // This algorithm assumes that the internal representation of the double
  325|       |  // type is the 8-byte IEEE 754 binary64 format, which is common but not
  326|       |  // required by the C++ standard.
  327|  20.3k|#ifdef __cpp_lib_bit_cast
  328|  20.3k|  if (byteOrder == littleEndian)
  ------------------
  |  Branch (328:7): [True: 970, False: 19.4k]
  ------------------
  329|    970|    return std::bit_cast<double>(static_cast<uint64_t>(buf[7]) << 56 | static_cast<uint64_t>(buf[6]) << 48 |
  330|    970|                                 static_cast<uint64_t>(buf[5]) << 40 | static_cast<uint64_t>(buf[4]) << 32 |
  331|    970|                                 static_cast<uint64_t>(buf[3]) << 24 | static_cast<uint64_t>(buf[2]) << 16 |
  332|    970|                                 static_cast<uint64_t>(buf[1]) << 8 | static_cast<uint64_t>(buf[0]));
  333|  19.4k|  return std::bit_cast<double>(static_cast<uint64_t>(buf[0]) << 56 | static_cast<uint64_t>(buf[1]) << 48 |
  334|  19.4k|                               static_cast<uint64_t>(buf[2]) << 40 | static_cast<uint64_t>(buf[3]) << 32 |
  335|  19.4k|                               static_cast<uint64_t>(buf[4]) << 24 | static_cast<uint64_t>(buf[5]) << 16 |
  336|  19.4k|                               static_cast<uint64_t>(buf[6]) << 8 | static_cast<uint64_t>(buf[7]));
  337|       |#else
  338|       |  union {
  339|       |    uint64_t ull_;
  340|       |    double d_;
  341|       |  } u;
  342|       |  u.ull_ = 0;
  343|       |  if (byteOrder == littleEndian) {
  344|       |    u.ull_ = static_cast<uint64_t>(buf[7]) << 56 | static_cast<uint64_t>(buf[6]) << 48 |
  345|       |             static_cast<uint64_t>(buf[5]) << 40 | static_cast<uint64_t>(buf[4]) << 32 |
  346|       |             static_cast<uint64_t>(buf[3]) << 24 | static_cast<uint64_t>(buf[2]) << 16 |
  347|       |             static_cast<uint64_t>(buf[1]) << 8 | static_cast<uint64_t>(buf[0]);
  348|       |  } else {
  349|       |    u.ull_ = static_cast<uint64_t>(buf[0]) << 56 | static_cast<uint64_t>(buf[1]) << 48 |
  350|       |             static_cast<uint64_t>(buf[2]) << 40 | static_cast<uint64_t>(buf[3]) << 32 |
  351|       |             static_cast<uint64_t>(buf[4]) << 24 | static_cast<uint64_t>(buf[5]) << 16 |
  352|       |             static_cast<uint64_t>(buf[6]) << 8 | static_cast<uint64_t>(buf[7]);
  353|       |  }
  354|       |  return u.d_;
  355|       |#endif
  356|  20.3k|}
_ZN5Exiv27us2DataEPhtNS_9ByteOrderE:
  358|  3.57M|size_t us2Data(byte* buf, uint16_t s, ByteOrder byteOrder) {
  359|  3.57M|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (359:7): [True: 3.43M, False: 135k]
  ------------------
  360|  3.43M|    buf[0] = static_cast<byte>(s & 0x00ffU);
  361|  3.43M|    buf[1] = static_cast<byte>((s & 0xff00U) >> 8);
  362|  3.43M|  } else {
  363|   135k|    buf[0] = static_cast<byte>((s & 0xff00U) >> 8);
  364|   135k|    buf[1] = static_cast<byte>(s & 0x00ffU);
  365|   135k|  }
  366|  3.57M|  return 2;
  367|  3.57M|}
_ZN5Exiv27ul2DataEPhjNS_9ByteOrderE:
  369|  2.20M|size_t ul2Data(byte* buf, uint32_t l, ByteOrder byteOrder) {
  370|  2.20M|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (370:7): [True: 2.10M, False: 94.2k]
  ------------------
  371|  2.10M|    buf[0] = static_cast<byte>(l & 0x000000ffU);
  372|  2.10M|    buf[1] = static_cast<byte>((l & 0x0000ff00U) >> 8);
  373|  2.10M|    buf[2] = static_cast<byte>((l & 0x00ff0000U) >> 16);
  374|  2.10M|    buf[3] = static_cast<byte>((l & 0xff000000U) >> 24);
  375|  2.10M|  } else {
  376|  94.2k|    buf[0] = static_cast<byte>((l & 0xff000000U) >> 24);
  377|  94.2k|    buf[1] = static_cast<byte>((l & 0x00ff0000U) >> 16);
  378|  94.2k|    buf[2] = static_cast<byte>((l & 0x0000ff00U) >> 8);
  379|  94.2k|    buf[3] = static_cast<byte>(l & 0x000000ffU);
  380|  94.2k|  }
  381|  2.20M|  return 4;
  382|  2.20M|}
_ZN5Exiv27ur2DataEPhNSt3__14pairIjjEENS_9ByteOrderE:
  399|   233k|size_t ur2Data(byte* buf, URational l, ByteOrder byteOrder) {
  400|   233k|  size_t o = ul2Data(buf, l.first, byteOrder);
  401|   233k|  o += ul2Data(buf + o, l.second, byteOrder);
  402|   233k|  return o;
  403|   233k|}
_ZN5Exiv26s2DataEPhsNS_9ByteOrderE:
  405|   133k|size_t s2Data(byte* buf, int16_t s, ByteOrder byteOrder) {
  406|   133k|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (406:7): [True: 131k, False: 1.78k]
  ------------------
  407|   131k|    buf[0] = static_cast<byte>(s & 0x00ffU);
  408|   131k|    buf[1] = static_cast<byte>((s & 0xff00U) >> 8);
  409|   131k|  } else {
  410|  1.78k|    buf[0] = static_cast<byte>((s & 0xff00U) >> 8);
  411|  1.78k|    buf[1] = static_cast<byte>(s & 0x00ffU);
  412|  1.78k|  }
  413|   133k|  return 2;
  414|   133k|}
_ZN5Exiv26l2DataEPhiNS_9ByteOrderE:
  416|   100k|size_t l2Data(byte* buf, int32_t l, ByteOrder byteOrder) {
  417|   100k|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (417:7): [True: 93.4k, False: 7.24k]
  ------------------
  418|  93.4k|    buf[0] = static_cast<byte>(l & 0x000000ffU);
  419|  93.4k|    buf[1] = static_cast<byte>((l & 0x0000ff00U) >> 8);
  420|  93.4k|    buf[2] = static_cast<byte>((l & 0x00ff0000U) >> 16);
  421|  93.4k|    buf[3] = static_cast<byte>((l & 0xff000000U) >> 24);
  422|  93.4k|  } else {
  423|  7.24k|    buf[0] = static_cast<byte>((l & 0xff000000U) >> 24);
  424|  7.24k|    buf[1] = static_cast<byte>((l & 0x00ff0000U) >> 16);
  425|  7.24k|    buf[2] = static_cast<byte>((l & 0x0000ff00U) >> 8);
  426|  7.24k|    buf[3] = static_cast<byte>(l & 0x000000ffU);
  427|  7.24k|  }
  428|   100k|  return 4;
  429|   100k|}
_ZN5Exiv26r2DataEPhNSt3__14pairIiiEENS_9ByteOrderE:
  431|  23.8k|size_t r2Data(byte* buf, Rational l, ByteOrder byteOrder) {
  432|  23.8k|  size_t o = l2Data(buf, l.first, byteOrder);
  433|  23.8k|  o += l2Data(buf + o, l.second, byteOrder);
  434|  23.8k|  return o;
  435|  23.8k|}
_ZN5Exiv26f2DataEPhfNS_9ByteOrderE:
  437|   112k|size_t f2Data(byte* buf, float f, ByteOrder byteOrder) {
  438|       |  // This algorithm assumes that the internal representation of the float
  439|       |  // type is the 4-byte IEEE 754 binary32 format, which is common but not
  440|       |  // required by the C++ standard.
  441|   112k|#ifdef __cpp_lib_bit_cast
  442|   112k|  return ul2Data(buf, std::bit_cast<uint32_t>(f), byteOrder);
  443|       |#else
  444|       |  union {
  445|       |    uint32_t ul_;
  446|       |    float f_;
  447|       |  } u;
  448|       |  u.f_ = f;
  449|       |  return ul2Data(buf, u.ul_, byteOrder);
  450|       |#endif
  451|   112k|}
_ZN5Exiv26d2DataEPhdNS_9ByteOrderE:
  453|  70.0k|size_t d2Data(byte* buf, double d, ByteOrder byteOrder) {
  454|       |  // This algorithm assumes that the internal representation of the double
  455|       |  // type is the 8-byte IEEE 754 binary64 format, which is common but not
  456|       |  // required by the C++ standard.
  457|  70.0k|  union {
  458|  70.0k|    uint64_t ull_;
  459|  70.0k|    double d_;
  460|  70.0k|  } u;
  461|  70.0k|  u.d_ = d;
  462|  70.0k|  uint64_t m = 0xff;
  463|  70.0k|  if (byteOrder == littleEndian) {
  ------------------
  |  Branch (463:7): [True: 69.7k, False: 267]
  ------------------
  464|  69.7k|    buf[0] = static_cast<byte>(u.ull_ & m);
  465|  69.7k|    buf[1] = static_cast<byte>((u.ull_ & (m << 8)) >> 8);
  466|  69.7k|    buf[2] = static_cast<byte>((u.ull_ & (m << 16)) >> 16);
  467|  69.7k|    buf[3] = static_cast<byte>((u.ull_ & (m << 24)) >> 24);
  468|  69.7k|    buf[4] = static_cast<byte>((u.ull_ & (m << 32)) >> 32);
  469|  69.7k|    buf[5] = static_cast<byte>((u.ull_ & (m << 40)) >> 40);
  470|  69.7k|    buf[6] = static_cast<byte>((u.ull_ & (m << 48)) >> 48);
  471|  69.7k|    buf[7] = static_cast<byte>((u.ull_ & (m << 56)) >> 56);
  472|  69.7k|  } else {
  473|    267|    buf[0] = static_cast<byte>((u.ull_ & (m << 56)) >> 56);
  474|    267|    buf[1] = static_cast<byte>((u.ull_ & (m << 48)) >> 48);
  475|    267|    buf[2] = static_cast<byte>((u.ull_ & (m << 40)) >> 40);
  476|    267|    buf[3] = static_cast<byte>((u.ull_ & (m << 32)) >> 32);
  477|    267|    buf[4] = static_cast<byte>((u.ull_ & (m << 24)) >> 24);
  478|    267|    buf[5] = static_cast<byte>((u.ull_ & (m << 16)) >> 16);
  479|    267|    buf[6] = static_cast<byte>((u.ull_ & (m << 8)) >> 8);
  480|    267|    buf[7] = static_cast<byte>(u.ull_ & m);
  481|    267|  }
  482|  70.0k|  return 8;
  483|  70.0k|}
_ZN5Exiv25isHexERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEmS8_:
  512|  30.0k|bool isHex(const std::string& str, size_t size, const std::string& prefix) {
  513|  30.0k|  if (!str.starts_with(prefix))
  ------------------
  |  Branch (513:7): [True: 0, False: 30.0k]
  ------------------
  514|      0|    return false;
  515|  30.0k|  if (size > 0 && str.size() != size + prefix.size())
  ------------------
  |  Branch (515:7): [True: 30.0k, False: 0]
  |  Branch (515:19): [True: 0, False: 30.0k]
  ------------------
  516|      0|    return false;
  517|       |
  518|  30.0k|  return std::all_of(str.begin() + prefix.size(), str.end(), ::isxdigit);
  519|  30.0k|}  // isHex
_ZN5Exiv219floatToRationalCastEf:
  667|  5.29k|Rational floatToRationalCast(float f) {
  668|       |  // Convert f to double because it simplifies the range checks
  669|       |  // below. (All int values can be losslessly converted to double, but
  670|       |  // sometimes get rounded when converted to float.)
  671|  5.29k|  const double d = f;
  672|       |  // Beware: primitive conversion algorithm
  673|  5.29k|  int32_t den;
  674|  5.29k|  if (std::fabs(d) <= std::numeric_limits<int32_t>::max() / 1000000) {
  ------------------
  |  Branch (674:7): [True: 2.22k, False: 3.07k]
  ------------------
  675|  2.22k|    den = 1000000;
  676|  3.07k|  } else if (std::fabs(d) <= std::numeric_limits<int32_t>::max() / 10000) {
  ------------------
  |  Branch (676:14): [True: 1.89k, False: 1.18k]
  ------------------
  677|  1.89k|    den = 10000;
  678|  1.89k|  } else if (std::fabs(d) <= std::numeric_limits<int32_t>::max() / 100) {
  ------------------
  |  Branch (678:14): [True: 86, False: 1.09k]
  ------------------
  679|     86|    den = 100;
  680|  1.09k|  } else if (std::fabs(d) <= std::numeric_limits<int32_t>::max()) {
  ------------------
  |  Branch (680:14): [True: 82, False: 1.01k]
  ------------------
  681|     82|    den = 1;
  682|  1.01k|  } else {
  683|  1.01k|    return {d > 0 ? 1 : -1, 0};
  ------------------
  |  Branch (683:13): [True: 640, False: 376]
  ------------------
  684|  1.01k|  }
  685|  4.27k|  const auto nom = static_cast<int32_t>(std::lround(d * den));
  686|  4.27k|  const int32_t g = std::gcd(nom, den);
  687|       |
  688|  4.27k|  return {nom / g, den / g};
  689|  5.29k|}
types.cpp:_ZN5Exiv2L18checkDataBufBoundsERKNS_7DataBufEm:
  204|  52.1k|static void checkDataBufBounds(const DataBuf& buf, size_t end) {
  205|  52.1k|  Internal::enforce<std::invalid_argument>(end <= static_cast<size_t>(std::numeric_limits<long>::max()),
  206|  52.1k|                                           "end of slice too large to be compared with DataBuf bounds.");
  207|  52.1k|  Internal::enforce<std::out_of_range>(end <= buf.size(), "Invalid slice bounds specified");
  208|  52.1k|}
types.cpp:_ZNK12_GLOBAL__N_113TypeInfoTableeqEN5Exiv26TypeIdE:
   44|   366M|  bool operator==(Exiv2::TypeId typeId) const {
   45|   366M|    return typeId_ == typeId;
   46|   366M|  }

_ZN5Exiv28Internal5upperENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
    8|  27.4k|std::string upper(std::string_view str) {
    9|  27.4k|  std::string result;
   10|  27.4k|  result.reserve(str.size());
   11|  27.4k|  for (auto c : str)
  ------------------
  |  Branch (11:15): [True: 515k, False: 27.4k]
  ------------------
   12|   515k|    result.push_back(std::toupper(static_cast<unsigned char>(c)));
   13|  27.4k|  return result;
   14|  27.4k|}

_ZN5Exiv28Internal8containsIPKcEEbNSt3__117basic_string_viewIcNS4_11char_traitsIcEEEET_:
    9|  7.53k|constexpr bool contains(std::string_view s, auto c) {
   10|       |#ifdef __cpp_lib_string_contains
   11|       |  return s.contains(c);
   12|       |#else
   13|  7.53k|  return s.find(c) != std::string_view::npos;
   14|  7.53k|#endif
   15|  7.53k|}
_ZN5Exiv28Internal8containsIcEEbNSt3__117basic_string_viewIcNS2_11char_traitsIcEEEET_:
    9|  6.65k|constexpr bool contains(std::string_view s, auto c) {
   10|       |#ifdef __cpp_lib_string_contains
   11|       |  return s.contains(c);
   12|       |#else
   13|  6.65k|  return s.find(c) != std::string_view::npos;
   14|  6.65k|#endif
   15|  6.65k|}

_ZN5Exiv25ValueC2ENS_6TypeIdE:
   20|  56.8M|Value::Value(TypeId typeId) : type_(typeId) {
   21|  56.8M|}
_ZN5Exiv25Value6createENS_6TypeIdE:
   23|  21.2M|Value::UniquePtr Value::create(TypeId typeId) {
   24|  21.2M|  switch (typeId) {
   25|      0|    case invalidTypeId:
  ------------------
  |  Branch (25:5): [True: 0, False: 21.2M]
  ------------------
   26|  7.51k|    case signedByte:
  ------------------
  |  Branch (26:5): [True: 7.51k, False: 21.2M]
  ------------------
   27|  1.22M|    case unsignedByte:
  ------------------
  |  Branch (27:5): [True: 1.21M, False: 20.0M]
  ------------------
   28|  1.22M|      return std::make_unique<DataValue>(typeId);
   29|  92.2k|    case asciiString:
  ------------------
  |  Branch (29:5): [True: 92.2k, False: 21.2M]
  ------------------
   30|  92.2k|      return std::make_unique<AsciiValue>();
   31|  16.0M|    case unsignedShort:
  ------------------
  |  Branch (31:5): [True: 16.0M, False: 5.28M]
  ------------------
   32|  16.0M|      return std::make_unique<ValueType<uint16_t>>();
   33|   212k|    case unsignedLong:
  ------------------
  |  Branch (33:5): [True: 212k, False: 21.0M]
  ------------------
   34|   231k|    case tiffIfd:
  ------------------
  |  Branch (34:5): [True: 18.9k, False: 21.2M]
  ------------------
   35|   231k|      return std::make_unique<ValueType<uint32_t>>(typeId);
   36|  44.6k|    case unsignedRational:
  ------------------
  |  Branch (36:5): [True: 44.6k, False: 21.2M]
  ------------------
   37|  44.6k|      return std::make_unique<ValueType<URational>>();
   38|  99.4k|    case undefined:
  ------------------
  |  Branch (38:5): [True: 99.4k, False: 21.1M]
  ------------------
   39|  99.4k|      return std::make_unique<DataValue>();
   40|  1.10M|    case signedShort:
  ------------------
  |  Branch (40:5): [True: 1.10M, False: 20.1M]
  ------------------
   41|  1.10M|      return std::make_unique<ValueType<int16_t>>();
   42|   209k|    case signedLong:
  ------------------
  |  Branch (42:5): [True: 209k, False: 21.0M]
  ------------------
   43|   209k|      return std::make_unique<ValueType<int32_t>>();
   44|  32.1k|    case signedRational:
  ------------------
  |  Branch (44:5): [True: 32.1k, False: 21.2M]
  ------------------
   45|  32.1k|      return std::make_unique<ValueType<Rational>>();
   46|  10.2k|    case tiffFloat:
  ------------------
  |  Branch (46:5): [True: 10.2k, False: 21.2M]
  ------------------
   47|  10.2k|      return std::make_unique<ValueType<float>>();
   48|  8.42k|    case tiffDouble:
  ------------------
  |  Branch (48:5): [True: 8.42k, False: 21.2M]
  ------------------
   49|  8.42k|      return std::make_unique<ValueType<double>>();
   50|  42.2k|    case string:
  ------------------
  |  Branch (50:5): [True: 42.2k, False: 21.2M]
  ------------------
   51|  42.2k|      return std::make_unique<StringValue>();
   52|  2.66k|    case date:
  ------------------
  |  Branch (52:5): [True: 2.66k, False: 21.2M]
  ------------------
   53|  2.66k|      return std::make_unique<DateValue>();
   54|  2.30k|    case time:
  ------------------
  |  Branch (54:5): [True: 2.30k, False: 21.2M]
  ------------------
   55|  2.30k|      return std::make_unique<TimeValue>();
   56|  3.07k|    case comment:
  ------------------
  |  Branch (56:5): [True: 3.07k, False: 21.2M]
  ------------------
   57|  3.07k|      return std::make_unique<CommentValue>();
   58|  21.4k|    case xmpText:
  ------------------
  |  Branch (58:5): [True: 21.4k, False: 21.2M]
  ------------------
   59|  21.4k|      return std::make_unique<XmpTextValue>();
   60|      0|    case xmpBag:
  ------------------
  |  Branch (60:5): [True: 0, False: 21.2M]
  ------------------
   61|  3.01k|    case xmpSeq:
  ------------------
  |  Branch (61:5): [True: 3.01k, False: 21.2M]
  ------------------
   62|  3.01k|    case xmpAlt:
  ------------------
  |  Branch (62:5): [True: 0, False: 21.2M]
  ------------------
   63|  3.01k|      return std::make_unique<XmpArrayValue>(typeId);
   64|      0|    case langAlt:
  ------------------
  |  Branch (64:5): [True: 0, False: 21.2M]
  ------------------
   65|      0|      return std::make_unique<LangAltValue>();
   66|  2.15M|    default:
  ------------------
  |  Branch (66:5): [True: 2.15M, False: 19.1M]
  ------------------
   67|  2.15M|      return std::make_unique<DataValue>(typeId);
   68|  21.2M|  }
   69|  21.2M|}  // Value::create
_ZN5Exiv25Value11setDataAreaEPKhm:
   71|  1.16k|int Value::setDataArea(const byte* /*buf*/, size_t /*len*/) {
   72|  1.16k|  return -1;
   73|  1.16k|}
_ZNK5Exiv25Value8toStringEv:
   75|   107k|std::string Value::toString() const {
   76|   107k|  std::ostringstream os;
   77|   107k|  write(os);
   78|   107k|  ok_ = !os.fail();
   79|   107k|  return os.str();
   80|   107k|}
_ZNK5Exiv25Value8toStringEm:
   82|  11.1k|std::string Value::toString(size_t /*n*/) const {
   83|  11.1k|  return toString();
   84|  11.1k|}
_ZNK5Exiv25Value12sizeDataAreaEv:
   86|  34.8k|size_t Value::sizeDataArea() const {
   87|  34.8k|  return 0;
   88|  34.8k|}
_ZNK5Exiv25Value8dataAreaEv:
   90|  2.32k|DataBuf Value::dataArea() const {
   91|  2.32k|  return {nullptr, 0};
   92|  2.32k|}
_ZN5Exiv29DataValueC2ENS_6TypeIdE:
   94|  3.47M|DataValue::DataValue(TypeId typeId) : Value(typeId) {
   95|  3.47M|}
_ZNK5Exiv29DataValue5countEv:
  101|  7.37M|size_t DataValue::count() const {
  102|  7.37M|  return size();
  103|  7.37M|}
_ZN5Exiv29DataValue4readEPKhmNS_9ByteOrderE:
  105|  3.47M|int DataValue::read(const byte* buf, size_t len, ByteOrder /*byteOrder*/) {
  106|       |  // byteOrder not needed
  107|  3.47M|  value_.assign(buf, buf + len);
  108|  3.47M|  return 0;
  109|  3.47M|}
_ZNK5Exiv29DataValue4copyEPhNS_9ByteOrderE:
  123|  2.20M|size_t DataValue::copy(byte* buf, ByteOrder /*byteOrder*/) const {
  124|       |  // byteOrder not needed
  125|  2.20M|  return std::copy(value_.begin(), value_.end(), buf) - buf;
  126|  2.20M|}
_ZNK5Exiv29DataValue4sizeEv:
  128|  15.2M|size_t DataValue::size() const {
  129|  15.2M|  return value_.size();
  130|  15.2M|}
_ZNK5Exiv29DataValue6clone_Ev:
  132|  11.4M|DataValue* DataValue::clone_() const {
  133|  11.4M|  return new DataValue(*this);
  134|  11.4M|}
_ZNK5Exiv29DataValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  136|   106k|std::ostream& DataValue::write(std::ostream& os) const {
  137|   106k|  if (!value_.empty()) {
  ------------------
  |  Branch (137:7): [True: 105k, False: 467]
  ------------------
  138|   105k|    std::copy(value_.begin(), value_.end() - 1, std::ostream_iterator<int>(os, " "));
  139|   105k|    os << static_cast<int>(value_.back());
  140|   105k|  }
  141|   106k|  return os;
  142|   106k|}
_ZNK5Exiv29DataValue8toStringEm:
  144|  1.84k|std::string DataValue::toString(size_t n) const {
  145|  1.84k|  ok_ = true;
  146|  1.84k|  return std::to_string(value_.at(n));
  147|  1.84k|}
_ZNK5Exiv29DataValue7toInt64Em:
  149|   248k|int64_t DataValue::toInt64(size_t n) const {
  150|   248k|  ok_ = true;
  151|   248k|  return value_.at(n);
  152|   248k|}
_ZNK5Exiv29DataValue8toUint32Em:
  154|  61.7k|uint32_t DataValue::toUint32(size_t n) const {
  155|  61.7k|  ok_ = true;
  156|  61.7k|  return value_.at(n);
  157|  61.7k|}
_ZNK5Exiv29DataValue7toFloatEm:
  159|  1.36k|float DataValue::toFloat(size_t n) const {
  160|  1.36k|  ok_ = true;
  161|  1.36k|  return value_.at(n);
  162|  1.36k|}
_ZNK5Exiv29DataValue10toRationalEm:
  164|  1.94k|Rational DataValue::toRational(size_t n) const {
  165|  1.94k|  ok_ = true;
  166|  1.94k|  return {value_.at(n), 1};
  167|  1.94k|}
_ZN5Exiv215StringValueBase4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  173|    148|int StringValueBase::read(const std::string& buf) {
  174|    148|  value_ = buf;
  175|    148|  return 0;
  176|    148|}
_ZN5Exiv215StringValueBase4readEPKhmNS_9ByteOrderE:
  178|   123k|int StringValueBase::read(const byte* buf, size_t len, ByteOrder /*byteOrder*/) {
  179|       |  // byteOrder not needed
  180|   123k|  if (buf)
  ------------------
  |  Branch (180:7): [True: 123k, False: 0]
  ------------------
  181|   123k|    value_ = std::string(reinterpret_cast<const char*>(buf), len);
  182|   123k|  return 0;
  183|   123k|}
_ZNK5Exiv215StringValueBase4copyEPhNS_9ByteOrderE:
  185|  64.8k|size_t StringValueBase::copy(byte* buf, ByteOrder /*byteOrder*/) const {
  186|  64.8k|  if (value_.empty())
  ------------------
  |  Branch (186:7): [True: 25.3k, False: 39.5k]
  ------------------
  187|  25.3k|    return 0;
  188|       |  // byteOrder not needed
  189|  39.5k|  return value_.copy(reinterpret_cast<char*>(buf), value_.size());
  190|  64.8k|}
_ZNK5Exiv215StringValueBase5countEv:
  192|   198k|size_t StringValueBase::count() const {
  193|   198k|  return size();
  194|   198k|}
_ZNK5Exiv215StringValueBase4sizeEv:
  196|   365k|size_t StringValueBase::size() const {
  197|   365k|  return value_.size();
  198|   365k|}
_ZNK5Exiv215StringValueBase5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  200|  2.85k|std::ostream& StringValueBase::write(std::ostream& os) const {
  201|  2.85k|  return os << value_;
  202|  2.85k|}
_ZNK5Exiv215StringValueBase7toInt64Em:
  204|  24.0k|int64_t StringValueBase::toInt64(size_t n) const {
  205|  24.0k|  ok_ = true;
  206|  24.0k|  return static_cast<signed char>(value_.at(n));
  207|  24.0k|}
_ZNK5Exiv215StringValueBase8toUint32Em:
  209|  2.51k|uint32_t StringValueBase::toUint32(size_t n) const {
  210|  2.51k|  ok_ = true;
  211|  2.51k|  return static_cast<unsigned char>(value_.at(n));
  212|  2.51k|}
_ZNK5Exiv215StringValueBase7toFloatEm:
  214|    547|float StringValueBase::toFloat(size_t n) const {
  215|    547|  ok_ = true;
  216|    547|  return static_cast<signed char>(value_.at(n));
  217|    547|}
_ZNK5Exiv215StringValueBase10toRationalEm:
  219|    680|Rational StringValueBase::toRational(size_t n) const {
  220|    680|  ok_ = true;
  221|    680|  return {static_cast<signed char>(value_.at(n)), 1};
  222|    680|}
_ZN5Exiv211StringValueC2Ev:
  224|  42.2k|StringValue::StringValue() : StringValueBase(string) {
  225|  42.2k|}
_ZNK5Exiv211StringValue6clone_Ev:
  230|   580k|StringValue* StringValue::clone_() const {
  231|   580k|  return new StringValue(*this);
  232|   580k|}
_ZN5Exiv210AsciiValueC2Ev:
  234|  92.2k|AsciiValue::AsciiValue() : StringValueBase(asciiString) {
  235|  92.2k|}
_ZN5Exiv210AsciiValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  240|  28.4k|int AsciiValue::read(const std::string& buf) {
  241|  28.4k|  value_ = buf;
  242|       |  // ensure count>0 and nul terminated # https://github.com/Exiv2/exiv2/issues/1484
  243|  28.4k|  if (value_.empty() || value_.back() != '\0') {
  ------------------
  |  Branch (243:7): [True: 0, False: 28.4k]
  |  Branch (243:25): [True: 28.4k, False: 0]
  ------------------
  244|  28.4k|    value_ += '\0';
  245|  28.4k|  }
  246|  28.4k|  return 0;
  247|  28.4k|}
_ZNK5Exiv210AsciiValue6clone_Ev:
  249|   199k|AsciiValue* AsciiValue::clone_() const {
  250|   199k|  return new AsciiValue(*this);
  251|   199k|}
_ZNK5Exiv210AsciiValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  253|   136k|std::ostream& AsciiValue::write(std::ostream& os) const {
  254|       |  // Write only up to the first '\0' (if any)
  255|   136k|  std::string::size_type pos = value_.find_first_of('\0');
  256|   136k|  if (pos == std::string::npos)
  ------------------
  |  Branch (256:7): [True: 4.45k, False: 131k]
  ------------------
  257|  4.45k|    pos = value_.size();
  258|   136k|  return os << value_.substr(0, pos);
  259|   136k|}
_ZN5Exiv212CommentValue11CharsetInfo4nameENS0_9CharsetIdE:
  271|  1.12k|const char* CommentValue::CharsetInfo::name(CharsetId charsetId) {
  272|  1.12k|  return charsetTable_[charsetId < lastCharsetId ? charsetId : undefined].name_;
  ------------------
  |  Branch (272:24): [True: 1.12k, False: 0]
  ------------------
  273|  1.12k|}
_ZN5Exiv212CommentValue11CharsetInfo15charsetIdByCodeERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  286|  5.60k|CommentValue::CharsetId CommentValue::CharsetInfo::charsetIdByCode(const std::string& code) {
  287|  5.60k|  int i = 0;
  288|  23.7k|  for (; charsetTable_[i].charsetId_ != lastCharsetId && std::string(charsetTable_[i].code_, 8) != code; ++i) {
  ------------------
  |  Branch (288:10): [True: 21.4k, False: 2.30k]
  |  Branch (288:10): [True: 18.1k, False: 5.60k]
  |  Branch (288:58): [True: 18.1k, False: 3.30k]
  ------------------
  289|  18.1k|  }
  290|  5.60k|  return charsetTable_[i].charsetId_ == lastCharsetId ? invalidCharsetId : charsetTable_[i].charsetId_;
  ------------------
  |  Branch (290:10): [True: 2.30k, False: 3.30k]
  ------------------
  291|  5.60k|}
_ZN5Exiv212CommentValueC2Ev:
  293|  3.07k|CommentValue::CommentValue() : StringValueBase(Exiv2::undefined) {
  294|  3.07k|}
_ZN5Exiv212CommentValue4readEPKhmNS_9ByteOrderE:
  330|  3.07k|int CommentValue::read(const byte* buf, size_t len, ByteOrder byteOrder) {
  331|  3.07k|  byteOrder_ = byteOrder;
  332|  3.07k|  return StringValueBase::read(buf, len, byteOrder);
  333|  3.07k|}
_ZNK5Exiv212CommentValue4copyEPhNS_9ByteOrderE:
  335|    363|size_t CommentValue::copy(byte* buf, ByteOrder byteOrder) const {
  336|    363|  std::string c = value_;
  337|    363|  if (charsetId() == unicode) {
  ------------------
  |  Branch (337:7): [True: 60, False: 303]
  ------------------
  338|     60|    c = value_.substr(8);
  339|     60|    [[maybe_unused]] const size_t sz = c.size();
  340|     60|    if (byteOrder_ == littleEndian && byteOrder == bigEndian) {
  ------------------
  |  Branch (340:9): [True: 8, False: 52]
  |  Branch (340:39): [True: 0, False: 8]
  ------------------
  341|      0|      convertStringCharset(c, "UCS-2LE", "UCS-2BE");
  342|     60|    } else if (byteOrder_ == bigEndian && byteOrder == littleEndian) {
  ------------------
  |  Branch (342:16): [True: 52, False: 8]
  |  Branch (342:43): [True: 0, False: 52]
  ------------------
  343|      0|      convertStringCharset(c, "UCS-2BE", "UCS-2LE");
  344|      0|    }
  345|     60|    c = value_.substr(0, 8) + c;
  346|     60|  }
  347|    363|  if (c.empty())
  ------------------
  |  Branch (347:7): [True: 111, False: 252]
  ------------------
  348|    111|    return 0;
  349|    252|  return c.copy(reinterpret_cast<char*>(buf), c.size());
  350|    363|}
_ZNK5Exiv212CommentValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  352|  1.55k|std::ostream& CommentValue::write(std::ostream& os) const {
  353|  1.55k|  CharsetId csId = charsetId();
  354|  1.55k|  std::string text = comment();
  355|  1.55k|  if (csId != undefined) {
  ------------------
  |  Branch (355:7): [True: 1.12k, False: 427]
  ------------------
  356|  1.12k|    os << "charset=" << CharsetInfo::name(csId) << " ";
  357|  1.12k|  }
  358|  1.55k|  return os << text;
  359|  1.55k|}
_ZNK5Exiv212CommentValue7commentEPKc:
  361|  1.55k|std::string CommentValue::comment(const char* encoding) const {
  362|  1.55k|  std::string c;
  363|  1.55k|  if (value_.length() < 8) {
  ------------------
  |  Branch (363:7): [True: 134, False: 1.41k]
  ------------------
  364|    134|    return c;
  365|    134|  }
  366|  1.41k|  c = value_.substr(8);
  367|  1.41k|  if (charsetId() == unicode) {
  ------------------
  |  Branch (367:7): [True: 503, False: 914]
  ------------------
  368|    503|    const char* from = !encoding || *encoding == '\0' ? detectCharset(c) : encoding;
  ------------------
  |  Branch (368:24): [True: 503, False: 0]
  |  Branch (368:37): [True: 0, False: 0]
  ------------------
  369|    503|    if (!convertStringCharset(c, from, "UTF-8"))
  ------------------
  |  Branch (369:9): [True: 15, False: 488]
  ------------------
  370|     15|      throw Error(ErrorCode::kerInvalidIconvEncoding, from, "UTF-8");
  371|    503|  }
  372|       |
  373|       |  // # 1266 Remove trailing nulls
  374|  1.40k|  if (charsetId() == undefined || charsetId() == ascii) {
  ------------------
  |  Branch (374:7): [True: 278, False: 1.12k]
  |  Branch (374:35): [True: 90, False: 1.03k]
  ------------------
  375|    368|    auto n = c.find('\0');
  376|    368|    if (n != std::string::npos)
  ------------------
  |  Branch (376:9): [True: 222, False: 146]
  ------------------
  377|    222|      c.resize(n);
  378|    368|  }
  379|  1.40k|  return c;
  380|  1.41k|}
_ZNK5Exiv212CommentValue9charsetIdEv:
  382|  5.85k|CommentValue::CharsetId CommentValue::charsetId() const {
  383|  5.85k|  CharsetId charsetId = undefined;
  384|  5.85k|  if (value_.length() >= 8) {
  ------------------
  |  Branch (384:7): [True: 5.60k, False: 248]
  ------------------
  385|  5.60k|    const std::string code = value_.substr(0, 8);
  386|  5.60k|    charsetId = CharsetInfo::charsetIdByCode(code);
  387|  5.60k|  }
  388|  5.85k|  return charsetId;
  389|  5.85k|}
_ZNK5Exiv212CommentValue13detectCharsetERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  391|    503|const char* CommentValue::detectCharset(std::string& c) const {
  392|       |  // Interpret a BOM if there is one
  393|    503|  if (c.compare(0, 3, "\xef\xbb\xbf") == 0) {
  ------------------
  |  Branch (393:7): [True: 112, False: 391]
  ------------------
  394|    112|    c = c.substr(3);
  395|    112|    return "UTF-8";
  396|    112|  }
  397|    391|  if (c.compare(0, 2, "\xff\xfe") == 0) {
  ------------------
  |  Branch (397:7): [True: 80, False: 311]
  ------------------
  398|     80|    c = c.substr(2);
  399|     80|    return "UCS-2LE";
  400|     80|  }
  401|    311|  if (c.compare(0, 2, "\xfe\xff") == 0) {
  ------------------
  |  Branch (401:7): [True: 166, False: 145]
  ------------------
  402|    166|    c = c.substr(2);
  403|    166|    return "UCS-2BE";
  404|    166|  }
  405|       |
  406|       |  // Todo: Add logic to guess if the comment is encoded in UTF-8
  407|       |
  408|    145|  return byteOrder_ == littleEndian ? "UCS-2LE" : "UCS-2BE";
  ------------------
  |  Branch (408:10): [True: 7, False: 138]
  ------------------
  409|    311|}
_ZNK5Exiv212CommentValue6clone_Ev:
  411|  6.57k|CommentValue* CommentValue::clone_() const {
  412|  6.57k|  return new CommentValue(*this);
  413|  6.57k|}
_ZN5Exiv28XmpValue15setXmpArrayTypeENS0_12XmpArrayTypeE:
  415|  4.22k|void XmpValue::setXmpArrayType(XmpArrayType xmpArrayType) {
  416|  4.22k|  xmpArrayType_ = xmpArrayType;
  417|  4.22k|}
_ZN5Exiv28XmpValue12setXmpStructENS0_9XmpStructE:
  419|    449|void XmpValue::setXmpStruct(XmpStruct xmpStruct) {
  420|    449|  xmpStruct_ = xmpStruct;
  421|    449|}
_ZNK5Exiv28XmpValue12xmpArrayTypeEv:
  423|  49.4k|XmpValue::XmpArrayType XmpValue::xmpArrayType() const {
  424|  49.4k|  return xmpArrayType_;
  425|  49.4k|}
_ZN5Exiv28XmpValue12xmpArrayTypeENS_6TypeIdE:
  427|  4.13k|XmpValue::XmpArrayType XmpValue::xmpArrayType(TypeId typeId) {
  428|  4.13k|  XmpArrayType xa = xaNone;
  429|  4.13k|  switch (typeId) {
  430|     62|    case xmpAlt:
  ------------------
  |  Branch (430:5): [True: 62, False: 4.07k]
  ------------------
  431|     62|      xa = xaAlt;
  432|     62|      break;
  433|    132|    case xmpBag:
  ------------------
  |  Branch (433:5): [True: 132, False: 4.00k]
  ------------------
  434|    132|      xa = xaBag;
  435|    132|      break;
  436|  3.63k|    case xmpSeq:
  ------------------
  |  Branch (436:5): [True: 3.63k, False: 502]
  ------------------
  437|  3.63k|      xa = xaSeq;
  438|  3.63k|      break;
  439|    308|    default:
  ------------------
  |  Branch (439:5): [True: 308, False: 3.82k]
  ------------------
  440|    308|      break;
  441|  4.13k|  }
  442|  4.13k|  return xa;
  443|  4.13k|}
_ZNK5Exiv28XmpValue9xmpStructEv:
  445|  49.7k|XmpValue::XmpStruct XmpValue::xmpStruct() const {
  446|  49.7k|  return xmpStruct_;
  447|  49.7k|}
_ZN5Exiv212XmpTextValueC2Ev:
  469|  29.7k|XmpTextValue::XmpTextValue() : XmpValue(xmpText) {
  470|  29.7k|}
_ZN5Exiv212XmpTextValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  476|   495k|int XmpTextValue::read(const std::string& buf) {
  477|       |  // support a type=Alt,Bag,Seq,Struct indicator
  478|   495k|  std::string b = buf;
  479|   495k|  std::string type;
  480|   495k|  if (buf.starts_with("type=")) {
  ------------------
  |  Branch (480:7): [True: 373, False: 495k]
  ------------------
  481|    373|    std::string::size_type pos = buf.find_first_of(' ');
  482|    373|    type = buf.substr(5, pos - 5);
  483|       |    // Strip quotes (so you can also specify the type without quotes)
  484|    373|    if (!type.empty() && type.front() == '"')
  ------------------
  |  Branch (484:9): [True: 288, False: 85]
  |  Branch (484:26): [True: 137, False: 151]
  ------------------
  485|    137|      type = type.substr(1);
  486|    373|    if (!type.empty() && type.back() == '"')
  ------------------
  |  Branch (486:9): [True: 243, False: 130]
  |  Branch (486:26): [True: 85, False: 158]
  ------------------
  487|     85|      type.pop_back();
  488|    373|    b.clear();
  489|    373|    if (pos != std::string::npos)
  ------------------
  |  Branch (489:9): [True: 181, False: 192]
  ------------------
  490|    181|      b = buf.substr(pos + 1);
  491|    373|  }
  492|   495k|  if (!type.empty()) {
  ------------------
  |  Branch (492:7): [True: 243, False: 495k]
  ------------------
  493|    243|    if (type == "Alt") {
  ------------------
  |  Branch (493:9): [True: 19, False: 224]
  ------------------
  494|     19|      setXmpArrayType(XmpValue::xaAlt);
  495|    224|    } else if (type == "Bag") {
  ------------------
  |  Branch (495:16): [True: 18, False: 206]
  ------------------
  496|     18|      setXmpArrayType(XmpValue::xaBag);
  497|    206|    } else if (type == "Seq") {
  ------------------
  |  Branch (497:16): [True: 50, False: 156]
  ------------------
  498|     50|      setXmpArrayType(XmpValue::xaSeq);
  499|    156|    } else if (type == "Struct") {
  ------------------
  |  Branch (499:16): [True: 9, False: 147]
  ------------------
  500|      9|      setXmpStruct();
  501|    147|    } else {
  502|    147|      throw Error(ErrorCode::kerInvalidXmpText, type);
  503|    147|    }
  504|    243|  }
  505|   495k|  value_ = std::move(b);
  506|   495k|  return 0;
  507|   495k|}
_ZNK5Exiv212XmpTextValue4sizeEv:
  513|  19.5k|size_t XmpTextValue::size() const {
  514|  19.5k|  std::ostringstream os;
  515|  19.5k|  write(os);
  516|  19.5k|  return os.str().size();
  517|  19.5k|}
_ZNK5Exiv212XmpTextValue5countEv:
  519|  19.5k|size_t XmpTextValue::count() const {
  520|  19.5k|  return size();
  521|  19.5k|}
_ZNK5Exiv212XmpTextValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  523|  42.5k|std::ostream& XmpTextValue::write(std::ostream& os) const {
  524|  42.5k|  bool del = false;
  525|  42.5k|  if (xmpArrayType() != XmpValue::xaNone) {
  ------------------
  |  Branch (525:7): [True: 351, False: 42.2k]
  ------------------
  526|    351|    switch (xmpArrayType()) {
  ------------------
  |  Branch (526:13): [True: 351, False: 0]
  ------------------
  527|     25|      case XmpValue::xaAlt:
  ------------------
  |  Branch (527:7): [True: 25, False: 326]
  ------------------
  528|     25|        os << "type=\"Alt\"";
  529|     25|        break;
  530|     12|      case XmpValue::xaBag:
  ------------------
  |  Branch (530:7): [True: 12, False: 339]
  ------------------
  531|     12|        os << "type=\"Bag\"";
  532|     12|        break;
  533|    314|      case XmpValue::xaSeq:
  ------------------
  |  Branch (533:7): [True: 314, False: 37]
  ------------------
  534|    314|        os << "type=\"Seq\"";
  535|    314|        break;
  536|      0|      case XmpValue::xaNone:
  ------------------
  |  Branch (536:7): [True: 0, False: 351]
  ------------------
  537|      0|        break;  // just to suppress the warning
  538|    351|    }
  539|    351|    del = true;
  540|  42.2k|  } else if (xmpStruct() != XmpValue::xsNone) {
  ------------------
  |  Branch (540:14): [True: 832, False: 41.4k]
  ------------------
  541|    832|    switch (xmpStruct()) {
  ------------------
  |  Branch (541:13): [True: 832, False: 0]
  ------------------
  542|    832|      case XmpValue::xsStruct:
  ------------------
  |  Branch (542:7): [True: 832, False: 0]
  ------------------
  543|    832|        os << "type=\"Struct\"";
  544|    832|        break;
  545|      0|      case XmpValue::xsNone:
  ------------------
  |  Branch (545:7): [True: 0, False: 832]
  ------------------
  546|      0|        break;  // just to suppress the warning
  547|    832|    }
  548|    832|    del = true;
  549|    832|  }
  550|  42.5k|  if (del && !value_.empty())
  ------------------
  |  Branch (550:7): [True: 1.18k, False: 41.4k]
  |  Branch (550:14): [True: 12, False: 1.17k]
  ------------------
  551|     12|    os << " ";
  552|  42.5k|  return os << value_;
  553|  42.5k|}
_ZNK5Exiv212XmpTextValue6clone_Ev:
  571|  43.2k|XmpTextValue* XmpTextValue::clone_() const {
  572|  43.2k|  return new XmpTextValue(*this);
  573|  43.2k|}
_ZN5Exiv213XmpArrayValueC2ENS_6TypeIdE:
  575|  3.69k|XmpArrayValue::XmpArrayValue(TypeId typeId) : XmpValue(typeId) {
  576|  3.69k|  setXmpArrayType(xmpArrayType(typeId));
  577|  3.69k|}
_ZN5Exiv213XmpArrayValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  579|  22.8k|int XmpArrayValue::read(const std::string& buf) {
  580|  22.8k|  if (!buf.empty())
  ------------------
  |  Branch (580:7): [True: 17.5k, False: 5.23k]
  ------------------
  581|  17.5k|    value_.push_back(buf);
  582|  22.8k|  return 0;
  583|  22.8k|}
_ZNK5Exiv213XmpArrayValue5countEv:
  589|  2.92k|size_t XmpArrayValue::count() const {
  590|  2.92k|  return value_.size();
  591|  2.92k|}
_ZNK5Exiv213XmpArrayValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  593|  1.86k|std::ostream& XmpArrayValue::write(std::ostream& os) const {
  594|  1.86k|  if (!value_.empty()) {
  ------------------
  |  Branch (594:7): [True: 1.37k, False: 498]
  ------------------
  595|  1.37k|    std::copy(value_.begin(), value_.end() - 1, std::ostream_iterator<std::string>(os, ", "));
  596|  1.37k|    os << value_.back();
  597|  1.37k|  }
  598|  1.86k|  return os;
  599|  1.86k|}
_ZNK5Exiv213XmpArrayValue8toStringEm:
  601|  1.47k|std::string XmpArrayValue::toString(size_t n) const {
  602|  1.47k|  ok_ = true;
  603|  1.47k|  return value_.at(n);
  604|  1.47k|}
_ZNK5Exiv213XmpArrayValue6clone_Ev:
  622|  6.41k|XmpArrayValue* XmpArrayValue::clone_() const {
  623|  6.41k|  return new XmpArrayValue(*this);
  624|  6.41k|}
_ZN5Exiv212LangAltValueC2Ev:
  626|    158|LangAltValue::LangAltValue() : XmpValue(langAlt) {
  627|    158|}
_ZNK5Exiv212LangAltValue5countEv:
  680|    174|size_t LangAltValue::count() const {
  681|    174|  return value_.size();
  682|    174|}
_ZNK5Exiv212LangAltValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  684|    174|std::ostream& LangAltValue::write(std::ostream& os) const {
  685|    174|  bool first = true;
  686|       |
  687|       |  // Write the default entry first
  688|    174|  if (auto i = value_.find("x-default"); i != value_.end()) {
  ------------------
  |  Branch (688:42): [True: 54, False: 120]
  ------------------
  689|     54|    os << "lang=\"" << i->first << "\" " << i->second;
  690|     54|    first = false;
  691|     54|  }
  692|       |
  693|       |  // Write the others
  694|    174|  for (const auto& [lang, s] : value_) {
  ------------------
  |  Branch (694:30): [True: 172, False: 174]
  ------------------
  695|    172|    if (lang != "x-default") {
  ------------------
  |  Branch (695:9): [True: 118, False: 54]
  ------------------
  696|    118|      if (!first)
  ------------------
  |  Branch (696:11): [True: 8, False: 110]
  ------------------
  697|      8|        os << ", ";
  698|    118|      os << "lang=\"" << lang << "\" " << s;
  699|    118|      first = false;
  700|    118|    }
  701|    172|  }
  702|    174|  return os;
  703|    174|}
_ZNK5Exiv212LangAltValue6clone_Ev:
  738|    362|LangAltValue* LangAltValue::clone_() const {
  739|    362|  return new LangAltValue(*this);
  740|    362|}
_ZN5Exiv29DateValueC2Ev:
  742|  2.66k|DateValue::DateValue() : Value(date) {
  743|  2.66k|  date_ = {};
  744|  2.66k|}
_ZN5Exiv29DateValue4readEPKhmNS_9ByteOrderE:
  750|  2.52k|int DateValue::read(const byte* buf, size_t len, ByteOrder /*byteOrder*/) {
  751|  2.52k|  const std::string str(reinterpret_cast<const char*>(buf), len);
  752|  2.52k|  return read(str);
  753|  2.52k|}
_ZN5Exiv29DateValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  755|  2.66k|int DateValue::read(const std::string& buf) {
  756|       |  // ISO 8601 date formats:
  757|       |  // https://web.archive.org/web/20171020084445/https://www.loc.gov/standards/datetime/ISO_DIS%208601-1.pdf
  758|  2.66k|  size_t monthPos = 0;
  759|  2.66k|  size_t dayPos = 0;
  760|       |
  761|  2.66k|  auto printWarning = [] {
  762|  2.66k|#ifndef SUPPRESS_WARNINGS
  763|  2.66k|    EXV_WARNING << Error(ErrorCode::kerUnsupportedDateFormat) << "\n";
  764|  2.66k|#endif
  765|  2.66k|  };
  766|       |
  767|  2.66k|  if (buf.size() < 8) {
  ------------------
  |  Branch (767:7): [True: 337, False: 2.33k]
  ------------------
  768|    337|    printWarning();
  769|    337|    return 1;
  770|    337|  }
  771|       |
  772|  2.33k|  if ((buf.size() >= 10 && buf[4] == '-' && buf[7] == '-') || (buf.size() == 8)) {
  ------------------
  |  Branch (772:8): [True: 498, False: 1.83k]
  |  Branch (772:28): [True: 238, False: 260]
  |  Branch (772:45): [True: 122, False: 116]
  |  Branch (772:63): [True: 1.82k, False: 381]
  ------------------
  773|  1.95k|    if (buf.size() >= 10) {
  ------------------
  |  Branch (773:9): [True: 122, False: 1.82k]
  ------------------
  774|    122|      monthPos = 5;
  775|    122|      dayPos = 8;
  776|  1.82k|    } else {
  777|  1.82k|      monthPos = 4;
  778|  1.82k|      dayPos = 6;
  779|  1.82k|    }
  780|       |
  781|  1.95k|    auto checkDigits = [&buf, &printWarning](size_t start, size_t count, int32_t& dest) {
  782|  1.95k|      for (size_t i = start; i < start + count; ++i) {
  783|  1.95k|        if (!std::isdigit(buf[i])) {
  784|  1.95k|          printWarning();
  785|  1.95k|          return 1;
  786|  1.95k|        }
  787|  1.95k|      }
  788|  1.95k|      dest = std::stoul(buf.substr(start, count));
  789|  1.95k|      return 0;
  790|  1.95k|    };
  791|       |
  792|  1.95k|    if (checkDigits(0, 4, date_.year) || checkDigits(monthPos, 2, date_.month) || checkDigits(dayPos, 2, date_.day)) {
  ------------------
  |  Branch (792:9): [True: 1.14k, False: 810]
  |  Branch (792:42): [True: 258, False: 552]
  |  Branch (792:83): [True: 163, False: 389]
  ------------------
  793|  1.56k|      printWarning();
  794|  1.56k|      return 1;
  795|  1.56k|    }
  796|       |
  797|    389|    if (date_.month > 12 || date_.day > 31) {
  ------------------
  |  Branch (797:9): [True: 52, False: 337]
  |  Branch (797:29): [True: 20, False: 317]
  ------------------
  798|     72|      date_.month = 0;
  799|     72|      date_.day = 0;
  800|     72|      printWarning();
  801|     72|      return 1;
  802|     72|    }
  803|    317|    return 0;
  804|    389|  }
  805|    381|  printWarning();
  806|    381|  return 1;
  807|  2.33k|}
_ZNK5Exiv29DateValue4copyEPhNS_9ByteOrderE:
  813|    214|size_t DateValue::copy(byte* buf, ByteOrder /*byteOrder*/) const {
  814|       |  // \note Here the date is copied in the Basic format YYYYMMDD, as the IPTC key	Iptc.Application2.DateCreated
  815|       |  // wants it. Check https://exiv2.org/iptc.html
  816|       |
  817|    214|  auto out = reinterpret_cast<char*>(buf);
  818|    214|  auto it = stringFormatTo(out, "{:04}{:02}{:02}", date_.year, date_.month, date_.day);
  ------------------
  |  |   19|    214|#define stringFormatTo std::format_to
  ------------------
  819|       |
  820|    214|  return it - out;
  821|    214|}
_ZNK5Exiv29DateValue4sizeEv:
  831|    428|size_t DateValue::size() const {
  832|    428|  return 8;
  833|    428|}
_ZNK5Exiv29DateValue6clone_Ev:
  835|  2.20k|DateValue* DateValue::clone_() const {
  836|  2.20k|  return new DateValue(*this);
  837|  2.20k|}
_ZNK5Exiv29DateValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
  839|    756|std::ostream& DateValue::write(std::ostream& os) const {
  840|       |  // Write DateValue in ISO 8601 Extended format: YYYY-MM-DD
  841|    756|  return os << stringFormat("{:04}-{:02}-{:02}", date_.year, date_.month, date_.day);
  ------------------
  |  |   18|    756|#define stringFormat std::format
  ------------------
  842|    756|}
_ZN5Exiv29TimeValueC2Ev:
  878|  2.30k|TimeValue::TimeValue() : Value(time) {
  879|  2.30k|  time_ = {};
  880|  2.30k|}
_ZN5Exiv29TimeValue4readEPKhmNS_9ByteOrderE:
  886|  2.30k|int TimeValue::read(const byte* buf, size_t len, ByteOrder /*byteOrder*/) {
  887|  2.30k|  const std::string str(reinterpret_cast<const char*>(buf), len);
  888|  2.30k|  return read(str);
  889|  2.30k|}
_ZN5Exiv29TimeValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  891|  2.30k|int TimeValue::read(const std::string& buf) {
  892|       |  // ISO 8601 time formats:
  893|       |  // https://web.archive.org/web/20171020084445/https://www.loc.gov/standards/datetime/ISO_DIS%208601-1.pdf
  894|       |  // Not supported formats:
  895|       |  // 4.2.2.4 Representations with decimal fraction: 232050,5
  896|  2.30k|  auto printWarning = [] {
  897|  2.30k|#ifndef SUPPRESS_WARNINGS
  898|  2.30k|    EXV_WARNING << Error(ErrorCode::kerUnsupportedTimeFormat) << "\n";
  899|  2.30k|#endif
  900|  2.30k|    return 1;
  901|  2.30k|  };
  902|       |
  903|  2.30k|  if (buf.size() < 2)
  ------------------
  |  Branch (903:7): [True: 53, False: 2.25k]
  ------------------
  904|     53|    return printWarning();
  905|       |
  906|  2.25k|  for (auto c : buf)
  ------------------
  |  Branch (906:15): [True: 22.1k, False: 1.57k]
  ------------------
  907|  22.1k|    if (c != ':' && c != '+' && c != '-' && c != 'Z' && !std::isdigit(c))
  ------------------
  |  Branch (907:9): [True: 21.0k, False: 1.13k]
  |  Branch (907:21): [True: 20.7k, False: 322]
  |  Branch (907:33): [True: 18.8k, False: 1.90k]
  |  Branch (907:45): [True: 18.3k, False: 434]
  |  Branch (907:57): [True: 681, False: 17.6k]
  ------------------
  908|    681|      return printWarning();
  909|       |
  910|  1.57k|  size_t mpos;
  911|  1.57k|  size_t spos;
  912|  1.57k|  if (buf.find(':') != std::string::npos) {
  ------------------
  |  Branch (912:7): [True: 748, False: 826]
  ------------------
  913|    748|    mpos = 3;
  914|    748|    spos = 6;
  915|    826|  } else {
  916|    826|    mpos = 2;
  917|    826|    spos = 4;
  918|    826|  }
  919|       |
  920|  1.57k|  try {
  921|  1.57k|    auto hi = std::stoi(buf.substr(0, 2));
  922|  1.57k|    if (hi < 0 || hi > 23)
  ------------------
  |  Branch (922:9): [True: 187, False: 1.38k]
  |  Branch (922:19): [True: 54, False: 1.33k]
  ------------------
  923|    200|      return printWarning();
  924|  1.37k|    time_.hour = hi;
  925|  1.37k|    if (buf.size() > 3) {
  ------------------
  |  Branch (925:9): [True: 1.29k, False: 77]
  ------------------
  926|  1.29k|      auto mi = std::stoi(buf.substr(mpos, 2));
  927|  1.29k|      if (mi < 0 || mi > 59)
  ------------------
  |  Branch (927:11): [True: 69, False: 1.22k]
  |  Branch (927:21): [True: 84, False: 1.14k]
  ------------------
  928|    132|        return printWarning();
  929|  1.16k|      time_.minute = std::stoi(buf.substr(mpos, 2));
  930|  1.16k|    } else {
  931|     77|      time_.minute = 0;
  932|     77|    }
  933|  1.24k|    if (buf.size() > 5) {
  ------------------
  |  Branch (933:9): [True: 1.02k, False: 217]
  ------------------
  934|  1.02k|      auto si = std::stoi(buf.substr(spos, 2));
  935|  1.02k|      if (si < 0 || si > 60)
  ------------------
  |  Branch (935:11): [True: 53, False: 972]
  |  Branch (935:21): [True: 87, False: 885]
  ------------------
  936|    112|        return printWarning();
  937|    913|      time_.second = std::stoi(buf.substr(spos, 2));
  938|    913|    } else {
  939|    217|      time_.second = 0;
  940|    217|    }
  941|       |
  942|  1.13k|    auto fpos = buf.find('+');
  943|  1.13k|    if (fpos == std::string::npos)
  ------------------
  |  Branch (943:9): [True: 855, False: 275]
  ------------------
  944|    855|      fpos = buf.find('-');
  945|       |
  946|  1.13k|    if (fpos != std::string::npos) {
  ------------------
  |  Branch (946:9): [True: 870, False: 260]
  ------------------
  947|    870|      auto format = buf.substr(fpos, buf.size());
  948|       |      // Use the sign of the raw offset string rather than of the parsed
  949|       |      // tzHour: when the hour magnitude is 0 (e.g. "-00:30"), std::stoi
  950|       |      // returns 0, which loses the '-' sign that std::stoi("-00") cannot
  951|       |      // preserve. format always starts with '+' or '-' (see fpos above).
  952|    870|      const bool negative = format.at(0) == '-';
  953|    870|      auto posColon = format.find(':');
  954|    870|      if (posColon == std::string::npos) {
  ------------------
  |  Branch (954:11): [True: 569, False: 301]
  ------------------
  955|       |        // Extended format
  956|    569|        auto tzhi = std::stoi(format.substr(0, 3));
  957|    569|        if (tzhi < -23 || tzhi > 23)
  ------------------
  |  Branch (957:13): [True: 123, False: 446]
  |  Branch (957:27): [True: 10, False: 436]
  ------------------
  958|    121|          return printWarning();
  959|    448|        time_.tzHour = tzhi;
  960|    448|        if (format.size() > 3) {
  ------------------
  |  Branch (960:13): [True: 298, False: 150]
  ------------------
  961|    298|          int minute = std::stoi(format.substr(3));
  962|    298|          if (minute < 0 || minute > 59)
  ------------------
  |  Branch (962:15): [True: 19, False: 279]
  |  Branch (962:29): [True: 47, False: 232]
  ------------------
  963|     50|            return printWarning();
  964|    248|          time_.tzMinute = negative ? -minute : minute;
  ------------------
  |  Branch (964:28): [True: 177, False: 71]
  ------------------
  965|    248|        }
  966|    448|      } else {
  967|       |        // Basic format
  968|    301|        auto tzhi = std::stoi(format.substr(0, posColon));
  969|    301|        if (tzhi < -23 || tzhi > 23)
  ------------------
  |  Branch (969:13): [True: 95, False: 206]
  |  Branch (969:27): [True: 41, False: 165]
  ------------------
  970|     74|          return printWarning();
  971|    227|        time_.tzHour = tzhi;
  972|    227|        int minute = std::stoi(format.substr(posColon + 1));
  973|    227|        if (minute < 0 || minute > 59)
  ------------------
  |  Branch (973:13): [True: 86, False: 141]
  |  Branch (973:27): [True: 78, False: 63]
  ------------------
  974|     78|          return printWarning();
  975|    149|        time_.tzMinute = negative ? -minute : minute;
  ------------------
  |  Branch (975:26): [True: 52, False: 97]
  ------------------
  976|    149|      }
  977|    870|    }
  978|  1.13k|  } catch (std::exception&) {
  979|       |    // std::stoi might throw an exception if the syntax is invalid.
  980|    204|    return printWarning();
  981|    204|  }
  982|    603|  return 0;
  983|  1.57k|}
_ZNK5Exiv29TimeValue4copyEPhNS_9ByteOrderE:
  990|    246|size_t TimeValue::copy(byte* buf, ByteOrder /*byteOrder*/) const {
  991|       |  // NOTE: Here the time is copied in the Basic format HHMMSS:HHMM, as the IPTC key
  992|       |  // Iptc.Application2.TimeCreated wants it. Check https://exiv2.org/iptc.html
  993|    246|  char plusMinus = '+';
  994|    246|  if (time_.tzHour < 0 || time_.tzMinute < 0)
  ------------------
  |  Branch (994:7): [True: 21, False: 225]
  |  Branch (994:27): [True: 7, False: 218]
  ------------------
  995|     28|    plusMinus = '-';
  996|       |
  997|    246|  auto out = reinterpret_cast<char*>(buf);
  998|    246|  auto it = stringFormatTo(out, "{:02}{:02}{:02}{}{:02}{:02}", time_.hour, time_.minute, time_.second, plusMinus,
  ------------------
  |  |   19|    246|#define stringFormatTo std::format_to
  ------------------
  999|    246|                           std::abs(time_.tzHour), std::abs(time_.tzMinute));
 1000|       |
 1001|    246|  auto wrote = static_cast<size_t>(it - out);
 1002|    246|  Internal::enforce(wrote == 11, Exiv2::ErrorCode::kerUnsupportedTimeFormat);
 1003|    246|  return wrote;
 1004|    246|}
_ZNK5Exiv29TimeValue4sizeEv:
 1014|    492|size_t TimeValue::size() const {
 1015|    492|  return 11;
 1016|    492|}
_ZNK5Exiv29TimeValue6clone_Ev:
 1018|  1.44k|TimeValue* TimeValue::clone_() const {
 1019|  1.44k|  return new TimeValue(*this);
 1020|  1.44k|}
_ZNK5Exiv29TimeValue5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
 1022|    140|std::ostream& TimeValue::write(std::ostream& os) const {
 1023|       |  // Write TimeValue in ISO 8601 Extended format: hh:mm:ss±hh:mm
 1024|    140|  char plusMinus = '+';
 1025|    140|  if (time_.tzHour < 0 || time_.tzMinute < 0)
  ------------------
  |  Branch (1025:7): [True: 42, False: 98]
  |  Branch (1025:27): [True: 12, False: 86]
  ------------------
 1026|     54|    plusMinus = '-';
 1027|       |
 1028|    140|  return os << stringFormat("{:02}:{:02}:{:02}{}{:02}:{:02}", time_.hour, time_.minute, time_.second, plusMinus,
  ------------------
  |  |   18|    140|#define stringFormat std::format
  ------------------
 1029|    140|                            std::abs(time_.tzHour), std::abs(time_.tzMinute));
 1030|    140|}
value.cpp:_ZZN5Exiv29DateValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEENK3$_0clEv:
  761|  3.91k|  auto printWarning = [] {
  762|  3.91k|#ifndef SUPPRESS_WARNINGS
  763|  3.91k|    EXV_WARNING << Error(ErrorCode::kerUnsupportedDateFormat) << "\n";
  ------------------
  |  |  138|  3.91k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 3.91k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  3.91k|  LogMsg(LogMsg::warn).os()
  ------------------
  764|  3.91k|#endif
  765|  3.91k|  };
value.cpp:_ZZN5Exiv29DateValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEENK3$_1clEmmRi:
  781|  3.31k|    auto checkDigits = [&buf, &printWarning](size_t start, size_t count, int32_t& dest) {
  782|  8.75k|      for (size_t i = start; i < start + count; ++i) {
  ------------------
  |  Branch (782:30): [True: 7.00k, False: 1.75k]
  ------------------
  783|  7.00k|        if (!std::isdigit(buf[i])) {
  ------------------
  |  Branch (783:13): [True: 1.56k, False: 5.43k]
  ------------------
  784|  1.56k|          printWarning();
  785|  1.56k|          return 1;
  786|  1.56k|        }
  787|  7.00k|      }
  788|  1.75k|      dest = std::stoul(buf.substr(start, count));
  789|  1.75k|      return 0;
  790|  3.31k|    };
value.cpp:_ZZN5Exiv29TimeValue4readERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEENK3$_0clEv:
  896|  1.70k|  auto printWarning = [] {
  897|  1.70k|#ifndef SUPPRESS_WARNINGS
  898|  1.70k|    EXV_WARNING << Error(ErrorCode::kerUnsupportedTimeFormat) << "\n";
  ------------------
  |  |  138|  1.70k|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 1.70k]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|  1.70k|  LogMsg(LogMsg::warn).os()
  ------------------
  899|  1.70k|#endif
  900|  1.70k|    return 1;
  901|  1.70k|  };

_ZN5Exiv29WebPImageC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   78|    135|    Image(ImageType::webp, mdNone, std::move(io), params) {
   79|    135|}  // WebPImage::WebPImage
_ZN5Exiv29WebPImage13writeMetadataEv:
   98|     48|void WebPImage::writeMetadata() {
   99|     48|  if (io_->open() != 0) {
  ------------------
  |  Branch (99:7): [True: 0, False: 48]
  ------------------
  100|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  101|      0|  }
  102|     48|  IoCloser closer(*io_);
  103|     48|  MemIo tempIo;
  104|       |
  105|     48|  doWriteMetadata(tempIo);  // may throw
  106|     48|  io_->close();
  107|     48|  io_->transfer(tempIo);  // may throw
  108|     48|}  // WebPImage::writeMetadata
_ZN5Exiv29WebPImage15doWriteMetadataERNS_7BasicIoE:
  110|     48|void WebPImage::doWriteMetadata(BasicIo& outIo) {
  111|     48|  if (!io_->isopen())
  ------------------
  |  Branch (111:7): [True: 0, False: 48]
  ------------------
  112|      0|    throw Error(ErrorCode::kerInputDataReadFailed);
  113|     48|  if (!outIo.isopen())
  ------------------
  |  Branch (113:7): [True: 0, False: 48]
  ------------------
  114|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  115|       |
  116|       |#ifdef EXIV2_DEBUG_MESSAGES
  117|       |  std::cout << "Writing metadata" << '\n';
  118|       |#endif
  119|       |
  120|     48|  byte data[WEBP_TAG_SIZE * 3];
  121|     48|  DataBuf chunkId(WEBP_TAG_SIZE + 1);
  122|     48|  chunkId.write_uint8(WEBP_TAG_SIZE, '\0');
  123|       |
  124|     48|  io_->readOrThrow(data, WEBP_TAG_SIZE * 3, Exiv2::ErrorCode::kerCorruptedMetadata);
  125|     48|  uint64_t filesize = Exiv2::getULong(data + WEBP_TAG_SIZE, littleEndian);
  126|       |
  127|       |  /* Set up header */
  128|     48|  if (outIo.write(data, WEBP_TAG_SIZE * 3) != WEBP_TAG_SIZE * 3)
  ------------------
  |  Branch (128:7): [True: 0, False: 48]
  ------------------
  129|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  130|       |
  131|       |  /* Parse Chunks */
  132|     48|  bool has_size = false;
  133|     48|  bool has_xmp = false;
  134|     48|  bool has_exif = false;
  135|     48|  bool has_vp8x = false;
  136|     48|  bool has_alpha = false;
  137|     48|  bool has_icc = iccProfileDefined();
  138|       |
  139|     48|  uint32_t width = 0;
  140|     48|  uint32_t height = 0;
  141|       |
  142|     48|  std::array<byte, WEBP_TAG_SIZE> size_buff;
  143|     48|  Blob blob;
  144|       |
  145|     48|  if (!exifData_.empty()) {
  ------------------
  |  Branch (145:7): [True: 0, False: 48]
  ------------------
  146|      0|    ExifParser::encode(blob, littleEndian, exifData_);
  147|      0|    if (!blob.empty()) {
  ------------------
  |  Branch (147:9): [True: 0, False: 0]
  ------------------
  148|      0|      has_exif = true;
  149|      0|    }
  150|      0|  }
  151|       |
  152|     48|  if (!xmpData_.empty() && !writeXmpFromPacket()) {
  ------------------
  |  Branch (152:7): [True: 0, False: 48]
  |  Branch (152:28): [True: 0, False: 0]
  ------------------
  153|      0|    XmpParser::encode(xmpPacket_, xmpData_, XmpParser::useCompactFormat | XmpParser::omitAllFormatting);
  154|      0|  }
  155|     48|  has_xmp = !xmpPacket_.empty();
  156|     48|  std::string xmp(xmpPacket_);
  157|       |
  158|       |  /* Verify for a VP8X Chunk First before writing in
  159|       |   case we have any exif or xmp data, also check
  160|       |   for any chunks with alpha frame/layer set */
  161|    400|  while (!io_->eof() && io_->tell() < filesize) {
  ------------------
  |  Branch (161:10): [True: 392, False: 8]
  |  Branch (161:25): [True: 352, False: 40]
  ------------------
  162|    352|    io_->readOrThrow(chunkId.data(), WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata);
  163|    352|    io_->readOrThrow(size_buff.data(), WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata);
  164|    352|    const uint32_t size_u32 = Exiv2::getULong(size_buff.data(), littleEndian);
  165|       |
  166|       |    // Check that `size_u32` is within bounds.
  167|    352|    Internal::enforce(size_u32 <= io_->size() - io_->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  168|       |
  169|    352|    DataBuf payload(size_u32);
  170|    352|    if (!payload.empty()) {
  ------------------
  |  Branch (170:9): [True: 352, False: 0]
  ------------------
  171|    352|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  172|    352|      if (payload.size() % 2) {
  ------------------
  |  Branch (172:11): [True: 137, False: 215]
  ------------------
  173|    137|        byte c = 0;
  174|    137|        io_->readOrThrow(&c, 1, Exiv2::ErrorCode::kerCorruptedMetadata);
  175|    137|      }
  176|    352|    }
  177|       |
  178|       |    /* Chunk with information about features
  179|       |     used in the file. */
  180|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8X) && !has_vp8x) {
  ------------------
  |  Branch (180:9): [True: 30, False: 322]
  |  Branch (180:59): [True: 15, False: 15]
  ------------------
  181|     15|      has_vp8x = true;
  182|     15|    }
  183|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8X) && !has_size) {
  ------------------
  |  Branch (183:9): [True: 30, False: 322]
  |  Branch (183:59): [True: 15, False: 15]
  ------------------
  184|     15|      Internal::enforce(size_u32 >= 10, Exiv2::ErrorCode::kerCorruptedMetadata);
  185|     15|      has_size = true;
  186|     15|      std::array<byte, WEBP_TAG_SIZE> size_buf;
  187|       |
  188|       |      // Fetch width - stored in 24bits
  189|     15|      std::copy_n(payload.begin() + 4, 3, size_buf.begin());
  190|     15|      size_buf.back() = 0;
  191|     15|      width = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  192|       |
  193|       |      // Fetch height - stored in 24bits
  194|     15|      std::copy_n(payload.begin() + 7, 3, size_buf.begin());
  195|     15|      size_buf.back() = 0;
  196|     15|      height = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  197|     15|    }
  198|       |
  199|       |    /* Chunk with animation control data. */
  200|       |#ifdef __CHECK_FOR_ALPHA__  // Maybe in the future
  201|       |    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ANIM) && !has_alpha) {
  202|       |      has_alpha = true;
  203|       |    }
  204|       |#endif
  205|       |
  206|       |    /* Chunk with lossy image data. */
  207|       |#ifdef __CHECK_FOR_ALPHA__  // Maybe in the future
  208|       |    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8) && !has_alpha) {
  209|       |      has_alpha = true;
  210|       |    }
  211|       |#endif
  212|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8) && !has_size) {
  ------------------
  |  Branch (212:9): [True: 4, False: 348]
  |  Branch (212:58): [True: 3, False: 1]
  ------------------
  213|      3|      Internal::enforce(size_u32 >= 10, Exiv2::ErrorCode::kerCorruptedMetadata);
  214|      3|      has_size = true;
  215|      3|      std::array<byte, 2> size_buf;
  216|       |
  217|       |      /* Refer to this https://tools.ietf.org/html/rfc6386
  218|       |         for height and width reference for VP8 chunks */
  219|       |
  220|       |      // Fetch width - stored in 16bits
  221|      3|      std::copy_n(payload.begin() + 6, 2, size_buf.begin());
  222|      3|      width = Exiv2::getUShort(size_buf.data(), littleEndian) & 0x3fff;
  223|       |
  224|       |      // Fetch height - stored in 16bits
  225|      3|      std::copy_n(payload.begin() + 8, 2, size_buf.begin());
  226|      3|      height = Exiv2::getUShort(size_buf.data(), littleEndian) & 0x3fff;
  227|      3|    }
  228|       |
  229|       |    /* Chunk with lossless image data. */
  230|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8L) && !has_alpha) {
  ------------------
  |  Branch (230:9): [True: 9, False: 343]
  |  Branch (230:59): [True: 9, False: 0]
  ------------------
  231|      9|      Internal::enforce(size_u32 >= 5, Exiv2::ErrorCode::kerCorruptedMetadata);
  232|      9|      if ((payload.read_uint8(4) & WEBP_VP8X_ALPHA_BIT) == WEBP_VP8X_ALPHA_BIT) {
  ------------------
  |  Branch (232:11): [True: 1, False: 8]
  ------------------
  233|      1|        has_alpha = true;
  234|      1|      }
  235|      9|    }
  236|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8L) && !has_size) {
  ------------------
  |  Branch (236:9): [True: 8, False: 344]
  |  Branch (236:59): [True: 6, False: 2]
  ------------------
  237|      6|      Internal::enforce(size_u32 >= 5, Exiv2::ErrorCode::kerCorruptedMetadata);
  238|      6|      has_size = true;
  239|      6|      std::array<byte, 2> size_buf_w;
  240|      6|      std::array<byte, 3> size_buf_h;
  241|       |
  242|       |      /* For VP8L chunks width & height are stored in 28 bits
  243|       |         of a 32 bit field requires bitshifting to get actual
  244|       |         sizes. Width and height are split even into 14 bits
  245|       |         each. Refer to this https://goo.gl/bpgMJf */
  246|       |
  247|       |      // Fetch width - 14 bits wide
  248|      6|      std::copy_n(payload.begin() + 1, 2, size_buf_w.begin());
  249|      6|      size_buf_w.back() &= 0x3F;
  250|      6|      width = Exiv2::getUShort(size_buf_w.data(), littleEndian) + 1;
  251|       |
  252|       |      // Fetch height - 14 bits wide
  253|      6|      std::copy_n(payload.begin() + 2, 3, size_buf_h.begin());
  254|      6|      size_buf_h[0] = ((size_buf_h[0] >> 6) & 0x3) | ((size_buf_h[1] & 0x3FU) << 0x2);
  255|      6|      size_buf_h[1] = ((size_buf_h[1] >> 6) & 0x3) | ((size_buf_h[2] & 0xFU) << 0x2);
  256|      6|      height = Exiv2::getUShort(size_buf_h.data(), littleEndian) + 1;
  257|      6|    }
  258|       |
  259|       |    /* Chunk with animation frame. */
  260|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ANMF) && !has_alpha) {
  ------------------
  |  Branch (260:9): [True: 13, False: 339]
  |  Branch (260:59): [True: 12, False: 1]
  ------------------
  261|     12|      Internal::enforce(size_u32 >= 6, Exiv2::ErrorCode::kerCorruptedMetadata);
  262|     12|      if ((payload.read_uint8(5) & 0x2) == 0x2) {
  ------------------
  |  Branch (262:11): [True: 1, False: 11]
  ------------------
  263|      1|        has_alpha = true;
  264|      1|      }
  265|     12|    }
  266|    352|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ANMF) && !has_size) {
  ------------------
  |  Branch (266:9): [True: 12, False: 340]
  |  Branch (266:59): [True: 6, False: 6]
  ------------------
  267|      6|      Internal::enforce(size_u32 >= 12, Exiv2::ErrorCode::kerCorruptedMetadata);
  268|      6|      has_size = true;
  269|      6|      std::array<byte, WEBP_TAG_SIZE> size_buf;
  270|       |
  271|       |      // Fetch width - stored in 24bits
  272|      6|      std::copy_n(payload.begin() + 6, 3, size_buf.begin());
  273|      6|      size_buf.back() = 0;
  274|      6|      width = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  275|       |
  276|       |      // Fetch height - stored in 24bits
  277|      6|      std::copy_n(payload.begin() + 9, 3, size_buf.begin());
  278|      6|      size_buf.back() = 0;
  279|      6|      height = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  280|      6|    }
  281|       |
  282|       |    /* Chunk with alpha data. */
  283|    352|    if (equalsWebPTag(chunkId, "ALPH") && !has_alpha) {
  ------------------
  |  Branch (283:9): [True: 0, False: 352]
  |  Branch (283:43): [True: 0, False: 0]
  ------------------
  284|      0|      has_alpha = true;
  285|      0|    }
  286|    352|  }
  287|       |
  288|       |  /* Inject a VP8X chunk if one isn't available. */
  289|     48|  if (!has_vp8x) {
  ------------------
  |  Branch (289:7): [True: 25, False: 23]
  ------------------
  290|     25|    inject_VP8X(outIo, has_xmp, has_exif, has_alpha, has_icc, width, height);
  291|     25|  }
  292|       |
  293|     48|  io_->seek(12, BasicIo::beg);
  294|    350|  while (!io_->eof() && io_->tell() < filesize) {
  ------------------
  |  Branch (294:10): [True: 329, False: 21]
  |  Branch (294:25): [True: 302, False: 27]
  ------------------
  295|    302|    io_->readOrThrow(chunkId.data(), 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  296|    302|    io_->readOrThrow(size_buff.data(), 4, Exiv2::ErrorCode::kerCorruptedMetadata);
  297|       |
  298|    302|    const uint32_t size_u32 = Exiv2::getULong(size_buff.data(), littleEndian);
  299|       |
  300|       |    // Check that `size_u32` is within bounds.
  301|    302|    Internal::enforce(size_u32 <= io_->size() - io_->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  302|       |
  303|    302|    DataBuf payload(size_u32);
  304|    302|    io_->readOrThrow(payload.data(), size_u32, Exiv2::ErrorCode::kerCorruptedMetadata);
  305|    302|    if (io_->tell() % 2)
  ------------------
  |  Branch (305:9): [True: 117, False: 185]
  ------------------
  306|    117|      io_->seek(+1, BasicIo::cur);  // skip pad
  307|       |
  308|    302|    if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8X)) {
  ------------------
  |  Branch (308:9): [True: 30, False: 272]
  ------------------
  309|     30|      Internal::enforce(size_u32 >= 1, Exiv2::ErrorCode::kerCorruptedMetadata);
  310|     30|      if (has_icc) {
  ------------------
  |  Branch (310:11): [True: 2, False: 28]
  ------------------
  311|      2|        const uint8_t x = payload.read_uint8(0);
  312|      2|        payload.write_uint8(0, x | WEBP_VP8X_ICC_BIT);
  313|     28|      } else {
  314|     28|        const uint8_t x = payload.read_uint8(0);
  315|     28|        payload.write_uint8(0, x & ~WEBP_VP8X_ICC_BIT);
  316|     28|      }
  317|       |
  318|     30|      if (has_xmp) {
  ------------------
  |  Branch (318:11): [True: 11, False: 19]
  ------------------
  319|     11|        const uint8_t x = payload.read_uint8(0);
  320|     11|        payload.write_uint8(0, x | WEBP_VP8X_XMP_BIT);
  321|     19|      } else {
  322|     19|        const uint8_t x = payload.read_uint8(0);
  323|     19|        payload.write_uint8(0, x & ~WEBP_VP8X_XMP_BIT);
  324|     19|      }
  325|       |
  326|     30|      if (has_exif) {
  ------------------
  |  Branch (326:11): [True: 0, False: 30]
  ------------------
  327|      0|        const uint8_t x = payload.read_uint8(0);
  328|      0|        payload.write_uint8(0, x | WEBP_VP8X_EXIF_BIT);
  329|     30|      } else {
  330|     30|        const uint8_t x = payload.read_uint8(0);
  331|     30|        payload.write_uint8(0, x & ~WEBP_VP8X_EXIF_BIT);
  332|     30|      }
  333|       |
  334|     30|      if (outIo.write(chunkId.c_data(), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (334:11): [True: 0, False: 30]
  ------------------
  335|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  336|     30|      if (outIo.write(size_buff.data(), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (336:11): [True: 0, False: 30]
  ------------------
  337|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  338|     30|      if (outIo.write(payload.c_data(), payload.size()) != payload.size())
  ------------------
  |  Branch (338:11): [True: 0, False: 30]
  ------------------
  339|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  340|     30|      if (outIo.tell() % 2 && outIo.write(&WEBP_PAD_ODD, 1) != 1)
  ------------------
  |  Branch (340:11): [True: 12, False: 18]
  |  Branch (340:31): [True: 0, False: 12]
  ------------------
  341|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  342|       |
  343|     30|      if (has_icc) {
  ------------------
  |  Branch (343:11): [True: 2, False: 28]
  ------------------
  344|      2|        if (outIo.write(reinterpret_cast<const byte*>(WEBP_CHUNK_HEADER_ICCP), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (344:13): [True: 0, False: 2]
  ------------------
  345|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  346|      2|        ul2Data(data, static_cast<uint32_t>(iccProfile_.size()), littleEndian);
  347|      2|        if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (347:13): [True: 0, False: 2]
  ------------------
  348|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  349|      2|        if (outIo.write(iccProfile_.c_data(), iccProfile_.size()) != iccProfile_.size()) {
  ------------------
  |  Branch (349:13): [True: 0, False: 2]
  ------------------
  350|      0|          throw Error(ErrorCode::kerImageWriteFailed);
  351|      0|        }
  352|      2|        has_icc = false;
  353|      2|      }
  354|    272|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP)) {
  ------------------
  |  Branch (354:16): [True: 4, False: 268]
  ------------------
  355|       |      // Skip it altogether handle it prior to here :)
  356|    268|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF)) {
  ------------------
  |  Branch (356:16): [True: 0, False: 268]
  ------------------
  357|       |      // Skip and add new data afterwards
  358|    268|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP)) {
  ------------------
  |  Branch (358:16): [True: 6, False: 262]
  ------------------
  359|       |      // Skip and add new data afterwards
  360|    262|    } else {
  361|    262|      if (outIo.write(chunkId.c_data(), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (361:11): [True: 0, False: 262]
  ------------------
  362|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  363|    262|      if (outIo.write(size_buff.data(), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (363:11): [True: 0, False: 262]
  ------------------
  364|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  365|    262|      if (outIo.write(payload.c_data(), payload.size()) != payload.size())
  ------------------
  |  Branch (365:11): [True: 0, False: 262]
  ------------------
  366|      0|        throw Error(ErrorCode::kerImageWriteFailed);
  367|    262|    }
  368|       |
  369|       |    // Encoder required to pad odd sized data with a null byte
  370|    302|    if (outIo.tell() % 2 && outIo.write(&WEBP_PAD_ODD, 1) != 1)
  ------------------
  |  Branch (370:9): [True: 102, False: 200]
  |  Branch (370:29): [True: 0, False: 102]
  ------------------
  371|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  372|    302|  }
  373|       |
  374|     48|  if (has_exif) {
  ------------------
  |  Branch (374:7): [True: 0, False: 48]
  ------------------
  375|      0|    if (outIo.write(reinterpret_cast<const byte*>(WEBP_CHUNK_HEADER_EXIF), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (375:9): [True: 0, False: 0]
  ------------------
  376|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  377|      0|    us2Data(data, static_cast<uint16_t>(blob.size()) + 8, bigEndian);
  378|      0|    ul2Data(data, static_cast<uint32_t>(blob.size()), littleEndian);
  379|      0|    if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (379:9): [True: 0, False: 0]
  ------------------
  380|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  381|      0|    if (outIo.write(blob.data(), blob.size()) != blob.size()) {
  ------------------
  |  Branch (381:9): [True: 0, False: 0]
  ------------------
  382|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  383|      0|    }
  384|      0|    if (outIo.tell() % 2 && outIo.write(&WEBP_PAD_ODD, 1) != 1)
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  |  Branch (384:29): [True: 0, False: 0]
  ------------------
  385|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  386|      0|  }
  387|       |
  388|     48|  if (has_xmp) {
  ------------------
  |  Branch (388:7): [True: 5, False: 43]
  ------------------
  389|      5|    if (outIo.write(reinterpret_cast<const byte*>(WEBP_CHUNK_HEADER_XMP), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (389:9): [True: 0, False: 5]
  ------------------
  390|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  391|      5|    ul2Data(data, static_cast<uint32_t>(xmpPacket().size()), littleEndian);
  392|      5|    if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (392:9): [True: 0, False: 5]
  ------------------
  393|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  394|      5|    if (outIo.write(reinterpret_cast<const byte*>(xmp.data()), xmp.size()) != xmp.size()) {
  ------------------
  |  Branch (394:9): [True: 0, False: 5]
  ------------------
  395|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  396|      0|    }
  397|      5|    if (outIo.tell() % 2 && outIo.write(&WEBP_PAD_ODD, 1) != 1)
  ------------------
  |  Branch (397:9): [True: 3, False: 2]
  |  Branch (397:29): [True: 0, False: 3]
  ------------------
  398|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  399|      5|  }
  400|       |
  401|       |  // Fix File Size Payload Data
  402|     48|  outIo.seek(0, BasicIo::beg);
  403|     48|  filesize = outIo.size() - 8;
  404|     48|  outIo.seek(4, BasicIo::beg);
  405|     48|  ul2Data(data, static_cast<uint32_t>(filesize), littleEndian);
  406|     48|  if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (406:7): [True: 0, False: 48]
  ------------------
  407|      0|    throw Error(ErrorCode::kerImageWriteFailed);
  408|       |
  409|     48|}  // WebPImage::writeMetadata
_ZN5Exiv29WebPImage14printStructureERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_20PrintStructureOptionEm:
  413|    366|void WebPImage::printStructure(std::ostream& out, PrintStructureOption option, size_t depth) {
  414|    366|  if (io_->open() != 0) {
  ------------------
  |  Branch (414:7): [True: 0, False: 366]
  ------------------
  415|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  416|      0|  }
  417|       |  // Ensure this is the correct image type
  418|    366|  if (!isWebPType(*io_, true)) {
  ------------------
  |  Branch (418:7): [True: 0, False: 366]
  ------------------
  419|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (419:9): [True: 0, False: 0]
  |  Branch (419:25): [True: 0, False: 0]
  ------------------
  420|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  421|      0|    throw Error(ErrorCode::kerNotAnImage, "WEBP");
  422|      0|  }
  423|       |
  424|    366|  bool bPrint = option == kpsBasic || option == kpsRecursive;
  ------------------
  |  Branch (424:17): [True: 73, False: 293]
  |  Branch (424:39): [True: 62, False: 231]
  ------------------
  425|    366|  if (bPrint || option == kpsXMP || option == kpsIccProfile || option == kpsIptcErase) {
  ------------------
  |  Branch (425:7): [True: 135, False: 231]
  |  Branch (425:17): [True: 62, False: 169]
  |  Branch (425:37): [True: 48, False: 121]
  |  Branch (425:64): [True: 48, False: 73]
  ------------------
  426|    293|    byte data[WEBP_TAG_SIZE * 2];
  427|    293|    io_->read(data, WEBP_TAG_SIZE * 2);
  428|    293|    uint64_t filesize = Exiv2::getULong(data + WEBP_TAG_SIZE, littleEndian);
  429|    293|    DataBuf chunkId(5);
  430|    293|    chunkId.write_uint8(4, '\0');
  431|       |
  432|    293|    if (bPrint) {
  ------------------
  |  Branch (432:9): [True: 135, False: 158]
  ------------------
  433|    135|      out << Internal::indent(depth) << "STRUCTURE OF WEBP FILE: " << io().path() << '\n';
  434|    135|      out << Internal::indent(depth) << " Chunk |   Length |   Offset | Payload" << '\n';
  435|    135|    }
  436|       |
  437|    293|    io_->seek(0, BasicIo::beg);  // rewind
  438|  2.55k|    while (!io_->eof() && io_->tell() < filesize) {
  ------------------
  |  Branch (438:12): [True: 2.49k, False: 61]
  |  Branch (438:27): [True: 2.26k, False: 232]
  ------------------
  439|  2.26k|      auto offset = io_->tell();
  440|  2.26k|      byte size_buff[WEBP_TAG_SIZE];
  441|  2.26k|      io_->read(chunkId.data(), WEBP_TAG_SIZE);
  442|  2.26k|      io_->read(size_buff, WEBP_TAG_SIZE);
  443|  2.26k|      const uint32_t size = Exiv2::getULong(size_buff, littleEndian);
  444|       |
  445|       |      // Check that `size` is within bounds.
  446|  2.26k|      Internal::enforce(!offset || size <= io_->size() - io_->tell(), Exiv2::ErrorCode::kerCorruptedMetadata);
  ------------------
  |  Branch (446:25): [True: 288, False: 1.97k]
  |  Branch (446:36): [True: 1.97k, False: 0]
  ------------------
  447|       |
  448|  2.26k|      DataBuf payload(offset ? size : WEBP_TAG_SIZE);  // header is different from chunks
  ------------------
  |  Branch (448:23): [True: 1.97k, False: 288]
  ------------------
  449|  2.26k|      io_->read(payload.data(), payload.size());
  450|       |
  451|  2.26k|      if (bPrint) {
  ------------------
  |  Branch (451:11): [True: 953, False: 1.30k]
  ------------------
  452|    953|        out << Internal::indent(depth) << stringFormat("  {} | {:8} | {:8} | ", chunkId.c_str(), size, offset)
  ------------------
  |  |   18|    953|#define stringFormat std::format
  ------------------
  453|    953|            << Internal::binaryToString(makeSlice(payload, 0, payload.size() > 32 ? 32 : payload.size())) << '\n';
  ------------------
  |  Branch (453:63): [True: 122, False: 831]
  ------------------
  454|    953|      }
  455|       |
  456|  2.26k|      if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF) && option == kpsRecursive) {
  ------------------
  |  Branch (456:11): [True: 46, False: 2.21k]
  |  Branch (456:61): [True: 14, False: 32]
  ------------------
  457|       |        // create memio object with the payload, then print the structure
  458|     14|        MemIo p(payload.c_data(), payload.size());
  459|     14|        printTiffStructure(p, out, option, depth + 1);
  460|     14|      }
  461|       |
  462|  2.26k|      bool bPrintPayload = (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP) && option == kpsXMP) ||
  ------------------
  |  Branch (462:29): [True: 106, False: 2.15k]
  |  Branch (462:78): [True: 20, False: 86]
  ------------------
  463|  2.21k|                           (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP) && option == kpsIccProfile);
  ------------------
  |  Branch (463:29): [True: 21, False: 2.19k]
  |  Branch (463:79): [True: 4, False: 17]
  ------------------
  464|  2.26k|      if (bPrintPayload) {
  ------------------
  |  Branch (464:11): [True: 24, False: 2.23k]
  ------------------
  465|     24|        out.write(payload.c_str(), payload.size());
  466|     24|      }
  467|       |
  468|  2.26k|      if (offset && io_->tell() % 2)
  ------------------
  |  Branch (468:11): [True: 1.94k, False: 313]
  |  Branch (468:21): [True: 749, False: 1.19k]
  ------------------
  469|    749|        io_->seek(+1, BasicIo::cur);  // skip padding byte on sub-chunks
  470|  2.26k|    }
  471|    293|  }
  472|    366|}
_ZN5Exiv29WebPImage12readMetadataEv:
  476|    135|void WebPImage::readMetadata() {
  477|    135|  if (io_->open() != 0)
  ------------------
  |  Branch (477:7): [True: 0, False: 135]
  ------------------
  478|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
  479|    135|  IoCloser closer(*io_);
  480|       |  // Ensure that this is the correct image type
  481|    135|  if (!isWebPType(*io_, true)) {
  ------------------
  |  Branch (481:7): [True: 0, False: 135]
  ------------------
  482|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (482:9): [True: 0, False: 0]
  |  Branch (482:25): [True: 0, False: 0]
  ------------------
  483|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
  484|      0|    throw Error(ErrorCode::kerNotAJpeg);
  485|      0|  }
  486|    135|  clearMetadata();
  487|       |
  488|    135|  byte data[12];
  489|    135|  DataBuf chunkId(5);
  490|    135|  chunkId.write_uint8(4, '\0');
  491|       |
  492|    135|  io_->readOrThrow(data, WEBP_TAG_SIZE * 3, Exiv2::ErrorCode::kerCorruptedMetadata);
  493|       |
  494|    135|  const uint32_t filesize = Safe::add(Exiv2::getULong(data + WEBP_TAG_SIZE, littleEndian), 8U);
  495|    135|  Internal::enforce(filesize <= io_->size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  496|       |
  497|    135|  WebPImage::decodeChunks(filesize);
  498|       |
  499|    135|}  // WebPImage::readMetadata
_ZN5Exiv29WebPImage12decodeChunksEj:
  501|    123|void WebPImage::decodeChunks(uint32_t filesize) {
  502|    123|  DataBuf chunkId(5);
  503|    123|  std::array<byte, WEBP_TAG_SIZE> size_buff;
  504|    123|  bool has_canvas_data = false;
  505|       |
  506|       |#ifdef EXIV2_DEBUG_MESSAGES
  507|       |  std::cout << "Reading metadata" << '\n';
  508|       |#endif
  509|       |
  510|    123|  chunkId.write_uint8(4, '\0');
  511|  2.06k|  while (!io_->eof() && io_->tell() < filesize) {
  ------------------
  |  Branch (511:10): [True: 2.01k, False: 59]
  |  Branch (511:25): [True: 1.94k, False: 64]
  ------------------
  512|  1.94k|    io_->readOrThrow(chunkId.data(), WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata);
  513|  1.94k|    io_->readOrThrow(size_buff.data(), WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata);
  514|       |
  515|  1.94k|    const uint32_t size = Exiv2::getULong(size_buff.data(), littleEndian);
  516|       |
  517|       |    // Check that `size` is within bounds.
  518|  1.94k|    Internal::enforce(io_->tell() <= filesize, Exiv2::ErrorCode::kerCorruptedMetadata);
  519|  1.94k|    Internal::enforce(size <= (filesize - io_->tell()), Exiv2::ErrorCode::kerCorruptedMetadata);
  520|       |
  521|  1.94k|    if (DataBuf payload(size); payload.empty()) {
  ------------------
  |  Branch (521:32): [True: 1.27k, False: 668]
  ------------------
  522|  1.27k|      io_->seek(size, BasicIo::cur);
  523|  1.27k|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8X) && !has_canvas_data) {
  ------------------
  |  Branch (523:16): [True: 42, False: 626]
  |  Branch (523:66): [True: 26, False: 16]
  ------------------
  524|     26|      Internal::enforce(size >= 10, Exiv2::ErrorCode::kerCorruptedMetadata);
  525|       |
  526|     26|      has_canvas_data = true;
  527|     26|      std::array<byte, WEBP_TAG_SIZE> size_buf;
  528|       |
  529|     26|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  530|       |
  531|       |      // Fetch width
  532|     26|      std::copy_n(payload.begin() + 4, 3, size_buf.begin());
  533|     26|      size_buf.back() = 0;
  534|     26|      pixelWidth_ = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  535|       |
  536|       |      // Fetch height
  537|     26|      std::copy_n(payload.begin() + 7, 3, size_buf.begin());
  538|     26|      size_buf.back() = 0;
  539|     26|      pixelHeight_ = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  540|    642|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8) && !has_canvas_data) {
  ------------------
  |  Branch (540:16): [True: 6, False: 636]
  |  Branch (540:65): [True: 5, False: 1]
  ------------------
  541|      5|      Internal::enforce(size >= 10, Exiv2::ErrorCode::kerCorruptedMetadata);
  542|       |
  543|      5|      has_canvas_data = true;
  544|      5|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  545|      5|      std::array<byte, WEBP_TAG_SIZE> size_buf;
  546|       |
  547|       |      // Fetch width""
  548|      5|      std::copy_n(payload.begin() + 6, 2, size_buf.begin());
  549|      5|      size_buf[2] = 0;
  550|      5|      size_buf[3] = 0;
  551|      5|      pixelWidth_ = Exiv2::getULong(size_buf.data(), littleEndian) & 0x3fff;
  552|       |
  553|       |      // Fetch height
  554|      5|      std::copy_n(payload.begin() + 8, 2, size_buf.begin());
  555|      5|      size_buf[2] = 0;
  556|      5|      size_buf[3] = 0;
  557|      5|      pixelHeight_ = Exiv2::getULong(size_buf.data(), littleEndian) & 0x3fff;
  558|    637|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8L) && !has_canvas_data) {
  ------------------
  |  Branch (558:16): [True: 11, False: 626]
  |  Branch (558:66): [True: 8, False: 3]
  ------------------
  559|      8|      Internal::enforce(size >= 5, Exiv2::ErrorCode::kerCorruptedMetadata);
  560|       |
  561|      8|      has_canvas_data = true;
  562|      8|      std::array<byte, 2> size_buf_w;
  563|      8|      std::array<byte, 3> size_buf_h;
  564|       |
  565|      8|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  566|       |
  567|       |      // Fetch width
  568|      8|      std::copy_n(payload.begin() + 1, 2, size_buf_w.begin());
  569|      8|      size_buf_w.back() &= 0x3F;
  570|      8|      pixelWidth_ = Exiv2::getUShort(size_buf_w.data(), littleEndian) + 1;
  571|       |
  572|       |      // Fetch height
  573|      8|      std::copy_n(payload.begin() + 2, 3, size_buf_h.begin());
  574|      8|      size_buf_h[0] = ((size_buf_h[0] >> 6) & 0x3) | ((size_buf_h[1] & 0x3FU) << 0x2);
  575|      8|      size_buf_h[1] = ((size_buf_h[1] >> 6) & 0x3) | ((size_buf_h[2] & 0xFU) << 0x2);
  576|      8|      pixelHeight_ = Exiv2::getUShort(size_buf_h.data(), littleEndian) + 1;
  577|    629|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ANMF) && !has_canvas_data) {
  ------------------
  |  Branch (577:16): [True: 41, False: 588]
  |  Branch (577:66): [True: 8, False: 33]
  ------------------
  578|      8|      Internal::enforce(size >= 12, Exiv2::ErrorCode::kerCorruptedMetadata);
  579|       |
  580|      8|      has_canvas_data = true;
  581|      8|      std::array<byte, WEBP_TAG_SIZE> size_buf;
  582|       |
  583|      8|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  584|       |
  585|       |      // Fetch width
  586|      8|      std::copy_n(payload.begin() + 6, 3, size_buf.begin());
  587|      8|      size_buf.back() = 0;
  588|      8|      pixelWidth_ = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  589|       |
  590|       |      // Fetch height
  591|      8|      std::copy_n(payload.begin() + 9, 3, size_buf.begin());
  592|      8|      size_buf.back() = 0;
  593|      8|      pixelHeight_ = Exiv2::getULong(size_buf.data(), littleEndian) + 1;
  594|    621|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP)) {
  ------------------
  |  Branch (594:16): [True: 8, False: 613]
  ------------------
  595|      8|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  596|      8|      this->setIccProfile(std::move(payload));
  597|    613|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF)) {
  ------------------
  |  Branch (597:16): [True: 40, False: 573]
  ------------------
  598|     40|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  599|       |
  600|     40|      std::array<byte, 2> size_buff2;
  601|       |      // 4 meaningful bytes + 2 padding bytes
  602|     40|      auto exifLongHeader = std::array<byte, 6>{0xFF, 0x01, 0xFF, 0xE1, 0x00, 0x00};
  603|     40|      auto exifShortHeader = std::array<byte, 6>{0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
  604|     40|      const byte exifTiffLEHeader[] = {0x49, 0x49, 0x2A};        // "MM*"
  605|     40|      const byte exifTiffBEHeader[] = {0x4D, 0x4D, 0x00, 0x2A};  // "II\0*"
  606|     40|      size_t offset = 0;
  607|     40|      bool s_header = false;
  608|     40|      bool le_header = false;
  609|     40|      bool be_header = false;
  610|     40|      size_t pos = getHeaderOffset(payload.c_data(), payload.size(), exifLongHeader.data(), 4);
  611|       |
  612|     40|      if (pos == std::string::npos) {
  ------------------
  |  Branch (612:11): [True: 36, False: 4]
  ------------------
  613|     36|        pos = getHeaderOffset(payload.c_data(), payload.size(), exifLongHeader.data(), 6);
  614|     36|        if (pos != std::string::npos) {
  ------------------
  |  Branch (614:13): [True: 0, False: 36]
  ------------------
  615|      0|          s_header = true;
  616|      0|        }
  617|     36|      }
  618|     40|      if (pos == std::string::npos) {
  ------------------
  |  Branch (618:11): [True: 36, False: 4]
  ------------------
  619|     36|        pos = getHeaderOffset(payload.c_data(), payload.size(), exifTiffLEHeader, 3);
  620|     36|        if (pos != std::string::npos) {
  ------------------
  |  Branch (620:13): [True: 3, False: 33]
  ------------------
  621|      3|          le_header = true;
  622|      3|        }
  623|     36|      }
  624|     40|      if (pos == std::string::npos) {
  ------------------
  |  Branch (624:11): [True: 33, False: 7]
  ------------------
  625|     33|        pos = getHeaderOffset(payload.c_data(), payload.size(), exifTiffBEHeader, 4);
  626|     33|        if (pos != std::string::npos) {
  ------------------
  |  Branch (626:13): [True: 11, False: 22]
  ------------------
  627|     11|          be_header = true;
  628|     11|        }
  629|     33|      }
  630|       |
  631|     40|      if (s_header) {
  ------------------
  |  Branch (631:11): [True: 0, False: 40]
  ------------------
  632|      0|        offset += 6;
  633|      0|      }
  634|     40|      if (be_header || le_header) {
  ------------------
  |  Branch (634:11): [True: 11, False: 29]
  |  Branch (634:24): [True: 3, False: 26]
  ------------------
  635|     14|        offset += 12;
  636|     14|      }
  637|       |
  638|     40|      const size_t sizePayload = Safe::add(payload.size(), offset);
  639|     40|      DataBuf rawExifData(sizePayload);
  640|       |
  641|     40|      if (s_header) {
  ------------------
  |  Branch (641:11): [True: 0, False: 40]
  ------------------
  642|      0|        us2Data(size_buff2.data(), static_cast<uint16_t>(sizePayload - 6), bigEndian);
  643|      0|        std::copy_n(exifLongHeader.begin(), 4, rawExifData.begin());
  644|      0|        std::copy(size_buff2.begin(), size_buff2.end(), rawExifData.begin() + 4);
  645|      0|      }
  646|       |
  647|     40|      if (be_header || le_header) {
  ------------------
  |  Branch (647:11): [True: 11, False: 29]
  |  Branch (647:24): [True: 3, False: 26]
  ------------------
  648|     14|        us2Data(size_buff2.data(), static_cast<uint16_t>(sizePayload - 6), bigEndian);
  649|     14|        std::copy_n(exifLongHeader.begin(), 4, rawExifData.begin());
  650|     14|        std::copy(size_buff2.begin(), size_buff2.end(), rawExifData.begin() + 4);
  651|     14|        std::copy(exifShortHeader.begin(), exifShortHeader.end(), rawExifData.begin() + 6);
  652|     14|      }
  653|       |
  654|     40|      std::copy(payload.begin(), payload.end(), rawExifData.begin() + offset);
  655|       |
  656|       |#ifdef EXIV2_DEBUG_MESSAGES
  657|       |      std::cout << "Display Hex Dump [size:" << sizePayload << "]" << '\n';
  658|       |      std::cout << binaryToHex(rawExifData.c_data(), sizePayload);
  659|       |#endif
  660|       |
  661|     40|      if (pos != std::string::npos) {
  ------------------
  |  Branch (661:11): [True: 18, False: 22]
  ------------------
  662|     18|        XmpData xmpData;
  663|     18|        const DecodeParams dp(max_recursion_depth_);
  664|     18|        ByteOrder bo = ExifParser::decode(exifData_, payload.c_data(pos), payload.size() - pos, dp);
  665|     18|        setByteOrder(bo);
  666|     22|      } else {
  667|     22|#ifndef SUPPRESS_WARNINGS
  668|     22|        EXV_WARNING << "Failed to decode Exif metadata." << '\n';
  ------------------
  |  |  138|     22|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 22]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     22|  LogMsg(LogMsg::warn).os()
  ------------------
  669|     22|#endif
  670|     22|        exifData_.clear();
  671|     22|      }
  672|    573|    } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP)) {
  ------------------
  |  Branch (672:16): [True: 46, False: 527]
  ------------------
  673|     46|      io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata);
  674|     46|      xmpPacket_.assign(payload.c_str(), payload.size());
  675|     46|      const DecodeParams dp(max_recursion_depth_);
  676|     46|      if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_, dp)) {
  ------------------
  |  Branch (676:11): [True: 46, False: 0]
  |  Branch (676:34): [True: 46, False: 0]
  ------------------
  677|     46|#ifndef SUPPRESS_WARNINGS
  678|     46|        EXV_WARNING << "Failed to decode XMP metadata." << '\n';
  ------------------
  |  |  138|     46|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 46]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     46|  LogMsg(LogMsg::warn).os()
  ------------------
  679|     46|#endif
  680|     46|      } else {
  681|       |#ifdef EXIV2_DEBUG_MESSAGES
  682|       |        std::cout << "Display Hex Dump [size:" << payload.size() << "]" << '\n';
  683|       |        std::cout << binaryToHex(payload.c_data(), payload.size());
  684|       |#endif
  685|      0|      }
  686|    527|    } else {
  687|    527|      io_->seek(size, BasicIo::cur);
  688|    527|    }
  689|       |
  690|  1.94k|    if (io_->tell() % 2)
  ------------------
  |  Branch (690:9): [True: 214, False: 1.73k]
  ------------------
  691|    214|      io_->seek(+1, BasicIo::cur);
  692|  1.94k|  }
  693|    123|}
_ZN5Exiv215newWebPInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  697|    135|Image::UniquePtr newWebPInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  698|    135|  auto image = std::make_unique<WebPImage>(std::move(io), params);
  699|    135|  if (!image->good()) {
  ------------------
  |  Branch (699:7): [True: 0, False: 135]
  ------------------
  700|      0|    return nullptr;
  701|      0|  }
  702|    135|  return image;
  703|    135|}
_ZN5Exiv210isWebPTypeERNS_7BasicIoEb:
  705|  16.7k|bool isWebPType(BasicIo& iIo, bool /*advance*/) {
  706|  16.7k|  if (iIo.size() < 12) {
  ------------------
  |  Branch (706:7): [True: 91, False: 16.6k]
  ------------------
  707|     91|    return false;
  708|     91|  }
  709|  16.6k|  const int32_t len = 4;
  710|  16.6k|  constexpr std::array<byte, len> RiffImageId{'R', 'I', 'F', 'F'};
  711|  16.6k|  constexpr std::array<byte, len> WebPImageId{'W', 'E', 'B', 'P'};
  712|  16.6k|  std::array<byte, len> webp;
  713|  16.6k|  std::array<byte, len> data;
  714|  16.6k|  std::array<byte, len> riff;
  715|  16.6k|  iIo.readOrThrow(riff.data(), len, Exiv2::ErrorCode::kerCorruptedMetadata);
  716|  16.6k|  iIo.readOrThrow(data.data(), len, Exiv2::ErrorCode::kerCorruptedMetadata);
  717|  16.6k|  iIo.readOrThrow(webp.data(), len, Exiv2::ErrorCode::kerCorruptedMetadata);
  718|  16.6k|  bool matched_riff = riff == RiffImageId;
  719|  16.6k|  bool matched_webp = webp == WebPImageId;
  720|  16.6k|  iIo.seek(-12, BasicIo::cur);
  721|  16.6k|  return matched_riff && matched_webp;
  ------------------
  |  Branch (721:10): [True: 1.05k, False: 15.6k]
  |  Branch (721:26): [True: 771, False: 281]
  ------------------
  722|  16.7k|}
_ZN5Exiv29WebPImage13equalsWebPTagERKNS_7DataBufEPKc:
  731|  14.7k|bool WebPImage::equalsWebPTag(const Exiv2::DataBuf& buf, const char* str) {
  732|  21.7k|  for (int i = 0; i < 4; i++)
  ------------------
  |  Branch (732:19): [True: 21.2k, False: 513]
  ------------------
  733|  21.2k|    if (toupper(buf.read_uint8(i)) != str[i])
  ------------------
  |  Branch (733:9): [True: 14.2k, False: 7.00k]
  ------------------
  734|  14.2k|      return false;
  735|    513|  return true;
  736|  14.7k|}
_ZNK5Exiv29WebPImage11inject_VP8XERNS_7BasicIoEbbbbjj:
  746|     25|                            uint32_t height) const {
  747|     25|  const byte size[4] = {0x0A, 0x00, 0x00, 0x00};
  748|     25|  byte data[10] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  749|     25|  iIo.write(reinterpret_cast<const byte*>(WEBP_CHUNK_HEADER_VP8X), WEBP_TAG_SIZE);
  750|     25|  iIo.write(size, WEBP_TAG_SIZE);
  751|       |
  752|     25|  if (has_alpha) {
  ------------------
  |  Branch (752:7): [True: 2, False: 23]
  ------------------
  753|      2|    data[0] |= WEBP_VP8X_ALPHA_BIT;
  754|      2|  }
  755|       |
  756|     25|  if (has_icc) {
  ------------------
  |  Branch (756:7): [True: 1, False: 24]
  ------------------
  757|      1|    data[0] |= WEBP_VP8X_ICC_BIT;
  758|      1|  }
  759|       |
  760|     25|  if (has_xmp) {
  ------------------
  |  Branch (760:7): [True: 3, False: 22]
  ------------------
  761|      3|    data[0] |= WEBP_VP8X_XMP_BIT;
  762|      3|  }
  763|       |
  764|     25|  if (has_exif) {
  ------------------
  |  Branch (764:7): [True: 0, False: 25]
  ------------------
  765|      0|    data[0] |= WEBP_VP8X_EXIF_BIT;
  766|      0|  }
  767|       |
  768|       |  /* set width - stored in 24bits*/
  769|     25|  Internal::enforce(width > 0, Exiv2::ErrorCode::kerCorruptedMetadata);
  770|     25|  uint32_t w = width - 1;
  771|     25|  data[4] = w & 0xFF;
  772|     25|  data[5] = (w >> 8) & 0xFF;
  773|     25|  data[6] = (w >> 16) & 0xFF;
  774|       |
  775|       |  /* set height - stored in 24bits */
  776|     25|  Internal::enforce(height > 0, Exiv2::ErrorCode::kerCorruptedMetadata);
  777|     25|  uint32_t h = height - 1;
  778|     25|  data[7] = h & 0xFF;
  779|     25|  data[8] = (h >> 8) & 0xFF;
  780|     25|  data[9] = (h >> 16) & 0xFF;
  781|       |
  782|     25|  iIo.write(data, 10);
  783|       |
  784|       |  /* Handle inject an icc profile right after VP8X chunk */
  785|     25|  if (has_icc) {
  ------------------
  |  Branch (785:7): [True: 1, False: 24]
  ------------------
  786|      1|    byte size_buff[WEBP_TAG_SIZE];
  787|      1|    ul2Data(size_buff, static_cast<uint32_t>(iccProfile_.size()), littleEndian);
  788|      1|    if (iIo.write(reinterpret_cast<const byte*>(WEBP_CHUNK_HEADER_ICCP), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (788:9): [True: 0, False: 1]
  ------------------
  789|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  790|      1|    if (iIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
  ------------------
  |  Branch (790:9): [True: 0, False: 1]
  ------------------
  791|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  792|      1|    if (iIo.write(iccProfile_.c_data(), iccProfile_.size()) != iccProfile_.size())
  ------------------
  |  Branch (792:9): [True: 0, False: 1]
  ------------------
  793|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  794|      1|    if (iIo.tell() % 2 && iIo.write(&WEBP_PAD_ODD, 1) != 1)
  ------------------
  |  Branch (794:9): [True: 0, False: 1]
  |  Branch (794:27): [True: 0, False: 0]
  ------------------
  795|      0|      throw Error(ErrorCode::kerImageWriteFailed);
  796|      1|  }
  797|     25|}
_ZN5Exiv29WebPImage15getHeaderOffsetEPKhmS2_m:
  799|    145|size_t WebPImage::getHeaderOffset(const byte* data, size_t data_size, const byte* header, size_t header_size) {
  800|    145|  size_t pos = std::string::npos;  // error value
  801|    145|  if (data_size < header_size) {
  ------------------
  |  Branch (801:7): [True: 23, False: 122]
  ------------------
  802|     23|    return pos;
  803|     23|  }
  804|  3.26k|  for (size_t i = 0; i < data_size - header_size; i++) {
  ------------------
  |  Branch (804:22): [True: 3.16k, False: 104]
  ------------------
  805|  3.16k|    if (memcmp(header, &data[i], header_size) == 0) {
  ------------------
  |  Branch (805:9): [True: 18, False: 3.14k]
  ------------------
  806|     18|      pos = i;
  807|     18|      break;
  808|     18|    }
  809|  3.16k|  }
  810|    122|  return pos;
  811|    145|}

_ZN5Exiv28Xmpdatum4ImplC2ERKNS_6XmpKeyEPKNS_5ValueE:
  253|  33.5k|Xmpdatum::Impl::Impl(const XmpKey& key, const Value* pValue) : key_(key.clone()) {
  254|  33.5k|  if (pValue)
  ------------------
  |  Branch (254:7): [True: 12.1k, False: 21.4k]
  ------------------
  255|  12.1k|    value_ = pValue->clone();
  256|  33.5k|}
_ZN5Exiv28Xmpdatum4ImplC2ERKS1_:
  258|  37.8k|Xmpdatum::Impl::Impl(const Impl& rhs) {
  259|  37.8k|  if (rhs.key_)
  ------------------
  |  Branch (259:7): [True: 37.8k, False: 0]
  ------------------
  260|  37.8k|    key_ = rhs.key_->clone();  // deep copy
  261|  37.8k|  if (rhs.value_)
  ------------------
  |  Branch (261:7): [True: 37.8k, False: 0]
  ------------------
  262|  37.8k|    value_ = rhs.value_->clone();  // deep copy
  263|  37.8k|}
_ZN5Exiv28XmpdatumC2ERKNS_6XmpKeyEPKNS_5ValueE:
  277|  33.5k|Xmpdatum::Xmpdatum(const XmpKey& key, const Value* pValue) : p_(std::make_unique<Impl>(key, pValue)) {
  278|  33.5k|}
_ZN5Exiv28XmpdatumC2ERKS0_:
  280|  37.8k|Xmpdatum::Xmpdatum(const Xmpdatum& rhs) : p_(std::make_unique<Impl>(*rhs.p_)) {
  281|  37.8k|}
_ZN5Exiv28XmpdatumD2Ev:
  290|  71.4k|Xmpdatum::~Xmpdatum() = default;
_ZNK5Exiv28Xmpdatum3keyEv:
  292|  6.29M|std::string Xmpdatum::key() const {
  293|  6.29M|  return p_->key_ ? p_->key_->key() : "";
  ------------------
  |  Branch (293:10): [True: 6.29M, False: 0]
  ------------------
  294|  6.29M|}
_ZNK5Exiv28Xmpdatum9groupNameEv:
  300|  3.60k|std::string Xmpdatum::groupName() const {
  301|  3.60k|  return p_->key_ ? p_->key_->groupName() : "";
  ------------------
  |  Branch (301:10): [True: 3.60k, False: 0]
  ------------------
  302|  3.60k|}
_ZNK5Exiv28Xmpdatum7tagNameEv:
  304|  17.1k|std::string Xmpdatum::tagName() const {
  305|  17.1k|  return p_->key_ ? p_->key_->tagName() : "";
  ------------------
  |  Branch (305:10): [True: 17.1k, False: 0]
  ------------------
  306|  17.1k|}
_ZNK5Exiv28Xmpdatum6typeIdEv:
  320|  17.5k|TypeId Xmpdatum::typeId() const {
  321|  17.5k|  return p_->value_ ? p_->value_->typeId() : invalidTypeId;
  ------------------
  |  Branch (321:10): [True: 17.5k, False: 0]
  ------------------
  322|  17.5k|}
_ZNK5Exiv28Xmpdatum5countEv:
  332|  4.27k|size_t Xmpdatum::count() const {
  333|  4.27k|  return p_->value_ ? p_->value_->count() : 0;
  ------------------
  |  Branch (333:10): [True: 4.27k, False: 0]
  ------------------
  334|  4.27k|}
_ZNK5Exiv28Xmpdatum8toStringEv:
  340|    759|std::string Xmpdatum::toString() const {
  341|    759|  return p_->value_ ? p_->value_->toString() : "";
  ------------------
  |  Branch (341:10): [True: 759, False: 0]
  ------------------
  342|    759|}
_ZNK5Exiv28Xmpdatum8toStringEm:
  344|  7.24k|std::string Xmpdatum::toString(size_t n) const {
  345|  7.24k|  return p_->value_ ? p_->value_->toString(n) : "";
  ------------------
  |  Branch (345:10): [True: 7.24k, False: 0]
  ------------------
  346|  7.24k|}
_ZNK5Exiv28Xmpdatum5valueEv:
  364|  25.6k|const Value& Xmpdatum::value() const {
  365|  25.6k|  if (!p_->value_)
  ------------------
  |  Branch (365:7): [True: 0, False: 25.6k]
  ------------------
  366|      0|    throw Error(ErrorCode::kerValueNotSet, key());
  367|  25.6k|  return *p_->value_;
  368|  25.6k|}
_ZNK5Exiv28Xmpdatum5writeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKNS_8ExifDataE:
  374|  18.3k|std::ostream& Xmpdatum::write(std::ostream& os, const ExifData*) const {
  375|  18.3k|  return XmpProperties::printProperty(os, key(), value());
  376|  18.3k|}
_ZN5Exiv28Xmpdatum8setValueERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  384|   487k|int Xmpdatum::setValue(const std::string& value) {
  385|   487k|  XmpProperties::XmpLock lock;
  386|   487k|  if (!p_->value_) {
  ------------------
  |  Branch (386:7): [True: 21.4k, False: 466k]
  ------------------
  387|  21.4k|    TypeId type = xmpText;
  388|  21.4k|    if (p_->key_) {
  ------------------
  |  Branch (388:9): [True: 21.4k, False: 0]
  ------------------
  389|  21.4k|      type = XmpProperties::propertyTypeUnlocked(*p_->key_.get(), lock);
  390|  21.4k|    }
  391|  21.4k|    p_->value_ = Value::create(type);
  392|  21.4k|  }
  393|   487k|  return p_->value_->read(value);
  394|   487k|}
_ZN5Exiv27XmpDataixERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  396|   488k|Xmpdatum& XmpData::operator[](const std::string& key) {
  397|   488k|  XmpProperties::XmpLock lock;
  398|   488k|  XmpKey xmpKey(key, lock);
  399|   488k|  auto pos = std::find_if(xmpMetadata_.begin(), xmpMetadata_.end(), FindXmpdatum(xmpKey));
  400|   488k|  if (pos == xmpMetadata_.end()) {
  ------------------
  |  Branch (400:7): [True: 21.4k, False: 466k]
  ------------------
  401|  21.4k|    return xmpMetadata_.emplace_back(xmpKey);
  402|  21.4k|  }
  403|   466k|  return *pos;
  404|   488k|}
_ZN5Exiv27XmpData3addERKNS_6XmpKeyEPKNS_5ValueE:
  406|  3.00k|int XmpData::add(const XmpKey& key, const Value* value) {
  407|  3.00k|  XmpProperties::XmpLock lock;
  408|  3.00k|  return addUnlocked(key, value, lock);
  409|  3.00k|}
_ZN5Exiv27XmpData11addUnlockedERKNS_6XmpKeyEPKNS_5ValueERKNS_13XmpProperties7XmpLockE:
  411|  12.1k|int XmpData::addUnlocked(const XmpKey& key, const Value* value, const XmpProperties::XmpLock&) {
  412|  12.1k|  xmpMetadata_.emplace_back(key, value);
  413|  12.1k|  return 0;
  414|  12.1k|}
_ZNK5Exiv27XmpData7findKeyERKNS_6XmpKeyE:
  426|  4.42k|XmpData::const_iterator XmpData::findKey(const XmpKey& key) const {
  427|  4.42k|  XmpProperties::XmpLock lock;
  428|  4.42k|  return std::find_if(xmpMetadata_.begin(), xmpMetadata_.end(), FindXmpdatum(key));
  429|  4.42k|}
_ZN5Exiv27XmpData7findKeyERKNS_6XmpKeyE:
  431|  80.0k|XmpData::iterator XmpData::findKey(const XmpKey& key) {
  432|  80.0k|  XmpProperties::XmpLock lock;
  433|  80.0k|  return std::find_if(xmpMetadata_.begin(), xmpMetadata_.end(), FindXmpdatum(key));
  434|  80.0k|}
_ZN5Exiv27XmpData5clearEv:
  436|  33.1k|void XmpData::clear() {
  437|  33.1k|  XmpProperties::XmpLock lock;
  438|  33.1k|  clearUnlocked(lock);
  439|  33.1k|}
_ZN5Exiv27XmpData13clearUnlockedERKNS_13XmpProperties7XmpLockE:
  441|  36.7k|void XmpData::clearUnlocked(const XmpProperties::XmpLock&) {
  442|  36.7k|  xmpMetadata_.clear();
  443|  36.7k|  nsBindings_.clear();
  444|  36.7k|}
_ZNK5Exiv27XmpData5beginEv:
  455|    182|XmpData::const_iterator XmpData::begin() const {
  456|    182|  return xmpMetadata_.begin();
  457|    182|}
_ZNK5Exiv27XmpData3endEv:
  459|  4.60k|XmpData::const_iterator XmpData::end() const {
  460|  4.60k|  return xmpMetadata_.end();
  461|  4.60k|}
_ZNK5Exiv27XmpData5emptyEv:
  463|  1.97k|bool XmpData::empty() const {
  464|  1.97k|  XmpProperties::XmpLock lock;
  465|  1.97k|  return emptyUnlocked(lock);
  466|  1.97k|}
_ZNK5Exiv27XmpData13emptyUnlockedERKNS_13XmpProperties7XmpLockE:
  468|  19.1k|bool XmpData::emptyUnlocked(const XmpProperties::XmpLock&) const {
  469|  19.1k|  return xmpMetadata_.empty();
  470|  19.1k|}
_ZN5Exiv27XmpData5beginEv:
  481|  25.8k|XmpData::iterator XmpData::begin() {
  482|  25.8k|  return xmpMetadata_.begin();
  483|  25.8k|}
_ZN5Exiv27XmpData3endEv:
  485|   105k|XmpData::iterator XmpData::end() {
  486|   105k|  return xmpMetadata_.end();
  487|   105k|}
_ZN5Exiv227xmpToolkitEnsureInitializedEv:
  538|  21.7k|void xmpToolkitEnsureInitialized() {
  539|  21.7k|  static XmpToolkitLifetimeManager instance;
  540|  21.7k|  (void)instance;
  541|  21.7k|}
_ZN5Exiv29XmpParser14registerNsImplERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  543|    969|void XmpParser::registerNsImpl(const std::string& ns, const std::string& prefix) {
  544|    969|  xmpToolkitEnsureInitialized();
  545|    969|  try {
  546|    969|    std::string existingPrefix;
  547|    969|    if (SXMPMeta::GetNamespacePrefix(ns.c_str(), &existingPrefix)) {
  ------------------
  |  Branch (547:9): [True: 966, False: 3]
  ------------------
  548|    966|      if (!existingPrefix.empty() && existingPrefix.back() == ':') {
  ------------------
  |  Branch (548:11): [True: 966, False: 0]
  |  Branch (548:38): [True: 966, False: 0]
  ------------------
  549|    966|        existingPrefix.pop_back();
  550|    966|      }
  551|    966|      if (existingPrefix == prefix) {
  ------------------
  |  Branch (551:11): [True: 944, False: 22]
  ------------------
  552|       |        // Already registered correctly, skip overhead
  553|    944|        return;
  554|    944|      }
  555|    966|    }
  556|       |
  557|     25|    SXMPMeta::DeleteNamespace(ns.c_str());
  558|       |#ifdef EXV_ADOBE_XMPSDK
  559|       |    SXMPMeta::RegisterNamespace(ns.c_str(), prefix.c_str(), nullptr);
  560|       |#else
  561|     25|    SXMPMeta::RegisterNamespace(ns.c_str(), prefix.c_str());
  562|     25|#endif
  563|     25|  } catch (const XMP_Error& /* e */) {
  564|       |    // throw Error(ErrorCode::kerXMPToolkitError, e.GetID(), e.GetErrMsg());
  565|      0|  }
  566|    969|}
_ZN5Exiv29XmpParser6decodeERNS_7XmpDataERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS_12DecodeParamsE:
  663|  4.02k|int XmpParser::decode(XmpData& xmpData, const std::string& xmpPacket, const DecodeParams& dp) {
  664|  4.02k|  try {
  665|  4.02k|    xmpData.setPacket(xmpPacket);
  666|  4.02k|    if (xmpPacket.empty()) {
  ------------------
  |  Branch (666:9): [True: 417, False: 3.61k]
  ------------------
  667|    417|      xmpData.clear();
  668|    417|      return 0;
  669|    417|    }
  670|       |
  671|       |    // Acquire Giant Lock
  672|  3.61k|    XmpProperties::XmpLock lock;
  673|  3.61k|    try {
  674|  3.61k|      xmpToolkitEnsureInitialized();
  675|  3.61k|    } catch (const Error&) {
  676|      0|#ifndef SUPPRESS_WARNINGS
  677|      0|      EXV_ERROR << "XMP toolkit initialization failed.\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  678|      0|#endif
  679|      0|      return 2;
  680|      0|    }
  681|       |
  682|  3.61k|    xmpData.clearUnlocked(lock);
  683|       |
  684|       |    // Make sure the unterminated substring is used
  685|  3.61k|    size_t len = xmpPacket.size();
  686|  1.56M|    while (len > 0 && 0 == xmpPacket[len - 1])
  ------------------
  |  Branch (686:12): [True: 1.56M, False: 17]
  |  Branch (686:23): [True: 1.56M, False: 3.59k]
  ------------------
  687|  1.56M|      --len;
  688|       |
  689|  3.61k|    XMLValidator::check(xmpPacket.data(), len, dp);
  690|  3.61k|    SXMPMeta meta(xmpPacket.data(), static_cast<XMP_StringLen>(len));
  691|  3.61k|    SXMPIterator iter(meta);
  692|  3.61k|    std::string schemaNs;
  693|  3.61k|    std::string propPath;
  694|  3.61k|    std::string propValue;
  695|  3.61k|    XMP_OptionBits opt = 0;
  696|  15.4k|    while (iter.Next(&schemaNs, &propPath, &propValue, &opt)) {
  ------------------
  |  Branch (696:12): [True: 11.8k, False: 3.61k]
  ------------------
  697|  11.8k|      printNode(schemaNs, propPath, propValue, opt);
  698|  11.8k|      if (XMP_PropIsAlias(opt)) {
  ------------------
  |  Branch (698:11): [True: 0, False: 11.8k]
  ------------------
  699|      0|        throw Error(ErrorCode::kerAliasesNotSupported, schemaNs, propPath, propValue);
  700|      0|      }
  701|  11.8k|      if (XMP_NodeIsSchema(opt)) {
  ------------------
  |  Branch (701:11): [True: 2.70k, False: 9.14k]
  ------------------
  702|       |        // Register unknown namespaces with Exiv2
  703|       |        // (Namespaces are automatically registered with the XMP Toolkit)
  704|  2.70k|        std::string prefix = XmpProperties::prefixUnlocked(schemaNs, lock);
  705|  2.70k|        if (prefix.empty()) {
  ------------------
  |  Branch (705:13): [True: 2.17k, False: 530]
  ------------------
  706|  2.17k|          if (!SXMPMeta::GetNamespacePrefix(schemaNs.c_str(), &prefix))
  ------------------
  |  Branch (706:15): [True: 0, False: 2.17k]
  ------------------
  707|      0|            throw Error(ErrorCode::kerSchemaNamespaceNotRegistered, schemaNs);
  708|  2.17k|          prefix.pop_back();
  709|       |          // Hardening: a parsed packet must not silently rebind a prefix that is
  710|       |          // already globally bound -- a built-in standard prefix, or one a prior
  711|       |          // explicit registerNs() established -- to a different URI.  Letting it
  712|       |          // would poison every later write and lookup in this process (the
  713|       |          // namespace-leak bug).  The packet's own binding is still captured
  714|       |          // per-instance below, so this object round-trips faithfully; we just
  715|       |          // don't pollute the global registry on a read.
  716|  2.17k|          if (!XmpProperties::prefixIsBoundUnlocked(prefix, lock))
  ------------------
  |  Branch (716:15): [True: 6, False: 2.17k]
  ------------------
  717|      6|            XmpProperties::registerNsUnlocked(schemaNs, prefix, lock);
  718|  2.17k|        }
  719|       |        // Record the prefix->URI binding exactly as declared by THIS packet so
  720|       |        // encode() can resolve each property's URI from the data it came from,
  721|       |        // rather than from the process-global registry which another image may
  722|       |        // have rebound (e.g. to a corrupted URI).  See XmpData::nsBindings().
  723|  2.70k|        xmpData.nsBindings_[prefix] = schemaNs;
  724|  2.70k|        continue;
  725|  2.70k|      }
  726|  9.14k|      auto key = makeXmpKey(schemaNs, propPath, lock);
  727|  9.14k|      if (XMP_ArrayIsAltText(opt)) {
  ------------------
  |  Branch (727:11): [True: 158, False: 8.98k]
  ------------------
  728|       |        // Read Lang Alt property
  729|    158|        auto val = std::make_unique<LangAltValue>();
  730|    158|        XMP_Index count = meta.CountArrayItems(schemaNs.c_str(), propPath.c_str());
  731|    313|        while (count-- > 0) {
  ------------------
  |  Branch (731:16): [True: 155, False: 158]
  ------------------
  732|       |          // Get the text
  733|    155|          bool haveNext = iter.Next(&schemaNs, &propPath, &propValue, &opt);
  734|    155|          printNode(schemaNs, propPath, propValue, opt);
  735|    155|          if (!haveNext || !XMP_PropIsSimple(opt) || !XMP_PropHasLang(opt)) {
  ------------------
  |  Branch (735:15): [True: 0, False: 155]
  |  Branch (735:28): [True: 0, False: 155]
  |  Branch (735:54): [True: 0, False: 155]
  ------------------
  736|      0|            throw Error(ErrorCode::kerDecodeLangAltPropertyFailed, propPath, opt);
  737|      0|          }
  738|    155|          std::string text = propValue;
  739|       |          // Get the language qualifier
  740|    155|          haveNext = iter.Next(&schemaNs, &propPath, &propValue, &opt);
  741|    155|          printNode(schemaNs, propPath, propValue, opt);
  742|    155|          if (!haveNext || !XMP_PropIsSimple(opt) || !XMP_PropIsQualifier(opt) ||
  ------------------
  |  Branch (742:15): [True: 0, False: 155]
  |  Branch (742:15): [True: 0, False: 155]
  |  Branch (742:28): [True: 0, False: 155]
  |  Branch (742:54): [True: 0, False: 155]
  ------------------
  743|    155|              propPath.substr(propPath.size() - 8, 8) != "xml:lang") {
  ------------------
  |  Branch (743:15): [True: 0, False: 155]
  ------------------
  744|      0|            throw Error(ErrorCode::kerDecodeLangAltQualifierFailed, propPath, opt);
  745|      0|          }
  746|    155|          val->value_[propValue] = std::move(text);
  747|    155|        }
  748|    158|        xmpData.addUnlocked(*key, val.get(), lock);
  749|    158|        continue;
  750|    158|      }
  751|  8.98k|      if (XMP_PropIsArray(opt) && !XMP_PropHasQualifiers(opt) && !XMP_ArrayIsAltText(opt)) {
  ------------------
  |  Branch (751:11): [True: 809, False: 8.17k]
  |  Branch (751:35): [True: 809, False: 0]
  |  Branch (751:66): [True: 809, False: 0]
  ------------------
  752|       |        // Check if all elements are simple
  753|    809|        bool simpleArray = true;
  754|    809|        SXMPIterator aIter(meta, schemaNs.c_str(), propPath.c_str());
  755|    809|        std::string aSchemaNs;
  756|    809|        std::string aPropPath;
  757|    809|        std::string aPropValue;
  758|    809|        XMP_OptionBits aOpt = 0;
  759|  3.17k|        while (aIter.Next(&aSchemaNs, &aPropPath, &aPropValue, &aOpt)) {
  ------------------
  |  Branch (759:16): [True: 2.49k, False: 677]
  ------------------
  760|  2.49k|          if (propPath == aPropPath)
  ------------------
  |  Branch (760:15): [True: 809, False: 1.68k]
  ------------------
  761|    809|            continue;
  762|  1.68k|          if (!XMP_PropIsSimple(aOpt) || XMP_PropHasQualifiers(aOpt) || XMP_PropIsQualifier(aOpt) ||
  ------------------
  |  Branch (762:15): [True: 86, False: 1.60k]
  |  Branch (762:42): [True: 46, False: 1.55k]
  |  Branch (762:73): [True: 0, False: 1.55k]
  ------------------
  763|  1.68k|              XMP_NodeIsSchema(aOpt) || XMP_PropIsAlias(aOpt)) {
  ------------------
  |  Branch (763:15): [True: 0, False: 1.55k]
  |  Branch (763:41): [True: 0, False: 1.55k]
  ------------------
  764|    132|            simpleArray = false;
  765|    132|            break;
  766|    132|          }
  767|  1.68k|        }
  768|    809|        if (simpleArray) {
  ------------------
  |  Branch (768:13): [True: 677, False: 132]
  ------------------
  769|       |          // Read the array into an XmpArrayValue
  770|    677|          auto val = std::make_unique<XmpArrayValue>(arrayValueTypeId(opt));
  771|    677|          XMP_Index count = meta.CountArrayItems(schemaNs.c_str(), propPath.c_str());
  772|  2.23k|          while (count-- > 0) {
  ------------------
  |  Branch (772:18): [True: 1.55k, False: 677]
  ------------------
  773|  1.55k|            iter.Next(&schemaNs, &propPath, &propValue, &opt);
  774|  1.55k|            printNode(schemaNs, propPath, propValue, opt);
  775|  1.55k|            val->read(propValue);
  776|  1.55k|          }
  777|    677|          xmpData.addUnlocked(*key, val.get(), lock);
  778|    677|          continue;
  779|    677|        }
  780|    809|      }
  781|       |
  782|  8.31k|      auto val = std::make_unique<XmpTextValue>();
  783|  8.31k|      if (XMP_PropIsStruct(opt) || XMP_PropIsArray(opt)) {
  ------------------
  |  Branch (783:11): [True: 308, False: 8.00k]
  |  Branch (783:36): [True: 132, False: 7.87k]
  ------------------
  784|       |        // Create a metadatum with only XMP options
  785|    440|        val->setXmpArrayType(xmpArrayType(opt));
  786|    440|        val->setXmpStruct(xmpStruct(opt));
  787|    440|        xmpData.addUnlocked(*key, val.get(), lock);
  788|    440|        continue;
  789|    440|      }
  790|  7.87k|      if (XMP_PropIsSimple(opt) || XMP_PropIsQualifier(opt)) {
  ------------------
  |  Branch (790:11): [True: 7.87k, False: 0]
  |  Branch (790:36): [True: 0, False: 0]
  ------------------
  791|  7.87k|        val->read(propValue);
  792|  7.87k|        xmpData.addUnlocked(*key, val.get(), lock);
  793|  7.87k|        continue;
  794|  7.87k|      }
  795|       |      // Don't let any node go by unnoticed
  796|      0|      throw Error(ErrorCode::kerUnhandledXmpNode, key->key(), opt);
  797|  7.87k|    }  // iterate through all XMP nodes
  798|       |
  799|  3.61k|    return 0;
  800|  3.61k|  }
  801|  4.02k|#ifndef SUPPRESS_WARNINGS
  802|  4.02k|  catch (const Error& e) {
  803|      8|    if (e.code() == ErrorCode::kerXMPToolkitError) {
  ------------------
  |  Branch (803:9): [True: 0, False: 8]
  ------------------
  804|       |      // Initialization failures caught above, this handles other XMP errors if any wrapped in Error
  805|      0|    }
  806|      8|    throw;
  807|  2.04k|  } catch (const XMP_Error& e) {
  808|  2.04k|    EXV_ERROR << Error(ErrorCode::kerXMPToolkitError, e.GetID(), e.GetErrMsg()) << "\n";
  ------------------
  |  |  142|  2.04k|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 2.04k]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|  2.04k|  LogMsg(LogMsg::error).os()
  ------------------
  809|  2.04k|    xmpData.clear();
  810|  2.04k|    return 3;
  811|  2.04k|  }
  812|       |#else
  813|       |  catch (const XMP_Error&) {
  814|       |    xmpData.clear();
  815|       |    return 3;
  816|       |  }
  817|       |#endif  // SUPPRESS_WARNINGS
  818|  4.02k|}  // XmpParser::decode
_ZN5Exiv29XmpParser6encodeERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_7XmpDataEtj:
  832|  17.1k|int XmpParser::encode(std::string& xmpPacket, const XmpData& xmpData, uint16_t formatFlags, uint32_t padding) {
  833|  17.1k|  try {
  834|       |    // Acquire Giant Lock
  835|  17.1k|    XmpProperties::XmpLock lock;
  836|  17.1k|    try {
  837|  17.1k|      xmpToolkitEnsureInitialized();
  838|  17.1k|    } catch (const Error&) {
  839|      0|#ifndef SUPPRESS_WARNINGS
  840|      0|      EXV_ERROR << "XMP toolkit initialization failed.\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  841|      0|#endif
  842|      0|      return 2;
  843|      0|    }
  844|       |
  845|  17.1k|    if (xmpData.emptyUnlocked(lock)) {
  ------------------
  |  Branch (845:9): [True: 16.9k, False: 182]
  ------------------
  846|  16.9k|      xmpPacket.clear();
  847|  16.9k|      return 0;
  848|  16.9k|    }  // We are holding the Giant Lock, so we can iterate nsRegistry_ safely.
  849|       |    // XmpProperties interactions must go through Unlocked/impl methods to avoid deadlocks.
  850|    969|    for (const auto& [xmp, uri] : XmpProperties::nsRegistry_) {
  ------------------
  |  Branch (850:33): [True: 969, False: 182]
  ------------------
  851|       |#ifdef EXIV2_DEBUG_MESSAGES
  852|       |      std::cerr << "Registering " << uri.prefix_ << " : " << xmp << "\n";
  853|       |#endif
  854|       |      // registerNsImpl is safe since we hold the lock
  855|    969|      registerNsImpl(xmp, uri.prefix_);
  856|    969|    }
  857|       |
  858|       |    // Note: we deliberately do NOT re-register the per-instance bindings with
  859|       |    // the toolkit here.  Every URI they contain was already registered while its
  860|       |    // packet was parsed in decode() (custom ones are also in nsRegistry_, handled
  861|       |    // above), so SetProperty resolves them.  Re-registering would overwrite the
  862|       |    // toolkit's URI->prefix mapping whenever our preferred prefix differs from the
  863|       |    // one the file used for that URI (e.g. iptc vs Iptc4xmpCore), which breaks
  864|       |    // serialization of struct fields that still carry the file's prefix.
  865|    182|    SXMPMeta meta;
  866|  3.60k|    for (const auto& xmp : xmpData) {
  ------------------
  |  Branch (866:26): [True: 3.60k, False: 182]
  ------------------
  867|  3.60k|      const std::string ns = resolveNamespace(xmpData, xmp.groupName(), lock);
  868|  3.60k|      XMP_OptionBits options = 0;
  869|       |
  870|  3.60k|      if (xmp.typeId() == langAlt) {
  ------------------
  |  Branch (870:11): [True: 67, False: 3.53k]
  ------------------
  871|       |        // Encode Lang Alt property
  872|     67|        const auto la = dynamic_cast<const LangAltValue*>(&xmp.value());
  873|     67|        if (!la)
  ------------------
  |  Branch (873:13): [True: 0, False: 67]
  ------------------
  874|      0|          throw Error(ErrorCode::kerEncodeLangAltPropertyFailed, xmp.key());
  875|       |
  876|     67|        int idx = 1;
  877|     68|        for (const auto& [lang, specs] : la->value_) {
  ------------------
  |  Branch (877:40): [True: 68, False: 67]
  ------------------
  878|     68|          if (!specs.empty()) {  // remove lang specs with no value
  ------------------
  |  Branch (878:15): [True: 66, False: 2]
  ------------------
  879|     66|            printNode(ns, xmp.tagName(), specs, 0);
  880|     66|            meta.AppendArrayItem(ns.c_str(), xmp.tagName().c_str(), kXMP_PropArrayIsAlternate, specs.c_str());
  881|     66|            const std::string item = xmp.tagName() + "[" + toString(idx++) + "]";
  882|     66|            meta.SetQualifier(ns.c_str(), item.c_str(), kXMP_NS_XML, "lang", lang.c_str());
  883|     66|          }
  884|     68|        }
  885|     67|        continue;
  886|     67|      }
  887|       |
  888|       |      // Todo: Xmpdatum should have an XmpValue, not a Value
  889|  3.53k|      const auto val = dynamic_cast<const XmpValue*>(&xmp.value());
  890|  3.53k|      if (!val)
  ------------------
  |  Branch (890:11): [True: 0, False: 3.53k]
  ------------------
  891|      0|        throw Error(ErrorCode::kerInvalidKeyXmpValue, xmp.key(), xmp.typeName());
  892|  3.53k|      options = xmpArrayOptionBits(val->xmpArrayType()) | xmpArrayOptionBits(val->xmpStruct());
  893|  3.53k|      if (xmp.typeId() == xmpBag || xmp.typeId() == xmpSeq || xmp.typeId() == xmpAlt) {
  ------------------
  |  Branch (893:11): [True: 56, False: 3.48k]
  |  Branch (893:37): [True: 238, False: 3.24k]
  |  Branch (893:63): [True: 23, False: 3.21k]
  ------------------
  894|    317|        printNode(ns, xmp.tagName(), "", options);
  895|    317|        meta.SetProperty(ns.c_str(), xmp.tagName().c_str(), nullptr, options);
  896|  1.05k|        for (size_t idx = 0; idx < xmp.count(); ++idx) {
  ------------------
  |  Branch (896:30): [True: 736, False: 317]
  ------------------
  897|    736|          const std::string item = xmp.tagName() + "[" + toString(idx + 1) + "]";
  898|    736|          printNode(ns, item, xmp.toString(static_cast<long>(idx)), 0);
  899|    736|          meta.SetProperty(ns.c_str(), item.c_str(), xmp.toString(static_cast<long>(idx)).c_str());
  900|    736|        }
  901|    317|        continue;
  902|    317|      }
  903|  3.21k|      if (xmp.typeId() == xmpText) {
  ------------------
  |  Branch (903:11): [True: 3.21k, False: 0]
  ------------------
  904|  3.21k|        const auto xt = dynamic_cast<const XmpTextValue*>(&xmp.value());
  905|  3.21k|        if (xmp.count() == 0 || xt->xmpStruct() != XmpValue::xsNone || xt->xmpArrayType() != XmpValue::xaNone) {
  ------------------
  |  Branch (905:13): [True: 127, False: 3.09k]
  |  Branch (905:33): [True: 144, False: 2.94k]
  |  Branch (905:72): [True: 63, False: 2.88k]
  ------------------
  906|    334|          printNode(ns, xmp.tagName(), "", options);
  907|    334|          meta.SetProperty(ns.c_str(), xmp.tagName().c_str(), nullptr, options);
  908|  2.88k|        } else {
  909|  2.88k|          printNode(ns, xmp.tagName(), xmp.toString(0), options);
  910|  2.88k|          meta.SetProperty(ns.c_str(), xmp.tagName().c_str(), xmp.toString(0).c_str(), options);
  911|  2.88k|        }
  912|  3.21k|        continue;
  913|  3.21k|      }
  914|       |      // Don't let any Xmpdatum go by unnoticed
  915|      0|      throw Error(ErrorCode::kerUnhandledXmpdatum, xmp.tagName(), xmp.typeName());
  916|  3.21k|    }
  917|    182|    std::string tmpPacket;
  918|    182|    meta.SerializeToBuffer(&tmpPacket, xmpFormatOptionBits(static_cast<XmpFormatFlags>(formatFlags)),
  919|    182|                           padding);  // throws
  920|    182|    xmpPacket = std::move(tmpPacket);
  921|       |
  922|    182|    return 0;
  923|    182|  }
  924|  17.1k|#ifndef SUPPRESS_WARNINGS
  925|  17.1k|  catch (const Error& /* e */) {
  926|      0|    throw;
  927|      0|  } catch (const XMP_Error& e) {
  928|      0|    EXV_ERROR << Error(ErrorCode::kerXMPToolkitError, e.GetID(), e.GetErrMsg()) << "\n";
  ------------------
  |  |  142|      0|  if (LogMsg::error >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (142:7): [True: 0, False: 0]
  |  |  |  Branch (142:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|  LogMsg(LogMsg::error).os()
  ------------------
  929|      0|    return 3;
  930|      0|  }
  931|       |#else
  932|       |  catch (const XMP_Error&) {
  933|       |    return 3;
  934|       |  }
  935|       |#endif  // SUPPRESS_WARNINGS
  936|  17.1k|}  // XmpParser::encode
_ZN5Exiv29XmpParser10makeXmpKeyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKNS_13XmpProperties7XmpLockE:
 1098|  9.14k|                                                      const XmpProperties::XmpLock& lock) {
 1099|  9.14k|  std::string property;
 1100|  9.14k|  std::string::size_type idx = propPath.find(':');
 1101|  9.14k|  if (idx == std::string::npos) {
  ------------------
  |  Branch (1101:7): [True: 0, False: 9.14k]
  ------------------
 1102|      0|    throw Exiv2::Error(Exiv2::ErrorCode::kerPropertyNameIdentificationFailed, propPath, schemaNs);
 1103|      0|  }
 1104|       |  // Don't worry about out_of_range, XMP parser takes care of this
 1105|  9.14k|  property = propPath.substr(idx + 1);
 1106|  9.14k|  std::string prefix = Exiv2::XmpProperties::prefixUnlocked(schemaNs, lock);
 1107|  9.14k|  if (prefix.empty()) {
  ------------------
  |  Branch (1107:7): [True: 7.95k, False: 1.18k]
  ------------------
 1108|       |    // The namespace was intentionally not registered globally (e.g. a packet
 1109|       |    // that rebinds an already-bound prefix to a different URI -- see the
 1110|       |    // hardening in decode()).  Fall back to the prefix the toolkit parsed so
 1111|       |    // the property still gets a key; its URI is preserved per-instance.
 1112|  7.95k|    std::string toolkitPrefix;
 1113|  7.95k|    if (SXMPMeta::GetNamespacePrefix(schemaNs.c_str(), &toolkitPrefix)) {
  ------------------
  |  Branch (1113:9): [True: 7.95k, False: 0]
  ------------------
 1114|  7.95k|      toolkitPrefix.pop_back();
 1115|  7.95k|      prefix = std::move(toolkitPrefix);
 1116|  7.95k|    }
 1117|  7.95k|  }
 1118|  9.14k|  if (prefix.empty()) {
  ------------------
  |  Branch (1118:7): [True: 0, False: 9.14k]
  ------------------
 1119|      0|    throw Exiv2::Error(Exiv2::ErrorCode::kerNoPrefixForNamespace, propPath, schemaNs);
 1120|      0|  }
 1121|  9.14k|  return Exiv2::XmpKey::UniquePtr(new Exiv2::XmpKey(prefix, property, lock));
 1122|  9.14k|}  // makeXmpKey
_ZN5Exiv29XmpParser16resolveNamespaceERKNS_7XmpDataERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS_13XmpProperties7XmpLockE:
 1125|  3.60k|                                               const XmpProperties::XmpLock& lock) {
 1126|  3.60k|  const auto& nsBindings = xmpData.nsBindings();
 1127|  3.60k|  const auto binding = nsBindings.find(prefix);
 1128|  3.60k|  return binding != nsBindings.end() ? binding->second : XmpProperties::nsUnlocked(prefix, lock);
  ------------------
  |  Branch (1128:10): [True: 3.60k, False: 0]
  ------------------
 1129|  3.60k|}  // resolveNamespace
xmp.cpp:_ZNK12_GLOBAL__N_112FindXmpdatumclERKN5Exiv28XmpdatumE:
  203|  6.27M|  bool operator()(const Exiv2::Xmpdatum& xmpdatum) const {
  204|  6.27M|    return key_ == xmpdatum.key();
  205|  6.27M|  }
xmp.cpp:_ZN12_GLOBAL__N_112FindXmpdatumC2ERKN5Exiv26XmpKeyE:
  197|   572k|  explicit FindXmpdatum(const Exiv2::XmpKey& key) : key_(key.key()) {
  198|   572k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator5checkEPKcmRKN5Exiv212DecodeParamsE:
   67|  3.61k|  static void check(const char* buf, size_t buflen, const DecodeParams& dp) {
   68|  3.61k|    XMLValidator validator(dp.max_recursion_depth());
   69|  3.61k|    validator.check_internal(buf, buflen);
   70|  3.61k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidatorC2Em:
   79|  3.61k|      max_recursion_depth_(max_recursion_depth), parser_(XML_ParserCreateNS(nullptr, '@')) {
   80|  3.61k|    if (!parser_) {
  ------------------
  |  Branch (80:9): [True: 0, False: 3.61k]
  ------------------
   81|      0|      throw Error(ErrorCode::kerXMPToolkitError, "Could not create expat parser");
   82|      0|    }
   83|  3.61k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator14check_internalEPKcm:
  104|  3.61k|  void check_internal(const char* buf, size_t buflen) {
  105|  3.61k|    if (buflen > static_cast<size_t>(std::numeric_limits<int>::max())) {
  ------------------
  |  Branch (105:9): [True: 0, False: 3.61k]
  ------------------
  106|      0|      throw Error(ErrorCode::kerXMPToolkitError, "Buffer length is greater than INT_MAX");
  107|      0|    }
  108|       |
  109|  3.61k|    XML_SetUserData(parser_, this);
  110|  3.61k|    XML_SetElementHandler(parser_, startElement_cb, endElement_cb);
  111|  3.61k|    XML_SetNamespaceDeclHandler(parser_, startNamespace_cb, endNamespace_cb);
  112|  3.61k|    XML_SetStartDoctypeDeclHandler(parser_, startDTD_cb);
  113|       |
  114|  3.61k|    if (XML_Parse(parser_, buf, static_cast<int>(buflen), true) == XML_STATUS_ERROR) {
  ------------------
  |  Branch (114:9): [True: 1.41k, False: 2.20k]
  ------------------
  115|  1.41k|      setError(XML_ErrorString(XML_GetErrorCode(parser_)));
  116|  1.41k|    }
  117|       |
  118|  3.61k|    if (haserror_) {
  ------------------
  |  Branch (118:9): [True: 1.41k, False: 2.20k]
  ------------------
  119|  1.41k|      throw XMP_Error(kXMPErr_BadXML, "Error in XMLValidator");
  120|  1.41k|    }
  121|  3.61k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator15startElement_cbEPvPKcPS3_:
  160|  28.1k|  static void XMLCALL startElement_cb(void* userData, const XML_Char* name, const XML_Char** attrs) noexcept {
  161|  28.1k|    static_cast<XMLValidator*>(userData)->startElement(name, attrs);
  162|  28.1k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator12startElementEPKcPS2_:
  123|  28.1k|  void startElement(const XML_Char*, const XML_Char**) noexcept {
  124|  28.1k|    if (element_depth_ > max_recursion_depth_) {
  ------------------
  |  Branch (124:9): [True: 3.22k, False: 24.9k]
  ------------------
  125|  3.22k|      setError("Too deeply nested");
  126|  3.22k|    }
  127|  28.1k|    ++element_depth_;
  128|  28.1k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator13endElement_cbEPvPKc:
  166|  13.8k|  static void XMLCALL endElement_cb(void* userData, const XML_Char* name) noexcept {
  167|  13.8k|    static_cast<XMLValidator*>(userData)->endElement(name);
  168|  13.8k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator10endElementEPKc:
  130|  13.8k|  void endElement(const XML_Char*) noexcept {
  131|  13.8k|    if (element_depth_ > 0) {
  ------------------
  |  Branch (131:9): [True: 13.8k, False: 0]
  ------------------
  132|  13.8k|      --element_depth_;
  133|  13.8k|    } else {
  134|      0|      setError("Negative depth");
  135|      0|    }
  136|  13.8k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator17startNamespace_cbEPvPKcS3_:
  172|  17.9k|  static void XMLCALL startNamespace_cb(void* userData, const XML_Char* prefix, const XML_Char* uri) noexcept {
  173|  17.9k|    static_cast<XMLValidator*>(userData)->startNamespace(prefix, uri);
  174|  17.9k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator14startNamespaceEPKcS2_:
  138|  17.9k|  void startNamespace(const XML_Char*, const XML_Char*) noexcept {
  139|  17.9k|    if (namespace_depth_ > max_recursion_depth_) {
  ------------------
  |  Branch (139:9): [True: 1.07k, False: 16.9k]
  ------------------
  140|  1.07k|      setError("Too deeply nested");
  141|  1.07k|    }
  142|  17.9k|    ++namespace_depth_;
  143|  17.9k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator15endNamespace_cbEPvPKc:
  178|  7.29k|  static void XMLCALL endNamespace_cb(void* userData, const XML_Char* prefix) noexcept {
  179|  7.29k|    static_cast<XMLValidator*>(userData)->endNamespace(prefix);
  180|  7.29k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator12endNamespaceEPKc:
  145|  7.29k|  void endNamespace(const XML_Char*) noexcept {
  146|  7.29k|    if (namespace_depth_ > 0) {
  ------------------
  |  Branch (146:9): [True: 7.29k, False: 0]
  ------------------
  147|  7.29k|      --namespace_depth_;
  148|  7.29k|    } else {
  149|      0|      setError("Negative depth");
  150|      0|    }
  151|  7.29k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator11startDTD_cbEPvPKcS3_S3_i:
  183|     11|                                  const XML_Char* pubid, int has_internal_subset) noexcept {
  184|     11|    static_cast<XMLValidator*>(userData)->startDTD(doctypeName, sysid, pubid, has_internal_subset);
  185|     11|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator8startDTDEPKcS2_S2_i:
  153|     11|  void startDTD(const XML_Char*, const XML_Char*, const XML_Char*, int) noexcept {
  154|       |    // DOCTYPE is used for XXE attacks.
  155|     11|    setError("DOCTYPE not supported");
  156|     11|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidator8setErrorEPKc:
   89|  5.71k|  void setError(const char* msg) {
   90|  5.71k|    const XML_Size errlinenum = XML_GetCurrentLineNumber(parser_);
   91|  5.71k|    const XML_Size errcolnum = XML_GetCurrentColumnNumber(parser_);
   92|  5.71k|#ifndef SUPPRESS_WARNINGS
   93|  5.71k|    EXV_INFO << "Invalid XML at line " << errlinenum << ", column " << errcolnum << ": " << msg << "\n";
  ------------------
  |  |  134|  5.71k|  if (LogMsg::info >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (134:7): [True: 0, False: 5.71k]
  |  |  |  Branch (134:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  135|  5.71k|  LogMsg(LogMsg::info).os()
  ------------------
   94|  5.71k|#endif
   95|       |    // If this is the first error, then save it.
   96|  5.71k|    if (!haserror_) {
  ------------------
  |  Branch (96:9): [True: 1.41k, False: 4.30k]
  ------------------
   97|  1.41k|      haserror_ = true;
   98|  1.41k|      errmsg_ = msg;
   99|  1.41k|      errlinenum_ = errlinenum;
  100|  1.41k|      errcolnum_ = errcolnum;
  101|  1.41k|    }
  102|  5.71k|  }
xmp.cpp:_ZN12_GLOBAL__N_112XMLValidatorD2Ev:
   85|  3.61k|  ~XMLValidator() {
   86|  3.61k|    XML_ParserFree(parser_);
   87|  3.61k|  }
xmp.cpp:_ZN12_GLOBAL__N_19xmpStructEj:
  955|    440|Exiv2::XmpValue::XmpStruct xmpStruct(XMP_OptionBits opt) {
  956|    440|  Exiv2::XmpValue::XmpStruct var(Exiv2::XmpValue::xsNone);
  957|    440|  if (XMP_PropIsStruct(opt)) {
  ------------------
  |  Branch (957:7): [True: 308, False: 132]
  ------------------
  958|    308|    var = Exiv2::XmpValue::xsStruct;
  959|    308|  }
  960|    440|  return var;
  961|    440|}
xmp.cpp:_ZN12_GLOBAL__N_118xmpArrayOptionBitsEN5Exiv28XmpValue9XmpStructE:
  963|  3.53k|XMP_OptionBits xmpArrayOptionBits(Exiv2::XmpValue::XmpStruct xs) {
  964|  3.53k|  XMP_OptionBits var(0);
  965|  3.53k|  switch (xs) {
  ------------------
  |  Branch (965:11): [True: 3.53k, False: 0]
  ------------------
  966|  3.39k|    case Exiv2::XmpValue::xsNone:
  ------------------
  |  Branch (966:5): [True: 3.39k, False: 144]
  ------------------
  967|  3.39k|      break;
  968|    144|    case Exiv2::XmpValue::xsStruct:
  ------------------
  |  Branch (968:5): [True: 144, False: 3.39k]
  ------------------
  969|    144|      XMP_SetOption(var, kXMP_PropValueIsStruct);
  970|    144|      break;
  971|  3.53k|  }
  972|  3.53k|  return var;
  973|  3.53k|}
xmp.cpp:_ZN12_GLOBAL__N_116arrayValueTypeIdEj:
  975|  1.11k|Exiv2::TypeId arrayValueTypeId(XMP_OptionBits opt) {
  976|  1.11k|  Exiv2::TypeId typeId(Exiv2::invalidTypeId);
  977|  1.11k|  if (XMP_PropIsArray(opt)) {
  ------------------
  |  Branch (977:7): [True: 809, False: 308]
  ------------------
  978|    809|    if (XMP_ArrayIsAlternate(opt))
  ------------------
  |  Branch (978:9): [True: 62, False: 747]
  ------------------
  979|     62|      typeId = Exiv2::xmpAlt;
  980|    747|    else if (XMP_ArrayIsOrdered(opt))
  ------------------
  |  Branch (980:14): [True: 615, False: 132]
  ------------------
  981|    615|      typeId = Exiv2::xmpSeq;
  982|    132|    else if (XMP_ArrayIsUnordered(opt))
  ------------------
  |  Branch (982:14): [True: 132, False: 0]
  ------------------
  983|    132|      typeId = Exiv2::xmpBag;
  984|    809|  }
  985|  1.11k|  return typeId;
  986|  1.11k|}
xmp.cpp:_ZN12_GLOBAL__N_112xmpArrayTypeEj:
  988|    440|Exiv2::XmpValue::XmpArrayType xmpArrayType(XMP_OptionBits opt) {
  989|    440|  return Exiv2::XmpValue::xmpArrayType(arrayValueTypeId(opt));
  990|    440|}
xmp.cpp:_ZN12_GLOBAL__N_118xmpArrayOptionBitsEN5Exiv28XmpValue12XmpArrayTypeE:
  992|  3.53k|XMP_OptionBits xmpArrayOptionBits(Exiv2::XmpValue::XmpArrayType xat) {
  993|  3.53k|  XMP_OptionBits var(0);
  994|  3.53k|  switch (xat) {
  ------------------
  |  Branch (994:11): [True: 3.53k, False: 0]
  ------------------
  995|  3.15k|    case Exiv2::XmpValue::xaNone:
  ------------------
  |  Branch (995:5): [True: 3.15k, False: 380]
  ------------------
  996|  3.15k|      break;
  997|     28|    case Exiv2::XmpValue::xaAlt:
  ------------------
  |  Branch (997:5): [True: 28, False: 3.50k]
  ------------------
  998|     28|      XMP_SetOption(var, kXMP_PropValueIsArray);
  999|     28|      XMP_SetOption(var, kXMP_PropArrayIsAlternate);
 1000|     28|      break;
 1001|    296|    case Exiv2::XmpValue::xaSeq:
  ------------------
  |  Branch (1001:5): [True: 296, False: 3.24k]
  ------------------
 1002|    296|      XMP_SetOption(var, kXMP_PropValueIsArray);
 1003|    296|      XMP_SetOption(var, kXMP_PropArrayIsOrdered);
 1004|    296|      break;
 1005|     56|    case Exiv2::XmpValue::xaBag:
  ------------------
  |  Branch (1005:5): [True: 56, False: 3.48k]
  ------------------
 1006|     56|      XMP_SetOption(var, kXMP_PropValueIsArray);
 1007|     56|      break;
 1008|  3.53k|  }
 1009|  3.53k|  return var;
 1010|  3.53k|}
xmp.cpp:_ZN12_GLOBAL__N_119xmpFormatOptionBitsEN5Exiv29XmpParser14XmpFormatFlagsE:
 1016|    182|XMP_OptionBits xmpFormatOptionBits(Exiv2::XmpParser::XmpFormatFlags flags) {
 1017|    182|  XMP_OptionBits var(0);
 1018|    182|  if (flags & Exiv2::XmpParser::omitPacketWrapper)
  ------------------
  |  Branch (1018:7): [True: 0, False: 182]
  ------------------
 1019|      0|    var |= kXMP_OmitPacketWrapper;
 1020|    182|  if (flags & Exiv2::XmpParser::readOnlyPacket)
  ------------------
  |  Branch (1020:7): [True: 0, False: 182]
  ------------------
 1021|      0|    var |= kXMP_ReadOnlyPacket;
 1022|    182|  if (flags & Exiv2::XmpParser::useCompactFormat)
  ------------------
  |  Branch (1022:7): [True: 182, False: 0]
  ------------------
 1023|    182|    var |= kXMP_UseCompactFormat;
 1024|    182|  if (flags & Exiv2::XmpParser::includeThumbnailPad)
  ------------------
  |  Branch (1024:7): [True: 0, False: 182]
  ------------------
 1025|      0|    var |= kXMP_IncludeThumbnailPad;
 1026|    182|  if (flags & Exiv2::XmpParser::exactPacketLength)
  ------------------
  |  Branch (1026:7): [True: 0, False: 182]
  ------------------
 1027|      0|    var |= kXMP_ExactPacketLength;
 1028|    182|  if (flags & Exiv2::XmpParser::writeAliasComments)
  ------------------
  |  Branch (1028:7): [True: 0, False: 182]
  ------------------
 1029|      0|    var |= kXMP_WriteAliasComments;
 1030|    182|  if (flags & Exiv2::XmpParser::omitAllFormatting)
  ------------------
  |  Branch (1030:7): [True: 54, False: 128]
  ------------------
 1031|     54|    var |= kXMP_OmitAllFormatting;
 1032|    182|  return var;
 1033|    182|}
xmp.cpp:_ZN12_GLOBAL__N_19printNodeERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_j:
 1091|  18.0k|void printNode(const std::string&, const std::string&, const std::string&, XMP_OptionBits) {
 1092|  18.0k|}
_ZN5Exiv28Xmpdatum4ImplD2Ev:
  246|  71.4k|  ~Impl() = default;

_ZN5Exiv225XmpToolkitLifetimeManagerC2Ev:
   33|      1|  XmpToolkitLifetimeManager() {
   34|      1|    if (SXMPMeta::Initialize()) {
  ------------------
  |  Branch (34:9): [True: 1, False: 0]
  ------------------
   35|       |#ifdef EXV_ADOBE_XMPSDK
   36|       |      SXMPMeta::RegisterNamespace("http://ns.adobe.com/lightroom/1.0/", "lr", nullptr);
   37|       |      SXMPMeta::RegisterNamespace("http://rs.tdwg.org/dwc/index.htm", "dwc", nullptr);
   38|       |      SXMPMeta::RegisterNamespace("http://purl.org/dc/terms/", "dcterms", nullptr);
   39|       |      SXMPMeta::RegisterNamespace("http://www.digikam.org/ns/1.0/", "digiKam", nullptr);
   40|       |      SXMPMeta::RegisterNamespace("http://www.digikam.org/ns/kipi/1.0/", "kipi", nullptr);
   41|       |      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.0/", "MicrosoftPhoto", nullptr);
   42|       |      SXMPMeta::RegisterNamespace("http://ns.acdsee.com/iptc/1.0/", "acdsee", nullptr);
   43|       |      SXMPMeta::RegisterNamespace("http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt", nullptr);
   44|       |      SXMPMeta::RegisterNamespace("http://ns.useplus.org/ldf/xmp/1.0/", "plus", nullptr);
   45|       |      SXMPMeta::RegisterNamespace("http://ns.iview-multimedia.com/mediapro/1.0/", "mediapro", nullptr);
   46|       |      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/expressionmedia/1.0/", "expressionmedia", nullptr);
   47|       |      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.2/", "MP", nullptr);
   48|       |      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.2/t/RegionInfo#", "MPRI", nullptr);
   49|       |      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.2/t/Region#", "MPReg", nullptr);
   50|       |      SXMPMeta::RegisterNamespace("http://ns.google.com/photos/1.0/panorama/", "GPano", nullptr);
   51|       |      SXMPMeta::RegisterNamespace("http://www.metadataworkinggroup.com/schemas/regions/", "mwg-rs", nullptr);
   52|       |      SXMPMeta::RegisterNamespace("http://www.metadataworkinggroup.com/schemas/keywords/", "mwg-kw", nullptr);
   53|       |      SXMPMeta::RegisterNamespace("http://ns.adobe.com/xmp/sType/Area#", "stArea", nullptr);
   54|       |      SXMPMeta::RegisterNamespace("http://cipa.jp/exif/1.0/", "exifEX", nullptr);
   55|       |      SXMPMeta::RegisterNamespace("http://ns.adobe.com/camera-raw-saved-settings/1.0/", "crss", nullptr);
   56|       |      SXMPMeta::RegisterNamespace("http://www.audio/", "audio", nullptr);
   57|       |      SXMPMeta::RegisterNamespace("http://www.video/", "video", nullptr);
   58|       |#else
   59|      1|      SXMPMeta::RegisterNamespace("http://ns.adobe.com/lightroom/1.0/", "lr");
   60|      1|      SXMPMeta::RegisterNamespace("http://rs.tdwg.org/dwc/index.htm", "dwc");
   61|      1|      SXMPMeta::RegisterNamespace("http://purl.org/dc/terms/", "dcterms");
   62|      1|      SXMPMeta::RegisterNamespace("http://www.digikam.org/ns/1.0/", "digiKam");
   63|      1|      SXMPMeta::RegisterNamespace("http://www.digikam.org/ns/kipi/1.0/", "kipi");
   64|      1|      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.0/", "MicrosoftPhoto");
   65|      1|      SXMPMeta::RegisterNamespace("http://ns.acdsee.com/iptc/1.0/", "acdsee");
   66|      1|      SXMPMeta::RegisterNamespace("http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt");
   67|      1|      SXMPMeta::RegisterNamespace("http://ns.useplus.org/ldf/xmp/1.0/", "plus");
   68|      1|      SXMPMeta::RegisterNamespace("http://ns.iview-multimedia.com/mediapro/1.0/", "mediapro");
   69|      1|      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/expressionmedia/1.0/", "expressionmedia");
   70|      1|      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.2/", "MP");
   71|      1|      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.2/t/RegionInfo#", "MPRI");
   72|      1|      SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.2/t/Region#", "MPReg");
   73|      1|      SXMPMeta::RegisterNamespace("http://ns.google.com/photos/1.0/panorama/", "GPano");
   74|      1|      SXMPMeta::RegisterNamespace("http://www.metadataworkinggroup.com/schemas/regions/", "mwg-rs");
   75|      1|      SXMPMeta::RegisterNamespace("http://www.metadataworkinggroup.com/schemas/keywords/", "mwg-kw");
   76|      1|      SXMPMeta::RegisterNamespace("http://ns.adobe.com/xmp/sType/Area#", "stArea");
   77|      1|      SXMPMeta::RegisterNamespace("http://cipa.jp/exif/1.0/", "exifEX");
   78|      1|      SXMPMeta::RegisterNamespace("http://ns.adobe.com/camera-raw-saved-settings/1.0/", "crss");
   79|      1|      SXMPMeta::RegisterNamespace("http://www.audio/", "audio");
   80|      1|      SXMPMeta::RegisterNamespace("http://www.video/", "video");
   81|      1|#endif
   82|      1|    } else {
   83|      0|      throw Error(ErrorCode::kerXMPToolkitError, 2, "Failed to initialize XMP Toolkit");
   84|      0|    }
   85|      1|  }
_ZN5Exiv225XmpToolkitLifetimeManagerD2Ev:
   87|      1|  ~XmpToolkitLifetimeManager() {
   88|       |    // Use Unsafe version to avoid acquiring mutex during static destruction.
   89|       |    // This is safe because static destruction is single-threaded per C++ standard.
   90|      1|    XmpProperties::unregisterAllNsNoLock(XmpProperties::LifetimeKey{});
   91|      1|    SXMPMeta::Terminate();
   92|      1|  }

_ZN5Exiv210XmpSidecarC2ENSt3__110unique_ptrINS_7BasicIoENS1_14default_deleteIS3_EEEERKNS_15ImageCtorParamsE:
   30|    639|    Image(ImageType::xmp, mdXmp, std::move(io), params) {
   31|    639|  if (params.create() && io_->open() == 0) {
  ------------------
  |  Branch (31:7): [True: 0, False: 639]
  |  Branch (31:26): [True: 0, False: 0]
  ------------------
   32|      0|    IoCloser closer(*io_);
   33|      0|    io_->write(reinterpret_cast<const byte*>(xmlHeader), xmlHdrCnt);
   34|      0|  }
   35|    639|}  // XmpSidecar::XmpSidecar
_ZN5Exiv210XmpSidecar12readMetadataEv:
   46|    639|void XmpSidecar::readMetadata() {
   47|       |#ifdef EXIV2_DEBUG_MESSAGES
   48|       |  std::cerr << "Reading XMP file " << io_->path() << "\n";
   49|       |#endif
   50|    639|  if (io_->open() != 0) {
  ------------------
  |  Branch (50:7): [True: 0, False: 639]
  ------------------
   51|      0|    throw Error(ErrorCode::kerDataSourceOpenFailed, io_->path(), strError());
   52|      0|  }
   53|    639|  IoCloser closer(*io_);
   54|       |  // Ensure that this is the correct image type
   55|    639|  if (!isXmpType(*io_, false)) {
  ------------------
  |  Branch (55:7): [True: 0, False: 639]
  ------------------
   56|      0|    if (io_->error() || io_->eof())
  ------------------
  |  Branch (56:9): [True: 0, False: 0]
  |  Branch (56:25): [True: 0, False: 0]
  ------------------
   57|      0|      throw Error(ErrorCode::kerFailedToReadImageData);
   58|      0|    throw Error(ErrorCode::kerNotAnImage, "XMP");
   59|      0|  }
   60|       |  // Read the XMP packet from the IO stream
   61|    639|  std::string xmpPacket;
   62|    639|  const long len = 64 * 1024;
   63|    639|  auto buf = std::make_unique<byte[]>(len);
   64|  1.38k|  while (auto l = io_->read(buf.get(), len)) {
  ------------------
  |  Branch (64:15): [True: 741, False: 639]
  ------------------
   65|    741|    xmpPacket.append(reinterpret_cast<char*>(buf.get()), l);
   66|    741|  }
   67|    639|  if (io_->error())
  ------------------
  |  Branch (67:7): [True: 0, False: 639]
  ------------------
   68|      0|    throw Error(ErrorCode::kerFailedToReadImageData);
   69|    639|  clearMetadata();
   70|    639|  xmpPacket_ = std::move(xmpPacket);
   71|    639|  const DecodeParams dp(max_recursion_depth_);
   72|    639|  if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_, dp)) {
  ------------------
  |  Branch (72:7): [True: 638, False: 1]
  |  Branch (72:30): [True: 99, False: 539]
  ------------------
   73|     99|#ifndef SUPPRESS_WARNINGS
   74|     99|    EXV_WARNING << "Failed to decode XMP metadata.\n";
  ------------------
  |  |  138|     99|  if (LogMsg::warn >= LogMsg::level() && LogMsg::handler()) \
  |  |  ------------------
  |  |  |  Branch (138:7): [True: 0, False: 99]
  |  |  |  Branch (138:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  139|     99|  LogMsg(LogMsg::warn).os()
  ------------------
   75|     99|#endif
   76|     99|  }
   77|       |
   78|       |  // #1112 - store dates to deal with loss of TZ information during conversions
   79|    639|  for (const auto& xmp : xmpData_) {
  ------------------
  |  Branch (79:24): [True: 432, False: 639]
  ------------------
   80|    432|    std::string key(xmp.key());
   81|    432|    if (Internal::contains(key, "Date")) {
  ------------------
  |  Branch (81:9): [True: 183, False: 249]
  ------------------
   82|    183|      dates_[key] = xmp.value().toString();
   83|    183|    }
   84|    432|  }
   85|       |
   86|    639|  copyXmpToIptc(xmpData_, iptcData_);
   87|    639|  copyXmpToExif(xmpData_, exifData_);
   88|    639|}  // XmpSidecar::readMetadata
_ZN5Exiv214newXmpInstanceENSt3__110unique_ptrINS_7BasicIoENS0_14default_deleteIS2_EEEERKNS_15ImageCtorParamsE:
  154|    639|Image::UniquePtr newXmpInstance(BasicIo::UniquePtr io, const ImageCtorParams& params) {
  155|    639|  auto image = std::make_unique<XmpSidecar>(std::move(io), params);
  156|    639|  if (!image->good()) {
  ------------------
  |  Branch (156:7): [True: 0, False: 639]
  ------------------
  157|      0|    return nullptr;
  158|      0|  }
  159|    639|  return image;
  160|    639|}
_ZN5Exiv29isXmpTypeERNS_7BasicIoEb:
  162|  12.3k|bool isXmpType(BasicIo& iIo, bool advance) {
  163|       |  /*
  164|       |    Check if the file starts with an optional XML declaration followed by
  165|       |    either an XMP header (<?xpacket ... ?>) or an <x:xmpmeta> element.
  166|       |
  167|       |    In addition, in order for empty XmpSidecar objects as created by
  168|       |    Exiv2 to pass the test, just an XML header is also considered ok.
  169|       |   */
  170|  12.3k|  const int32_t len = 80;
  171|  12.3k|  byte buf[len];
  172|  12.3k|  iIo.read(buf, xmlHdrCnt + 1);
  173|  12.3k|  if (iIo.eof() && 0 == strncmp(reinterpret_cast<const char*>(buf), xmlHeader, xmlHdrCnt)) {
  ------------------
  |  Branch (173:7): [True: 133, False: 12.1k]
  |  Branch (173:20): [True: 3, False: 130]
  ------------------
  174|      3|    return true;
  175|      3|  }
  176|  12.3k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (176:7): [True: 0, False: 12.3k]
  |  Branch (176:22): [True: 130, False: 12.1k]
  ------------------
  177|    130|    return false;
  178|    130|  }
  179|  12.1k|  iIo.read(buf + xmlHdrCnt + 1, len - xmlHdrCnt - 1);
  180|  12.1k|  if (iIo.error() || iIo.eof()) {
  ------------------
  |  Branch (180:7): [True: 0, False: 12.1k]
  |  Branch (180:22): [True: 19, False: 12.1k]
  ------------------
  181|     19|    return false;
  182|     19|  }
  183|       |  // Skip leading BOM
  184|  12.1k|  int32_t start = 0;
  185|  12.1k|  if (0 == strncmp(reinterpret_cast<const char*>(buf), "\xef\xbb\xbf", 3)) {
  ------------------
  |  Branch (185:7): [True: 227, False: 11.9k]
  ------------------
  186|    227|    start = 3;
  187|    227|  }
  188|  12.1k|  bool rc = false;
  189|  12.1k|  std::string head(reinterpret_cast<const char*>(buf + start), len - start);
  190|  12.1k|  if (head.starts_with("<?xml")) {
  ------------------
  |  Branch (190:7): [True: 45, False: 12.1k]
  ------------------
  191|       |    // Forward to the next tag
  192|     45|    auto it = std::find(head.begin() + 5, head.end(), '<');
  193|     45|    if (it != head.end())
  ------------------
  |  Branch (193:9): [True: 35, False: 10]
  ------------------
  194|     35|      head = head.substr(std::distance(head.begin(), it));
  195|     45|  }
  196|  12.1k|  if (head.starts_with("<?xpacket") || head.starts_with("<x:xmpmeta")) {
  ------------------
  |  Branch (196:7): [True: 36, False: 12.1k]
  |  Branch (196:40): [True: 1.87k, False: 10.2k]
  ------------------
  197|  1.91k|    rc = true;
  198|  1.91k|  }
  199|  12.1k|  if (!advance || !rc) {
  ------------------
  |  Branch (199:7): [True: 12.1k, False: 0]
  |  Branch (199:19): [True: 0, False: 0]
  ------------------
  200|  12.1k|    iIo.seek(-(len - start), BasicIo::cur);  // Swallow the BOM
  201|  12.1k|  }
  202|  12.1k|  return rc;
  203|  12.1k|}

XMP_NewExpatAdapter:
   68|  2.20k|{
   69|  2.20k|	return new ExpatAdapter;
   70|  2.20k|}	// XMP_NewExpatAdapter
_ZN12ExpatAdapterC2Ev:
   74|  2.20k|ExpatAdapter::ExpatAdapter() : parser(0)
   75|  2.20k|{
   76|       |
   77|       |	#if XMP_DebugBuild
   78|       |		this->elemNesting = 0;
   79|       |		#if DumpXMLParseEvents
   80|       |			if ( this->parseLog == 0 ) this->parseLog = stdout;
   81|       |		#endif
   82|       |	#endif
   83|       |
   84|  2.20k|	this->parser = XML_ParserCreateNS ( 0, FullNameSeparator );
  ------------------
  |  |   33|  2.20k|#define FullNameSeparator	'@'
  ------------------
   85|  2.20k|	if ( this->parser == 0 ) XMP_Throw ( "Failure creating Expat parser", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (85:7): [True: 0, False: 2.20k]
  ------------------
   86|       |	
   87|  2.20k|	XML_SetUserData ( this->parser, this );
   88|       |	
   89|  2.20k|	XML_SetNamespaceDeclHandler ( this->parser, StartNamespaceDeclHandler, EndNamespaceDeclHandler );
   90|  2.20k|	XML_SetElementHandler ( this->parser, StartElementHandler, EndElementHandler );
   91|       |
   92|  2.20k|	XML_SetCharacterDataHandler ( this->parser, CharacterDataHandler );
   93|  2.20k|	XML_SetCdataSectionHandler ( this->parser, StartCdataSectionHandler, EndCdataSectionHandler );
   94|       |
   95|  2.20k|	XML_SetProcessingInstructionHandler ( this->parser, ProcessingInstructionHandler );
   96|  2.20k|	XML_SetCommentHandler ( this->parser, CommentHandler );
   97|       |
   98|  2.20k|	#if BanAllEntityUsage
   99|  2.20k|		XML_SetStartDoctypeDeclHandler ( this->parser, StartDoctypeDeclHandler );
  100|  2.20k|		isAborted = false;
  101|  2.20k|	#endif
  102|       |
  103|  2.20k|	this->parseStack.push_back ( &this->tree );	// Push the XML root node.
  104|       |
  105|  2.20k|}	// ExpatAdapter::ExpatAdapter
_ZN12ExpatAdapterD2Ev:
  110|  2.20k|{
  111|       |
  112|  2.20k|	if ( this->parser != 0 ) XML_ParserFree ( this->parser );
  ------------------
  |  Branch (112:7): [True: 2.20k, False: 0]
  ------------------
  113|  2.20k|	this->parser = 0;
  114|       |
  115|  2.20k|}	// ExpatAdapter::~ExpatAdapter
_ZN12ExpatAdapter11ParseBufferEPKvmb:
  126|  2.20k|{
  127|  2.20k|	enum XML_Status status;
  128|       |	
  129|  2.20k|	if ( length == 0 ) {	// Expat does not like empty buffers.
  ------------------
  |  Branch (129:7): [True: 0, False: 2.20k]
  ------------------
  130|      0|		if ( ! last ) return;
  ------------------
  |  Branch (130:8): [True: 0, False: 0]
  ------------------
  131|      0|		buffer = kOneSpace;
  132|      0|		length = 1;
  133|      0|	}
  134|       |	
  135|  2.20k|	status = XML_Parse ( this->parser, (const char *)buffer, length, last );
  136|       |	
  137|  2.20k|	#if BanAllEntityUsage
  138|  2.20k|		if ( this->isAborted ) XMP_Throw ( "DOCTYPE is not allowed", kXMPErr_BadXML );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (138:8): [True: 0, False: 2.20k]
  ------------------
  139|  2.20k|	#endif
  140|       |
  141|  2.20k|	if ( status != XML_STATUS_OK ) {
  ------------------
  |  Branch (141:7): [True: 4, False: 2.20k]
  ------------------
  142|       |	
  143|      4|		XMP_StringPtr errMsg = "XML parsing failure";
  144|       |
  145|       |		#if 0	// XMP_DebugBuild	// Disable for now to make test output uniform. Restore later with thread safety.
  146|       |		
  147|       |			// *** This is a good candidate for a callback error notification mechanism.
  148|       |			// *** This code is not thread safe, the sExpatMessage isn't locked. But that's OK for debug usage.
  149|       |
  150|       |			enum XML_Error expatErr = XML_GetErrorCode ( this->parser );
  151|       |			const char *   expatMsg = XML_ErrorString ( expatErr );
  152|       |			int errLine = XML_GetCurrentLineNumber ( this->parser );
  153|       |		
  154|       |			char msgBuffer[1000];
  155|       |			// AUDIT: Use of sizeof(msgBuffer) for snprintf length is safe.
  156|       |			snprintf ( msgBuffer, sizeof(msgBuffer), "# Expat error %d at line %d, \"%s\"", expatErr, errLine, expatMsg );
  157|       |			sExpatMessage = msgBuffer;
  158|       |			errMsg = sExpatMessage.c_str();
  159|       |
  160|       |			#if  DumpXMLParseEvents
  161|       |				if ( this->parseLog != 0 ) fprintf ( this->parseLog, "%s\n", errMsg, expatErr, errLine, expatMsg );
  162|       |			#endif
  163|       |
  164|       |		#endif
  165|       |
  166|      4|		XMP_Throw ( errMsg, kXMPErr_BadXML );
  ------------------
  |  |  199|      4|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  167|       |
  168|      0|	}
  169|       |	
  170|  2.20k|}	// ExpatAdapter::ParseBuffer
ExpatAdapter.cpp:_ZL25StartNamespaceDeclHandlerPvPKcS1_:
  242|  7.26k|{
  243|  7.26k|	IgnoreParam(userData);
  ------------------
  |  |  117|  7.26k|#define IgnoreParam(p)	(void)p
  ------------------
  244|       |	
  245|       |	// As a bug fix hack, change a URI of "http://purl.org/dc/1.1/" to ""http://purl.org/dc/elements/1.1/.
  246|       |	// Early versions of Flash that put XMP in SWF used a bad URI for the dc: namespace.
  247|       |	
  248|       |	#if XMP_DebugBuild & DumpXMLParseEvents		// Avoid unused variable warning.
  249|       |		ExpatAdapter * thiz = (ExpatAdapter*)userData;
  250|       |	#endif
  251|       |
  252|  7.26k|	if ( prefix == 0 ) prefix = "_dflt_";	// Have default namespace.
  ------------------
  |  Branch (252:7): [True: 4, False: 7.26k]
  ------------------
  253|  7.26k|	if ( uri == 0 ) return;	// Ignore, have xmlns:pre="", no URI to register.
  ------------------
  |  Branch (253:7): [True: 4, False: 7.26k]
  ------------------
  254|       |	
  255|       |	#if XMP_DebugBuild & DumpXMLParseEvents
  256|       |		if ( thiz->parseLog != 0 ) {
  257|       |			PrintIndent ( thiz->parseLog, thiz->elemNesting );
  258|       |			fprintf ( thiz->parseLog, "StartNamespace: %s - \"%s\"\n", prefix, uri );
  259|       |		}
  260|       |	#endif
  261|       |	
  262|  7.26k|	if ( XMP_LitMatch ( uri, "http://purl.org/dc/1.1/" ) ) uri = "http://purl.org/dc/elements/1.1/";
  ------------------
  |  |   96|  7.26k|#define XMP_LitMatch(s,l)		(std::strcmp((s),(l)) == 0)
  |  |  ------------------
  |  |  |  Branch (96:28): [True: 134, False: 7.12k]
  |  |  ------------------
  ------------------
  263|  7.26k|	XMPMeta::RegisterNamespace ( uri, prefix );
  264|       |
  265|  7.26k|}	// StartNamespaceDeclHandler
ExpatAdapter.cpp:_ZL23EndNamespaceDeclHandlerPvPKc:
  270|  7.26k|{
  271|  7.26k|	IgnoreParam(userData);
  ------------------
  |  |  117|  7.26k|#define IgnoreParam(p)	(void)p
  ------------------
  272|       |
  273|       |	#if XMP_DebugBuild & DumpXMLParseEvents		// Avoid unused variable warning.
  274|       |		ExpatAdapter * thiz = (ExpatAdapter*)userData;
  275|       |	#endif
  276|       |
  277|  7.26k|	if ( prefix == 0 ) prefix = "_dflt_";	// Have default namespace.
  ------------------
  |  Branch (277:7): [True: 4, False: 7.26k]
  ------------------
  278|       |	
  279|       |	#if XMP_DebugBuild & DumpXMLParseEvents
  280|       |		if ( thiz->parseLog != 0 ) {
  281|       |			PrintIndent ( thiz->parseLog, thiz->elemNesting );
  282|       |			fprintf ( thiz->parseLog, "EndNamespace: %s\n", prefix );
  283|       |		}
  284|       |	#endif
  285|       |	
  286|       |	// ! Nothing to do, Expat has done all of the XML processing.
  287|       |
  288|  7.26k|}	// EndNamespaceDeclHandler
ExpatAdapter.cpp:_ZL19StartElementHandlerPvPKcPS1_:
  293|  13.7k|{
  294|  13.7k|	XMP_Assert ( attrs != 0 );
  ------------------
  |  |  142|  13.7k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  295|  13.7k|	ExpatAdapter * thiz = (ExpatAdapter*)userData;
  296|       |	
  297|  13.7k|	size_t attrCount = 0;
  298|  36.8k|	for ( XMP_StringPtr* a = attrs; *a != 0; ++a ) ++attrCount;
  ------------------
  |  Branch (298:34): [True: 23.0k, False: 13.7k]
  ------------------
  299|  13.7k|	if ( (attrCount & 1) != 0 )	XMP_Throw ( "Expat attribute info has odd length", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (299:7): [True: 0, False: 13.7k]
  ------------------
  300|  13.7k|	attrCount = attrCount/2;	// They are name/value pairs.
  301|       |	
  302|       |	#if XMP_DebugBuild & DumpXMLParseEvents
  303|       |		if ( thiz->parseLog != 0 ) {
  304|       |			PrintIndent ( thiz->parseLog, thiz->elemNesting );
  305|       |			fprintf ( thiz->parseLog, "StartElement: %s, %d attrs", name, attrCount );
  306|       |			for ( XMP_StringPtr* attr = attrs; *attr != 0; attr += 2 ) {
  307|       |				XMP_StringPtr attrName = *attr;
  308|       |				XMP_StringPtr attrValue = *(attr+1);
  309|       |				fprintf ( thiz->parseLog, ", %s = \"%s\"", attrName, attrValue );
  310|       |			}
  311|       |			fprintf ( thiz->parseLog, "\n" );
  312|       |		}
  313|       |	#endif
  314|       |
  315|  13.7k|	XML_Node * parentNode = thiz->parseStack.back();
  316|  13.7k|	XML_Node * elemNode   = new XML_Node ( parentNode, "", kElemNode );
  317|       |	
  318|  13.7k|	SetQualName ( name, elemNode );
  319|       |	
  320|  25.3k|	for ( XMP_StringPtr* attr = attrs; *attr != 0; attr += 2 ) {
  ------------------
  |  Branch (320:37): [True: 11.5k, False: 13.7k]
  ------------------
  321|       |
  322|  11.5k|		XMP_StringPtr attrName = *attr;
  323|  11.5k|		XMP_StringPtr attrValue = *(attr+1);
  324|  11.5k|		XML_Node * attrNode = new XML_Node ( elemNode, "", kAttrNode );
  325|       |
  326|  11.5k|		SetQualName ( attrName, attrNode );
  327|  11.5k|		attrNode->value = attrValue;
  328|  11.5k|		if ( attrNode->name == "xml:lang" ) NormalizeLangValue ( &attrNode->value );
  ------------------
  |  Branch (328:8): [True: 384, False: 11.1k]
  ------------------
  329|  11.5k|		elemNode->attrs.push_back ( attrNode );
  330|       |
  331|  11.5k|	}
  332|       |	
  333|  13.7k|	parentNode->content.push_back ( elemNode );
  334|  13.7k|	thiz->parseStack.push_back ( elemNode );
  335|       |	
  336|  13.7k|	if ( elemNode->name == "rdf:RDF" ) {
  ------------------
  |  Branch (336:7): [True: 2.03k, False: 11.7k]
  ------------------
  337|  2.03k|		thiz->rootNode = elemNode;
  338|  2.03k|		++thiz->rootCount;
  339|  2.03k|	}
  340|       |	#if XMP_DebugBuild
  341|       |		++thiz->elemNesting;
  342|       |	#endif
  343|       |
  344|  13.7k|}	// StartElementHandler
ExpatAdapter.cpp:_ZL11SetQualNamePKcP8XML_Node:
  187|  25.3k|{
  188|       |	// Expat delivers the full name as a catenation of namespace URI, separator, and local name.
  189|       |
  190|       |	// As a compatibility hack, an "about" or "ID" attribute of an rdf:Description element is
  191|       |	// changed to "rdf:about" or rdf:ID. Easier done here than in the RDF recognizer.
  192|       |	
  193|       |	// As a bug fix hack, change a URI of "http://purl.org/dc/1.1/" to ""http://purl.org/dc/elements/1.1/.
  194|       |	// Early versions of Flash that put XMP in SWF used a bad URI for the dc: namespace.
  195|       |
  196|       |	// ! This code presumes the RDF namespace prefix is "rdf".
  197|       |
  198|  25.3k|	size_t sepPos = strlen(fullName);
  199|   324k|	for ( --sepPos; sepPos > 0; --sepPos ) {
  ------------------
  |  Branch (199:18): [True: 322k, False: 1.52k]
  ------------------
  200|   322k|		if ( fullName[sepPos] == FullNameSeparator ) break;
  ------------------
  |  |   33|   322k|#define FullNameSeparator	'@'
  ------------------
  |  Branch (200:8): [True: 23.7k, False: 299k]
  ------------------
  201|   322k|	}
  202|       |
  203|  25.3k|	if ( fullName[sepPos] == FullNameSeparator ) {
  ------------------
  |  |   33|  25.3k|#define FullNameSeparator	'@'
  ------------------
  |  Branch (203:7): [True: 23.7k, False: 1.52k]
  ------------------
  204|       |
  205|  23.7k|		XMP_StringPtr prefix;
  206|  23.7k|		XMP_StringLen prefixLen;
  207|  23.7k|		XMP_StringPtr localPart = fullName + sepPos + 1;
  208|       |
  209|  23.7k|		node->ns.assign ( fullName, sepPos );
  210|  23.7k|		if ( node->ns == "http://purl.org/dc/1.1/" ) node->ns = "http://purl.org/dc/elements/1.1/";
  ------------------
  |  Branch (210:8): [True: 327, False: 23.4k]
  ------------------
  211|       |
  212|  23.7k|		bool found = XMPMeta::GetNamespacePrefix ( node->ns.c_str(), &prefix, &prefixLen );
  213|  23.7k|		if ( ! found ) XMP_Throw ( "Unknown URI in Expat full name", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (213:8): [True: 0, False: 23.7k]
  ------------------
  214|  23.7k|		node->nsPrefixLen = prefixLen;	// ! Includes the ':'.
  215|       |		
  216|  23.7k|		node->name = prefix;
  217|  23.7k|		node->name += localPart;
  218|       |
  219|  23.7k|	} else {
  220|       |
  221|  1.52k|		node->name = fullName;	// The name is not in a namespace.
  222|       |	
  223|  1.52k|		if ( node->parent->name == "rdf:Description" ) {
  ------------------
  |  Branch (223:8): [True: 394, False: 1.12k]
  ------------------
  224|    394|			if ( node->name == "about" ) {
  ------------------
  |  Branch (224:9): [True: 175, False: 219]
  ------------------
  225|    175|				node->ns   = kXMP_NS_RDF;
  226|    175|				node->name = "rdf:about";
  227|    175|				node->nsPrefixLen = 4;	// ! Include the ':'.
  228|    219|			} else if ( node->name == "ID" ) {
  ------------------
  |  Branch (228:16): [True: 6, False: 213]
  ------------------
  229|      6|				node->ns   = kXMP_NS_RDF;
  230|      6|				node->name = "rdf:ID";
  231|      6|				node->nsPrefixLen = 4;	// ! Include the ':'.
  232|      6|			}
  233|    394|		}
  234|       |		
  235|  1.52k|	}
  236|       |
  237|  25.3k|}	// SetQualName
ExpatAdapter.cpp:_ZL17EndElementHandlerPvPKc:
  349|  13.7k|{
  350|  13.7k|	IgnoreParam(name);
  ------------------
  |  |  117|  13.7k|#define IgnoreParam(p)	(void)p
  ------------------
  351|       |	
  352|  13.7k|	ExpatAdapter * thiz = (ExpatAdapter*)userData;
  353|       |
  354|       |	#if XMP_DebugBuild
  355|       |		--thiz->elemNesting;
  356|       |	#endif
  357|  13.7k|	(void) thiz->parseStack.pop_back();
  358|       |	
  359|       |	#if XMP_DebugBuild & DumpXMLParseEvents
  360|       |		if ( thiz->parseLog != 0 ) {
  361|       |			PrintIndent ( thiz->parseLog, thiz->elemNesting );
  362|       |			fprintf ( thiz->parseLog, "EndElement: %s\n", name );
  363|       |		}
  364|       |	#endif
  365|       |
  366|  13.7k|}	// EndElementHandler
ExpatAdapter.cpp:_ZL20CharacterDataHandlerPvPKci:
  371|  38.0k|{
  372|  38.0k|	ExpatAdapter * thiz = (ExpatAdapter*)userData;
  373|       |	
  374|  38.0k|	if ( (cData == 0) || (len == 0) ) { cData = ""; len = 0; }
  ------------------
  |  Branch (374:7): [True: 0, False: 38.0k]
  |  Branch (374:23): [True: 0, False: 38.0k]
  ------------------
  375|       |	
  376|       |	#if XMP_DebugBuild & DumpXMLParseEvents
  377|       |		if ( thiz->parseLog != 0 ) {
  378|       |			PrintIndent ( thiz->parseLog, thiz->elemNesting );
  379|       |			fprintf ( thiz->parseLog, "CharContent: \"" );
  380|       |			for ( int i = 0; i < len; ++i ) fprintf ( thiz->parseLog, "%c", cData[i] );
  381|       |			fprintf ( thiz->parseLog, "\"\n" );
  382|       |		}
  383|       |	#endif
  384|       |	
  385|  38.0k|	XML_Node * parentNode = thiz->parseStack.back();
  386|  38.0k|	XML_Node * cDataNode  = new XML_Node ( parentNode, "", kCDataNode );
  387|       |	
  388|  38.0k|	cDataNode->value.assign ( cData, len );
  389|  38.0k|	parentNode->content.push_back ( cDataNode );
  390|       |	
  391|  38.0k|}	// CharacterDataHandler
ExpatAdapter.cpp:_ZL28ProcessingInstructionHandlerPvPKcS1_:
  436|  1.29k|{
  437|  1.29k|	XMP_Assert ( target != 0 );
  ------------------
  |  |  142|  1.29k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  438|  1.29k|	ExpatAdapter * thiz = (ExpatAdapter*)userData;
  439|       |
  440|  1.29k|	if ( ! XMP_LitMatch ( target, "xpacket" ) ) return;	// Ignore all PIs except the XMP packet wrapper.
  ------------------
  |  |   96|  1.29k|#define XMP_LitMatch(s,l)		(std::strcmp((s),(l)) == 0)
  ------------------
  |  Branch (440:7): [True: 692, False: 606]
  ------------------
  441|    606|	if ( data == 0 ) data = "";
  ------------------
  |  Branch (441:7): [True: 0, False: 606]
  ------------------
  442|       |	
  443|       |	#if XMP_DebugBuild & DumpXMLParseEvents
  444|       |		if ( thiz->parseLog != 0 ) {
  445|       |			PrintIndent ( thiz->parseLog, thiz->elemNesting );
  446|       |			fprintf ( thiz->parseLog, "PI: %s - \"%s\"\n", target, data );
  447|       |		}
  448|       |	#endif
  449|       |	
  450|    606|	XML_Node * parentNode = thiz->parseStack.back();
  451|    606|	XML_Node * piNode  = new XML_Node ( parentNode, target, kPINode );
  452|       |	
  453|    606|	piNode->value.assign ( data );
  454|    606|	parentNode->content.push_back ( piNode );
  455|       |	
  456|    606|}	// ProcessingInstructionHandler

_Z10ProcessRDFP8XMP_NodeRK8XML_Nodej:
  624|  1.95k|{
  625|  1.95k|	IgnoreParam(options);
  ------------------
  |  |  117|  1.95k|#define IgnoreParam(p)	(void)p
  ------------------
  626|       |	
  627|  1.95k|	RDF_RDF ( xmpTree, rdfNode );
  628|       |
  629|  1.95k|}	// ProcessRDF
ParseRDF.cpp:_ZL7RDF_RDFP8XMP_NodeRK8XML_Node:
  646|  1.95k|{
  647|       |
  648|  1.95k|	if ( ! xmlNode.attrs.empty() ) XMP_Throw ( "Invalid attributes of rdf:RDF element", kXMPErr_BadRDF );
  ------------------
  |  |  199|     12|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (648:7): [True: 12, False: 1.94k]
  ------------------
  649|  1.94k|	RDF_NodeElementList ( xmpTree, xmlNode, kIsTopLevel );
  650|       |
  651|  1.94k|}	// RDF_RDF
ParseRDF.cpp:_ZL19RDF_NodeElementListP8XMP_NodeRK8XML_Nodeb:
  663|  1.94k|{
  664|  1.94k|	XMP_Assert ( isTopLevel );
  ------------------
  |  |  142|  1.94k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  665|       |	
  666|  1.94k|	XML_cNodePos currChild = xmlParent.content.begin();	// *** Change these loops to the indexed pattern.
  667|  1.94k|	XML_cNodePos endChild  = xmlParent.content.end();
  668|       |
  669|  5.42k|	for ( ; currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (669:10): [True: 3.47k, False: 1.94k]
  ------------------
  670|  3.47k|		if ( (*currChild)->IsWhitespaceNode() ) continue;
  ------------------
  |  Branch (670:8): [True: 1.52k, False: 1.94k]
  ------------------
  671|  1.94k|		RDF_NodeElement ( xmpParent, **currChild, isTopLevel );
  672|  1.94k|	}
  673|       |
  674|  1.94k|}	// RDF_NodeElementList
ParseRDF.cpp:_ZL15RDF_NodeElementP8XMP_NodeRK8XML_Nodeb:
  694|  3.09k|{
  695|  3.09k|	RDFTermKind nodeTerm = GetRDFTermKind ( xmlNode.name );
  696|  3.09k|	if ( (nodeTerm != kRDFTerm_Description) && (nodeTerm != kRDFTerm_Other) ) {
  ------------------
  |  Branch (696:7): [True: 1.25k, False: 1.84k]
  |  Branch (696:45): [True: 3, False: 1.25k]
  ------------------
  697|      3|		XMP_Throw ( "Node element must be rdf:Description or typedNode", kXMPErr_BadRDF );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  698|      0|	}
  699|       |
  700|  3.09k|	if ( isTopLevel && (nodeTerm == kRDFTerm_Other) ) {
  ------------------
  |  Branch (700:7): [True: 1.94k, False: 1.14k]
  |  Branch (700:21): [True: 103, False: 1.84k]
  ------------------
  701|    103|		XMP_Throw ( "Top level typedNode not allowed", kXMPErr_BadXMP );
  ------------------
  |  |  199|    103|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  702|  2.99k|	} else {
  703|  2.99k|		RDF_NodeElementAttrs ( xmpParent, xmlNode, isTopLevel );
  704|  2.99k|		RDF_PropertyElementList ( xmpParent, xmlNode, isTopLevel );
  705|  2.99k|	}
  706|       |
  707|  3.09k|}	// RDF_NodeElement
ParseRDF.cpp:_ZL14GetRDFTermKindRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
  264|  18.5k|{
  265|  18.5k|	RDFTermKind term = kRDFTerm_Other;
  266|       |
  267|       |	// Arranged to hopefully minimize the parse time for large XMP.
  268|       |
  269|  18.5k|	if ( (name.size() > 4) && (strncmp ( name.c_str(), "rdf:", 4 ) == 0) ) {
  ------------------
  |  Branch (269:7): [True: 18.4k, False: 94]
  |  Branch (269:28): [True: 7.21k, False: 11.1k]
  ------------------
  270|       |
  271|  7.21k|		if ( name == "rdf:li" ) {
  ------------------
  |  Branch (271:8): [True: 2.21k, False: 5.00k]
  ------------------
  272|  2.21k|			term = kRDFTerm_li;
  273|  5.00k|		} else if ( name == "rdf:parseType" ) {
  ------------------
  |  Branch (273:15): [True: 11, False: 4.98k]
  ------------------
  274|     11|			term = kRDFTerm_parseType;
  275|  4.98k|		} else if ( name == "rdf:Description" ) {
  ------------------
  |  Branch (275:15): [True: 1.84k, False: 3.14k]
  ------------------
  276|  1.84k|			term = kRDFTerm_Description;
  277|  3.14k|		} else if ( name == "rdf:about" ) {
  ------------------
  |  Branch (277:15): [True: 304, False: 2.84k]
  ------------------
  278|    304|			term = kRDFTerm_about;
  279|  2.84k|		} else if ( name == "rdf:resource" ) {
  ------------------
  |  Branch (279:15): [True: 6, False: 2.83k]
  ------------------
  280|      6|			term = kRDFTerm_resource;
  281|  2.83k|		} else if ( name == "rdf:RDF" ) {
  ------------------
  |  Branch (281:15): [True: 13, False: 2.82k]
  ------------------
  282|     13|			term = kRDFTerm_RDF;
  283|  2.82k|		} else if ( name == "rdf:ID" ) {
  ------------------
  |  Branch (283:15): [True: 199, False: 2.62k]
  ------------------
  284|    199|			term = kRDFTerm_ID;
  285|  2.62k|		} else if ( name == "rdf:nodeID" ) {
  ------------------
  |  Branch (285:15): [True: 38, False: 2.58k]
  ------------------
  286|     38|			term = kRDFTerm_nodeID;
  287|  2.58k|		} else if ( name == "rdf:datatype" ) {
  ------------------
  |  Branch (287:15): [True: 1, False: 2.58k]
  ------------------
  288|      1|			term = kRDFTerm_datatype;
  289|  2.58k|		} else if ( name == "rdf:aboutEach" ) {
  ------------------
  |  Branch (289:15): [True: 21, False: 2.56k]
  ------------------
  290|     21|			term = kRDFTerm_aboutEach;
  291|  2.56k|		} else if ( name == "rdf:aboutEachPrefix" ) {
  ------------------
  |  Branch (291:15): [True: 0, False: 2.56k]
  ------------------
  292|      0|			term = kRDFTerm_aboutEachPrefix;
  293|  2.56k|		} else if ( name == "rdf:bagID" ) {
  ------------------
  |  Branch (293:15): [True: 21, False: 2.54k]
  ------------------
  294|     21|			term = kRDFTerm_bagID;
  295|     21|		}
  296|       |
  297|  7.21k|	}
  298|       |
  299|  18.5k|	return term;
  300|       |
  301|  18.5k|}	// GetRDFTermKind
ParseRDF.cpp:_ZL20RDF_NodeElementAttrsP8XMP_NodeRK8XML_Nodeb:
  731|  2.99k|{
  732|  2.99k|	XMP_OptionBits exclusiveAttrs = 0;	// Used to detect attributes that are mutually exclusive.
  733|       |
  734|  2.99k|	XML_cNodePos currAttr = xmlNode.attrs.begin();
  735|  2.99k|	XML_cNodePos endAttr  = xmlNode.attrs.end();
  736|       |
  737|  11.0k|	for ( ; currAttr != endAttr; ++currAttr ) {
  ------------------
  |  Branch (737:10): [True: 8.38k, False: 2.69k]
  ------------------
  738|       |
  739|  8.38k|		RDFTermKind attrTerm = GetRDFTermKind ( (*currAttr)->name );
  740|       |
  741|  8.38k|		switch ( attrTerm ) {
  742|       |
  743|     57|			case kRDFTerm_ID     :
  ------------------
  |  Branch (743:4): [True: 57, False: 8.32k]
  ------------------
  744|     74|			case kRDFTerm_nodeID :
  ------------------
  |  Branch (744:4): [True: 17, False: 8.36k]
  ------------------
  745|    376|			case kRDFTerm_about  :
  ------------------
  |  Branch (745:4): [True: 302, False: 8.07k]
  ------------------
  746|       |
  747|    376|				if ( exclusiveAttrs & kExclusiveAttrMask ) XMP_Throw ( "Mutally exclusive about, ID, nodeID attributes", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (747:10): [True: 0, False: 376]
  ------------------
  748|    376|				exclusiveAttrs |= (1 << attrTerm);
  749|       |
  750|    376|				if ( isTopLevel && (attrTerm == kRDFTerm_about) ) {
  ------------------
  |  Branch (750:10): [True: 376, False: 0]
  |  Branch (750:24): [True: 302, False: 74]
  ------------------
  751|       |					// This is the rdf:about attribute on a top level node. Set the XMP tree name if
  752|       |					// it doesn't have a name yet. Make sure this name matches the XMP tree name.
  753|    302|					XMP_Assert ( xmpParent->parent == 0 );	// Must be the tree root node.
  ------------------
  |  |  142|    302|	#define XMP_Assert(c)	((void) 0)
  ------------------
  754|    302|					if ( xmpParent->name.empty() ) {
  ------------------
  |  Branch (754:11): [True: 302, False: 0]
  ------------------
  755|    302|						xmpParent->name = (*currAttr)->value;
  756|    302|					} else if ( ! (*currAttr)->value.empty() ) {
  ------------------
  |  Branch (756:18): [True: 0, False: 0]
  ------------------
  757|      0|						if ( xmpParent->name != (*currAttr)->value ) XMP_Throw ( "Mismatched top level rdf:about values", kXMPErr_BadXMP );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (757:12): [True: 0, False: 0]
  ------------------
  758|      0|					}
  759|    302|				}
  760|       |
  761|    376|				break;
  762|       |
  763|  7.94k|			case kRDFTerm_Other :
  ------------------
  |  Branch (763:4): [True: 7.94k, False: 437]
  ------------------
  764|  7.94k|				AddChildNode ( xmpParent, **currAttr, (*currAttr)->value.c_str(), isTopLevel );
  765|  7.94k|				break;
  766|       |
  767|     61|			default :
  ------------------
  |  Branch (767:4): [True: 61, False: 8.32k]
  ------------------
  768|     61|				XMP_Throw ( "Invalid nodeElement attribute", kXMPErr_BadRDF );
  ------------------
  |  |  199|     61|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  769|       |
  770|  8.38k|		}
  771|       |
  772|  8.38k|	}
  773|       |
  774|  2.99k|}	// RDF_NodeElementAttrs
ParseRDF.cpp:_ZL12AddChildNodeP8XMP_NodeRK8XML_NodePKcb:
  362|  13.3k|{
  363|       |	#if 0
  364|       |		cout << "AddChildNode, parent = " << xmpParent->name << ", child = " << xmlNode.name;
  365|       |		cout << ", value = \"" << value << '"';
  366|       |		if ( isTopLevel ) cout << ", top level";
  367|       |		cout << endl;
  368|       |	#endif
  369|       |	
  370|  13.3k|	if ( xmlNode.ns.empty() ) {
  ------------------
  |  Branch (370:7): [True: 219, False: 13.0k]
  ------------------
  371|    219|		XMP_Throw ( "XML namespace required for all elements and attributes", kXMPErr_BadRDF );
  ------------------
  |  |  199|    219|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  372|      0|	}
  373|       |		
  374|  13.0k|	XMP_StringPtr  childName    = xmlNode.name.c_str();
  375|  13.0k|	const bool     isArrayItem  = (xmlNode.name == "rdf:li");
  376|  13.0k|	const bool     isValueNode  = (xmlNode.name == "rdf:value");
  377|  13.0k|	XMP_OptionBits childOptions = 0;
  378|       |	
  379|  13.0k|	if ( isTopLevel ) {
  ------------------
  |  Branch (379:7): [True: 9.91k, False: 3.18k]
  ------------------
  380|       |
  381|       |		// Lookup the schema node, adjust the XMP parent pointer.
  382|  9.91k|		XMP_Assert ( xmpParent->parent == 0 );	// Incoming parent must be the tree root.
  ------------------
  |  |  142|  9.91k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  383|  9.91k|		XMP_Node * schemaNode = FindSchemaNode ( xmpParent, xmlNode.ns.c_str(), kXMP_CreateNodes );
  ------------------
  |  |  295|  9.91k|#define kXMP_CreateNodes	true
  ------------------
  384|  9.91k|		if ( schemaNode->options & kXMP_NewImplicitNode ) schemaNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|  9.91k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
              		if ( schemaNode->options & kXMP_NewImplicitNode ) schemaNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|  3.36k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (384:8): [True: 3.36k, False: 6.54k]
  ------------------
  385|       |			// *** Should use "opt &= ~flag" (no conditional), need runtime check for proper 32 bit code.
  386|  9.91k|		xmpParent = schemaNode;
  387|       |		
  388|       |		// If this is an alias set the isAlias flag in the node and the hasAliases flag in the tree.
  389|  9.91k|		if ( sRegisteredAliasMap->find ( xmlNode.name ) != sRegisteredAliasMap->end() ) {
  ------------------
  |  Branch (389:8): [True: 0, False: 9.91k]
  ------------------
  390|      0|			childOptions |= kXMP_PropIsAlias;
  391|      0|			schemaNode->parent->options |= kXMP_PropHasAliases;
  392|      0|		}
  393|       |		
  394|  9.91k|	}
  395|       |
  396|       |	// Make sure that this is not a duplicate of a named node.
  397|  13.0k|	if ( ! (isArrayItem | isValueNode) ) {
  ------------------
  |  Branch (397:7): [True: 10.8k, False: 2.23k]
  ------------------
  398|  10.8k|		if ( FindChildNode ( xmpParent, childName, kXMP_ExistingOnly ) != 0 ) {
  ------------------
  |  |  296|  10.8k|#define kXMP_ExistingOnly	false
  ------------------
  |  Branch (398:8): [True: 0, False: 10.8k]
  ------------------
  399|      0|			XMP_Throw ( "Duplicate property or field node", kXMPErr_BadXMP );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  400|      0|		}
  401|       |		
  402|  10.8k|	}
  403|       |	
  404|       |	// Add the new child to the XMP parent node.
  405|  13.0k|	XMP_Node * newChild = new XMP_Node ( xmpParent, childName, value, childOptions );
  406|  13.0k|	if ( (! isValueNode) || xmpParent->children.empty() ) {
  ------------------
  |  Branch (406:7): [True: 13.0k, False: 37]
  |  Branch (406:26): [True: 18, False: 19]
  ------------------
  407|  13.0k|		 xmpParent->children.push_back ( newChild );
  408|  13.0k|	} else {
  409|     28|		 xmpParent->children.insert ( xmpParent->children.begin(), newChild );
  410|     28|	}
  411|  13.0k|	if ( isValueNode ) {
  ------------------
  |  Branch (411:7): [True: 37, False: 13.0k]
  ------------------
  412|     37|		if ( isTopLevel || (! (xmpParent->options & kXMP_PropValueIsStruct)) ) XMP_Throw ( "Misplaced rdf:value element", kXMPErr_BadRDF );
  ------------------
  |  |  199|     37|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (412:8): [True: 37, False: 0]
  |  Branch (412:22): [True: 0, False: 0]
  ------------------
  413|      0|		xmpParent->options |= kRDF_HasValueElem;
  414|      0|	}
  415|       |	
  416|  13.0k|	if ( isArrayItem ) {
  ------------------
  |  Branch (416:7): [True: 2.19k, False: 10.8k]
  ------------------
  417|  2.19k|		if ( ! (xmpParent->options & kXMP_PropValueIsArray) ) XMP_Throw ( "Misplaced rdf:li element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      2|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (417:8): [True: 2, False: 2.19k]
  ------------------
  418|  2.19k|		newChild->name = kXMP_ArrayItemName;
  ------------------
  |  |  293|  2.19k|#define kXMP_ArrayItemName	"[]"
  ------------------
  419|       |		#if 0	// *** XMP_DebugBuild
  420|       |			newChild->_namePtr = newChild->name.c_str();
  421|       |		#endif
  422|  2.19k|	}
  423|       |	
  424|  13.0k|	return newChild;
  425|       |
  426|  13.0k|}	// AddChildNode
ParseRDF.cpp:_ZL23RDF_PropertyElementListP8XMP_NodeRK8XML_Nodeb:
  786|  2.69k|{
  787|  2.69k|	XML_cNodePos currChild = xmlParent.content.begin();
  788|  2.69k|	XML_cNodePos endChild  = xmlParent.content.end();
  789|       |
  790|  17.2k|	for ( ; currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (790:10): [True: 14.6k, False: 2.60k]
  ------------------
  791|  14.6k|		if ( (*currChild)->IsWhitespaceNode() ) continue;
  ------------------
  |  Branch (791:8): [True: 10.1k, False: 4.51k]
  ------------------
  792|  4.51k|		if ( (*currChild)->kind != kElemNode ) {
  ------------------
  |  Branch (792:8): [True: 93, False: 4.42k]
  ------------------
  793|     93|			XMP_Throw ( "Expected property element node not found", kXMPErr_BadRDF );
  ------------------
  |  |  199|     93|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  794|      0|		}
  795|  4.42k|		RDF_PropertyElement ( xmpParent, **currChild, isTopLevel );
  796|  4.42k|	}
  797|       |
  798|  2.69k|}	// RDF_PropertyElementList
ParseRDF.cpp:_ZL19RDF_PropertyElementP8XMP_NodeRK8XML_Nodeb:
  853|  4.42k|{
  854|  4.42k|	RDFTermKind nodeTerm = GetRDFTermKind ( xmlNode.name );
  855|  4.42k|	if ( ! IsPropertyElementName ( nodeTerm ) ) XMP_Throw ( "Invalid property element name", kXMPErr_BadRDF );
  ------------------
  |  |  199|      4|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (855:7): [True: 4, False: 4.41k]
  ------------------
  856|       |	
  857|  4.41k|	if ( xmlNode.attrs.size() > 3 ) {
  ------------------
  |  Branch (857:7): [True: 124, False: 4.29k]
  ------------------
  858|       |
  859|       |		// Only an emptyPropertyElt can have more than 3 attributes.
  860|    124|		RDF_EmptyPropertyElement ( xmpParent, xmlNode, isTopLevel );
  861|       |
  862|  4.29k|	} else {
  863|       |
  864|       |		// Look through the attributes for one that isn't rdf:ID or xml:lang, it will usually tell
  865|       |		// what we should be dealing with. The called routines must verify their specific syntax!
  866|       |
  867|  4.29k|		XML_cNodePos currAttr = xmlNode.attrs.begin();
  868|  4.29k|		XML_cNodePos endAttr  = xmlNode.attrs.end();
  869|  4.29k|		XMP_VarString * attrName = 0;
  870|       |
  871|  4.58k|		for ( ; currAttr != endAttr; ++currAttr ) {
  ------------------
  |  Branch (871:11): [True: 629, False: 3.95k]
  ------------------
  872|    629|			attrName = &((*currAttr)->name);
  873|    629|			if ( (*attrName != "xml:lang") && (*attrName != "rdf:ID") ) break;
  ------------------
  |  Branch (873:9): [True: 408, False: 221]
  |  Branch (873:38): [True: 336, False: 72]
  ------------------
  874|    629|		}
  875|       |
  876|  4.29k|		if ( currAttr != endAttr ) {
  ------------------
  |  Branch (876:8): [True: 336, False: 3.95k]
  ------------------
  877|       |
  878|    336|			XMP_Assert ( attrName != 0 );
  ------------------
  |  |  142|    336|	#define XMP_Assert(c)	((void) 0)
  ------------------
  879|    336|			XMP_VarString& attrValue = (*currAttr)->value;
  880|       |
  881|    336|			if ( *attrName == "rdf:datatype" ) {
  ------------------
  |  Branch (881:9): [True: 0, False: 336]
  ------------------
  882|      0|				RDF_LiteralPropertyElement ( xmpParent, xmlNode, isTopLevel );
  883|    336|			} else if ( *attrName != "rdf:parseType" ) {
  ------------------
  |  Branch (883:16): [True: 326, False: 10]
  ------------------
  884|    326|				RDF_EmptyPropertyElement ( xmpParent, xmlNode, isTopLevel );
  885|    326|			} else if ( attrValue == "Literal" ) {
  ------------------
  |  Branch (885:16): [True: 0, False: 10]
  ------------------
  886|      0|				RDF_ParseTypeLiteralPropertyElement ( xmpParent, xmlNode, isTopLevel );
  887|     10|			} else if ( attrValue == "Resource" ) {
  ------------------
  |  Branch (887:16): [True: 0, False: 10]
  ------------------
  888|      0|				RDF_ParseTypeResourcePropertyElement ( xmpParent, xmlNode, isTopLevel );
  889|     10|			} else if ( attrValue == "Collection" ) {
  ------------------
  |  Branch (889:16): [True: 0, False: 10]
  ------------------
  890|      0|				RDF_ParseTypeCollectionPropertyElement ( xmpParent, xmlNode, isTopLevel );
  891|     10|			} else {
  892|     10|				RDF_ParseTypeOtherPropertyElement ( xmpParent, xmlNode, isTopLevel );
  893|     10|			}
  894|       |
  895|  3.95k|		} else {
  896|       |
  897|       |			// Only rdf:ID and xml:lang, could be a resourcePropertyElt, a literalPropertyElt, or an.
  898|       |			// emptyPropertyElt. Look at the child XML nodes to decide which.
  899|       |
  900|  3.95k|			if ( xmlNode.content.empty() ) {
  ------------------
  |  Branch (900:9): [True: 583, False: 3.37k]
  ------------------
  901|       |
  902|    583|				RDF_EmptyPropertyElement ( xmpParent, xmlNode, isTopLevel );
  903|       |
  904|  3.37k|			} else {
  905|       |			
  906|  3.37k|				XML_cNodePos currChild = xmlNode.content.begin();
  907|  3.37k|				XML_cNodePos endChild  = xmlNode.content.end();
  908|       |
  909|  9.24k|				for ( ; currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (909:13): [True: 7.04k, False: 2.20k]
  ------------------
  910|  7.04k|					if ( (*currChild)->kind != kCDataNode ) break;
  ------------------
  |  Branch (910:11): [True: 1.17k, False: 5.87k]
  ------------------
  911|  7.04k|				}
  912|       |				
  913|  3.37k|				if ( currChild == endChild ) {
  ------------------
  |  Branch (913:10): [True: 2.20k, False: 1.17k]
  ------------------
  914|  2.20k|					RDF_LiteralPropertyElement ( xmpParent, xmlNode, isTopLevel );
  915|  2.20k|				} else {
  916|  1.17k|					RDF_ResourcePropertyElement ( xmpParent, xmlNode, isTopLevel );
  917|  1.17k|				}
  918|       |			
  919|  3.37k|			}
  920|       |
  921|  3.95k|		}
  922|       |		
  923|  4.29k|	}
  924|       |
  925|  4.41k|}	// RDF_PropertyElement
ParseRDF.cpp:_ZL21IsPropertyElementNameh:
  349|  4.42k|{
  350|       |
  351|  4.42k|	if 	( (term == kRDFTerm_Description) || IsOldTerm ( term ) ) return false;
  ------------------
  |  Branch (351:8): [True: 0, False: 4.42k]
  |  Branch (351:42): [True: 0, False: 4.42k]
  ------------------
  352|  4.42k|	return (! IsCoreSyntaxTerm ( term ));
  353|       |
  354|  4.42k|}	// IsPropertyElementName
ParseRDF.cpp:_ZL9IsOldTermh:
  333|  4.42k|{
  334|       |
  335|  4.42k|	if 	( (kRDFTerm_FirstOld <= term) && (term <= kRDFTerm_LastOld) ) return true;
  ------------------
  |  Branch (335:8): [True: 0, False: 4.42k]
  |  Branch (335:39): [True: 0, False: 0]
  ------------------
  336|  4.42k|	return false;
  337|       |
  338|  4.42k|}	// IsOldTerm
ParseRDF.cpp:_ZL16IsCoreSyntaxTermh:
  316|  4.42k|{
  317|       |
  318|  4.42k|	if 	( (kRDFTerm_FirstCore <= term) && (term <= kRDFTerm_LastCore) ) return true;
  ------------------
  |  Branch (318:8): [True: 2.21k, False: 2.20k]
  |  Branch (318:40): [True: 4, False: 2.21k]
  ------------------
  319|  4.41k|	return false;
  320|       |
  321|  4.42k|}	// IsCoreSyntaxTerm
ParseRDF.cpp:_ZL24RDF_EmptyPropertyElementP8XMP_NodeRK8XML_Nodeb:
 1189|  1.03k|{
 1190|  1.03k|	bool hasPropertyAttrs = false;
 1191|  1.03k|	bool hasResourceAttr  = false;
 1192|  1.03k|	bool hasNodeIDAttr    = false;
 1193|  1.03k|	bool hasValueAttr     = false;
 1194|       |	
 1195|  1.03k|	const XML_Node * valueNode = 0;	// ! Can come from rdf:value or rdf:resource.
 1196|       |	
 1197|  1.03k|	if ( ! xmlNode.content.empty() ) XMP_Throw ( "Nested content not allowed with rdf:resource or property attributes", kXMPErr_BadRDF );
  ------------------
  |  |  199|      7|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1197:7): [True: 7, False: 1.02k]
  ------------------
 1198|       |	
 1199|       |	// First figure out what XMP this maps to and remember the XML node for a simple value.
 1200|       |	
 1201|  1.02k|	XML_cNodePos currAttr = xmlNode.attrs.begin();
 1202|  1.02k|	XML_cNodePos endAttr  = xmlNode.attrs.end();
 1203|       |
 1204|  2.37k|	for ( ; currAttr != endAttr; ++currAttr ) {
  ------------------
  |  Branch (1204:10): [True: 1.35k, False: 1.02k]
  ------------------
 1205|       |
 1206|  1.35k|		RDFTermKind attrTerm = GetRDFTermKind ( (*currAttr)->name );
 1207|       |
 1208|  1.35k|		switch ( attrTerm ) {
 1209|       |
 1210|     74|			case kRDFTerm_ID :
  ------------------
  |  Branch (1210:4): [True: 74, False: 1.28k]
  ------------------
 1211|       |				// Nothing to do.
 1212|     74|				break;
 1213|       |
 1214|      6|			case kRDFTerm_resource :
  ------------------
  |  Branch (1214:4): [True: 6, False: 1.35k]
  ------------------
 1215|      6|				if ( hasNodeIDAttr ) XMP_Throw ( "Empty property element can't have both rdf:resource and rdf:nodeID", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1215:10): [True: 0, False: 6]
  ------------------
 1216|      6|				if ( hasValueAttr ) XMP_Throw ( "Empty property element can't have both rdf:value and rdf:resource", kXMPErr_BadXMP );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1216:10): [True: 3, False: 3]
  ------------------
 1217|      3|				hasResourceAttr = true;
 1218|      3|				if ( ! hasValueAttr ) valueNode = *currAttr;
  ------------------
  |  Branch (1218:10): [True: 3, False: 0]
  ------------------
 1219|      3|				break;
 1220|       |
 1221|     12|			case kRDFTerm_nodeID :
  ------------------
  |  Branch (1221:4): [True: 12, False: 1.34k]
  ------------------
 1222|     12|				if ( hasResourceAttr ) XMP_Throw ( "Empty property element can't have both rdf:resource and rdf:nodeID", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1222:10): [True: 0, False: 12]
  ------------------
 1223|     12|				hasNodeIDAttr = true;
 1224|     12|				break;
 1225|       |
 1226|  1.26k|			case kRDFTerm_Other :
  ------------------
  |  Branch (1226:4): [True: 1.26k, False: 94]
  ------------------
 1227|  1.26k|				if ( (*currAttr)->name == "rdf:value" ) {
  ------------------
  |  Branch (1227:10): [True: 41, False: 1.22k]
  ------------------
 1228|     41|					if ( hasResourceAttr ) XMP_Throw ( "Empty property element can't have both rdf:value and rdf:resource", kXMPErr_BadXMP );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1228:11): [True: 0, False: 41]
  ------------------
 1229|     41|					hasValueAttr = true;
 1230|     41|					valueNode = *currAttr;
 1231|  1.22k|				} else if ( (*currAttr)->name != "xml:lang" ) {
  ------------------
  |  Branch (1231:17): [True: 1.13k, False: 85]
  ------------------
 1232|  1.13k|					hasPropertyAttrs = true;
 1233|  1.13k|				}
 1234|  1.26k|				break;
 1235|       |
 1236|  1.26k|			default :
  ------------------
  |  Branch (1236:4): [True: 2, False: 1.35k]
  ------------------
 1237|      2|				XMP_Throw ( "Unrecognized attribute of empty property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      2|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1238|      0|				break;
 1239|       |
 1240|  1.35k|		}
 1241|       |
 1242|  1.35k|	}
 1243|       |	
 1244|       |	// Create the right kind of child node and visit the attributes again to add the fields or qualifiers.
 1245|       |	// ! Because of implementation vagaries, the xmpParent is the tree root for top level properties.
 1246|       |	// ! The schema is found, created if necessary, by AddChildNode.
 1247|       |	
 1248|  1.02k|	XMP_Node * childNode = AddChildNode ( xmpParent, xmlNode, "", isTopLevel );
 1249|  1.02k|	bool childIsStruct = false;
 1250|       |	
 1251|  1.02k|	if ( hasValueAttr | hasResourceAttr ) {
  ------------------
  |  Branch (1251:7): [True: 41, False: 980]
  ------------------
 1252|     41|		childNode->value = valueNode->value;
 1253|     41|		if ( ! hasValueAttr ) childNode->options |= kXMP_PropValueIsURI;	// ! Might have both rdf:value and rdf:resource.
  ------------------
  |  Branch (1253:8): [True: 3, False: 38]
  ------------------
 1254|    980|	} else if ( hasPropertyAttrs ) {
  ------------------
  |  Branch (1254:14): [True: 390, False: 590]
  ------------------
 1255|    390|		childNode->options |= kXMP_PropValueIsStruct;
 1256|    390|		childIsStruct = true;
 1257|    390|	}
 1258|       |		
 1259|  1.02k|	currAttr = xmlNode.attrs.begin();
 1260|  1.02k|	endAttr  = xmlNode.attrs.end();
 1261|       |
 1262|  2.27k|	for ( ; currAttr != endAttr; ++currAttr ) {
  ------------------
  |  Branch (1262:10): [True: 1.28k, False: 992]
  ------------------
 1263|       |
 1264|  1.28k|		if ( *currAttr == valueNode ) continue;	// Skip the rdf:value or rdf:resource attribute holding the value.
  ------------------
  |  Branch (1264:8): [True: 41, False: 1.24k]
  ------------------
 1265|  1.24k|		RDFTermKind attrTerm = GetRDFTermKind ( (*currAttr)->name );
 1266|       |
 1267|  1.24k|		switch ( attrTerm ) {
 1268|       |
 1269|     68|			case kRDFTerm_ID       :
  ------------------
  |  Branch (1269:4): [True: 68, False: 1.17k]
  ------------------
 1270|     77|			case kRDFTerm_nodeID   :
  ------------------
  |  Branch (1270:4): [True: 9, False: 1.23k]
  ------------------
 1271|     77|				break;	// Ignore all rdf:ID and rdf:nodeID attributes.w
 1272|       |				
 1273|      0|			case kRDFTerm_resource :
  ------------------
  |  Branch (1273:4): [True: 0, False: 1.24k]
  ------------------
 1274|      0|				AddQualifierNode ( childNode, **currAttr );
 1275|      0|				break;
 1276|       |
 1277|  1.16k|			case kRDFTerm_Other :
  ------------------
  |  Branch (1277:4): [True: 1.16k, False: 77]
  ------------------
 1278|  1.16k|				if ( (! childIsStruct) || (*currAttr)->name == "xml:lang" ) {
  ------------------
  |  Branch (1278:10): [True: 151, False: 1.01k]
  |  Branch (1278:31): [True: 37, False: 978]
  ------------------
 1279|    188|					AddQualifierNode ( childNode, **currAttr );
 1280|    978|				} else {
 1281|    978|					AddChildNode ( childNode, **currAttr, (*currAttr)->value.c_str(), false );
 1282|    978|				}
 1283|  1.16k|				break;
 1284|       |
 1285|      0|			default :
  ------------------
  |  Branch (1285:4): [True: 0, False: 1.24k]
  ------------------
 1286|      0|				XMP_Throw ( "Unrecognized attribute of empty property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1287|      0|				break;
 1288|       |
 1289|  1.24k|		}
 1290|       |
 1291|  1.24k|	}
 1292|       |
 1293|  1.02k|}	// RDF_EmptyPropertyElement
ParseRDF.cpp:_ZL16AddQualifierNodeP8XMP_NodeRK8XML_Node:
  483|    360|{
  484|    360|	if ( attr.ns.empty() ) {
  ------------------
  |  Branch (484:7): [True: 6, False: 354]
  ------------------
  485|      6|		XMP_Throw ( "XML namespace required for all elements and attributes", kXMPErr_BadRDF );
  ------------------
  |  |  199|      6|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  486|      0|	}
  487|       |	
  488|    354|	return AddQualifierNode ( xmpParent, attr.name, attr.value );
  489|       |
  490|    360|}	// AddQualifierNode
ParseRDF.cpp:_ZL16AddQualifierNodeP8XMP_NodeRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  435|    379|{
  436|       |
  437|       |	#if 0
  438|       |		cout << "AddQualifierNode, parent = " << xmpParent->name << ", name = " << name;
  439|       |		cout << ", value = \"" << value << '"' << endl;
  440|       |	#endif
  441|       |	
  442|    379|	const bool isLang = (name == "xml:lang");
  443|    379|	const bool isType = (name == "rdf:type");
  444|       |
  445|    379|	XMP_Node * newQual = 0;
  446|       |
  447|    379|		newQual = new XMP_Node ( xmpParent, name, value, kXMP_PropIsQualifier );
  448|       |
  449|    379|		if ( ! (isLang | isType) ) {
  ------------------
  |  Branch (449:8): [True: 115, False: 264]
  ------------------
  450|    115|			xmpParent->qualifiers.push_back ( newQual );
  451|    264|		} else if ( isLang ) {
  ------------------
  |  Branch (451:15): [True: 239, False: 25]
  ------------------
  452|    239|			if ( xmpParent->qualifiers.empty() ) {
  ------------------
  |  Branch (452:9): [True: 235, False: 4]
  ------------------
  453|    235|				xmpParent->qualifiers.push_back ( newQual );
  454|    235|			} else {
  455|      4|				xmpParent->qualifiers.insert ( xmpParent->qualifiers.begin(), newQual );
  456|      4|			}
  457|    239|			xmpParent->options |= kXMP_PropHasLang;
  458|    239|		} else {
  459|     25|			XMP_Assert ( isType );
  ------------------
  |  |  142|     25|	#define XMP_Assert(c)	((void) 0)
  ------------------
  460|     25|			if ( xmpParent->qualifiers.empty() ) {
  ------------------
  |  Branch (460:9): [True: 25, False: 0]
  ------------------
  461|     25|				xmpParent->qualifiers.push_back ( newQual );
  462|     25|			} else {
  463|      0|				size_t offset = 0;
  464|      0|				if ( XMP_PropHasLang ( xmpParent->options ) ) offset = 1;
  ------------------
  |  Branch (464:10): [True: 0, False: 0]
  ------------------
  465|      0|				xmpParent->qualifiers.insert ( xmpParent->qualifiers.begin()+offset, newQual );
  466|      0|			}
  467|     25|			xmpParent->options |= kXMP_PropHasType;
  468|     25|		}
  469|       |
  470|    379|		xmpParent->options |= kXMP_PropHasQualifiers;
  471|       |
  472|    379|	return newQual;
  473|       |
  474|    379|}	// AddQualifierNode
ParseRDF.cpp:_ZL26RDF_LiteralPropertyElementP8XMP_NodeRK8XML_Nodeb:
 1014|  2.20k|{
 1015|  2.20k|	XMP_Node * newChild = AddChildNode ( xmpParent, xmlNode, "", isTopLevel );
 1016|       |	
 1017|  2.20k|	XML_cNodePos currAttr = xmlNode.attrs.begin();
 1018|  2.20k|	XML_cNodePos endAttr  = xmlNode.attrs.end();
 1019|       |
 1020|  2.37k|	for ( ; currAttr != endAttr; ++currAttr ) {
  ------------------
  |  Branch (1020:10): [True: 170, False: 2.20k]
  ------------------
 1021|    170|		XMP_VarString & attrName = (*currAttr)->name;
 1022|    170|		if ( attrName == "xml:lang" ) {
  ------------------
  |  Branch (1022:8): [True: 170, False: 0]
  ------------------
 1023|    170|			AddQualifierNode ( newChild, **currAttr );
 1024|    170|		} else if ( (attrName == "rdf:ID") || (attrName == "rdf:datatype") ) {
  ------------------
  |  Branch (1024:15): [True: 0, False: 0]
  |  Branch (1024:41): [True: 0, False: 0]
  ------------------
 1025|      0|			continue;	// Ignore all rdf:ID and rdf:datatype attributes.
 1026|      0|		} else {
 1027|      0|			XMP_Throw ( "Invalid attribute for literal property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1028|      0|		}
 1029|    170|	}
 1030|       |	
 1031|  2.20k|	XML_cNodePos currChild = xmlNode.content.begin();
 1032|  2.20k|	XML_cNodePos endChild  = xmlNode.content.end();
 1033|  2.20k|	size_t      textSize  = 0;
 1034|       |
 1035|  5.77k|	for ( ; currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (1035:10): [True: 3.56k, False: 2.20k]
  ------------------
 1036|  3.56k|		if ( (*currChild)->kind != kCDataNode ) XMP_Throw ( "Invalid child of literal property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1036:8): [True: 0, False: 3.56k]
  ------------------
 1037|  3.56k|		textSize += (*currChild)->value.size();
 1038|  3.56k|	}
 1039|       |	
 1040|  2.20k|	newChild->value.reserve ( textSize );
 1041|       |
 1042|  5.77k|	for ( currChild = xmlNode.content.begin(); currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (1042:45): [True: 3.56k, False: 2.20k]
  ------------------
 1043|  3.56k|		newChild->value += (*currChild)->value;
 1044|  3.56k|	}
 1045|       |
 1046|       |	#if 0	// *** XMP_DebugBuild
 1047|       |		newChild->_valuePtr = newChild->value.c_str();
 1048|       |	#endif
 1049|       |	
 1050|  2.20k|}	// RDF_LiteralPropertyElement
ParseRDF.cpp:_ZL33RDF_ParseTypeOtherPropertyElementP8XMP_NodeRK8XML_Nodeb:
 1146|     10|{
 1147|     10|	IgnoreParam(xmpParent); IgnoreParam(xmlNode); IgnoreParam(isTopLevel); 
  ------------------
  |  |  117|     10|#define IgnoreParam(p)	(void)p
  ------------------
              	IgnoreParam(xmpParent); IgnoreParam(xmlNode); IgnoreParam(isTopLevel); 
  ------------------
  |  |  117|     10|#define IgnoreParam(p)	(void)p
  ------------------
              	IgnoreParam(xmpParent); IgnoreParam(xmlNode); IgnoreParam(isTopLevel); 
  ------------------
  |  |  117|     10|#define IgnoreParam(p)	(void)p
  ------------------
 1148|       |
 1149|     10|	XMP_Throw ( "ParseTypeOther property element not allowed", kXMPErr_BadXMP );
  ------------------
  |  |  199|     10|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1150|       |
 1151|      0|}	// RDF_ParseTypeOtherPropertyElement
ParseRDF.cpp:_ZL27RDF_ResourcePropertyElementP8XMP_NodeRK8XML_Nodeb:
  942|  1.17k|{
  943|  1.17k|	if ( isTopLevel && (xmlNode.name == "iX:changes") ) return;	// Strip old "punchcard" chaff.
  ------------------
  |  Branch (943:7): [True: 1.16k, False: 8]
  |  Branch (943:21): [True: 0, False: 1.16k]
  ------------------
  944|       |	
  945|  1.17k|	XMP_Node * newCompound = AddChildNode ( xmpParent, xmlNode, "", isTopLevel );
  946|       |	
  947|  1.17k|	XML_cNodePos currAttr = xmlNode.attrs.begin();
  948|  1.17k|	XML_cNodePos endAttr  = xmlNode.attrs.end();
  949|       |
  950|  1.17k|	for ( ; currAttr != endAttr; ++currAttr ) {
  ------------------
  |  Branch (950:10): [True: 2, False: 1.17k]
  ------------------
  951|      2|		XMP_VarString & attrName = (*currAttr)->name;
  952|      2|		if ( attrName == "xml:lang" ) {
  ------------------
  |  Branch (952:8): [True: 2, False: 0]
  ------------------
  953|      2|			AddQualifierNode ( newCompound, **currAttr );
  954|      2|		} else if ( attrName == "rdf:ID" ) {
  ------------------
  |  Branch (954:15): [True: 0, False: 0]
  ------------------
  955|      0|			continue;	// Ignore all rdf:ID attributes.
  956|      0|		} else {
  957|      0|			XMP_Throw ( "Invalid attribute for resource property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  958|      0|		}
  959|      2|	}
  960|       |	
  961|  1.17k|	XML_cNodePos currChild = xmlNode.content.begin();
  962|  1.17k|	XML_cNodePos endChild  = xmlNode.content.end();
  963|       |
  964|  3.44k|	for ( ; currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (964:10): [True: 3.44k, False: 0]
  ------------------
  965|  3.44k|		if ( ! (*currChild)->IsWhitespaceNode() ) break;
  ------------------
  |  Branch (965:8): [True: 1.17k, False: 2.27k]
  ------------------
  966|  3.44k|	}
  967|  1.17k|	if ( currChild == endChild ) XMP_Throw ( "Missing child of resource property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (967:7): [True: 0, False: 1.17k]
  ------------------
  968|  1.17k|	if ( (*currChild)->kind != kElemNode ) XMP_Throw ( "Children of resource property element must be XML elements", kXMPErr_BadRDF );
  ------------------
  |  |  199|     19|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (968:7): [True: 19, False: 1.15k]
  ------------------
  969|       |
  970|  1.15k|	if ( (*currChild)->name == "rdf:Bag" ) {
  ------------------
  |  Branch (970:7): [True: 132, False: 1.02k]
  ------------------
  971|    132|		newCompound->options |= kXMP_PropValueIsArray;
  972|  1.02k|	} else if ( (*currChild)->name == "rdf:Seq" ) {
  ------------------
  |  Branch (972:14): [True: 719, False: 303]
  ------------------
  973|    719|		newCompound->options |= kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered;
  974|    719|	} else if ( (*currChild)->name == "rdf:Alt" ) {
  ------------------
  |  Branch (974:14): [True: 276, False: 27]
  ------------------
  975|    276|		newCompound->options |= kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate;
  976|    276|	} else {
  977|     27|		newCompound->options |= kXMP_PropValueIsStruct;
  978|     27|		if ( (*currChild)->name != "rdf:Description" ) {
  ------------------
  |  Branch (978:8): [True: 27, False: 0]
  ------------------
  979|     27|			XMP_VarString typeName ( (*currChild)->ns );
  980|     27|			size_t        colonPos = (*currChild)->name.find_first_of(':');
  981|     27|			if ( colonPos == XMP_VarString::npos ) XMP_Throw ( "All XML elements must be in a namespace", kXMPErr_BadXMP );
  ------------------
  |  |  199|      2|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (981:9): [True: 2, False: 25]
  ------------------
  982|     25|			typeName.append ( (*currChild)->name, colonPos, XMP_VarString::npos );
  983|     25|			AddQualifierNode ( newCompound, XMP_VarString("rdf:type"), typeName );
  984|     25|		}
  985|     27|	}
  986|       |
  987|  1.15k|	RDF_NodeElement ( newCompound, **currChild, kNotTopLevel );
  988|  1.15k|	if ( newCompound->options & kRDF_HasValueElem ) {
  ------------------
  |  Branch (988:7): [True: 0, False: 1.15k]
  ------------------
  989|      0|		FixupQualifiedNode ( newCompound );
  990|  1.15k|	} else if ( newCompound->options & kXMP_PropArrayIsAlternate ) {
  ------------------
  |  Branch (990:14): [True: 271, False: 881]
  ------------------
  991|    271|		DetectAltText ( newCompound );
  992|    271|	}
  993|       |
  994|  3.11k|	for ( ++currChild; currChild != endChild; ++currChild ) {
  ------------------
  |  Branch (994:21): [True: 1.99k, False: 1.11k]
  ------------------
  995|  1.99k|		if ( ! (*currChild)->IsWhitespaceNode() ) XMP_Throw ( "Invalid child of resource property element", kXMPErr_BadRDF );
  ------------------
  |  |  199|     37|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (995:8): [True: 37, False: 1.96k]
  ------------------
  996|  1.96k|	}
  997|       |
  998|  1.15k|}	// RDF_ResourcePropertyElement

_Z28InitializeUnicodeConversionsv:
  147|      1|{
  148|      1|	UC_Assert ( (sizeof(UTF8Unit) == 1) && (sizeof(UTF16Unit) == 2) && (sizeof(UTF32Unit) == 4) ); 
  149|       |
  150|      1|	UTF16Unit u16  = 0x00FF;
  151|      1|	bool bigEndian = (*((UTF8Unit*)&u16) == 0);
  152|       |
  153|      1|	UTF8_to_UTF16Native = UTF8_to_UTF16Nat;
  154|      1|	UTF8_to_UTF32Native = UTF8_to_UTF32Nat;
  155|      1|	UTF16Native_to_UTF8 = UTF16Nat_to_UTF8;
  156|      1|	UTF32Native_to_UTF8 = UTF32Nat_to_UTF8;
  157|       |	
  158|      1|	if ( bigEndian ) {
  ------------------
  |  Branch (158:7): [True: 0, False: 1]
  ------------------
  159|       |	
  160|      0|		swap32to16Offset = 0;
  161|       |
  162|      0|		CodePoint_to_UTF16BE = CodePoint_to_UTF16Nat;
  163|      0|		CodePoint_to_UTF16LE = CodePoint_to_UTF16Swp;
  164|       |
  165|      0|		CodePoint_from_UTF16BE = CodePoint_from_UTF16Nat;
  166|      0|		CodePoint_from_UTF16LE = CodePoint_from_UTF16Swp;
  167|       |
  168|      0|		UTF8_to_UTF16BE = UTF8_to_UTF16Nat;
  169|      0|		UTF8_to_UTF16LE = UTF8_to_UTF16Swp;
  170|      0|		UTF8_to_UTF32BE = UTF8_to_UTF32Nat;
  171|      0|		UTF8_to_UTF32LE = UTF8_to_UTF32Swp;
  172|       |
  173|      0|		UTF16BE_to_UTF8 = UTF16Nat_to_UTF8;
  174|      0|		UTF16LE_to_UTF8 = UTF16Swp_to_UTF8;
  175|      0|		UTF32BE_to_UTF8 = UTF32Nat_to_UTF8;
  176|      0|		UTF32LE_to_UTF8 = UTF32Swp_to_UTF8;
  177|       |
  178|      0|		UTF16BE_to_UTF32BE = UTF16Nat_to_UTF32Nat;
  179|      0|		UTF16BE_to_UTF32LE = UTF16Nat_to_UTF32Swp;
  180|      0|		UTF16LE_to_UTF32BE = UTF16Swp_to_UTF32Nat;
  181|      0|		UTF16LE_to_UTF32LE = UTF16Swp_to_UTF32Swp;
  182|       |
  183|      0|		UTF32BE_to_UTF16BE = UTF32Nat_to_UTF16Nat;
  184|      0|		UTF32BE_to_UTF16LE = UTF32Nat_to_UTF16Swp;
  185|      0|		UTF32LE_to_UTF16BE = UTF32Swp_to_UTF16Nat;
  186|      0|		UTF32LE_to_UTF16LE = UTF32Swp_to_UTF16Swp;
  187|       |
  188|      1|	} else {
  189|       |	
  190|      1|		swap32to16Offset = 1;	// ! Offset in UTF16 units!
  191|       |
  192|      1|		CodePoint_to_UTF16BE = CodePoint_to_UTF16Swp;
  193|      1|		CodePoint_to_UTF16LE = CodePoint_to_UTF16Nat;
  194|       |
  195|      1|		CodePoint_from_UTF16BE = CodePoint_from_UTF16Swp;
  196|      1|		CodePoint_from_UTF16LE = CodePoint_from_UTF16Nat;
  197|       |
  198|      1|		UTF8_to_UTF16BE = UTF8_to_UTF16Swp;
  199|      1|		UTF8_to_UTF16LE = UTF8_to_UTF16Nat;
  200|      1|		UTF8_to_UTF32BE = UTF8_to_UTF32Swp;
  201|      1|		UTF8_to_UTF32LE = UTF8_to_UTF32Nat;
  202|       |
  203|      1|		UTF16BE_to_UTF8 = UTF16Swp_to_UTF8;
  204|      1|		UTF16LE_to_UTF8 = UTF16Nat_to_UTF8;
  205|      1|		UTF32BE_to_UTF8 = UTF32Swp_to_UTF8;
  206|      1|		UTF32LE_to_UTF8 = UTF32Nat_to_UTF8;
  207|       |
  208|      1|		UTF16BE_to_UTF32BE = UTF16Swp_to_UTF32Swp;
  209|      1|		UTF16BE_to_UTF32LE = UTF16Swp_to_UTF32Nat;
  210|      1|		UTF16LE_to_UTF32BE = UTF16Nat_to_UTF32Swp;
  211|      1|		UTF16LE_to_UTF32LE = UTF16Nat_to_UTF32Nat;
  212|       |
  213|      1|		UTF32BE_to_UTF16BE = UTF32Swp_to_UTF16Swp;
  214|      1|		UTF32BE_to_UTF16LE = UTF32Swp_to_UTF16Nat;
  215|      1|		UTF32LE_to_UTF16BE = UTF32Nat_to_UTF16Swp;
  216|      1|		UTF32LE_to_UTF16LE = UTF32Nat_to_UTF16Nat;
  217|       |
  218|      1|	}
  219|       |
  220|      1|}	// InitializeUnicodeConversions
_Z19CodePoint_from_UTF8PKhmPjPm:
  567|  40.9k|{
  568|  40.9k|	UTF8Unit inUnit;	// ! Don't read until we know there is input.
  569|  40.9k|	size_t unitCount = 0;
  570|       |
  571|  40.9k|	UC_Assert ( (utf8In != 0) && (cpOut != 0) && (utf8Read != 0) );
  572|  40.9k|	if ( utf8Len == 0 ) goto Done;
  ------------------
  |  Branch (572:7): [True: 0, False: 40.9k]
  ------------------
  573|  40.9k|	inUnit = *utf8In;
  574|  40.9k|	if ( inUnit >= 0x80 ) goto MultiByte;	// ! Force linear execution path for ASCII.
  ------------------
  |  Branch (574:7): [True: 40.9k, False: 0]
  ------------------
  575|       |	
  576|      0|	unitCount = 1;
  577|      0|	*cpOut = inUnit;	// ! Don't put after Done, don't write if no input.
  578|       |	
  579|      0|Done:	
  580|      0|	*utf8Read = unitCount;
  581|      0|	return;
  582|       |
  583|  40.9k|MultiByte:
  584|  40.9k|	CodePoint_from_UTF8_Multi ( utf8In, utf8Len, cpOut, utf8Read );
  585|  40.9k|	return;
  586|       |	
  587|      0|}	// CodePoint_from_UTF8
UnicodeConversions.cpp:_ZL25CodePoint_from_UTF8_MultiPKhmPjPm:
  516|  40.9k|{
  517|  40.9k|	UTF8Unit  inUnit = *utf8In;
  518|  40.9k|	size_t    unitCount = 0;
  519|  40.9k|	UTF32Unit cp;	// ! Avoid gcc complaints about declarations after goto's.
  520|  40.9k|	const UTF8Unit * utf8Pos;
  521|       |
  522|       |	// -------------------------------------------------------------------------------------
  523|       |	// We've got a multibyte UTF-8 character. The first byte has the number of bytes and the
  524|       |	// highest order data bits. The other bytes each add 6 more data bits.
  525|       |	
  526|       |	#if 0	// This might be a more effcient way to count the bytes.
  527|       |		static XMP_Uns8 kByteCounts[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 4 };
  528|       |		size_t bytesNeeded = kByteCounts [ inUnit >> 4 ];
  529|       |		if ( (bytesNeeded < 2) || ((bytesNeeded == 4) && ((inUnit & 0x08) != 0)) ) {
  530|       |			UC_Throw ( "Invalid UTF-8 sequence length", kXMPErr_BadParam );
  531|       |		}
  532|       |	#endif
  533|       |
  534|  40.9k|	size_t bytesNeeded = 0;	// Count the leading 1 bits in the first byte.
  535|   122k|	for ( UTF8Unit temp = inUnit; temp > 0x7F; temp = temp << 1 ) ++bytesNeeded;
  ------------------
  |  Branch (535:32): [True: 81.9k, False: 40.9k]
  ------------------
  536|       |		// *** Consider CPU-specific assembly inline, e.g. cntlzw on PowerPC.
  537|       |	
  538|  40.9k|	if ( (bytesNeeded < 2) || (bytesNeeded > 4) ) UC_Throw ( "Invalid UTF-8 sequence length", kXMPErr_BadParam );
  ------------------
  |  |   18|      0|	#define UC_Throw(msg,id)  throw XMP_Error ( id, msg )
  ------------------
  |  Branch (538:7): [True: 0, False: 40.9k]
  |  Branch (538:28): [True: 0, False: 40.9k]
  ------------------
  539|  40.9k|	if ( bytesNeeded > utf8Len ) goto Done;	// Not enough input in this buffer.
  ------------------
  |  Branch (539:7): [True: 0, False: 40.9k]
  ------------------
  540|  40.9k|	unitCount = bytesNeeded;
  541|       |	
  542|  40.9k|	cp = inUnit & ((1 << (7-unitCount)) - 1);	// Isolate the initial data bits in the bottom of cp.
  543|       |	
  544|  40.9k|	utf8Pos = utf8In + 1;	// We've absorbed the first byte.
  545|  81.9k|	for ( --bytesNeeded; bytesNeeded > 0; --bytesNeeded, ++utf8Pos ) {
  ------------------
  |  Branch (545:23): [True: 41.0k, False: 40.9k]
  ------------------
  546|  41.0k|		inUnit = *utf8Pos;
  547|  41.0k|		if ( (inUnit & UTF8Unit(0xC0)) != UTF8Unit(0x80) ) UC_Throw ( "Invalid UTF-8 data byte", kXMPErr_BadParam );
  ------------------
  |  |   18|      0|	#define UC_Throw(msg,id)  throw XMP_Error ( id, msg )
  ------------------
  |  Branch (547:8): [True: 0, False: 41.0k]
  ------------------
  548|  41.0k|		cp = (cp << 6) | (inUnit & 0x3F);
  549|  41.0k|	}
  550|       |	
  551|  40.9k|	if ( cp >= 0xD800 ) {	// Skip the next comparisons most of the time.
  ------------------
  |  Branch (551:7): [True: 18, False: 40.9k]
  ------------------
  552|     18|		if ( (0xD800 <= cp) && (cp <= 0xDFFF) ) UC_Throw ( "Bad UTF-8 - surrogate code point", kXMPErr_BadParam );
  ------------------
  |  |   18|      0|	#define UC_Throw(msg,id)  throw XMP_Error ( id, msg )
  ------------------
  |  Branch (552:8): [True: 18, False: 0]
  |  Branch (552:26): [True: 0, False: 18]
  ------------------
  553|     18|		if ( cp > 0x10FFFF ) UC_Throw ( "Bad UTF-8 - out of range", kXMPErr_BadParam );
  ------------------
  |  |   18|      0|	#define UC_Throw(msg,id)  throw XMP_Error ( id, msg )
  ------------------
  |  Branch (553:8): [True: 0, False: 18]
  ------------------
  554|     18|	}
  555|       |	
  556|  40.9k|	*cpOut = cp;	// ! Don't put after Done, don't write if no input.
  557|       |	
  558|  40.9k|Done:	
  559|  40.9k|	*utf8Read = unitCount;
  560|  40.9k|	return;
  561|       |	
  562|  40.9k|}	// CodePoint_from_UTF8_Multi

XMPCore_Impl.cpp:_ZL19VerifySimpleXMLNamePKcS0_:
   87|  38.4k|{
   88|       |
   89|  38.4k|	const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart;
   90|  38.4k|	const XMP_Uns8 * nameEnd   = (const XMP_Uns8 *) _nameEnd;
   91|  38.4k|	const XMP_Uns8 * namePos   = nameStart;
   92|  38.4k|	XMP_Uns32 cp;
   93|       |	
   94|       |	// The first character is more restricted.
   95|       |	
   96|  38.4k|	if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (96:7): [True: 0, False: 38.4k]
  ------------------
   97|       |
   98|  38.4k|	cp = *namePos;
   99|  38.4k|	if ( cp < 0x80 ) {
  ------------------
  |  Branch (99:7): [True: 38.4k, False: 53]
  ------------------
  100|  38.4k|		++namePos;
  101|  38.4k|		if ( ! IsStartChar_ASCII(cp) ) goto NameError;
  ------------------
  |  Branch (101:8): [True: 0, False: 38.4k]
  ------------------
  102|  38.4k|	} else {
  103|     53|		cp = GetCodePoint ( &namePos );
  104|     53|		if ( ! IsStartChar_NonASCII(cp) ) goto NameError;
  ------------------
  |  Branch (104:8): [True: 0, False: 53]
  ------------------
  105|     53|	}
  106|       |
  107|       |	// Check the rest of the name.
  108|       |	
  109|  1.73M|	while ( namePos < nameEnd ) {
  ------------------
  |  Branch (109:10): [True: 1.69M, False: 38.4k]
  ------------------
  110|  1.69M|		cp = *namePos;
  111|  1.69M|		if ( cp < 0x80 ) {
  ------------------
  |  Branch (111:8): [True: 1.67M, False: 19.6k]
  ------------------
  112|  1.67M|			++namePos;
  113|  1.67M|			if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError;
  ------------------
  |  Branch (113:9): [True: 90.4k, False: 1.58M]
  |  Branch (113:38): [True: 0, False: 90.4k]
  ------------------
  114|  1.67M|		} else {
  115|  19.6k|			cp = GetCodePoint ( &namePos );
  116|  19.6k|			if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError;
  ------------------
  |  Branch (116:9): [True: 16.4k, False: 3.18k]
  |  Branch (116:41): [True: 0, False: 16.4k]
  ------------------
  117|  19.6k|		}
  118|  1.69M|	}
  119|       |
  120|  38.4k|	return;
  121|       |
  122|  38.4k|NameError:
  123|      0|	XMP_Throw ( "Bad XML name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  124|       |	
  125|      0|}	// VerifySimpleXMLName
XMPCore_Impl.cpp:_ZL17IsStartChar_ASCIIj:
   31|  1.71M|{
   32|       |	// ASCII starting characters for an XML name.
   33|  1.71M|	if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true;
  ------------------
  |  Branch (33:8): [True: 1.00M, False: 704k]
  |  Branch (33:23): [True: 1.00M, False: 0]
  |  Branch (33:40): [True: 613k, False: 90.4k]
  |  Branch (33:55): [True: 608k, False: 5.49k]
  |  Branch (33:71): [True: 5.49k, False: 90.4k]
  ------------------
   34|  90.4k|	return false;
   35|  1.71M|}
XMPCore_Impl.cpp:_ZL12GetCodePointPPKh:
   19|  19.7k|{
   20|  19.7k|	const XMP_Uns8 * u8Ptr = *utf8Str_io;
   21|  19.7k|	XMP_Uns32 cp;
   22|  19.7k|	size_t u8Len;
   23|  19.7k|	CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );	// Throws an exception for errors.
   24|  19.7k|	*utf8Str_io = u8Ptr + u8Len;
   25|  19.7k|	return cp;
   26|  19.7k|}
XMPCore_Impl.cpp:_ZL20IsStartChar_NonASCIIj:
   40|  19.7k|{
   41|       |	// Non-ASCII starting characters for an XML name.
   42|       |	
   43|  19.7k|	if ( ((0xC0 <= cp) && (cp <= 0xD6))  || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true;
  ------------------
  |  Branch (43:8): [True: 3.28k, False: 16.4k]
  |  Branch (43:24): [True: 263, False: 3.01k]
  |  Branch (43:43): [True: 3.01k, False: 16.4k]
  |  Branch (43:59): [True: 368, False: 2.64k]
  ------------------
   44|  19.0k|	if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true;
  ------------------
  |  Branch (44:8): [True: 2.64k, False: 16.4k]
  |  Branch (44:24): [True: 1.34k, False: 1.30k]
  |  Branch (44:43): [True: 1.25k, False: 16.4k]
  |  Branch (44:60): [True: 0, False: 1.25k]
  ------------------
   45|       |
   46|  17.7k|	if ( ((0x37F <= cp) && (cp <= 0x1FFF))  || ((0x200C <= cp) && (cp <= 0x200D)) ) return true;
  ------------------
  |  Branch (46:8): [True: 1.25k, False: 16.4k]
  |  Branch (46:25): [True: 1.25k, False: 7]
  |  Branch (46:46): [True: 7, False: 16.4k]
  |  Branch (46:64): [True: 0, False: 7]
  ------------------
   47|  16.5k|	if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true;
  ------------------
  |  Branch (47:8): [True: 7, False: 16.4k]
  |  Branch (47:26): [True: 0, False: 7]
  |  Branch (47:46): [True: 7, False: 16.4k]
  |  Branch (47:64): [True: 0, False: 7]
  ------------------
   48|  16.5k|	if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true;
  ------------------
  |  Branch (48:8): [True: 7, False: 16.4k]
  |  Branch (48:26): [True: 7, False: 0]
  |  Branch (48:46): [True: 0, False: 16.4k]
  |  Branch (48:64): [True: 0, False: 0]
  ------------------
   49|  16.4k|	if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true;
  ------------------
  |  Branch (49:8): [True: 0, False: 16.4k]
  |  Branch (49:26): [True: 0, False: 0]
  |  Branch (49:46): [True: 0, False: 16.4k]
  |  Branch (49:65): [True: 0, False: 0]
  ------------------
   50|       |
   51|  16.4k|	return false;
   52|       |
   53|  16.4k|}
XMPCore_Impl.cpp:_ZL17IsOtherChar_ASCIIj:
   58|  90.4k|{
   59|       |	// ASCII following characters for an XML name.
   60|  90.4k|	if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true;
  ------------------
  |  Branch (60:8): [True: 49.4k, False: 40.9k]
  |  Branch (60:23): [True: 49.4k, False: 0]
  |  Branch (60:39): [True: 35.7k, False: 5.20k]
  |  Branch (60:54): [True: 5.20k, False: 0]
  ------------------
   61|      0|	return false;
   62|  90.4k|}
XMPCore_Impl.cpp:_ZL20IsOtherChar_NonASCIIj:
   67|  16.4k|{
   68|       |	// Non-ASCII following characters for an XML name.
   69|  16.4k|	if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F))  || ((0x203F <= cp) && (cp <= 0x2040)) ) return true;
  ------------------
  |  Branch (69:7): [True: 16.4k, False: 47]
  |  Branch (69:24): [True: 47, False: 0]
  |  Branch (69:41): [True: 47, False: 0]
  |  Branch (69:61): [True: 0, False: 0]
  |  Branch (69:79): [True: 0, False: 0]
  ------------------
   70|      0|	return false;
   71|  16.4k|}
XMPMeta-GetSet.cpp:_ZL12GetCodePointPPKh:
   19|  1.45k|{
   20|  1.45k|	const XMP_Uns8 * u8Ptr = *utf8Str_io;
   21|  1.45k|	XMP_Uns32 cp;
   22|  1.45k|	size_t u8Len;
   23|  1.45k|	CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );	// Throws an exception for errors.
   24|  1.45k|	*utf8Str_io = u8Ptr + u8Len;
   25|  1.45k|	return cp;
   26|  1.45k|}
XMPMeta.cpp:_ZL19VerifySimpleXMLNamePKcS0_:
   87|  7.35k|{
   88|       |
   89|  7.35k|	const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart;
   90|  7.35k|	const XMP_Uns8 * nameEnd   = (const XMP_Uns8 *) _nameEnd;
   91|  7.35k|	const XMP_Uns8 * namePos   = nameStart;
   92|  7.35k|	XMP_Uns32 cp;
   93|       |	
   94|       |	// The first character is more restricted.
   95|       |	
   96|  7.35k|	if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (96:7): [True: 0, False: 7.35k]
  ------------------
   97|       |
   98|  7.35k|	cp = *namePos;
   99|  7.35k|	if ( cp < 0x80 ) {
  ------------------
  |  Branch (99:7): [True: 7.26k, False: 91]
  ------------------
  100|  7.26k|		++namePos;
  101|  7.26k|		if ( ! IsStartChar_ASCII(cp) ) goto NameError;
  ------------------
  |  Branch (101:8): [True: 0, False: 7.26k]
  ------------------
  102|  7.26k|	} else {
  103|     91|		cp = GetCodePoint ( &namePos );
  104|     91|		if ( ! IsStartChar_NonASCII(cp) ) goto NameError;
  ------------------
  |  Branch (104:8): [True: 0, False: 91]
  ------------------
  105|     91|	}
  106|       |
  107|       |	// Check the rest of the name.
  108|       |	
  109|  1.38M|	while ( namePos < nameEnd ) {
  ------------------
  |  Branch (109:10): [True: 1.38M, False: 7.35k]
  ------------------
  110|  1.38M|		cp = *namePos;
  111|  1.38M|		if ( cp < 0x80 ) {
  ------------------
  |  Branch (111:8): [True: 1.36M, False: 19.6k]
  ------------------
  112|  1.36M|			++namePos;
  113|  1.36M|			if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError;
  ------------------
  |  Branch (113:9): [True: 71.9k, False: 1.29M]
  |  Branch (113:38): [True: 0, False: 71.9k]
  ------------------
  114|  1.36M|		} else {
  115|  19.6k|			cp = GetCodePoint ( &namePos );
  116|  19.6k|			if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError;
  ------------------
  |  Branch (116:9): [True: 16.3k, False: 3.28k]
  |  Branch (116:41): [True: 0, False: 16.3k]
  ------------------
  117|  19.6k|		}
  118|  1.38M|	}
  119|       |
  120|  7.35k|	return;
  121|       |
  122|  7.35k|NameError:
  123|      0|	XMP_Throw ( "Bad XML name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  124|       |	
  125|      0|}	// VerifySimpleXMLName
XMPMeta.cpp:_ZL17IsStartChar_ASCIIj:
   31|  1.36M|{
   32|       |	// ASCII starting characters for an XML name.
   33|  1.36M|	if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true;
  ------------------
  |  Branch (33:8): [True: 740k, False: 629k]
  |  Branch (33:23): [True: 740k, False: 0]
  |  Branch (33:40): [True: 557k, False: 71.9k]
  |  Branch (33:55): [True: 552k, False: 5.07k]
  |  Branch (33:71): [True: 5.07k, False: 71.9k]
  ------------------
   34|  71.9k|	return false;
   35|  1.36M|}
XMPMeta.cpp:_ZL12GetCodePointPPKh:
   19|  19.7k|{
   20|  19.7k|	const XMP_Uns8 * u8Ptr = *utf8Str_io;
   21|  19.7k|	XMP_Uns32 cp;
   22|  19.7k|	size_t u8Len;
   23|  19.7k|	CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );	// Throws an exception for errors.
   24|  19.7k|	*utf8Str_io = u8Ptr + u8Len;
   25|  19.7k|	return cp;
   26|  19.7k|}
XMPMeta.cpp:_ZL20IsStartChar_NonASCIIj:
   40|  19.7k|{
   41|       |	// Non-ASCII starting characters for an XML name.
   42|       |	
   43|  19.7k|	if ( ((0xC0 <= cp) && (cp <= 0xD6))  || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true;
  ------------------
  |  Branch (43:8): [True: 3.38k, False: 16.3k]
  |  Branch (43:24): [True: 46, False: 3.34k]
  |  Branch (43:43): [True: 3.34k, False: 16.3k]
  |  Branch (43:59): [True: 463, False: 2.87k]
  ------------------
   44|  19.2k|	if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true;
  ------------------
  |  Branch (44:8): [True: 2.87k, False: 16.3k]
  |  Branch (44:24): [True: 2.11k, False: 762]
  |  Branch (44:43): [True: 750, False: 16.3k]
  |  Branch (44:60): [True: 0, False: 750]
  ------------------
   45|       |
   46|  17.1k|	if ( ((0x37F <= cp) && (cp <= 0x1FFF))  || ((0x200C <= cp) && (cp <= 0x200D)) ) return true;
  ------------------
  |  Branch (46:8): [True: 750, False: 16.3k]
  |  Branch (46:25): [True: 706, False: 44]
  |  Branch (46:46): [True: 44, False: 16.3k]
  |  Branch (46:64): [True: 0, False: 44]
  ------------------
   47|  16.4k|	if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true;
  ------------------
  |  Branch (47:8): [True: 44, False: 16.3k]
  |  Branch (47:26): [True: 0, False: 44]
  |  Branch (47:46): [True: 44, False: 16.3k]
  |  Branch (47:64): [True: 0, False: 44]
  ------------------
   48|  16.4k|	if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true;
  ------------------
  |  Branch (48:8): [True: 44, False: 16.3k]
  |  Branch (48:26): [True: 44, False: 0]
  |  Branch (48:46): [True: 0, False: 16.3k]
  |  Branch (48:64): [True: 0, False: 0]
  ------------------
   49|  16.3k|	if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true;
  ------------------
  |  Branch (49:8): [True: 0, False: 16.3k]
  |  Branch (49:26): [True: 0, False: 0]
  |  Branch (49:46): [True: 0, False: 16.3k]
  |  Branch (49:65): [True: 0, False: 0]
  ------------------
   50|       |
   51|  16.3k|	return false;
   52|       |
   53|  16.3k|}
XMPMeta.cpp:_ZL17IsOtherChar_ASCIIj:
   58|  71.9k|{
   59|       |	// ASCII following characters for an XML name.
   60|  71.9k|	if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true;
  ------------------
  |  Branch (60:8): [True: 35.0k, False: 36.9k]
  |  Branch (60:23): [True: 35.0k, False: 0]
  |  Branch (60:39): [True: 34.3k, False: 2.57k]
  |  Branch (60:54): [True: 2.57k, False: 0]
  ------------------
   61|      0|	return false;
   62|  71.9k|}
XMPMeta.cpp:_ZL20IsOtherChar_NonASCIIj:
   67|  16.3k|{
   68|       |	// Non-ASCII following characters for an XML name.
   69|  16.3k|	if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F))  || ((0x203F <= cp) && (cp <= 0x2040)) ) return true;
  ------------------
  |  Branch (69:7): [True: 16.3k, False: 12]
  |  Branch (69:24): [True: 12, False: 0]
  |  Branch (69:41): [True: 12, False: 0]
  |  Branch (69:61): [True: 0, False: 0]
  |  Branch (69:79): [True: 0, False: 0]
  ------------------
   70|      0|	return false;
   71|  16.3k|}

WXMPIterator_PropCTor_1:
   40|  2.37k|{
   41|  2.37k|    XMP_ENTER_WRAPPER ( "WXMPIterator_PropCTor_1" )
  ------------------
  |  |  241|  2.37k|	AnnounceEntry ( proc );									\
  |  |  242|  2.37k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  2.37k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  2.37k|	try {													\
  |  |  245|  2.37k|		XMP_AutoMutex mutex;								\
  |  |  246|  2.37k|		wResult->errMessage = 0;
  ------------------
   42|       |
   43|  2.37k|		if ( schemaNS == 0 ) schemaNS = "";
  ------------------
  |  Branch (43:8): [True: 0, False: 2.37k]
  ------------------
   44|  2.37k|		if ( propName == 0 ) propName = "";
  ------------------
  |  Branch (44:8): [True: 0, False: 2.37k]
  ------------------
   45|       |
   46|  2.37k|		const XMPMeta & xmpObj = WtoXMPMeta_Ref ( xmpRef );
  ------------------
  |  |  108|  2.37k|#define WtoXMPMeta_Ref(xmpRef)	*((const XMPMeta *)(xmpRef))
  ------------------
   47|  2.37k|		XMPIterator *   iter   = new XMPIterator ( xmpObj, schemaNS, propName, options );
   48|  2.37k|		++iter->clientRefs;
   49|  2.37k|		XMP_Assert ( iter->clientRefs == 1 );
  ------------------
  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  ------------------
   50|  2.37k|		wResult->ptrResult = XMPIteratorRef ( iter );
   51|       |
   52|  2.37k|    XMP_EXIT_WRAPPER
  ------------------
  |  |  249|  2.37k|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|  2.37k|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|  2.37k|	AnnounceExit();
  ------------------
   53|  2.37k|}
WXMPIterator_DecrementRefCount_1:
   96|  2.37k|{
   97|  2.37k|	WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
   98|  2.37k|	XMP_ENTER_WRAPPER ( "WXMPIterator_DecrementRefCount_1" )
  ------------------
  |  |  241|  2.37k|	AnnounceEntry ( proc );									\
  |  |  242|  2.37k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  2.37k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  2.37k|	try {													\
  |  |  245|  2.37k|		XMP_AutoMutex mutex;								\
  |  |  246|  2.37k|		wResult->errMessage = 0;
  ------------------
   99|       |
  100|  2.37k|		XMPIterator * thiz = (XMPIterator*)iterRef;
  101|       |		
  102|  2.37k|		XMP_Assert ( thiz->clientRefs > 0 );
  ------------------
  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  103|  2.37k|		--thiz->clientRefs;
  104|  2.37k|		if ( thiz->clientRefs <= 0 ) delete ( thiz );
  ------------------
  |  Branch (104:8): [True: 2.37k, False: 0]
  ------------------
  105|       |
  106|  2.37k|	XMP_EXIT_WRAPPER_NO_THROW
  ------------------
  |  |  258|  2.37k|	} catch ( ... )	{							\
  |  |  259|      0|		AnnounceCatch ( "no-throw catch-all" );	\
  |  |  260|      0|		/* Do nothing. */						\
  |  |  261|      0|	}											\
  |  |  262|  2.37k|	AnnounceExit();
  ------------------
  107|  2.37k|}
WXMPIterator_Next_1:
  136|  18.4k|{
  137|  18.4k|    XMP_ENTER_WRAPPER ( "WXMPIterator_Next_1" )
  ------------------
  |  |  241|  18.4k|	AnnounceEntry ( proc );									\
  |  |  242|  18.4k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  18.4k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  18.4k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  18.4k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  18.4k|	try {													\
  |  |  245|  18.4k|		XMP_AutoMutex mutex;								\
  |  |  246|  18.4k|		wResult->errMessage = 0;
  ------------------
  138|       |
  139|  18.4k|		if ( schemaNS == 0 ) schemaNS = &voidStringPtr;
  ------------------
  |  Branch (139:8): [True: 0, False: 18.4k]
  ------------------
  140|  18.4k|		if ( nsSize == 0 ) nsSize = &voidStringLen;
  ------------------
  |  Branch (140:8): [True: 0, False: 18.4k]
  ------------------
  141|  18.4k|		if ( propPath == 0 ) propPath = &voidStringPtr;
  ------------------
  |  Branch (141:8): [True: 0, False: 18.4k]
  ------------------
  142|  18.4k|		if ( pathSize == 0 ) pathSize = &voidStringLen;
  ------------------
  |  Branch (142:8): [True: 0, False: 18.4k]
  ------------------
  143|  18.4k|		if ( propValue == 0 ) propValue = &voidStringPtr;
  ------------------
  |  Branch (143:8): [True: 0, False: 18.4k]
  ------------------
  144|  18.4k|		if ( valueSize == 0 ) valueSize = &voidStringLen;
  ------------------
  |  Branch (144:8): [True: 0, False: 18.4k]
  ------------------
  145|  18.4k|		if ( propOptions == 0 ) propOptions = &voidOptionBits;
  ------------------
  |  Branch (145:8): [True: 0, False: 18.4k]
  ------------------
  146|       |
  147|  18.4k|		XMPIterator * iter = WtoXMPIterator_Ptr ( iterRef );
  ------------------
  |  |  112|  18.4k|#define WtoXMPIterator_Ptr(iterRef)	(((iterRef) == 0) ? 0 : (XMPIterator *)(iterRef))
  |  |  ------------------
  |  |  |  Branch (112:38): [True: 0, False: 18.4k]
  |  |  ------------------
  ------------------
  148|  18.4k|		XMP_Bool found = iter->Next ( schemaNS, nsSize, propPath, pathSize, propValue, valueSize, propOptions );
  149|  18.4k|		wResult->int32Result = found;
  150|       |
  151|  18.4k|    XMP_EXIT_WRAPPER_KEEP_LOCK ( found )
  ------------------
  |  |  253|  18.4k|		if ( keep ) mutex.KeepLock();		\
  |  |  ------------------
  |  |  |  Branch (253:8): [True: 16.2k, False: 2.23k]
  |  |  ------------------
  |  |  254|  18.4k|	XMP_CATCH_EXCEPTIONS					\
  |  |  ------------------
  |  |  |  |  265|  18.4k|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      3|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      3|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      3|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      3|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 3]
  |  |  |  |  ------------------
  |  |  |  |  270|      3|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      3|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  255|  18.4k|	AnnounceExit();
  ------------------
  152|  18.4k|}
WXMPUtils_UnlockIter_1:
  174|  16.2k|{
  175|  16.2k|	WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
  176|  16.2k|    XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPUtils_UnlockIter_1" )
  ------------------
  |  |  235|  16.2k|	AnnounceNoLock ( proc );								\
  |  |  236|  16.2k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  16.2k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|  16.2k|	try {													\
  |  |  238|  16.2k|		wResult->errMessage = 0;
  ------------------
  177|       |
  178|  16.2k|		XMPIterator * iter = WtoXMPIterator_Ptr ( iterRef );
  ------------------
  |  |  112|  16.2k|#define WtoXMPIterator_Ptr(iterRef)	(((iterRef) == 0) ? 0 : (XMPIterator *)(iterRef))
  |  |  ------------------
  |  |  |  Branch (112:38): [True: 0, False: 16.2k]
  |  |  ------------------
  ------------------
  179|  16.2k|		iter->UnlockIter ( options );
  180|       |
  181|  16.2k|    XMP_EXIT_WRAPPER_NO_THROW
  ------------------
  |  |  258|  16.2k|	} catch ( ... )	{							\
  |  |  259|      0|		AnnounceCatch ( "no-throw catch-all" );	\
  |  |  260|      0|		/* Do nothing. */						\
  |  |  261|      0|	}											\
  |  |  262|  16.2k|	AnnounceExit();
  ------------------
  182|  16.2k|}

WXMPMeta_Initialize_1:
   50|      1|{
   51|      1|	XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPMeta_Initialize_1" )
  ------------------
  |  |  235|      1|	AnnounceNoLock ( proc );								\
  |  |  236|      1|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|      1|	try {													\
  |  |  238|      1|		wResult->errMessage = 0;
  ------------------
   52|       |
   53|      1|		bool ok = XMPMeta::Initialize();
   54|      1|		wResult->int32Result = ok;
   55|       |
   56|      1|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|      1|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|      1|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|      1|	AnnounceExit();
  ------------------
   57|      1|}
WXMPMeta_Terminate_1:
   62|      1|{
   63|      1|	WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
   64|      1|	XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPMeta_Terminate_1" )
  ------------------
  |  |  235|      1|	AnnounceNoLock ( proc );								\
  |  |  236|      1|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|      1|	try {													\
  |  |  238|      1|		wResult->errMessage = 0;
  ------------------
   65|       |
   66|      1|		XMPMeta::Terminate();
   67|       |
   68|      1|	XMP_EXIT_WRAPPER_NO_THROW
  ------------------
  |  |  258|      1|	} catch ( ... )	{							\
  |  |  259|      0|		AnnounceCatch ( "no-throw catch-all" );	\
  |  |  260|      0|		/* Do nothing. */						\
  |  |  261|      0|	}											\
  |  |  262|      1|	AnnounceExit();
  ------------------
   69|      0|}
WXMPMeta_CTor_1:
   77|  2.38k|{
   78|  2.38k|	XMP_ENTER_WRAPPER ( "WXMPMeta_CTor_1" )
  ------------------
  |  |  241|  2.38k|	AnnounceEntry ( proc );									\
  |  |  242|  2.38k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  2.38k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  2.38k|	try {													\
  |  |  245|  2.38k|		XMP_AutoMutex mutex;								\
  |  |  246|  2.38k|		wResult->errMessage = 0;
  ------------------
   79|       |
   80|  2.38k|		XMPMeta * xmpObj = new XMPMeta();
   81|  2.38k|		++xmpObj->clientRefs;
   82|  2.38k|		XMP_Assert ( xmpObj->clientRefs == 1 );
  ------------------
  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  ------------------
   83|  2.38k|		wResult->ptrResult = XMPMetaRef ( xmpObj );
   84|       |
   85|  2.38k|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|  2.38k|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|  2.38k|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|  2.38k|	AnnounceExit();
  ------------------
   86|  2.38k|}
WXMPMeta_DecrementRefCount_1:
  108|  2.38k|{
  109|  2.38k|	WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
  110|  2.38k|	XMP_ENTER_WRAPPER ( "WXMPMeta_DecrementRefCount_1" )
  ------------------
  |  |  241|  2.38k|	AnnounceEntry ( proc );									\
  |  |  242|  2.38k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  2.38k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  2.38k|	try {													\
  |  |  245|  2.38k|		XMP_AutoMutex mutex;								\
  |  |  246|  2.38k|		wResult->errMessage = 0;
  ------------------
  111|       |
  112|  2.38k|		XMPMeta * thiz = (XMPMeta*)xmpRef;
  113|       |		
  114|  2.38k|		XMP_Assert ( thiz->clientRefs > 0 );
  ------------------
  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  115|  2.38k|		--thiz->clientRefs;
  116|  2.38k|		if ( thiz->clientRefs <= 0 ) delete ( thiz );
  ------------------
  |  Branch (116:8): [True: 2.38k, False: 0]
  ------------------
  117|       |
  118|  2.38k|	XMP_EXIT_WRAPPER_NO_THROW
  ------------------
  |  |  258|  2.38k|	} catch ( ... )	{							\
  |  |  259|      0|		AnnounceCatch ( "no-throw catch-all" );	\
  |  |  260|      0|		/* Do nothing. */						\
  |  |  261|      0|	}											\
  |  |  262|  2.38k|	AnnounceExit();
  ------------------
  119|  2.38k|}
WXMPMeta_Unlock_1:
  207|  11.0k|{
  208|  11.0k|	WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
  209|  11.0k|	XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPMeta_Unlock_1" )
  ------------------
  |  |  235|  11.0k|	AnnounceNoLock ( proc );								\
  |  |  236|  11.0k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  11.0k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|  11.0k|	try {													\
  |  |  238|  11.0k|		wResult->errMessage = 0;
  ------------------
  210|       |
  211|  11.0k|		XMPMeta::Unlock ( options );
  212|       |
  213|  11.0k|	XMP_EXIT_WRAPPER_NO_THROW
  ------------------
  |  |  258|  11.0k|	} catch ( ... )	{							\
  |  |  259|      0|		AnnounceCatch ( "no-throw catch-all" );	\
  |  |  260|      0|		/* Do nothing. */						\
  |  |  261|      0|	}											\
  |  |  262|  11.0k|	AnnounceExit();
  ------------------
  214|  11.0k|}
WXMPMeta_RegisterNamespace_1:
  222|     47|{
  223|     47|	XMP_ENTER_WRAPPER ( "WXMPMeta_RegisterNamespace_1" )
  ------------------
  |  |  241|     47|	AnnounceEntry ( proc );									\
  |  |  242|     47|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|     47|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|     47|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|     47|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|     47|	try {													\
  |  |  245|     47|		XMP_AutoMutex mutex;								\
  |  |  246|     47|		wResult->errMessage = 0;
  ------------------
  224|       |
  225|     47|		if ( (namespaceURI == 0) || (*namespaceURI == 0) ) XMP_Throw ( "Empty namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (225:8): [True: 0, False: 47]
  |  Branch (225:31): [True: 0, False: 47]
  ------------------
  226|     47|		if ( (prefix == 0) || (*prefix == 0) ) XMP_Throw ( "Empty prefix", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (226:8): [True: 0, False: 47]
  |  Branch (226:25): [True: 0, False: 47]
  ------------------
  227|       |
  228|     47|		XMPMeta::RegisterNamespace ( namespaceURI, prefix );
  229|       |
  230|     47|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|     47|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|     47|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|     47|	AnnounceExit();
  ------------------
  231|     47|}
WXMPMeta_GetNamespacePrefix_1:
  240|  11.1k|{
  241|  11.1k|	XMP_ENTER_WRAPPER ( "WXMPMeta_GetNamespacePrefix_1" )
  ------------------
  |  |  241|  11.1k|	AnnounceEntry ( proc );									\
  |  |  242|  11.1k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  11.1k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  11.1k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  11.1k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  11.1k|	try {													\
  |  |  245|  11.1k|		XMP_AutoMutex mutex;								\
  |  |  246|  11.1k|		wResult->errMessage = 0;
  ------------------
  242|       |
  243|  11.1k|		if ( (namespaceURI == 0) || (*namespaceURI == 0) ) XMP_Throw ( "Empty namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (243:8): [True: 0, False: 11.1k]
  |  Branch (243:31): [True: 0, False: 11.1k]
  ------------------
  244|       |
  245|  11.1k|		if ( namespacePrefix == 0 ) namespacePrefix = &voidStringPtr;
  ------------------
  |  Branch (245:8): [True: 0, False: 11.1k]
  ------------------
  246|  11.1k|		if ( prefixSize == 0 ) prefixSize = &voidStringLen;
  ------------------
  |  Branch (246:8): [True: 0, False: 11.1k]
  ------------------
  247|       |
  248|  11.1k|		bool found = XMPMeta::GetNamespacePrefix ( namespaceURI, namespacePrefix, prefixSize );
  249|  11.1k|		wResult->int32Result = found;
  250|       |		
  251|  11.1k|	XMP_EXIT_WRAPPER_KEEP_LOCK ( found )
  ------------------
  |  |  253|  11.1k|		if ( keep ) mutex.KeepLock();		\
  |  |  ------------------
  |  |  |  Branch (253:8): [True: 11.0k, False: 3]
  |  |  ------------------
  |  |  254|  11.1k|	XMP_CATCH_EXCEPTIONS					\
  |  |  ------------------
  |  |  |  |  265|  11.1k|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  255|  11.1k|	AnnounceExit();
  ------------------
  252|  11.1k|}
WXMPMeta_DeleteNamespace_1:
  280|     25|{
  281|     25|	XMP_ENTER_WRAPPER ( "WXMPMeta_DeleteNamespace_1" )
  ------------------
  |  |  241|     25|	AnnounceEntry ( proc );									\
  |  |  242|     25|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|     25|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|     25|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|     25|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|     25|	try {													\
  |  |  245|     25|		XMP_AutoMutex mutex;								\
  |  |  246|     25|		wResult->errMessage = 0;
  ------------------
  282|       |
  283|     25|		if ( (namespaceURI == 0) || (*namespaceURI == 0) ) XMP_Throw ( "Empty namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (283:8): [True: 0, False: 25]
  |  Branch (283:31): [True: 0, False: 25]
  ------------------
  284|       |
  285|     25|		XMPMeta::DeleteNamespace ( namespaceURI );
  286|       |
  287|     25|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|     25|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|     25|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|     25|	AnnounceExit();
  ------------------
  288|     25|}
WXMPMeta_SetProperty_1:
  522|  4.27k|{
  523|  4.27k|	XMP_ENTER_WRAPPER ( "WXMPMeta_SetProperty_1" )
  ------------------
  |  |  241|  4.27k|	AnnounceEntry ( proc );									\
  |  |  242|  4.27k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  4.27k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  4.27k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  4.27k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  4.27k|	try {													\
  |  |  245|  4.27k|		XMP_AutoMutex mutex;								\
  |  |  246|  4.27k|		wResult->errMessage = 0;
  ------------------
  524|       |
  525|  4.27k|		if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (525:8): [True: 0, False: 4.27k]
  |  Branch (525:27): [True: 0, False: 4.27k]
  ------------------
  526|  4.27k|		if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (526:8): [True: 0, False: 4.27k]
  |  Branch (526:27): [True: 0, False: 4.27k]
  ------------------
  527|       |
  528|  4.27k|		XMPMeta * meta = WtoXMPMeta_Ptr ( xmpRef );
  ------------------
  |  |  109|  4.27k|#define WtoXMPMeta_Ptr(xmpRef)	(((xmpRef) == 0) ? 0 : (XMPMeta *)(xmpRef))
  |  |  ------------------
  |  |  |  Branch (109:33): [True: 0, False: 4.27k]
  |  |  ------------------
  ------------------
  529|  4.27k|		meta->SetProperty ( schemaNS, propName, propValue, options );
  530|       |		
  531|  4.27k|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|  4.27k|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|  4.27k|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|  4.27k|	AnnounceExit();
  ------------------
  532|  4.27k|}
WXMPMeta_AppendArrayItem_1:
  566|     66|{
  567|     66|	XMP_ENTER_WRAPPER ( "WXMPMeta_AppendArrayItem_1" )
  ------------------
  |  |  241|     66|	AnnounceEntry ( proc );									\
  |  |  242|     66|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|     66|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|     66|	try {													\
  |  |  245|     66|		XMP_AutoMutex mutex;								\
  |  |  246|     66|		wResult->errMessage = 0;
  ------------------
  568|       |
  569|     66|		if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (569:8): [True: 0, False: 66]
  |  Branch (569:27): [True: 0, False: 66]
  ------------------
  570|     66|		if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (570:8): [True: 0, False: 66]
  |  Branch (570:28): [True: 0, False: 66]
  ------------------
  571|       |
  572|     66|		XMPMeta * meta = WtoXMPMeta_Ptr ( xmpRef );
  ------------------
  |  |  109|     66|#define WtoXMPMeta_Ptr(xmpRef)	(((xmpRef) == 0) ? 0 : (XMPMeta *)(xmpRef))
  |  |  ------------------
  |  |  |  Branch (109:33): [True: 0, False: 66]
  |  |  ------------------
  ------------------
  573|     66|		meta->AppendArrayItem ( schemaNS, arrayName, arrayOptions, itemValue, options );
  574|       |		
  575|     66|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|     66|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|     66|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|     66|	AnnounceExit();
  ------------------
  576|     66|}
WXMPMeta_SetQualifier_1:
  614|     66|{
  615|     66|	XMP_ENTER_WRAPPER ( "WXMPMeta_SetQualifier_1" )
  ------------------
  |  |  241|     66|	AnnounceEntry ( proc );									\
  |  |  242|     66|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|     66|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|     66|	try {													\
  |  |  245|     66|		XMP_AutoMutex mutex;								\
  |  |  246|     66|		wResult->errMessage = 0;
  ------------------
  616|       |
  617|     66|		if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (617:8): [True: 0, False: 66]
  |  Branch (617:27): [True: 0, False: 66]
  ------------------
  618|     66|		if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (618:8): [True: 0, False: 66]
  |  Branch (618:27): [True: 0, False: 66]
  ------------------
  619|     66|		if ( (qualNS == 0) || (*qualNS == 0) ) XMP_Throw ( "Empty qualifier namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (619:8): [True: 0, False: 66]
  |  Branch (619:25): [True: 0, False: 66]
  ------------------
  620|     66|		if ( (qualName == 0) || (*qualName == 0) ) XMP_Throw ( "Empty qualifier name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (620:8): [True: 0, False: 66]
  |  Branch (620:27): [True: 0, False: 66]
  ------------------
  621|       |
  622|     66|		XMPMeta * meta = WtoXMPMeta_Ptr ( xmpRef );
  ------------------
  |  |  109|     66|#define WtoXMPMeta_Ptr(xmpRef)	(((xmpRef) == 0) ? 0 : (XMPMeta *)(xmpRef))
  |  |  ------------------
  |  |  |  Branch (109:33): [True: 0, False: 66]
  |  |  ------------------
  ------------------
  623|     66|		meta->SetQualifier ( schemaNS, propName, qualNS, qualName, qualValue, options );
  624|       |		
  625|     66|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|     66|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|     66|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|     66|	AnnounceExit();
  ------------------
  626|     66|}
WXMPMeta_CountArrayItems_1:
 1168|    835|{
 1169|    835|	XMP_ENTER_WRAPPER ( "WXMPMeta_CountArrayItems_1" )
  ------------------
  |  |  241|    835|	AnnounceEntry ( proc );									\
  |  |  242|    835|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|    835|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|    835|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|    835|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|    835|	try {													\
  |  |  245|    835|		XMP_AutoMutex mutex;								\
  |  |  246|    835|		wResult->errMessage = 0;
  ------------------
 1170|       |		
 1171|    835|		if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1171:8): [True: 0, False: 835]
  |  Branch (1171:27): [True: 0, False: 835]
  ------------------
 1172|    835|		if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1172:8): [True: 0, False: 835]
  |  Branch (1172:28): [True: 0, False: 835]
  ------------------
 1173|       |
 1174|    835|		const XMPMeta & meta = WtoXMPMeta_Ref ( xmpRef );
  ------------------
  |  |  108|    835|#define WtoXMPMeta_Ref(xmpRef)	*((const XMPMeta *)(xmpRef))
  ------------------
 1175|    835|		XMP_Index count = meta.CountArrayItems ( schemaNS, arrayName );
 1176|    835|		wResult->int32Result = count;
 1177|       |		
 1178|    835|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|    835|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|    835|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|    835|	AnnounceExit();
  ------------------
 1179|    835|}
WXMPMeta_UnlockObject_1:
 1186|    182|{
 1187|    182|	WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
 1188|    182|	XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPMeta_UnlockObject_1" )
  ------------------
  |  |  235|    182|	AnnounceNoLock ( proc );								\
  |  |  236|    182|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|    182|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|    182|	try {													\
  |  |  238|    182|		wResult->errMessage = 0;
  ------------------
 1189|       |	
 1190|    182|		const XMPMeta & meta = WtoXMPMeta_Ref ( xmpRef );
  ------------------
  |  |  108|    182|#define WtoXMPMeta_Ref(xmpRef)	*((const XMPMeta *)(xmpRef))
  ------------------
 1191|    182|		meta.UnlockObject ( options );
 1192|       |
 1193|    182|	XMP_EXIT_WRAPPER_NO_THROW
  ------------------
  |  |  258|    182|	} catch ( ... )	{							\
  |  |  259|      0|		AnnounceCatch ( "no-throw catch-all" );	\
  |  |  260|      0|		/* Do nothing. */						\
  |  |  261|      0|	}											\
  |  |  262|    182|	AnnounceExit();
  ------------------
 1194|    182|}
WXMPMeta_ParseFromBuffer_1:
 1270|  2.20k|{
 1271|  2.20k|	XMP_ENTER_WRAPPER ( "WXMPMeta_ParseFromBuffer_1" )
  ------------------
  |  |  241|  2.20k|	AnnounceEntry ( proc );									\
  |  |  242|  2.20k|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|  2.20k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|  2.20k|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|  2.20k|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|  2.20k|	try {													\
  |  |  245|  2.20k|		XMP_AutoMutex mutex;								\
  |  |  246|  2.20k|		wResult->errMessage = 0;
  ------------------
 1272|       |
 1273|  2.20k|		XMPMeta * meta = WtoXMPMeta_Ptr ( xmpRef );
  ------------------
  |  |  109|  2.20k|#define WtoXMPMeta_Ptr(xmpRef)	(((xmpRef) == 0) ? 0 : (XMPMeta *)(xmpRef))
  |  |  ------------------
  |  |  |  Branch (109:33): [True: 0, False: 2.20k]
  |  |  ------------------
  ------------------
 1274|  2.20k|		meta->ParseFromBuffer ( buffer, bufferSize, options );
 1275|       |		
 1276|  2.20k|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|  2.20k|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|  2.20k|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|    633|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|    633|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|    633|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|    633|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 633]
  |  |  |  |  ------------------
  |  |  |  |  270|    633|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|    633|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|  2.20k|	AnnounceExit();
  ------------------
 1277|  2.20k|}
WXMPMeta_SerializeToBuffer_1:
 1291|    182|{
 1292|    182|	XMP_ENTER_WRAPPER ( "WXMPMeta_SerializeToBuffer_1" )
  ------------------
  |  |  241|    182|	AnnounceEntry ( proc );									\
  |  |  242|    182|	XMP_Assert ( sXMP_InitCount > 0 );	                    \
  |  |  ------------------
  |  |  |  |  142|    182|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  243|    182|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|    182|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  244|    182|	try {													\
  |  |  245|    182|		XMP_AutoMutex mutex;								\
  |  |  246|    182|		wResult->errMessage = 0;
  ------------------
 1293|       |
 1294|    182|		if ( rdfString == 0 ) rdfString = &voidStringPtr;
  ------------------
  |  Branch (1294:8): [True: 0, False: 182]
  ------------------
 1295|    182|		if ( rdfSize == 0 ) rdfSize = &voidStringLen;
  ------------------
  |  Branch (1295:8): [True: 0, False: 182]
  ------------------
 1296|       |		
 1297|    182|		if ( newline == 0 ) newline = "";
  ------------------
  |  Branch (1297:8): [True: 0, False: 182]
  ------------------
 1298|    182|		if ( indent == 0 ) indent = "";
  ------------------
  |  Branch (1298:8): [True: 0, False: 182]
  ------------------
 1299|       |		
 1300|    182|		const XMPMeta & meta = WtoXMPMeta_Ref ( xmpRef );
  ------------------
  |  |  108|    182|#define WtoXMPMeta_Ref(xmpRef)	*((const XMPMeta *)(xmpRef))
  ------------------
 1301|    182|		meta.SerializeToBuffer ( rdfString, rdfSize, options, padding, newline, indent, baseIndent );
 1302|       |
 1303|    182|	XMP_EXIT_WRAPPER_KEEP_LOCK ( true ) // ! Always keep the lock, a string is always returned!
  ------------------
  |  |  253|    182|		if ( keep ) mutex.KeepLock();		\
  |  |  ------------------
  |  |  |  Branch (253:8): [True: 182, Folded]
  |  |  ------------------
  |  |  254|    182|	XMP_CATCH_EXCEPTIONS					\
  |  |  ------------------
  |  |  |  |  265|    182|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  255|    182|	AnnounceExit();
  ------------------
 1304|    182|}

WXMPUtils_ConvertToDate_1:
  339|    148|{
  340|    148|	XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPUtils_ConvertToDate_1" )
  ------------------
  |  |  235|    148|	AnnounceNoLock ( proc );								\
  |  |  236|    148|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|    148|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|    148|	try {													\
  |  |  238|    148|		wResult->errMessage = 0;
  ------------------
  341|       |
  342|    148|		if ( binValue == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam); // ! Pointer is from the client.
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (342:8): [True: 0, False: 148]
  ------------------
  343|    148|		XMPUtils::ConvertToDate ( strValue, binValue );
  344|       |
  345|    148|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|    148|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|    148|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|     88|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|     88|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|     88|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|     88|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 88]
  |  |  |  |  ------------------
  |  |  |  |  270|     88|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|     88|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|    148|	AnnounceExit();
  ------------------
  346|    148|}
WXMPUtils_ConvertToLocalTime_1:
  395|     60|{
  396|     60|	XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPUtils_ConvertToLocalTime_1" )
  ------------------
  |  |  235|     60|	AnnounceNoLock ( proc );								\
  |  |  236|     60|	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
  |  |  ------------------
  |  |  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  |  |  ------------------
  |  |  237|     60|	try {													\
  |  |  238|     60|		wResult->errMessage = 0;
  ------------------
  397|       |
  398|     60|		if ( time == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam);
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (398:8): [True: 0, False: 60]
  ------------------
  399|     60|		XMPUtils::ConvertToLocalTime ( time );
  400|       |
  401|     60|	XMP_EXIT_WRAPPER
  ------------------
  |  |  249|     60|	XMP_CATCH_EXCEPTIONS	\
  |  |  ------------------
  |  |  |  |  265|     60|	} catch ( XMP_Error & xmpErr ) {								\
  |  |  |  |  266|      0|		wResult->int32Result = xmpErr.GetID(); 						\
  |  |  |  |  267|      0|		wResult->ptrResult   = (void*)"XMP";						\
  |  |  |  |  268|      0|		wResult->errMessage  = xmpErr.GetErrMsg();					\
  |  |  |  |  269|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (269:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  270|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  271|      0|	} catch ( std::exception & stdErr ) {							\
  |  |  |  |  272|      0|		wResult->int32Result = kXMPErr_StdException; 				\
  |  |  |  |  273|      0|		wResult->errMessage  = stdErr.what(); 						\
  |  |  |  |  274|      0|		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  276|      0|	} catch ( ... ) {												\
  |  |  |  |  277|      0|		wResult->int32Result = kXMPErr_UnknownException; 			\
  |  |  |  |  278|      0|		wResult->errMessage  = "Caught unknown exception";			\
  |  |  |  |  279|      0|		AnnounceCatch ( wResult->errMessage );						\
  |  |  |  |  280|      0|	}
  |  |  ------------------
  |  |  250|     60|	AnnounceExit();
  ------------------
  402|     60|}

_ZN8XML_NodeC2EPS_PKch:
   90|  66.1k|            : kind(_kind), name(_name), nsPrefixLen(0), parent(_parent) {};
_ZN8XML_NodeD2Ev:
   95|  66.1k|	virtual ~XML_Node() { RemoveAttrs(); RemoveContent(); };
_ZN16XMLParserAdapterC2Ev:
  112|  2.20k|		: tree(0,"",kRootNode), rootNode(0), rootCount(0), charEncoding(XMP_OptionBits(-1)), pendingCount(0)
  113|  2.20k|	{
  114|       |		#if XMP_DebugBuild
  115|       |			parseLog = 0;
  116|       |		#endif
  117|  2.20k|	};
_ZN16XMLParserAdapterD2Ev:
  119|  2.20k|	virtual ~XMLParserAdapter() {};

_ZNK8XML_Node16IsWhitespaceNodeEv:
   39|  23.6k|{
   40|  23.6k|	if ( this->kind != kCDataNode ) return false;
  ------------------
  |  Branch (40:7): [True: 7.48k, False: 16.1k]
  ------------------
   41|       |
   42|  53.7k|	for ( size_t i = 0; i < this->value.size(); ++i ) {
  ------------------
  |  Branch (42:22): [True: 37.8k, False: 15.9k]
  ------------------
   43|  37.8k|		unsigned char ch = this->value[i];
   44|  37.8k|		if ( IsWhitespaceChar ( ch ) ) continue;
  ------------------
  |  |   45|  37.8k|#define IsWhitespaceChar(ch)	( ((ch) == ' ') || ((ch) == 0x09) || ((ch) == 0x0A) || ((ch) == 0x0D) )
  |  |  ------------------
  |  |  |  Branch (45:32): [True: 28.9k, False: 8.90k]
  |  |  |  Branch (45:49): [True: 353, False: 8.54k]
  |  |  |  Branch (45:67): [True: 8.36k, False: 186]
  |  |  |  Branch (45:85): [True: 3, False: 183]
  |  |  ------------------
  ------------------
   45|       |		// *** Add checks for other whitespace characters.
   46|    183|		return false;	// All the checks failed, this isn't whitespace.
   47|  37.8k|	}
   48|       |
   49|  15.9k|	return true;
   50|       |
   51|  16.1k|}	// XML_Node::IsWhitespaceNode
_ZN8XML_Node11RemoveAttrsEv:
  427|  66.1k|{
  428|       |
  429|  77.6k|	for ( size_t i = 0, vLim = this->attrs.size(); i < vLim; ++i ) delete this->attrs[i];
  ------------------
  |  Branch (429:49): [True: 11.5k, False: 66.1k]
  ------------------
  430|  66.1k|	this->attrs.clear();
  431|       |
  432|  66.1k|}	// XML_Node::RemoveAttrs
_ZN8XML_Node13RemoveContentEv:
  439|  66.1k|{
  440|       |
  441|   118k|	for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) delete this->content[i];
  ------------------
  |  Branch (441:51): [True: 52.3k, False: 66.1k]
  ------------------
  442|  66.1k|	this->content.clear();
  443|       |
  444|  66.1k|}	// XML_Node::RemoveContent

_Z13XMP_InitMutexP15pthread_mutex_t:
  114|      1|	bool XMP_InitMutex ( XMP_Mutex * mutex ) {
  115|      1|		int err = pthread_mutex_init ( mutex, 0 );
  116|      1|		return (err == 0 );
  117|      1|	}
_Z13XMP_TermMutexR15pthread_mutex_t:
  119|      1|	void XMP_TermMutex ( XMP_Mutex & mutex ) {
  120|      1|		(void) pthread_mutex_destroy ( &mutex );
  121|      1|	}
_Z23XMP_EnterCriticalRegionR15pthread_mutex_t:
  123|  46.7k|	void XMP_EnterCriticalRegion ( XMP_Mutex & mutex ) {
  124|  46.7k|		int err = pthread_mutex_lock ( &mutex );
  125|  46.7k|		if ( err != 0 ) XMP_Throw ( "XMP_EnterCriticalRegion - pthread_mutex_lock failure", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (125:8): [True: 0, False: 46.7k]
  ------------------
  126|  46.7k|	}
_Z22XMP_ExitCriticalRegionR15pthread_mutex_t:
  128|  46.7k|	void XMP_ExitCriticalRegion ( XMP_Mutex & mutex ) {
  129|  46.7k|		int err = pthread_mutex_unlock ( &mutex );
  130|  46.7k|		if ( err != 0 ) XMP_Throw ( "XMP_ExitCriticalRegion - pthread_mutex_unlock failure", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (130:8): [True: 0, False: 46.7k]
  ------------------
  131|  46.7k|	}
_Z16VerifySetOptionsjPKc:
  563|  4.50k|{
  564|       |
  565|  4.50k|	if ( options & kXMP_PropArrayIsAltText )   options |= kXMP_PropArrayIsAlternate;
  ------------------
  |  Branch (565:7): [True: 5, False: 4.50k]
  ------------------
  566|  4.50k|	if ( options & kXMP_PropArrayIsAlternate ) options |= kXMP_PropArrayIsOrdered;
  ------------------
  |  Branch (566:7): [True: 99, False: 4.40k]
  ------------------
  567|  4.50k|	if ( options & kXMP_PropArrayIsOrdered )   options |= kXMP_PropValueIsArray;
  ------------------
  |  Branch (567:7): [True: 411, False: 4.09k]
  ------------------
  568|       |	
  569|  4.50k|	if ( options & ~kXMP_AllSetOptionsMask ) {
  ------------------
  |  Branch (569:7): [True: 0, False: 4.50k]
  ------------------
  570|      0|		XMP_Throw ( "Unrecognized option flags", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  571|      0|	}
  572|       |	
  573|  4.50k|	if ( (options & kXMP_PropValueIsStruct) && (options & kXMP_PropValueIsArray) ) {
  ------------------
  |  Branch (573:7): [True: 144, False: 4.36k]
  |  Branch (573:45): [True: 0, False: 144]
  ------------------
  574|      0|		XMP_Throw ( "IsStruct and IsArray options are mutually exclusive", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  575|      0|	}
  576|       |	
  577|  4.50k|	if ( (options & kXMP_PropValueOptionsMask) && (options & kXMP_PropCompositeMask) ) {
  ------------------
  |  Branch (577:7): [True: 0, False: 4.50k]
  |  Branch (577:48): [True: 0, False: 0]
  ------------------
  578|      0|		XMP_Throw ( "Structs and arrays can't have \"value\" options", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  579|      0|	}
  580|       |	
  581|  4.50k|	if ( (propValue != 0) && (options & kXMP_PropCompositeMask) ) {
  ------------------
  |  Branch (581:7): [True: 3.75k, False: 754]
  |  Branch (581:27): [True: 0, False: 3.75k]
  ------------------
  582|      0|		XMP_Throw ( "Structs and arrays can't have string values", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  583|      0|	}
  584|       |
  585|  4.50k|	return options;
  586|       |
  587|  4.50k|}	// VerifySetOptions
_Z11ExpandXPathPKcS0_PNSt3__16vectorI13XPathStepInfoNS1_9allocatorIS3_EEEE:
  662|  19.8k|{
  663|  19.8k|	XMP_Assert ( (schemaNS != 0) && (propPath != 0) && (*propPath != 0) && (expandedXPath != 0) );
  ------------------
  |  |  142|  19.8k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  664|       |	
  665|  19.8k|	XMP_StringPtr	stepBegin, stepEnd;
  666|  19.8k|	XMP_StringPtr	qualName, nameEnd;
  667|  19.8k|	XMP_VarString	currStep;
  668|       |		
  669|  19.8k|	qualName = nameEnd = NULL;
  670|  19.8k|	size_t resCount = 2;	// Guess at the number of steps. At least 2, plus 1 for each '/' or '['.
  671|  1.80M|	for ( stepEnd = propPath; *stepEnd != 0; ++stepEnd ) {
  ------------------
  |  Branch (671:28): [True: 1.78M, False: 19.8k]
  ------------------
  672|  1.78M|		if ( (*stepEnd == '/') || (*stepEnd == '[') ) ++resCount;
  ------------------
  |  Branch (672:8): [True: 1.75k, False: 1.78M]
  |  Branch (672:29): [True: 6.03k, False: 1.78M]
  ------------------
  673|  1.78M|	}
  674|       |	
  675|  19.8k|	expandedXPath->clear();
  676|  19.8k|	expandedXPath->reserve ( resCount );
  677|       |	
  678|       |	// -------------------------------------------------------------------------------------------
  679|       |	// Pull out the first component and do some special processing on it: add the schema namespace
  680|       |	// prefix and see if it is an alias. The start must be a qualName.
  681|       |	
  682|  19.8k|	stepBegin = propPath;
  683|  19.8k|	stepEnd = stepBegin;
  684|  1.76M|	while ( (*stepEnd != 0) && (*stepEnd != '/') && (*stepEnd != '[') && (*stepEnd != '*') ) ++stepEnd;
  ------------------
  |  Branch (684:10): [True: 1.74M, False: 13.4k]
  |  Branch (684:29): [True: 1.74M, False: 359]
  |  Branch (684:50): [True: 1.74M, False: 6.03k]
  |  Branch (684:71): [True: 1.74M, False: 0]
  ------------------
  685|  19.8k|	if ( stepEnd == stepBegin ) XMP_Throw ( "Empty initial XPath step", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (685:7): [True: 0, False: 19.8k]
  ------------------
  686|  19.8k|	currStep.assign ( stepBegin, (stepEnd - stepBegin) );
  687|       |	
  688|  19.8k|	VerifyXPathRoot ( schemaNS, currStep.c_str(), expandedXPath );
  689|       |
  690|  19.8k|	XMP_OptionBits stepFlags = kXMP_StructFieldStep;	
  691|  19.8k|	if ( sRegisteredAliasMap->find ( (*expandedXPath)[kRootPropStep].step ) != sRegisteredAliasMap->end() ) {
  ------------------
  |  Branch (691:7): [True: 0, False: 19.8k]
  ------------------
  692|      0|		stepFlags |= kXMP_StepIsAlias;
  693|      0|	}
  694|  19.8k|	(*expandedXPath)[kRootPropStep].options |= stepFlags;
  695|       |		
  696|       |	// -----------------------------------------------------
  697|       |	// Now continue to process the rest of the XPath string.
  698|       |
  699|  27.5k|	while ( *stepEnd != 0 ) {
  ------------------
  |  Branch (699:10): [True: 7.79k, False: 19.8k]
  ------------------
  700|       |
  701|  7.79k|		stepBegin = stepEnd;
  702|  7.79k|		if ( *stepBegin == '/' ) ++stepBegin;
  ------------------
  |  Branch (702:8): [True: 1.75k, False: 6.03k]
  ------------------
  703|  7.79k|		if ( *stepBegin == '*' ) {
  ------------------
  |  Branch (703:8): [True: 0, False: 7.79k]
  ------------------
  704|      0|			++stepBegin;
  705|      0|			if ( *stepBegin != '[' ) XMP_Throw ( "Missing '[' after '*'", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (705:9): [True: 0, False: 0]
  ------------------
  706|      0|		}
  707|  7.79k|		stepEnd = stepBegin;
  708|       |
  709|  7.79k|		if ( *stepBegin != '[' ) {
  ------------------
  |  Branch (709:8): [True: 1.75k, False: 6.03k]
  ------------------
  710|       |		
  711|       |			// A struct field or qualifier.
  712|  1.75k|			qualName = stepBegin;
  713|  29.0k|			while ( (*stepEnd != 0) && (*stepEnd != '/') && (*stepEnd != '[') && (*stepEnd != '*') ) ++stepEnd;
  ------------------
  |  Branch (713:12): [True: 27.2k, False: 1.75k]
  |  Branch (713:31): [True: 27.2k, False: 0]
  |  Branch (713:52): [True: 27.2k, False: 0]
  |  Branch (713:73): [True: 27.2k, False: 0]
  ------------------
  714|  1.75k|			nameEnd = stepEnd;
  715|  1.75k|			stepFlags = kXMP_StructFieldStep;	// ! Touch up later, also changing '@' to '?'.
  716|       |			
  717|  6.03k|		} else {
  718|       |		
  719|       |			// One of the array forms.
  720|       |		
  721|  6.03k|			++stepEnd;	// Look at the character after the leading '['.
  722|       |			
  723|  6.03k|			if ( ('0' <= *stepEnd) && (*stepEnd <= '9') ) {
  ------------------
  |  Branch (723:9): [True: 6.03k, False: 0]
  |  Branch (723:30): [True: 6.03k, False: 0]
  ------------------
  724|       |
  725|       |				// A numeric (decimal integer) array index.
  726|  12.0k|				while ( (*stepEnd != 0) && ('0' <= *stepEnd) && (*stepEnd <= '9') ) ++stepEnd;
  ------------------
  |  Branch (726:13): [True: 12.0k, False: 0]
  |  Branch (726:32): [True: 12.0k, False: 0]
  |  Branch (726:53): [True: 6.03k, False: 6.03k]
  ------------------
  727|  6.03k|				if ( *stepEnd != ']' ) XMP_Throw ( "Missing ']' for integer array index", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (727:10): [True: 0, False: 6.03k]
  ------------------
  728|  6.03k|				stepFlags = kXMP_ArrayIndexStep;
  729|       |
  730|  6.03k|			} else {
  731|       |
  732|       |				// Could be "[last()]" or one of the selector forms. Find the ']' or '='.
  733|       |				
  734|      0|				while ( (*stepEnd != 0) && (*stepEnd != ']') && (*stepEnd != '=') ) ++stepEnd;
  ------------------
  |  Branch (734:13): [True: 0, False: 0]
  |  Branch (734:32): [True: 0, False: 0]
  |  Branch (734:53): [True: 0, False: 0]
  ------------------
  735|      0|				if ( *stepEnd == 0 ) XMP_Throw ( "Missing ']' or '=' for array index", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (735:10): [True: 0, False: 0]
  ------------------
  736|       |
  737|      0|				if ( *stepEnd == ']' ) {
  ------------------
  |  Branch (737:10): [True: 0, False: 0]
  ------------------
  738|       |
  739|      0|					if ( strncmp ( "[last()", stepBegin, (stepEnd - stepBegin) ) != 0 ) {
  ------------------
  |  Branch (739:11): [True: 0, False: 0]
  ------------------
  740|      0|						XMP_Throw ( "Invalid non-numeric array index", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  741|      0|					}
  742|      0|					stepFlags = kXMP_ArrayLastStep;
  743|       |
  744|      0|				} else {
  745|       |
  746|      0|					qualName = stepBegin+1;
  747|      0|					nameEnd = stepEnd;
  748|      0|					++stepEnd;	// Absorb the '=', remember the quote.
  749|      0|					const char quote = *stepEnd;
  750|      0|					if ( (quote != '\'') && (quote != '"') ) {
  ------------------
  |  Branch (750:11): [True: 0, False: 0]
  |  Branch (750:30): [True: 0, False: 0]
  ------------------
  751|      0|						XMP_Throw ( "Invalid quote in array selector", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  752|      0|					}
  753|       |
  754|      0|					++stepEnd;	// Absorb the leading quote.
  755|      0|					while ( *stepEnd != 0 ) {
  ------------------
  |  Branch (755:14): [True: 0, False: 0]
  ------------------
  756|      0|						if ( *stepEnd == quote ) {
  ------------------
  |  Branch (756:12): [True: 0, False: 0]
  ------------------
  757|      0|							if ( *(stepEnd+1) != quote ) break;
  ------------------
  |  Branch (757:13): [True: 0, False: 0]
  ------------------
  758|      0|							++stepEnd;
  759|      0|						}
  760|      0|						++stepEnd;
  761|      0|					}
  762|      0|					if ( *stepEnd == 0 ) {
  ------------------
  |  Branch (762:11): [True: 0, False: 0]
  ------------------
  763|      0|						XMP_Throw ( "No terminating quote for array selector", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  764|      0|					}
  765|      0|					++stepEnd;	// Absorb the trailing quote.
  766|       |					
  767|      0|					stepFlags = kXMP_FieldSelectorStep;	// ! Touch up later, also changing '@' to '?'.
  768|       |
  769|      0|				}
  770|       |
  771|      0|			}
  772|       |
  773|  6.03k|			if ( *stepEnd != ']' ) XMP_Throw ( "Missing ']' for array index", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (773:9): [True: 0, False: 6.03k]
  ------------------
  774|  6.03k|			++stepEnd;
  775|       |			
  776|  6.03k|		}
  777|       |
  778|  7.79k|		if ( stepEnd == stepBegin ) XMP_Throw ( "Empty XPath step", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (778:8): [True: 0, False: 7.79k]
  ------------------
  779|  7.79k|		currStep.assign ( stepBegin, (stepEnd - stepBegin) );
  780|       |
  781|  7.79k|		if ( GetStepKind ( stepFlags ) == kXMP_StructFieldStep ) {
  ------------------
  |  |  408|  7.79k|#define GetStepKind(f)	((f) & kXMP_StepKindMask)
  ------------------
  |  Branch (781:8): [True: 1.75k, False: 6.03k]
  ------------------
  782|       |
  783|  1.75k|			if ( currStep[0] == '@' ) {
  ------------------
  |  Branch (783:9): [True: 0, False: 1.75k]
  ------------------
  784|      0|				currStep[0] = '?';
  785|      0|				if ( currStep != "?xml:lang" ) XMP_Throw ( "Only xml:lang allowed with '@'", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (785:10): [True: 0, False: 0]
  ------------------
  786|      0|			}
  787|  1.75k|			if ( currStep[0] == '?' ) {
  ------------------
  |  Branch (787:9): [True: 497, False: 1.26k]
  ------------------
  788|    497|				++qualName;
  789|    497|				stepFlags = kXMP_QualifierStep;
  790|    497|			}
  791|  1.75k|			VerifyQualName ( qualName, nameEnd );
  792|       |
  793|  6.03k|		} else if ( GetStepKind ( stepFlags ) == kXMP_FieldSelectorStep ) {
  ------------------
  |  |  408|  6.03k|#define GetStepKind(f)	((f) & kXMP_StepKindMask)
  ------------------
  |  Branch (793:15): [True: 0, False: 6.03k]
  ------------------
  794|       |
  795|      0|			if ( currStep[1] == '@' ) {
  ------------------
  |  Branch (795:9): [True: 0, False: 0]
  ------------------
  796|      0|				currStep[1] = '?';
  797|      0|				if ( strncmp ( currStep.c_str(), "[?xml:lang=", 11 ) != 0 ) {
  ------------------
  |  Branch (797:10): [True: 0, False: 0]
  ------------------
  798|      0|					XMP_Throw ( "Only xml:lang allowed with '@'", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  799|      0|				}
  800|      0|			}
  801|      0|			if ( currStep[1] == '?' ) {
  ------------------
  |  Branch (801:9): [True: 0, False: 0]
  ------------------
  802|      0|				++qualName;
  803|      0|				stepFlags = kXMP_QualSelectorStep;
  804|      0|			}
  805|      0|			VerifyQualName ( qualName, nameEnd );
  806|       |
  807|      0|		}
  808|       |
  809|  7.79k|		expandedXPath->push_back ( XPathStepInfo ( currStep, stepFlags ) );
  810|       |
  811|  7.79k|	}
  812|       |
  813|  19.8k|}	// ExpandXPath
_Z14FindSchemaNodeP8XMP_NodePKcbPNSt3__111__wrap_iterIPS0_EE:
  828|  44.3k|{
  829|  44.3k|	XMP_Node * schemaNode = 0;
  830|       |	
  831|  44.3k|	XMP_Assert ( xmpTree->parent == 0 );
  ------------------
  |  |  142|  44.3k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  832|       |	
  833|   212k|	for ( size_t schemaNum = 0, schemaLim = xmpTree->children.size(); schemaNum != schemaLim; ++schemaNum ) {
  ------------------
  |  Branch (833:68): [True: 197k, False: 15.1k]
  ------------------
  834|   197k|		XMP_Node * currSchema = xmpTree->children[schemaNum];
  835|   197k|		XMP_Assert ( currSchema->parent == xmpTree );
  ------------------
  |  |  142|   197k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  836|   197k|		if ( currSchema->name == nsURI ) {
  ------------------
  |  Branch (836:8): [True: 29.1k, False: 168k]
  ------------------
  837|  29.1k|			schemaNode = currSchema;
  838|  29.1k|			if ( ptrPos != 0 ) *ptrPos = xmpTree->children.begin() + schemaNum;
  ------------------
  |  Branch (838:9): [True: 19.0k, False: 10.0k]
  ------------------
  839|  29.1k|			break;
  840|  29.1k|		}
  841|   197k|	}
  842|       |	
  843|  44.3k|	if ( (schemaNode == 0) && createNodes ) {
  ------------------
  |  Branch (843:7): [True: 15.1k, False: 29.1k]
  |  Branch (843:28): [True: 4.02k, False: 11.1k]
  ------------------
  844|       |
  845|  4.02k|		schemaNode = new XMP_Node ( xmpTree, nsURI, (kXMP_SchemaNode | kXMP_NewImplicitNode) );
  ------------------
  |  |  410|  4.02k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  846|  4.02k|		XMP_StringPtr prefixPtr;
  847|  4.02k|		XMP_StringLen prefixLen;
  848|  4.02k|        bool found = XMPMeta::GetNamespacePrefix ( nsURI, &prefixPtr, &prefixLen );	// *** Use map directly?
  849|  4.02k|		XMP_Assert ( found );
  ------------------
  |  |  142|  4.02k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  850|  4.02k|		UNUSED(found);
  851|       |
  852|  4.02k|		schemaNode->value.assign ( prefixPtr, prefixLen );
  853|  4.02k|		xmpTree->children.push_back ( schemaNode );
  854|  4.02k|		if ( ptrPos != 0 ) *ptrPos = xmpTree->children.end() - 1;
  ------------------
  |  Branch (854:8): [True: 656, False: 3.36k]
  ------------------
  855|       |
  856|       |		#if 0	// *** XMP_DebugBuild
  857|       |			schemaNode->_valuePtr = schemaNode->value.c_str();
  858|       |		#endif
  859|       |
  860|  4.02k|	}
  861|       |	
  862|  44.3k|	XMP_Assert ( (ptrPos == 0) || (schemaNode == 0) || (schemaNode == **ptrPos) );
  ------------------
  |  |  142|  44.3k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  863|  44.3k|	XMP_Assert ( (schemaNode != 0) || (! createNodes) );
  ------------------
  |  |  142|  44.3k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  864|  44.3k|	return schemaNode;
  865|       |	
  866|  44.3k|}	// FindSchemaNode
_Z13FindChildNodeP8XMP_NodePKcbPNSt3__111__wrap_iterIPS0_EE:
  881|  32.5k|{
  882|  32.5k|	XMP_Node * childNode = 0;
  883|       |
  884|  32.5k|	if ( ! (parent->options & (kXMP_SchemaNode | kXMP_PropValueIsStruct)) ) {
  ------------------
  |  Branch (884:7): [True: 9, False: 32.4k]
  ------------------
  885|      9|		if ( ! (parent->options & kXMP_NewImplicitNode) ) {
  ------------------
  |  |  410|      9|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (885:8): [True: 9, False: 0]
  ------------------
  886|      9|			XMP_Throw ( "Named children only allowed for schemas and structs", kXMPErr_BadXPath );
  ------------------
  |  |  199|      9|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  887|      0|		}
  888|      0|		if ( parent->options & kXMP_PropValueIsArray ) {
  ------------------
  |  Branch (888:8): [True: 0, False: 0]
  ------------------
  889|      0|			XMP_Throw ( "Named children not allowed for arrays", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  890|      0|		}
  891|      0|		if ( ! createNodes ) {	// *** Should be assert? If !createNodes, why is the parent a new implicit node?
  ------------------
  |  Branch (891:8): [True: 0, False: 0]
  ------------------
  892|      0|			XMP_Throw ( "Parent is new implicit node, but createNodes is false", kXMPErr_InternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  893|      0|		}
  894|      0|		parent->options |= kXMP_PropValueIsStruct;
  895|      0|	}
  896|       |	
  897|   709k|	for ( size_t childNum = 0, childLim = parent->children.size(); childNum != childLim; ++childNum ) {
  ------------------
  |  Branch (897:65): [True: 694k, False: 14.9k]
  ------------------
  898|   694k|		XMP_Node * currChild = parent->children[childNum];
  899|   694k|		XMP_Assert ( currChild->parent == parent );
  ------------------
  |  |  142|   694k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  900|   694k|		if ( currChild->name == childName ) {
  ------------------
  |  Branch (900:8): [True: 17.5k, False: 676k]
  ------------------
  901|  17.5k|			childNode = currChild;
  902|  17.5k|			if ( ptrPos != 0 ) *ptrPos = parent->children.begin() + childNum;
  ------------------
  |  Branch (902:9): [True: 17.5k, False: 74]
  ------------------
  903|  17.5k|			break;
  904|  17.5k|		}
  905|   694k|	}
  906|       |	
  907|  32.4k|	if ( (childNode == 0) && createNodes ) {
  ------------------
  |  Branch (907:7): [True: 14.9k, False: 17.5k]
  |  Branch (907:27): [True: 3.41k, False: 11.4k]
  ------------------
  908|  3.41k|		childNode = new XMP_Node ( parent, childName, kXMP_NewImplicitNode );
  ------------------
  |  |  410|  3.41k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  909|  3.41k|		parent->children.push_back ( childNode );
  910|  3.41k|		if ( ptrPos != 0 ) *ptrPos = parent->children.end() - 1;
  ------------------
  |  Branch (910:8): [True: 3.41k, False: 0]
  ------------------
  911|  3.41k|	}
  912|       |	
  913|  32.4k|	XMP_Assert ( (ptrPos == 0) || (childNode == 0) || (childNode == **ptrPos) );
  ------------------
  |  |  142|  32.4k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  914|  32.4k|	XMP_Assert ( (childNode != 0) || (! createNodes) );
  ------------------
  |  |  142|  32.4k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  915|  32.4k|	return childNode;
  916|       |	
  917|  32.5k|}	// FindChildNode
_Z17FindQualifierNodeP8XMP_NodePKcbPNSt3__111__wrap_iterIPS0_EE:
  934|    497|{
  935|    497|	XMP_Node * qualNode = 0;
  936|       |	
  937|    497|	XMP_Assert ( *qualName != '?' );
  ------------------
  |  |  142|    497|	#define XMP_Assert(c)	((void) 0)
  ------------------
  938|       |	
  939|    706|	for ( size_t qualNum = 0, qualLim = parent->qualifiers.size(); qualNum != qualLim; ++qualNum ) {
  ------------------
  |  Branch (939:65): [True: 529, False: 177]
  ------------------
  940|    529|		XMP_Node * currQual = parent->qualifiers[qualNum];
  941|    529|		XMP_Assert ( currQual->parent == parent );
  ------------------
  |  |  142|    529|	#define XMP_Assert(c)	((void) 0)
  ------------------
  942|    529|		if ( currQual->name == qualName ) {
  ------------------
  |  Branch (942:8): [True: 320, False: 209]
  ------------------
  943|    320|			qualNode = currQual;
  944|    320|			if ( ptrPos != 0 ) *ptrPos = parent->qualifiers.begin() + qualNum;
  ------------------
  |  Branch (944:9): [True: 320, False: 0]
  ------------------
  945|    320|			break;
  946|    320|		}
  947|    529|	}
  948|       |	
  949|    497|	if ( (qualNode == 0) && createNodes ) {
  ------------------
  |  Branch (949:7): [True: 177, False: 320]
  |  Branch (949:26): [True: 177, False: 0]
  ------------------
  950|       |
  951|    177|		qualNode = new XMP_Node ( parent, qualName, (static_cast<unsigned long>(kXMP_PropIsQualifier) | static_cast<unsigned long>(kXMP_NewImplicitNode)) );
  ------------------
  |  |  410|    177|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  952|    177|		parent->options |= kXMP_PropHasQualifiers;
  953|       |
  954|    177|		const bool isLang 	 = XMP_LitMatch ( qualName, "xml:lang" );
  ------------------
  |  |   96|    177|#define XMP_LitMatch(s,l)		(std::strcmp((s),(l)) == 0)
  ------------------
  955|    177|		const bool isType 	 = XMP_LitMatch ( qualName, "rdf:type" );
  ------------------
  |  |   96|    177|#define XMP_LitMatch(s,l)		(std::strcmp((s),(l)) == 0)
  ------------------
  956|    177|		const bool isSpecial = isLang | isType;
  957|       |
  958|    177|		if ( isLang ) {
  ------------------
  |  Branch (958:8): [True: 116, False: 61]
  ------------------
  959|    116|			parent->options |= kXMP_PropHasLang;
  960|    116|		} else if ( isType ) {
  ------------------
  |  Branch (960:15): [True: 0, False: 61]
  ------------------
  961|      0|			parent->options |= kXMP_PropHasType;
  962|      0|		}
  963|       |		
  964|    177|		if ( parent->qualifiers.empty() || (! isSpecial) ) {
  ------------------
  |  Branch (964:8): [True: 134, False: 43]
  |  Branch (964:38): [True: 43, False: 0]
  ------------------
  965|    177|			parent->qualifiers.push_back ( qualNode );
  966|    177|			if ( ptrPos != 0 ) *ptrPos = parent->qualifiers.end() - 1;
  ------------------
  |  Branch (966:9): [True: 177, False: 0]
  ------------------
  967|    177|		} else {
  968|      0|			XMP_NodePtrPos insertPos = parent->qualifiers.begin();	// ! Lang goes first, type after.
  969|      0|			if ( isType && (parent->options & kXMP_PropHasLang) ) ++insertPos;	// *** Does insert at end() work?
  ------------------
  |  Branch (969:9): [True: 0, False: 0]
  |  Branch (969:19): [True: 0, False: 0]
  ------------------
  970|      0|			insertPos = parent->qualifiers.insert ( insertPos, qualNode );
  971|      0|			if ( ptrPos != 0 ) *ptrPos = insertPos;
  ------------------
  |  Branch (971:9): [True: 0, False: 0]
  ------------------
  972|      0|		}
  973|       |
  974|    177|	}
  975|       |	
  976|    497|	XMP_Assert ( (ptrPos == 0) || (qualNode == 0) || (qualNode == **ptrPos) );
  ------------------
  |  |  142|    497|	#define XMP_Assert(c)	((void) 0)
  ------------------
  977|    497|	XMP_Assert ( (qualNode != 0) || (! createNodes) );
  ------------------
  |  |  142|    497|	#define XMP_Assert(c)	((void) 0)
  ------------------
  978|    497|	return qualNode;
  979|       |	
  980|    497|}	// FindQualifierNode
_Z8FindNodeP8XMP_NodeRKNSt3__16vectorI13XPathStepInfoNS1_9allocatorIS3_EEEEbjPNS1_11__wrap_iterIPS0_EE:
 1062|  19.7k|{
 1063|  19.7k|	XMP_Node *     currNode = 0;
 1064|  19.7k|	XMP_NodePtrPos currPos;
 1065|  19.7k|	XMP_NodePtrPos newSubPos;	// Root of implicitly created subtree. Valid only if leaf is new.
 1066|  19.7k|	bool           leafIsNew = false;
 1067|       |	
 1068|  19.7k|	XMP_Assert ( (leafOptions == 0) || createNodes );
  ------------------
  |  |  142|  19.7k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1069|       |
 1070|  19.7k|	if ( expandedXPath.empty() ) XMP_Throw ( "Empty XPath", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1070:7): [True: 0, False: 19.7k]
  ------------------
 1071|       |	
 1072|  19.7k|	size_t stepNum = 1;	// By default start calling FollowXPathStep for the top level property step.
 1073|  19.7k|	size_t stepLim = expandedXPath.size();
 1074|       |	
 1075|       |	// The start of processing deals with the schema node and top level alias. If the top level step
 1076|       |	// is not an alias, lookup the expanded path's schema URI. Otherwise, lookup the expanded path
 1077|       |	// for the actual. While tempting, don't substitute the actual's path into the local one, don't
 1078|       |	// risk messing with the caller's use of that. Also don't call FindNode recursively, we need to
 1079|       |	// keep track of the root of the implicitly created subtree as we move down the path.
 1080|       |	
 1081|  19.7k|	if ( ! (expandedXPath[kRootPropStep].options & kXMP_StepIsAlias) ) {
  ------------------
  |  Branch (1081:7): [True: 19.7k, False: 0]
  ------------------
 1082|       |		
 1083|  19.7k|		currNode = FindSchemaNode ( xmpTree, expandedXPath[kSchemaStep].step.c_str(), createNodes, &currPos );
 1084|  19.7k|		if ( currNode == 0 ) return 0;
  ------------------
  |  Branch (1084:8): [True: 6, False: 19.7k]
  ------------------
 1085|       |
 1086|  19.7k|		if ( currNode->options & kXMP_NewImplicitNode ) {
  ------------------
  |  |  410|  19.7k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (1086:8): [True: 656, False: 19.0k]
  ------------------
 1087|    656|			currNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|    656|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
 1088|    656|			if ( ! leafIsNew ) newSubPos = currPos;	// Save the top most implicit node.
  ------------------
  |  Branch (1088:9): [True: 656, False: 0]
  ------------------
 1089|    656|			leafIsNew = true;	// If any parent is new, the leaf will be new also.
 1090|    656|		}
 1091|       |
 1092|  19.7k|	} else {
 1093|       |
 1094|      0|		stepNum = 2;	// ! Continue processing the original path at the second level step.
 1095|       |
 1096|      0|		XMP_AliasMapPos aliasPos = sRegisteredAliasMap->find ( expandedXPath[kRootPropStep].step );
 1097|      0|		XMP_Assert ( aliasPos != sRegisteredAliasMap->end() );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1098|       |		
 1099|      0|		currNode = FindSchemaNode ( xmpTree, aliasPos->second[kSchemaStep].step.c_str(), createNodes, &currPos );
 1100|      0|		if ( currNode == 0 ) goto EXIT;
  ------------------
  |  Branch (1100:8): [True: 0, False: 0]
  ------------------
 1101|      0|		if ( currNode->options & kXMP_NewImplicitNode ) {
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (1101:8): [True: 0, False: 0]
  ------------------
 1102|      0|			currNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
 1103|      0|			if ( ! leafIsNew ) newSubPos = currPos;	// Save the top most implicit node.
  ------------------
  |  Branch (1103:9): [True: 0, False: 0]
  ------------------
 1104|      0|			leafIsNew = true;	// If any parent is new, the leaf will be new also.
 1105|      0|		}
 1106|       |
 1107|      0|		currNode = FollowXPathStep ( currNode, aliasPos->second, 1, createNodes, &currPos );
 1108|      0|		if ( currNode == 0 ) goto EXIT;
  ------------------
  |  Branch (1108:8): [True: 0, False: 0]
  ------------------
 1109|      0|		if ( currNode->options & kXMP_NewImplicitNode ) {
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (1109:8): [True: 0, False: 0]
  ------------------
 1110|      0|			currNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
 1111|      0|			CheckImplicitStruct ( currNode, expandedXPath, 2, stepLim );
 1112|      0|			if ( ! leafIsNew ) newSubPos = currPos;	// Save the top most implicit node.
  ------------------
  |  Branch (1112:9): [True: 0, False: 0]
  ------------------
 1113|      0|			leafIsNew = true;	// If any parent is new, the leaf will be new also.
 1114|      0|		}
 1115|       |		
 1116|      0|		XMP_OptionBits arrayForm = aliasPos->second[kRootPropStep].options & kXMP_PropArrayFormMask;
 1117|      0|		XMP_Assert ( (arrayForm == 0) || (arrayForm & kXMP_PropValueIsArray) );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1118|      0|		XMP_Assert ( (arrayForm == 0) ? (aliasPos->second.size() == 2) : (aliasPos->second.size() == 3) );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1119|       |		
 1120|      0|		if ( arrayForm != 0 ) { 
  ------------------
  |  Branch (1120:8): [True: 0, False: 0]
  ------------------
 1121|      0|			currNode = FollowXPathStep ( currNode, aliasPos->second, 2, createNodes, &currPos, true );
 1122|      0|			if ( currNode == 0 ) goto EXIT;
  ------------------
  |  Branch (1122:9): [True: 0, False: 0]
  ------------------
 1123|      0|			if ( currNode->options & kXMP_NewImplicitNode ) {
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (1123:9): [True: 0, False: 0]
  ------------------
 1124|      0|				currNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
 1125|      0|				CheckImplicitStruct ( currNode, expandedXPath, 2, stepLim );
 1126|      0|				if ( ! leafIsNew ) newSubPos = currPos;	// Save the top most implicit node.
  ------------------
  |  Branch (1126:10): [True: 0, False: 0]
  ------------------
 1127|      0|				leafIsNew = true;	// If any parent is new, the leaf will be new also.
 1128|      0|			}
 1129|      0|		}
 1130|       |		
 1131|      0|	}
 1132|       |	
 1133|       |	// Now follow the remaining steps of the original XPath.
 1134|       |	
 1135|       |	// *** ??? Change all the num/lim loops back to num<lim? Probably safer.
 1136|       |	
 1137|  19.7k|	try {
 1138|  47.1k|		for ( ; stepNum < stepLim; ++stepNum ) {
  ------------------
  |  Branch (1138:11): [True: 27.4k, False: 19.6k]
  ------------------
 1139|  27.4k|			currNode = FollowXPathStep ( currNode, expandedXPath, stepNum, createNodes, &currPos );
 1140|  27.4k|			if ( currNode == 0 ) goto EXIT;
  ------------------
  |  Branch (1140:9): [True: 56, False: 27.3k]
  ------------------
 1141|  27.3k|			if ( currNode->options & kXMP_NewImplicitNode ) {
  ------------------
  |  |  410|  27.3k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (1141:9): [True: 4.45k, False: 22.9k]
  ------------------
 1142|  4.45k|				currNode->options ^= kXMP_NewImplicitNode;	// Clear the implicit node bit.
  ------------------
  |  |  410|  4.45k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
 1143|  4.45k|				CheckImplicitStruct ( currNode, expandedXPath, stepNum+1, stepLim );
 1144|  4.45k|				if ( ! leafIsNew ) newSubPos = currPos;	// Save the top most implicit node.
  ------------------
  |  Branch (1144:10): [True: 3.79k, False: 656]
  ------------------
 1145|  4.45k|				leafIsNew = true;	// If any parent is new, the leaf will be new also.
 1146|  4.45k|			}
 1147|  27.3k|		}
 1148|  19.7k|	} catch ( ... ) {
 1149|      0|		if ( leafIsNew ) DeleteSubtree ( newSubPos );
  ------------------
  |  Branch (1149:8): [True: 0, False: 0]
  ------------------
 1150|      0|		throw;
 1151|      0|	}
 1152|       |	
 1153|       |	// Done. Delete the implicitly created subtree if the eventual node was not found.
 1154|       |
 1155|  19.7k|EXIT:
 1156|       |
 1157|  19.7k|	XMP_Assert ( (currNode == 0) || (currNode == *currPos) );
  ------------------
  |  |  142|  19.7k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1158|  19.7k|	XMP_Assert ( (currNode != 0) || (! createNodes) );
  ------------------
  |  |  142|  19.7k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1159|       |
 1160|  19.7k|	if ( leafIsNew ) {
  ------------------
  |  Branch (1160:7): [True: 4.45k, False: 15.2k]
  ------------------
 1161|  4.45k|		if ( currNode != 0 ) {
  ------------------
  |  Branch (1161:8): [True: 4.45k, False: 0]
  ------------------
 1162|  4.45k|			currNode->options |= leafOptions;
 1163|  4.45k|		} else {
 1164|      0|			DeleteSubtree ( newSubPos );
 1165|      0|		}
 1166|  4.45k|	}
 1167|       |
 1168|  19.7k|	if ( (currNode != 0) && (ptrPos != 0) ) *ptrPos = currPos;
  ------------------
  |  Branch (1168:7): [True: 19.6k, False: 56]
  |  Branch (1168:26): [True: 0, False: 19.6k]
  ------------------
 1169|  19.7k|	return currNode;
 1170|       |	
 1171|  19.7k|}	// FindNode
_Z18NormalizeLangValuePNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
 1343|    500|{
 1344|    500|	char * tagStart;
 1345|    500|	char * tagEnd;
 1346|       |
 1347|       |	// Find and process the primary subtag.
 1348|       |	
 1349|    500|	tagStart = (char*) value->c_str();
 1350|  6.56k|	for ( tagEnd = tagStart; (*tagEnd != 0) && (*tagEnd != '-'); ++tagEnd ) {
  ------------------
  |  Branch (1350:27): [True: 6.45k, False: 106]
  |  Branch (1350:45): [True: 6.06k, False: 394]
  ------------------
 1351|  6.06k|		if ( ('A' <= *tagEnd) && (*tagEnd <= 'Z') ) *tagEnd += 0x20;
  ------------------
  |  Branch (1351:8): [True: 3.56k, False: 2.50k]
  |  Branch (1351:28): [True: 590, False: 2.97k]
  ------------------
 1352|  6.06k|	}
 1353|       |	
 1354|       |	// Find and process the secondary subtag.
 1355|       |	
 1356|    500|	tagStart = tagEnd;
 1357|    500|	if ( *tagStart == '-' ) ++tagStart;
  ------------------
  |  Branch (1357:7): [True: 394, False: 106]
  ------------------
 1358|  14.9k|	for ( tagEnd = tagStart; (*tagEnd != 0) && (*tagEnd != '-'); ++tagEnd ) {
  ------------------
  |  Branch (1358:27): [True: 14.5k, False: 337]
  |  Branch (1358:45): [True: 14.4k, False: 163]
  ------------------
 1359|  14.4k|		if ( ('A' <= *tagEnd) && (*tagEnd <= 'Z') ) *tagEnd += 0x20;
  ------------------
  |  Branch (1359:8): [True: 9.24k, False: 5.18k]
  |  Branch (1359:28): [True: 1.72k, False: 7.51k]
  ------------------
 1360|  14.4k|	}
 1361|    500|	if ( tagEnd == tagStart+2 ) {
  ------------------
  |  Branch (1361:7): [True: 42, False: 458]
  ------------------
 1362|     42|		if ( ('a' <= *tagStart) && (*tagStart <= 'z') ) *tagStart -= 0x20;
  ------------------
  |  Branch (1362:8): [True: 10, False: 32]
  |  Branch (1362:30): [True: 9, False: 1]
  ------------------
 1363|     42|		++tagStart;
 1364|     42|		if ( ('a' <= *tagStart) && (*tagStart <= 'z') ) *tagStart -= 0x20;
  ------------------
  |  Branch (1364:8): [True: 19, False: 23]
  |  Branch (1364:30): [True: 19, False: 0]
  ------------------
 1365|     42|	}
 1366|       |	
 1367|       |	// Find and process the remaining subtags.
 1368|       |	
 1369|  1.95k|	while ( true ) {
  ------------------
  |  Branch (1369:10): [True: 1.95k, Folded]
  ------------------
 1370|  1.95k|		tagStart = tagEnd;
 1371|  1.95k|		if ( *tagStart == '-' ) ++tagStart;
  ------------------
  |  Branch (1371:8): [True: 1.45k, False: 499]
  ------------------
 1372|  1.95k|		if ( *tagStart == 0 ) break;
  ------------------
  |  Branch (1372:8): [True: 500, False: 1.45k]
  ------------------
 1373|  18.6k|		for ( tagEnd = tagStart; (*tagEnd != 0) && (*tagEnd != '-'); ++tagEnd ) {
  ------------------
  |  Branch (1373:28): [True: 18.4k, False: 162]
  |  Branch (1373:46): [True: 17.1k, False: 1.29k]
  ------------------
 1374|  17.1k|			if ( ('A' <= *tagEnd) && (*tagEnd <= 'Z') ) *tagEnd += 0x20;
  ------------------
  |  Branch (1374:9): [True: 8.82k, False: 8.36k]
  |  Branch (1374:29): [True: 1.99k, False: 6.82k]
  ------------------
 1375|  17.1k|		}
 1376|  1.45k|	}
 1377|       |	
 1378|    500|}	// NormalizeLangValue
_Z18NormalizeLangArrayP8XMP_Node:
 1390|    148|{
 1391|    148|	XMP_Assert ( XMP_ArrayIsAltText(array->options) );
  ------------------
  |  |  142|    148|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1392|       |	
 1393|    148|	size_t itemNum;
 1394|    148|	size_t itemLim = array->children.size();
 1395|    148|	bool   hasDefault = false;
 1396|       |	
 1397|    249|	for ( itemNum = 0; itemNum < itemLim; ++itemNum ) {
  ------------------
  |  Branch (1397:21): [True: 148, False: 101]
  ------------------
 1398|       |	
 1399|    148|		if ( array->children[itemNum]->qualifiers.empty() ||
  ------------------
  |  Branch (1399:8): [True: 0, False: 148]
  ------------------
 1400|    148|			 (array->children[itemNum]->qualifiers[0]->name != "xml:lang") ) {
  ------------------
  |  Branch (1400:5): [True: 0, False: 148]
  ------------------
 1401|      0|			XMP_Throw ( "AltText array items must have an xml:lang qualifier", kXMPErr_BadXMP );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1402|      0|		}
 1403|       |
 1404|    148|		if ( array->children[itemNum]->qualifiers[0]->value == "x-default" ) {
  ------------------
  |  Branch (1404:8): [True: 47, False: 101]
  ------------------
 1405|     47|			hasDefault = true;
 1406|     47|			break;
 1407|     47|		}
 1408|       |
 1409|    148|	}
 1410|       |
 1411|    148|	if ( hasDefault ) {
  ------------------
  |  Branch (1411:7): [True: 47, False: 101]
  ------------------
 1412|       |
 1413|     47|		if ( itemNum != 0 ) {
  ------------------
  |  Branch (1413:8): [True: 0, False: 47]
  ------------------
 1414|      0|			XMP_Node * temp = array->children[0];
 1415|      0|			array->children[0] = array->children[itemNum];
 1416|      0|			array->children[itemNum] = temp;
 1417|      0|		}
 1418|       |
 1419|       |// 09-Oct-07, ahu: disabled to avoid unexpected behaviour
 1420|       |//		if ( itemLim == 2 ) array->children[1]->value = array->children[0]->value;
 1421|       |
 1422|     47|	}
 1423|       |	
 1424|    148|}	// NormalizeLangArray
_Z13DetectAltTextP8XMP_Node:
 1434|    271|{
 1435|    271|	XMP_Assert ( XMP_ArrayIsAlternate(xmpParent->options) );
  ------------------
  |  |  142|    271|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1436|       |
 1437|    271|	size_t itemNum, itemLim;
 1438|       |	
 1439|    431|	for ( itemNum = 0, itemLim = xmpParent->children.size(); itemNum < itemLim; ++itemNum ) {
  ------------------
  |  Branch (1439:59): [True: 280, False: 151]
  ------------------
 1440|    280|		XMP_OptionBits currOptions = xmpParent->children[itemNum]->options;
 1441|    280|		if ( (currOptions & kXMP_PropCompositeMask) || (! (currOptions & kXMP_PropHasLang)) ) break;
  ------------------
  |  Branch (1441:8): [True: 19, False: 261]
  |  Branch (1441:50): [True: 101, False: 160]
  ------------------
 1442|    280|	}
 1443|       |	
 1444|    271|	if ( (itemLim != 0) && (itemNum == itemLim) ) {
  ------------------
  |  Branch (1444:7): [True: 268, False: 3]
  |  Branch (1444:25): [True: 148, False: 120]
  ------------------
 1445|    148|		xmpParent->options |= kXMP_PropArrayIsAltText;
 1446|    148|		NormalizeLangArray ( xmpParent );
 1447|    148|	}
 1448|       |
 1449|    271|}	// DetectAltText
XMPCore_Impl.cpp:_ZL15VerifyXPathRootPKcS0_PNSt3__16vectorI13XPathStepInfoNS1_9allocatorIS3_EEEE:
  154|  19.8k|{
  155|       |	// Do some basic checks on the URI and name. Try to lookup the URI. See if the name is qualified.
  156|       |	
  157|  19.8k|	XMP_Assert ( (schemaURI != 0) && (propName != 0) && (*propName != 0) );
  ------------------
  |  |  142|  19.8k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  158|  19.8k|	XMP_Assert ( (expandedXPath != 0) && (expandedXPath->empty()) );
  ------------------
  |  |  142|  19.8k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  159|       |
  160|  19.8k|	if ( *schemaURI == 0 ) XMP_Throw ( "Schema namespace URI is required", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (160:7): [True: 0, False: 19.8k]
  ------------------
  161|       |
  162|  19.8k|	if ( (*propName == '?') || (*propName == '@') ) {
  ------------------
  |  Branch (162:7): [True: 0, False: 19.8k]
  |  Branch (162:29): [True: 0, False: 19.8k]
  ------------------
  163|      0|		XMP_Throw ( "Top level name must not be a qualifier", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  164|      0|	}
  165|  1.76M|	for ( XMP_StringPtr ch = propName; *ch != 0; ++ch ) {
  ------------------
  |  Branch (165:37): [True: 1.74M, False: 19.8k]
  ------------------
  166|  1.74M|		if ( (*ch == '/') || (*ch == '[') ) {
  ------------------
  |  Branch (166:8): [True: 0, False: 1.74M]
  |  Branch (166:24): [True: 0, False: 1.74M]
  ------------------
  167|      0|			XMP_Throw ( "Top level name must be simple", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  168|      0|		}
  169|  1.74M|	}
  170|       |
  171|  19.8k|	XMP_StringMapPos uriPos = sNamespaceURIToPrefixMap->find ( XMP_VarString ( schemaURI ) );
  172|  19.8k|	if ( uriPos == sNamespaceURIToPrefixMap->end() ) {
  ------------------
  |  Branch (172:7): [True: 0, False: 19.8k]
  ------------------
  173|      0|		XMP_Throw ( "Unregistered schema namespace URI", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  174|      0|	}
  175|       |
  176|  19.8k|	XMP_StringPtr colonPos = propName;
  177|  1.50M|	while ( (*colonPos != 0) && (*colonPos != ':') ) ++colonPos;
  ------------------
  |  Branch (177:10): [True: 1.50M, False: 4.65k]
  |  Branch (177:30): [True: 1.48M, False: 15.1k]
  ------------------
  178|  19.8k|	VerifySimpleXMLName ( propName, colonPos );	// Verify the part before any colon.
  179|       |
  180|       |	// Verify the various URI and prefix combinations. Initialize the expanded XPath.
  181|       |	
  182|  19.8k|	if ( *colonPos == 0 ) {
  ------------------
  |  Branch (182:7): [True: 4.65k, False: 15.1k]
  ------------------
  183|       |	
  184|       |		// The propName is unqualified, use the schemaURI and associated prefix.
  185|       |		
  186|  4.65k|		expandedXPath->push_back ( XPathStepInfo ( schemaURI, kXMP_SchemaNode ) );
  187|  4.65k|		expandedXPath->push_back ( XPathStepInfo ( uriPos->second, 0 ) );
  188|  4.65k|		(*expandedXPath)[kRootPropStep].step += propName;
  189|       |	
  190|  15.1k|	} else {
  191|       |
  192|       |		// The propName is qualified. Make sure the prefix is legit. Use the associated URI and qualified name.
  193|       |
  194|  15.1k|		size_t prefixLen = colonPos - propName + 1;	// ! Include the colon.
  195|  15.1k|		VerifySimpleXMLName ( colonPos+1, colonPos+strlen(colonPos) );
  196|       |
  197|  15.1k|		XMP_VarString prefix ( propName, prefixLen );
  198|  15.1k|		XMP_StringMapPos prefixPos = sNamespacePrefixToURIMap->find ( prefix );
  199|  15.1k|		if ( prefixPos == sNamespacePrefixToURIMap->end() ) {
  ------------------
  |  Branch (199:8): [True: 0, False: 15.1k]
  ------------------
  200|      0|			XMP_Throw ( "Unknown schema namespace prefix", kXMPErr_BadSchema );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  201|      0|		}
  202|  15.1k|		if ( prefix != uriPos->second ) {
  ------------------
  |  Branch (202:8): [True: 3, False: 15.1k]
  ------------------
  203|      3|			XMP_Throw ( "Schema namespace URI and prefix mismatch", kXMPErr_BadSchema );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  204|      0|		}
  205|       |
  206|  15.1k|		expandedXPath->push_back ( XPathStepInfo ( schemaURI, kXMP_SchemaNode ) );
  207|  15.1k|		expandedXPath->push_back ( XPathStepInfo ( propName, 0 ) );
  208|       |	
  209|  15.1k|	}
  210|       |
  211|  19.8k|}	// VerifyXPathRoot
XMPCore_Impl.cpp:_ZL14VerifyQualNamePKcS0_:
  219|  1.75k|{
  220|  1.75k|	if ( qualName >= nameEnd ) XMP_Throw ( "Empty qualified name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (220:7): [True: 0, False: 1.75k]
  ------------------
  221|       |
  222|  1.75k|	XMP_StringPtr colonPos = qualName;
  223|  9.82k|	while ( (colonPos < nameEnd) && (*colonPos != ':') ) ++colonPos;
  ------------------
  |  Branch (223:10): [True: 9.82k, False: 0]
  |  Branch (223:34): [True: 8.06k, False: 1.75k]
  ------------------
  224|  1.75k|	if ( (colonPos == qualName) || (colonPos >= nameEnd) ) XMP_Throw ( "Ill-formed qualified name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (224:7): [True: 0, False: 1.75k]
  |  Branch (224:33): [True: 0, False: 1.75k]
  ------------------
  225|       |
  226|  1.75k|	VerifySimpleXMLName ( qualName, colonPos );
  227|  1.75k|	VerifySimpleXMLName ( colonPos+1, nameEnd );
  228|       |
  229|  1.75k|	size_t prefixLen = colonPos - qualName + 1;	// ! Include the colon.
  230|  1.75k|	XMP_VarString prefix ( qualName, prefixLen );
  231|  1.75k|	XMP_StringMapPos prefixPos = sNamespacePrefixToURIMap->find ( prefix );
  232|  1.75k|	if ( prefixPos == sNamespacePrefixToURIMap->end() ) {
  ------------------
  |  Branch (232:7): [True: 0, False: 1.75k]
  ------------------
  233|      0|		XMP_Throw ( "Unknown namespace prefix for qualified name", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  234|      0|	}
  235|       |
  236|  1.75k|}	// VerifyQualName
XMPCore_Impl.cpp:_ZL15FollowXPathStepP8XMP_NodeRKNSt3__16vectorI13XPathStepInfoNS1_9allocatorIS3_EEEEmbPNS1_11__wrap_iterIPS0_EEb:
  394|  27.4k|{
  395|  27.4k|	XMP_Node * nextNode = 0;
  396|  27.4k|	const XPathStepInfo & nextStep = fullPath[stepNum];
  397|  27.4k|	XMP_Index      index    = 0;
  398|  27.4k|	XMP_OptionBits stepKind = nextStep.options & kXMP_StepKindMask;
  399|       |	
  400|  27.4k|	XMP_Assert ( (kXMP_StructFieldStep <= stepKind) && (stepKind <= kXMP_FieldSelectorStep) );
  ------------------
  |  |  142|  27.4k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  401|       |
  402|  27.4k|	if ( stepKind == kXMP_StructFieldStep ) {
  ------------------
  |  Branch (402:7): [True: 20.9k, False: 6.46k]
  ------------------
  403|       |
  404|  20.9k|		nextNode = FindChildNode ( parentNode, nextStep.step.c_str(), createNodes, ptrPos );
  405|       |
  406|  20.9k|	} else if ( stepKind == kXMP_QualifierStep ) {
  ------------------
  |  Branch (406:14): [True: 497, False: 5.97k]
  ------------------
  407|       |	
  408|    497|		XMP_StringPtr qualStep = nextStep.step.c_str();
  409|    497|		XMP_Assert ( *qualStep == '?' );
  ------------------
  |  |  142|    497|	#define XMP_Assert(c)	((void) 0)
  ------------------
  410|    497|		++qualStep;
  411|    497|		nextNode = FindQualifierNode ( parentNode, qualStep, createNodes, ptrPos );
  412|       |
  413|  5.97k|	} else {
  414|       |	
  415|       |		// This is an array indexing step. First get the index, then get the node.
  416|       |
  417|  5.97k|		if ( ! (parentNode->options & kXMP_PropValueIsArray) ) {
  ------------------
  |  Branch (417:8): [True: 0, False: 5.97k]
  ------------------
  418|      0|			XMP_Throw ( "Indexing applied to non-array", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  419|      0|		}
  420|       |		
  421|  5.97k|		if ( stepKind == kXMP_ArrayIndexStep ) {
  ------------------
  |  Branch (421:8): [True: 5.97k, False: 0]
  ------------------
  422|  5.97k|			index = FindIndexedItem ( parentNode, nextStep.step, createNodes );
  423|  5.97k|		} else if ( stepKind == kXMP_ArrayLastStep ) {
  ------------------
  |  Branch (423:15): [True: 0, False: 0]
  ------------------
  424|      0|			index = parentNode->children.size() - 1;
  425|      0|		} else if ( stepKind == kXMP_FieldSelectorStep ) {
  ------------------
  |  Branch (425:15): [True: 0, False: 0]
  ------------------
  426|      0|			XMP_VarString fieldName, fieldValue;
  427|      0|			SplitNameAndValue ( nextStep.step, &fieldName, &fieldValue );
  428|      0|			index = LookupFieldSelector ( parentNode, fieldName.c_str(), fieldValue.c_str() );
  429|      0|		} else if ( stepKind == kXMP_QualSelectorStep ) {
  ------------------
  |  Branch (429:15): [True: 0, False: 0]
  ------------------
  430|      0|			XMP_VarString qualName, qualValue;
  431|      0|			SplitNameAndValue ( nextStep.step, &qualName, &qualValue );
  432|      0|			index = LookupQualSelector ( parentNode, qualName, qualValue );
  433|      0|		} else {
  434|      0|			XMP_Throw ( "Unknown array indexing step in FollowXPathStep", kXMPErr_InternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  435|      0|		}
  436|       |		
  437|  5.97k|		if ( (0 <= index) && (index <= (XMP_Index)parentNode->children.size()) ) nextNode = parentNode->children[index];
  ------------------
  |  Branch (437:8): [True: 5.97k, False: 0]
  |  Branch (437:24): [True: 5.97k, False: 0]
  ------------------
  438|       |
  439|  5.97k|		if ( (index == -1) && createNodes && aliasedArrayItem && (stepKind == kXMP_QualSelectorStep) ) {
  ------------------
  |  Branch (439:8): [True: 0, False: 5.97k]
  |  Branch (439:25): [True: 0, False: 0]
  |  Branch (439:40): [True: 0, False: 0]
  |  Branch (439:60): [True: 0, False: 0]
  ------------------
  440|       |		
  441|       |			// An ugly special case without an obvious better place to be. We have an alias to the
  442|       |			// x-default item of an alt-text array. A simple reference via SetProperty must create
  443|       |			// the x-default item if it does not yet exist.
  444|       |			
  445|      0|			XMP_Assert ( parentNode->options & kXMP_PropArrayIsAltText );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
  446|      0|			XMP_Assert ( (stepNum == 2) && (nextStep.step == "[?xml:lang=\"x-default\"]") );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
  447|       |
  448|      0|			nextNode = new XMP_Node ( parentNode, kXMP_ArrayItemName,
  ------------------
  |  |  293|      0|#define kXMP_ArrayItemName	"[]"
  ------------------
  449|      0|									  (kXMP_PropHasQualifiers | kXMP_PropHasLang | kXMP_NewImplicitNode) );
  ------------------
  |  |  410|      0|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  450|       |
  451|      0|			XMP_Node * langQual = new XMP_Node ( nextNode, "xml:lang", "x-default", kXMP_PropIsQualifier );
  452|      0|			nextNode->qualifiers.push_back ( langQual );
  453|       |
  454|      0|			if ( parentNode->children.empty() ) {
  ------------------
  |  Branch (454:9): [True: 0, False: 0]
  ------------------
  455|      0|				parentNode->children.push_back ( nextNode );
  456|      0|			} else {
  457|      0|				parentNode->children.insert ( parentNode->children.begin(), nextNode );
  458|      0|			}
  459|       |
  460|      0|			index = 0;	// ! C-style index! The x-default item is always first.
  461|       |
  462|      0|		}
  463|       |		
  464|  5.97k|		if ( (nextNode != 0) && (ptrPos != 0) ) *ptrPos = parentNode->children.begin() + index;
  ------------------
  |  Branch (464:8): [True: 5.97k, False: 0]
  |  Branch (464:27): [True: 5.97k, False: 0]
  ------------------
  465|       |	
  466|  5.97k|	}
  467|       |
  468|  27.4k|	if ( (nextNode != 0) && (nextNode->options & kXMP_NewImplicitNode) ) {
  ------------------
  |  |  410|  27.3k|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  |  Branch (468:7): [True: 27.3k, False: 56]
  |  Branch (468:26): [True: 4.45k, False: 22.9k]
  ------------------
  469|  4.45k|		nextNode->options |= (nextStep.options & kXMP_PropArrayFormMask);
  470|  4.45k|	}
  471|       |	
  472|  27.4k|	XMP_Assert ( (ptrPos == 0) || (nextNode == 0) || (nextNode == **ptrPos) );
  ------------------
  |  |  142|  27.4k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  473|  27.4k|	XMP_Assert ( (nextNode != 0) || (! createNodes) );
  ------------------
  |  |  142|  27.4k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  474|  27.4k|	return nextNode;
  475|       |	
  476|  27.4k|}	// FollowXPathStep
XMPCore_Impl.cpp:_ZL15FindIndexedItemP8XMP_NodeRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  248|  5.97k|{
  249|  5.97k|	XMP_Index index = 0;
  250|  5.97k|	size_t    chLim = indexStep.size() - 1;
  251|       |
  252|  5.97k|	XMP_Assert ( (chLim >= 2) && (indexStep[0] == '[') && (indexStep[chLim] == ']') );
  ------------------
  |  |  142|  5.97k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  253|       |	
  254|  11.9k|	for ( size_t chNum = 1; chNum != chLim; ++chNum ) {
  ------------------
  |  Branch (254:26): [True: 5.97k, False: 5.97k]
  ------------------
  255|  5.97k|		XMP_Assert ( ('0' <= indexStep[chNum]) && (indexStep[chNum] <= '9') );
  ------------------
  |  |  142|  5.97k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  256|  5.97k|		index = (index * 10) + (indexStep[chNum] - '0');
  257|  5.97k|		if ( index < 0 ) {
  ------------------
  |  Branch (257:8): [True: 0, False: 5.97k]
  ------------------
  258|      0|			XMP_Throw ( "Array index overflow", kXMPErr_BadXPath );	// ! Overflow, not truly negative.
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  259|      0|		}
  260|  5.97k|	}
  261|       |
  262|  5.97k|	--index;	// Change to a C-style, zero based index.
  263|  5.97k|	if ( index < 0 ) XMP_Throw ( "Array index must be larger than zero", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (263:7): [True: 0, False: 5.97k]
  ------------------
  264|       |
  265|  5.97k|	if ( (index == (XMP_Index)arrayNode->children.size()) && createNodes ) {	// Append a new last+1 node.
  ------------------
  |  Branch (265:7): [True: 859, False: 5.11k]
  |  Branch (265:59): [True: 859, False: 0]
  ------------------
  266|    859|		XMP_Node * newItem = new XMP_Node ( arrayNode, kXMP_ArrayItemName, kXMP_NewImplicitNode );
  ------------------
  |  |  293|    859|#define kXMP_ArrayItemName	"[]"
  ------------------
              		XMP_Node * newItem = new XMP_Node ( arrayNode, kXMP_ArrayItemName, kXMP_NewImplicitNode );
  ------------------
  |  |  410|    859|#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
  ------------------
  267|    859|		arrayNode->children.push_back ( newItem );
  268|    859|	}
  269|       |
  270|       |	// ! Don't throw here for a too large index. SetProperty will throw, GetProperty will not.
  271|  5.97k|	if ( index >= (XMP_Index)arrayNode->children.size() ) index = -1;
  ------------------
  |  Branch (271:7): [True: 0, False: 5.97k]
  ------------------
  272|  5.97k|	return index;
  273|       |	
  274|  5.97k|}	// FindIndexedItem
XMPCore_Impl.cpp:_ZL19CheckImplicitStructP8XMP_NodeRKNSt3__16vectorI13XPathStepInfoNS1_9allocatorIS3_EEEEmm:
  487|  4.45k|{
  488|       |
  489|  4.45k|	if ( (stepNum < stepLim) &&
  ------------------
  |  Branch (489:7): [True: 0, False: 4.45k]
  ------------------
  490|      0|		 ((node->options & kXMP_PropCompositeMask) == 0) &&
  ------------------
  |  Branch (490:4): [True: 0, False: 0]
  ------------------
  491|      0|		 (GetStepKind ( expandedXPath[stepNum].options ) == kXMP_StructFieldStep) ) {
  ------------------
  |  |  408|      0|#define GetStepKind(f)	((f) & kXMP_StepKindMask)
  ------------------
  |  Branch (491:4): [True: 0, False: 0]
  ------------------
  492|       |
  493|      0|		node->options |= kXMP_PropValueIsStruct;
  494|       |
  495|      0|	}
  496|       |
  497|  4.45k|}	// CheckImplicitStruct

_ZN13XMP_AutoMutexC2Ev:
  222|  46.7k|	XMP_AutoMutex() : mutex(&sXMPCoreLock) { XMP_EnterCriticalRegion ( *mutex ); ReportLock(); };
  ------------------
  |  |  168|  46.7k|	#define ReportLock()			++sLockCount
  ------------------
_ZN13XMP_AutoMutexD2Ev:
  223|  46.7k|	~XMP_AutoMutex() { if ( mutex != 0 ) { ReportUnlock(); XMP_ExitCriticalRegion ( *mutex ); mutex = 0; } };
  ------------------
  |  |  169|  19.2k|	#define ReportUnlock()			--sLockCount
  ------------------
  |  Branch (223:26): [True: 19.2k, False: 27.4k]
  ------------------
_ZN13XMP_AutoMutex8KeepLockEv:
  224|  27.4k|	void KeepLock() { ReportKeepLock(); mutex = 0; };
_ZN13XPathStepInfoC2EPKcj:
  389|  34.9k|	XPathStepInfo ( XMP_StringPtr _step, XMP_OptionBits _options ) : step(_step), options(_options) {};
_ZN13XPathStepInfoC2ENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEj:
  390|  12.4k|	XPathStepInfo ( XMP_VarString _step, XMP_OptionBits _options ) : step(_step), options(_options) {};
_ZN8XMP_NodeC2EPS_PKcj:
  434|  10.9k|		: options(_options), name(_name), parent(_parent)
  435|  10.9k|	{
  436|       |		#if XMP_DebugBuild
  437|       |			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
  438|       |			             (options & kXMP_SchemaNode) || (parent == 0) );
  439|       |			// *** _namePtr  = name.c_str();
  440|       |			// *** _valuePtr = value.c_str();
  441|       |		#endif
  442|  10.9k|	};
_ZN8XMP_NodeC2EPS_PKcS2_j:
  456|  13.1k|		: options(_options), name(_name), value(_value), parent(_parent)
  457|  13.1k|	{
  458|       |		#if XMP_DebugBuild
  459|       |			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
  460|       |			             (options & kXMP_SchemaNode) || (parent == 0) );
  461|       |			// *** _namePtr  = name.c_str();
  462|       |			// *** _valuePtr = value.c_str();
  463|       |		#endif
  464|  13.1k|	};
_ZN8XMP_NodeC2EPS_RKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_j:
  467|    379|		: options(_options), name(_name), value(_value), parent(_parent)
  468|    379|	{
  469|       |		#if XMP_DebugBuild
  470|       |			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
  471|       |			             (options & kXMP_SchemaNode) || (parent == 0) );
  472|       |			// *** _namePtr  = name.c_str();
  473|       |			// *** _valuePtr = value.c_str();
  474|       |		#endif
  475|    379|	};
_ZN8XMP_Node14RemoveChildrenEv:
  478|  27.9k|	{
  479|  49.4k|		for ( size_t i = 0, vLim = children.size(); i < vLim; ++i ) {
  ------------------
  |  Branch (479:47): [True: 21.4k, False: 27.9k]
  ------------------
  480|  21.4k|			if ( children[i] != 0 ) delete children[i];
  ------------------
  |  Branch (480:9): [True: 21.4k, False: 0]
  ------------------
  481|  21.4k|		}
  482|  27.9k|		children.clear();
  483|  27.9k|	}
_ZN8XMP_Node16RemoveQualifiersEv:
  486|  27.3k|	{
  487|  27.9k|		for ( size_t i = 0, vLim = qualifiers.size(); i < vLim; ++i ) {
  ------------------
  |  Branch (487:49): [True: 579, False: 27.3k]
  ------------------
  488|    579|			if ( qualifiers[i] != 0 ) delete qualifiers[i];
  ------------------
  |  Branch (488:9): [True: 579, False: 0]
  ------------------
  489|    579|		}
  490|  27.3k|		qualifiers.clear();
  491|  27.3k|	}
_ZN8XMP_Node9ClearNodeEv:
  494|  2.83k|	{
  495|  2.83k|		options = 0;
  496|  2.83k|		name.erase();
  497|  2.83k|		value.erase();
  498|  2.83k|		this->RemoveChildren();
  499|  2.83k|		this->RemoveQualifiers();
  500|  2.83k|	}
_ZN8XMP_NodeD2Ev:
  502|  24.4k|	virtual ~XMP_Node() { RemoveChildren(); RemoveQualifiers(); };

_ZN11XMPIterator10InitializeEv:
  376|      1|{
  377|      1|	sDummySchema = new XMP_Node ( 0, "dummy:schema/", kXMP_SchemaNode);
  378|      1|	return true;
  379|       |	
  380|      1|}	// Initialize
_ZN11XMPIterator9TerminateEv:
  388|      1|{
  389|      1|	delete ( sDummySchema );
  390|      1|	sDummySchema = 0;
  391|      1|	return;
  392|       |	
  393|      1|}	// Terminate
_ZN11XMPIteratorC2ERK7XMPMetaPKcS4_j:
  427|  2.37k|						   XMP_OptionBits  options ) : clientRefs(0), info(IterInfo(options,&xmpObj))
  428|  2.37k|{
  429|  2.37k|	if ( (options & kXMP_IterClassMask) != kXMP_IterProperties ) {
  ------------------
  |  Branch (429:7): [True: 0, False: 2.37k]
  ------------------
  430|      0|		XMP_Throw ( "Unsupported iteration kind", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  431|      0|	}
  432|       |	
  433|       |	// *** Lock the XMPMeta object if we ever stop using a full DLL lock.
  434|       |
  435|  2.37k|	if ( *propName != 0 ) {
  ------------------
  |  Branch (435:7): [True: 809, False: 1.56k]
  ------------------
  436|       |
  437|       |		// An iterator rooted at a specific node.
  438|       |
  439|       |		#if TraceIterators
  440|       |			printf ( "\nNew XMP property iterator for \"%s\", options = %X\n    Schema = %s, root = %s\n",
  441|       |			         xmpObj.tree.name.c_str(), options, schemaNS, propName );
  442|       |		#endif
  443|       |		
  444|    809|		XMP_ExpandedXPath propPath;
  445|    809|		ExpandXPath ( schemaNS, propName, &propPath );
  446|    809|		XMP_Node * propNode = FindConstNode ( &xmpObj.tree, propPath );	// If not found get empty iteration.
  ------------------
  |  |  301|    809|#define FindConstNode(t,p)		FindNode ( const_cast<XMP_Node*>(t), p, kXMP_ExistingOnly, 0 )
  |  |  ------------------
  |  |  |  |  296|    809|#define kXMP_ExistingOnly	false
  |  |  ------------------
  ------------------
  447|       |		
  448|    809|		if ( propNode != 0 ) {
  ------------------
  |  Branch (448:8): [True: 809, False: 0]
  ------------------
  449|       |
  450|    809|			XMP_VarString rootName ( propPath[1].step );	// The schema is [0].
  451|    809|			for ( size_t i = 2; i < propPath.size(); ++i ) {
  ------------------
  |  Branch (451:24): [True: 0, False: 809]
  ------------------
  452|      0|				XMP_OptionBits stepKind = GetStepKind ( propPath[i].options );
  ------------------
  |  |  408|      0|#define GetStepKind(f)	((f) & kXMP_StepKindMask)
  ------------------
  453|      0|				if ( stepKind <= kXMP_QualifierStep ) rootName += '/';
  ------------------
  |  Branch (453:10): [True: 0, False: 0]
  ------------------
  454|      0|				rootName += propPath[i].step;
  455|      0|			}
  456|       |
  457|    809|			propName = rootName.c_str();
  458|    809|			size_t leafOffset = rootName.size();
  459|  14.3k|			while ( (leafOffset > 0) && (propName[leafOffset] != '/') && (propName[leafOffset] != '[') ) --leafOffset;
  ------------------
  |  Branch (459:12): [True: 13.5k, False: 809]
  |  Branch (459:32): [True: 13.5k, False: 0]
  |  Branch (459:65): [True: 13.5k, False: 0]
  ------------------
  460|    809|			if ( propName[leafOffset] == '/' ) ++leafOffset;
  ------------------
  |  Branch (460:9): [True: 0, False: 809]
  ------------------
  461|       |
  462|    809|			info.tree.children.push_back ( IterNode ( propNode->options, propName, leafOffset ) );
  463|    809|			SetCurrSchema ( info, propPath[kSchemaStep].step.c_str() );
  464|    809|			if ( info.options & kXMP_IterJustChildren ) {
  ------------------
  |  Branch (464:9): [True: 0, False: 809]
  ------------------
  465|      0|				AddNodeOffspring ( info, info.tree.children.back(), propNode );
  466|      0|			}
  467|       |
  468|    809|		}
  469|       |	
  470|  1.56k|	} else if ( *schemaNS != 0 ) {
  ------------------
  |  Branch (470:14): [True: 0, False: 1.56k]
  ------------------
  471|       |
  472|       |		// An iterator for all properties in one schema.
  473|       |		
  474|       |		#if TraceIterators
  475|       |			printf ( "\nNew XMP schema iterator for \"%s\", options = %X\n    Schema = %s\n",
  476|       |			         xmpObj.tree.name.c_str(), options, schemaNS );
  477|       |		#endif
  478|       |		
  479|      0|		info.tree.children.push_back ( IterNode ( kXMP_SchemaNode, schemaNS, 0 ) );
  480|      0|		IterNode & iterSchema = info.tree.children.back();
  481|       |		
  482|      0|		XMP_Node * xmpSchema = FindConstSchema ( &xmpObj.tree, schemaNS );
  ------------------
  |  |  298|      0|#define FindConstSchema(t,u)	FindSchemaNode ( const_cast<XMP_Node*>(t), u, kXMP_ExistingOnly, 0 )
  |  |  ------------------
  |  |  |  |  296|      0|#define kXMP_ExistingOnly	false
  |  |  ------------------
  ------------------
  483|      0|		if ( xmpSchema != 0 ) AddSchemaProps ( info, iterSchema, xmpSchema );
  ------------------
  |  Branch (483:8): [True: 0, False: 0]
  ------------------
  484|       |		
  485|      0|		if ( info.options & kXMP_IterIncludeAliases ) AddSchemaAliases ( info, iterSchema, schemaNS );
  ------------------
  |  Branch (485:8): [True: 0, False: 0]
  ------------------
  486|       |		
  487|      0|		if ( iterSchema.children.empty() ) {
  ------------------
  |  Branch (487:8): [True: 0, False: 0]
  ------------------
  488|      0|			info.tree.children.pop_back();	// No properties, remove the schema node.
  489|      0|		} else {
  490|      0|			SetCurrSchema ( info, schemaNS );
  491|      0|		}
  492|       |	
  493|  1.56k|	} else {
  494|       |
  495|       |		// An iterator for all properties in all schema. First add schema that exist (have children),
  496|       |		// adding aliases from them if appropriate. Then add schema that have no actual properties
  497|       |		// but do have aliases to existing properties, if we're including aliases in the iteration.
  498|       |		
  499|       |		#if TraceIterators
  500|       |			printf ( "\nNew XMP tree iterator for \"%s\", options = %X\n",
  501|       |			         xmpObj.tree.name.c_str(), options );
  502|       |		#endif
  503|       |		
  504|       |		// First pick up the schema that exist.
  505|       |		
  506|  4.28k|		for ( size_t schemaNum = 0, schemaLim = xmpObj.tree.children.size(); schemaNum != schemaLim; ++schemaNum ) {
  ------------------
  |  Branch (506:72): [True: 2.71k, False: 1.56k]
  ------------------
  507|       |
  508|  2.71k|			const XMP_Node * xmpSchema = xmpObj.tree.children[schemaNum];
  509|  2.71k|			info.tree.children.push_back ( IterNode ( kXMP_SchemaNode, xmpSchema->name, 0 ) );
  510|  2.71k|			IterNode & iterSchema = info.tree.children.back();
  511|       |
  512|  2.71k|			if ( ! (info.options & kXMP_IterJustChildren) ) {
  ------------------
  |  Branch (512:9): [True: 2.71k, False: 0]
  ------------------
  513|  2.71k|				AddSchemaProps ( info, iterSchema, xmpSchema );
  514|  2.71k|				if ( info.options & kXMP_IterIncludeAliases ) AddSchemaAliases ( info, iterSchema, xmpSchema->name.c_str() );
  ------------------
  |  Branch (514:10): [True: 0, False: 2.71k]
  ------------------
  515|  2.71k|				if ( iterSchema.children.empty() ) info.tree.children.pop_back();	// No properties, remove the schema node.
  ------------------
  |  Branch (515:10): [True: 0, False: 2.71k]
  ------------------
  516|  2.71k|			}
  517|       |
  518|  2.71k|		}
  519|       |		
  520|  1.56k|		if ( info.options & kXMP_IterIncludeAliases ) {
  ------------------
  |  Branch (520:8): [True: 0, False: 1.56k]
  ------------------
  521|       |
  522|       |			// Add the schema that only have aliases. The most convenient, and safest way, is to go
  523|       |			// through the registered namespaces, see if it exists, and let AddSchemaAliases do its
  524|       |			// thing if not. Don't combine with the above loop, it is nicer to have the "real" stuff
  525|       |			// be in storage order (not subject to the namespace map order).
  526|       |			
  527|       |			// ! We don't do the kXMP_IterJustChildren handing in the same way here as above. The
  528|       |			// ! existing schema (presumably) have actual children. We need to call AddSchemaAliases
  529|       |			// ! here to determine if the namespace has any aliases to existing properties. We then
  530|       |			// ! strip the children if necessary.
  531|       |
  532|      0|			XMP_cStringMapPos currNS = sNamespaceURIToPrefixMap->begin();
  533|      0|			XMP_cStringMapPos endNS  = sNamespaceURIToPrefixMap->end();
  534|      0|			for ( ; currNS != endNS; ++currNS ) {
  ------------------
  |  Branch (534:12): [True: 0, False: 0]
  ------------------
  535|      0|				XMP_StringPtr schemaName = currNS->first.c_str();
  536|      0|				if ( FindConstSchema ( &xmpObj.tree, schemaName ) != 0 ) continue;
  ------------------
  |  |  298|      0|#define FindConstSchema(t,u)	FindSchemaNode ( const_cast<XMP_Node*>(t), u, kXMP_ExistingOnly, 0 )
  |  |  ------------------
  |  |  |  |  296|      0|#define kXMP_ExistingOnly	false
  |  |  ------------------
  ------------------
  |  Branch (536:10): [True: 0, False: 0]
  ------------------
  537|      0|				info.tree.children.push_back ( IterNode ( kXMP_SchemaNode, schemaName, 0 ) );
  538|      0|				IterNode & iterSchema = info.tree.children.back();
  539|      0|				AddSchemaAliases ( info, iterSchema, schemaName );
  540|      0|				if ( iterSchema.children.empty() ) {
  ------------------
  |  Branch (540:10): [True: 0, False: 0]
  ------------------
  541|      0|					info.tree.children.pop_back();	// No aliases, remove the schema node.
  542|      0|				} else if ( info.options & kXMP_IterJustChildren ) {
  ------------------
  |  Branch (542:17): [True: 0, False: 0]
  ------------------
  543|      0|					iterSchema.children.clear();	// Get rid of the children.
  544|      0|				}
  545|      0|			}
  546|       |
  547|      0|		}
  548|       |
  549|  1.56k|	}
  550|       |	
  551|       |	// Set the current iteration position to the first node to be visited.
  552|       |	
  553|  2.37k|	info.currPos = info.tree.children.begin();
  554|  2.37k|	info.endPos  = info.tree.children.end();
  555|       |	
  556|  2.37k|	if ( (info.options & kXMP_IterJustChildren) && (info.currPos != info.endPos) && (*schemaNS != 0) ) {
  ------------------
  |  Branch (556:7): [True: 0, False: 2.37k]
  |  Branch (556:49): [True: 0, False: 0]
  |  Branch (556:82): [True: 0, False: 0]
  ------------------
  557|      0|		info.currPos->visitStage = kIter_VisitSelf;
  558|      0|	}
  559|       |
  560|       |	#if TraceIterators
  561|       |		if ( info.currPos == info.endPos ) {
  562|       |			printf ( "    ** Empty iteration **\n" );
  563|       |		} else {
  564|       |			printf ( "    Initial node %s, stage = %s, iterator @ %.8X\n",
  565|       |			         info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage], this );
  566|       |		}
  567|       |	#endif
  568|       |	
  569|  2.37k|}	// XMPIterator for XMPMeta objects
_ZN11XMPIteratorD2Ev:
  591|  2.37k|{
  592|  2.37k|	XMP_Assert ( this->clientRefs <= 0 );
  ------------------
  |  |  142|  2.37k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  593|       |	// Let everything else default.
  594|       |	
  595|  2.37k|}	// ~XMPIterator
_ZN11XMPIterator4NextEPPKcPjS2_S3_S2_S3_S3_:
  617|  18.4k|{
  618|       |	// *** Lock the XMPMeta object if we ever stop using a full DLL lock.
  619|       |	
  620|       |	// ! NOTE: Supporting aliases throws in some nastiness with schemas. There might not be any XMP
  621|       |	// ! node for the schema, but we still have to visit it because of possible aliases.
  622|       |	
  623|  18.4k|	if ( info.currPos == info.endPos ) return false;	// Happens at the start of an empty iteration.
  ------------------
  |  Branch (623:7): [True: 307, False: 18.1k]
  ------------------
  624|       |	
  625|       |	#if TraceIterators
  626|       |		printf ( "Next iteration from %s, stage = %s, iterator @ %.8X\n",
  627|       |			     info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage], this );
  628|       |	#endif
  629|       |	
  630|  18.1k|	const XMP_Node * xmpNode = GetNextXMPNode ( info );
  631|  18.1k|	if ( xmpNode == 0 ) return false;
  ------------------
  |  Branch (631:7): [True: 1.92k, False: 16.2k]
  ------------------
  632|  16.2k|	bool isSchemaNode = XMP_NodeIsSchema ( info.currPos->options );
  633|       |	
  634|  16.2k|	if ( info.options & kXMP_IterJustLeafNodes ) {
  ------------------
  |  Branch (634:7): [True: 0, False: 16.2k]
  ------------------
  635|      0|		while ( isSchemaNode || (! xmpNode->children.empty()) ) {
  ------------------
  |  Branch (635:11): [True: 0, False: 0]
  |  Branch (635:27): [True: 0, False: 0]
  ------------------
  636|      0|			info.currPos->visitStage = kIter_VisitQualifiers;	// Skip to this node's children.
  637|      0|			xmpNode = GetNextXMPNode ( info );
  638|      0|			if ( xmpNode == 0 ) return false;
  ------------------
  |  Branch (638:9): [True: 0, False: 0]
  ------------------
  639|      0|			isSchemaNode = XMP_NodeIsSchema ( info.currPos->options );
  640|      0|		}
  641|      0|	}
  642|       |	
  643|  16.2k|	*schemaNS = info.currSchema.c_str();
  644|  16.2k|	*nsSize   = info.currSchema.size();
  645|       |
  646|  16.2k|	*propOptions = info.currPos->options;
  647|       |
  648|  16.2k|	*propPath  = "";
  649|  16.2k|	*pathSize  = 0;
  650|  16.2k|	*propValue = "";
  651|  16.2k|	*valueSize = 0;
  652|       |	
  653|  16.2k|	if ( ! (*propOptions & kXMP_SchemaNode) ) {
  ------------------
  |  Branch (653:7): [True: 13.5k, False: 2.70k]
  ------------------
  654|       |
  655|  13.5k|		*propPath = info.currPos->fullPath.c_str();
  656|  13.5k|		*pathSize = info.currPos->fullPath.size();
  657|  13.5k|		if ( info.options & kXMP_IterJustLeafName ) {
  ------------------
  |  Branch (657:8): [True: 0, False: 13.5k]
  ------------------
  658|      0|			*propPath += info.currPos->leafOffset;
  659|      0|			*pathSize -= info.currPos->leafOffset;
  660|      0|		}
  661|       |		
  662|  13.5k|		if ( ! (*propOptions & kXMP_PropCompositeMask) ) {
  ------------------
  |  Branch (662:8): [True: 11.3k, False: 2.17k]
  ------------------
  663|  11.3k|			*propValue = xmpNode->value.c_str();
  664|  11.3k|			*valueSize = xmpNode->value.size();
  665|  11.3k|		}
  666|       |
  667|  13.5k|	}
  668|       |	
  669|       |	#if TraceIterators
  670|       |		printf ( "    Next node %s, stage = %s\n",
  671|       |			     info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] );
  672|       |	#endif
  673|       |	
  674|  16.2k|	return true;
  675|       |
  676|  16.2k|}	// Next
_ZN11XMPIterator10UnlockIterEj:
  729|  16.2k|{
  730|  16.2k|	UNUSED(options);
  731|       |
  732|  16.2k|	XMPMeta::Unlock ( 0 );
  733|       |	
  734|  16.2k|}	// UnlockIter
XMPIterator.cpp:_ZL13SetCurrSchemaR8IterInfoPKc:
  181|    809|{
  182|       |
  183|    809|	info.currSchema = schemaName;
  184|       |	#if 0	// *** XMP_DebugBuild
  185|       |		info._schemaPtr = info.currSchema.c_str();
  186|       |	#endif
  187|       |
  188|    809|}	// SetCurrSchema
XMPIterator.cpp:_ZL16AddNodeOffspringR8IterInfoR8IterNodePK8XMP_Node:
  114|  13.5k|{
  115|  13.5k|	XMP_VarString currPath ( iterParent.fullPath );
  116|  13.5k|	size_t        leafOffset = iterParent.fullPath.size();
  117|       |	
  118|  13.5k|	if ( (! xmpParent->qualifiers.empty()) && (! (info.options & kXMP_IterOmitQualifiers)) ) {
  ------------------
  |  Branch (118:7): [True: 314, False: 13.1k]
  |  Branch (118:44): [True: 314, False: 0]
  ------------------
  119|       |
  120|       |		#if TraceIterators
  121|       |			printf ( "    Adding qualifiers of %s\n", currPath.c_str() );
  122|       |		#endif
  123|       |
  124|    314|		currPath += "/?";	// All qualifiers are named and use paths like "Prop/?Qual".
  125|    314|		leafOffset += 2;
  126|       |		
  127|    758|		for ( size_t qualNum = 0, qualLim = xmpParent->qualifiers.size(); qualNum != qualLim; ++qualNum ) {
  ------------------
  |  Branch (127:69): [True: 444, False: 314]
  ------------------
  128|    444|			const XMP_Node * xmpQual = xmpParent->qualifiers[qualNum];
  129|    444|			currPath += xmpQual->name;
  130|    444|			iterParent.qualifiers.push_back ( IterNode ( xmpQual->options, currPath, leafOffset ) );
  131|    444|			currPath.erase ( leafOffset );
  132|       |			#if TraceIterators
  133|       |				printf ( "        %s\n", xmpQual->name.c_str() );
  134|       |			#endif
  135|    444|		}
  136|       |		
  137|    314|		leafOffset -= 2;
  138|    314|		currPath.erase ( leafOffset );
  139|       |
  140|    314|	}
  141|       |
  142|  13.5k|	if ( ! xmpParent->children.empty() ) {
  ------------------
  |  Branch (142:7): [True: 2.15k, False: 11.3k]
  ------------------
  143|       |	
  144|       |		#if TraceIterators
  145|       |			printf ( "    Adding children of %s\n", currPath.c_str() );
  146|       |		#endif
  147|       |
  148|  2.15k|		XMP_Assert ( xmpParent->options & kXMP_PropCompositeMask );
  ------------------
  |  |  142|  2.15k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  149|       |		
  150|  2.15k|		if ( xmpParent->options & kXMP_PropValueIsStruct ) {
  ------------------
  |  Branch (150:8): [True: 394, False: 1.76k]
  ------------------
  151|    394|			currPath += '/';
  152|    394|			leafOffset += 1;
  153|    394|		}
  154|       |		
  155|  6.94k|		for ( size_t childNum = 0, childLim = xmpParent->children.size(); childNum != childLim; ++childNum ) {
  ------------------
  |  Branch (155:69): [True: 4.78k, False: 2.15k]
  ------------------
  156|  4.78k|			const XMP_Node * xmpChild = xmpParent->children[childNum];
  157|  4.78k|			if ( ! (xmpParent->options & kXMP_PropValueIsArray) ) {
  ------------------
  |  Branch (157:9): [True: 1.01k, False: 3.77k]
  ------------------
  158|  1.01k|				currPath += xmpChild->name;
  159|  3.77k|			} else {
  160|  3.77k|				char buffer [32];	// AUDIT: Using sizeof(buffer) below for snprintf length is safe.
  161|  3.77k|				snprintf ( buffer, sizeof(buffer), "[%lu]", static_cast<unsigned long>(childNum+1) );	// ! XPath indices are one-based.
  162|  3.77k|				currPath += buffer;
  163|  3.77k|			}
  164|  4.78k|			iterParent.children.push_back ( IterNode ( xmpChild->options, currPath, leafOffset ) );
  165|  4.78k|			currPath.erase ( leafOffset );
  166|       |			#if TraceIterators
  167|       |				printf ( "        %s\n", (iterParent.children.back().fullPath.c_str() + leafOffset) );
  168|       |			#endif
  169|  4.78k|		}
  170|       |	
  171|  2.15k|	}
  172|       |
  173|  13.5k|}	// AddNodeOffspring
XMPIterator.cpp:_ZL14AddSchemaPropsR8IterInfoR8IterNodePK8XMP_Node:
   48|  2.71k|{
   49|  2.71k|	UNUSED(info);
   50|       |	#if TraceIterators
   51|       |		printf ( "    Adding properties of %s\n", xmpSchema->name.c_str() );
   52|       |	#endif
   53|       |
   54|  10.6k|	for ( size_t propNum = 0, propLim = xmpSchema->children.size(); propNum != propLim; ++propNum ) {
  ------------------
  |  Branch (54:66): [True: 7.88k, False: 2.71k]
  ------------------
   55|  7.88k|		const XMP_Node * xmpProp = xmpSchema->children[propNum];
   56|       |		// *** set the has-aliases bit when appropriate
   57|  7.88k|		iterSchema.children.push_back ( IterNode ( xmpProp->options, xmpProp->name, 0 ) );
   58|       |		#if TraceIterators
   59|       |			printf ( "        %s\n", xmpProp->name.c_str() );
   60|       |		#endif
   61|  7.88k|	}
   62|       |
   63|  2.71k|}	// AddSchemaProps
XMPIterator.cpp:_ZL14GetNextXMPNodeR8IterInfo:
  308|  18.1k|{
  309|  18.1k|	const XMP_Node * xmpNode = 0;
  310|       |
  311|       |	// ----------------------------------------------------------------------------------------------
  312|       |	// On entry currPos points to an iteration node whose state is either before-visit or visit-self.
  313|       |	// If it is before-visit then we will return that node's value part now. If it is visit-self it
  314|       |	// means the previous iteration returned the value portion of that node, so we can advance to the
  315|       |	// next node in the iteration tree. Then we find the corresponding XMP node, allowing for the XMP
  316|       |	// tree to have been modified since that part of the iteration tree was constructed.
  317|       |	
  318|       |	// ! NOTE: Supporting aliases throws in some nastiness with schemas. There might not be any XMP
  319|       |	// ! node for the schema, but we still have to visit it because of possible aliases. The static
  320|       |	// ! sDummySchema is returned if there is no real schema node.
  321|       |
  322|  18.1k|	if ( info.currPos->visitStage != kIter_BeforeVisit ) AdvanceIterPos ( info );
  ------------------
  |  Branch (322:7): [True: 16.0k, False: 2.06k]
  ------------------
  323|       |	
  324|  18.1k|	bool isSchemaNode = false;
  325|  18.1k|	XMP_ExpandedXPath expPath;	// Keep outside the loop to avoid constant construct/destruct.
  326|       |	
  327|  18.1k|	while ( info.currPos != info.endPos ) {
  ------------------
  |  Branch (327:10): [True: 16.2k, False: 1.92k]
  ------------------
  328|       |
  329|  16.2k|		isSchemaNode = XMP_NodeIsSchema ( info.currPos->options );
  330|  16.2k|		if ( isSchemaNode ) {
  ------------------
  |  Branch (330:8): [True: 2.70k, False: 13.5k]
  ------------------
  331|  2.70k|			SetCurrSchema ( info, info.currPos->fullPath );
  332|  2.70k|			xmpNode = FindConstSchema ( &info.xmpObj->tree, info.currPos->fullPath.c_str() );
  ------------------
  |  |  298|  2.70k|#define FindConstSchema(t,u)	FindSchemaNode ( const_cast<XMP_Node*>(t), u, kXMP_ExistingOnly, 0 )
  |  |  ------------------
  |  |  |  |  296|  2.70k|#define kXMP_ExistingOnly	false
  |  |  ------------------
  ------------------
  333|  2.70k|			if ( xmpNode == 0 ) xmpNode = sDummySchema;
  ------------------
  |  Branch (333:9): [True: 0, False: 2.70k]
  ------------------
  334|  13.5k|		} else {
  335|  13.5k|			ExpandXPath ( info.currSchema.c_str(), info.currPos->fullPath.c_str(), &expPath );
  336|  13.5k|			xmpNode = FindConstNode ( &info.xmpObj->tree, expPath );
  ------------------
  |  |  301|  13.5k|#define FindConstNode(t,p)		FindNode ( const_cast<XMP_Node*>(t), p, kXMP_ExistingOnly, 0 )
  |  |  ------------------
  |  |  |  |  296|  13.5k|#define kXMP_ExistingOnly	false
  |  |  ------------------
  ------------------
  337|  13.5k|		}
  338|  16.2k|		if ( xmpNode != 0 ) break;	// Exit the loop, we found a live XMP node.
  ------------------
  |  Branch (338:8): [True: 16.2k, False: 3]
  ------------------
  339|       |
  340|      3|		info.currPos->visitStage = kIter_VisitChildren;	// Make AdvanceIterPos move to the next sibling.
  341|      3|		info.currPos->children.clear();
  342|      3|		info.currPos->qualifiers.clear();
  343|      3|		AdvanceIterPos ( info );
  344|       |
  345|      3|	}
  346|       |
  347|  18.1k|	if ( info.currPos == info.endPos ) return 0;
  ------------------
  |  Branch (347:7): [True: 1.92k, False: 16.2k]
  ------------------
  348|       |	
  349|       |	// -------------------------------------------------------------------------------------------
  350|       |	// Now we've got the iteration node and corresponding XMP node. Add the iteration children for
  351|       |	// structs and arrays. The children of schema were added when the iterator was constructed.
  352|       |
  353|  16.2k|	XMP_Assert ( info.currPos->visitStage == kIter_BeforeVisit );
  ------------------
  |  |  142|  16.2k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  354|       |
  355|  16.2k|	if ( info.currPos->visitStage == kIter_BeforeVisit ) {
  ------------------
  |  Branch (355:7): [True: 16.2k, False: 3]
  ------------------
  356|  16.2k|		if ( (! isSchemaNode) && (! (info.options & kXMP_IterJustChildren)) ) {
  ------------------
  |  Branch (356:8): [True: 13.5k, False: 2.70k]
  |  Branch (356:28): [True: 13.5k, False: 0]
  ------------------
  357|  13.5k|			AddNodeOffspring ( info, *info.currPos, xmpNode );
  358|  13.5k|		}
  359|  16.2k|		info.currPos->visitStage = kIter_VisitSelf;
  360|  16.2k|	}
  361|       |	
  362|  16.2k|	return xmpNode;
  363|       |
  364|  18.1k|}	// GetNextXMPNode
XMPIterator.cpp:_ZL13SetCurrSchemaR8IterInfoRNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  192|  4.15k|{
  193|       |
  194|  4.15k|	info.currSchema = schemaName;
  195|       |	#if 0	// *** XMP_DebugBuild
  196|       |		info._schemaPtr = info.currSchema.c_str();
  197|       |	#endif
  198|       |
  199|  4.15k|}	// SetCurrSchema
XMPIterator.cpp:_ZL14AdvanceIterPosR8IterInfo:
  212|  16.0k|{
  213|       |	// -------------------------------------------------------------------------------------------
  214|       |	// Keep looking until we find a node to visit or the end of everything. The first time through
  215|       |	// the current node will exist, we just visited it. But we have to keep looking if the current
  216|       |	// node was the last of its siblings or is an empty schema.
  217|       |	
  218|       |	// ! It is possible that info.currPos == info.endPos on entry. Don't dereference info.currPos yet!
  219|       |
  220|  36.8k|	while ( true ) {
  ------------------
  |  Branch (220:10): [True: 36.8k, Folded]
  ------------------
  221|       |	
  222|  36.8k|		if ( info.currPos == info.endPos ) {
  ------------------
  |  Branch (222:8): [True: 6.81k, False: 30.0k]
  ------------------
  223|       |		
  224|       |			// ------------------------------------------------------------------------------------
  225|       |			// At the end of a set of siblings, move up to an ancestor. We've either just finished
  226|       |			// the qualifiers and will move to the children, or have just finished the children and
  227|       |			// will move on to the next sibling.
  228|       |			
  229|  6.81k|			if ( info.ancestors.empty() ) break;	// We're at the end of the schema list.
  ------------------
  |  Branch (229:9): [True: 1.92k, False: 4.89k]
  ------------------
  230|       |
  231|  4.89k|			IterPosPair & parent = info.ancestors.back();
  232|  4.89k|			info.currPos = parent.first;
  233|  4.89k|			info.endPos  = parent.second;
  234|  4.89k|			info.ancestors.pop_back();
  235|       |			
  236|       |			#if TraceIterators
  237|       |				printf ( "    Moved up to %s, stage = %s\n",
  238|       |				         info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] );
  239|       |			#endif
  240|       |		
  241|  30.0k|		} else {
  242|       |			
  243|       |			// -------------------------------------------------------------------------------------------
  244|       |			// Decide what to do with this iteration node based on its state. Don't use a switch statement,
  245|       |			// some of the cases want to break from the loop. A break in a switch just exits the case.
  246|       |			
  247|       |			#if TraceIterators
  248|       |				printf ( "    Moving from %s, stage = %s\n",
  249|       |				         info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] );
  250|       |			#endif
  251|       |			
  252|  30.0k|			if ( info.currPos->visitStage == kIter_BeforeVisit ) {		// Visit this node now.
  ------------------
  |  Branch (252:9): [True: 9.11k, False: 20.9k]
  ------------------
  253|  9.11k|				if ( info.currPos->options & kXMP_SchemaNode ) SetCurrSchema ( info, info.currPos->fullPath );
  ------------------
  |  Branch (253:10): [True: 1.44k, False: 7.66k]
  ------------------
  254|  9.11k|				break;
  255|  9.11k|			}
  256|       |
  257|  20.9k|			if ( info.currPos->visitStage == kIter_VisitSelf ) {		// Just finished visiting the value portion.
  ------------------
  |  Branch (257:9): [True: 16.0k, False: 4.89k]
  ------------------
  258|  16.0k|				info.currPos->visitStage = kIter_VisitQualifiers;		// Start visiting the qualifiers.
  259|  16.0k|				if ( ! info.currPos->qualifiers.empty() ) {
  ------------------
  |  Branch (259:10): [True: 255, False: 15.8k]
  ------------------
  260|    255|					info.ancestors.push_back ( IterPosPair ( info.currPos, info.endPos ) );
  261|    255|					info.endPos  = info.currPos->qualifiers.end();		// ! Set the parent's endPos before changing currPos!
  262|    255|					info.currPos = info.currPos->qualifiers.begin();
  263|    255|					break;
  264|    255|				}
  265|  16.0k|			}
  266|       |
  267|  20.7k|			if ( info.currPos->visitStage == kIter_VisitQualifiers ) {	// Just finished visiting the qualifiers.
  ------------------
  |  Branch (267:9): [True: 16.0k, False: 4.63k]
  ------------------
  268|  16.0k|				info.currPos->qualifiers.clear();
  269|  16.0k|				info.currPos->visitStage = kIter_VisitChildren;			// Start visiting the children.
  270|  16.0k|				if ( ! info.currPos->children.empty() ) {
  ------------------
  |  Branch (270:10): [True: 4.77k, False: 11.2k]
  ------------------
  271|  4.77k|					info.ancestors.push_back ( IterPosPair ( info.currPos, info.endPos ) );
  272|  4.77k|					info.endPos  = info.currPos->children.end();		// ! Set the parent's endPos before changing currPos!
  273|  4.77k|					info.currPos = info.currPos->children.begin();
  274|  4.77k|					break;
  275|  4.77k|				}
  276|  16.0k|			}
  277|       |
  278|  15.9k|			if ( info.currPos->visitStage == kIter_VisitChildren ) {	// Just finished visiting the children.
  ------------------
  |  Branch (278:9): [True: 15.9k, False: 0]
  ------------------
  279|  15.9k|				info.currPos->children.clear();
  280|  15.9k|				++info.currPos;											// Move to the next sibling.
  281|  15.9k|				continue;
  282|  15.9k|			}
  283|       |			
  284|       |			#if TraceIterators
  285|       |				if ( info.currPos != info.endPos ) {
  286|       |					printf ( "    Moved to %s, stage = %s\n",
  287|       |					         info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] );
  288|       |				}
  289|       |			#endif
  290|       |			
  291|  15.9k|		}
  292|       |
  293|  36.8k|	}	// Loop to find the next node.
  294|       |	
  295|  16.0k|	XMP_Assert ( (info.currPos == info.endPos) || (info.currPos->visitStage == kIter_BeforeVisit) );
  ------------------
  |  |  142|  16.0k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  296|       |
  297|  16.0k|}	// AdvanceIterPos

_ZN8IterNodeC2Ev:
   43|  2.37k|	IterNode() : options(0), leafOffset(0), visitStage(kIter_BeforeVisit)
   44|  2.37k|	{
   45|       |		#if 0	// *** XMP_DebugBuild
   46|       |			_pathPtr = _leafPtr = 0;
   47|       |		#endif
   48|  2.37k|	};
_ZN8IterNodeC2EjRKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEm:
   51|  16.6k|			 : options(_options), fullPath(_fullPath), leafOffset(_leafOffset), visitStage(kIter_BeforeVisit)
   52|  16.6k|	{
   53|       |		#if 0	// *** XMP_DebugBuild
   54|       |			_pathPtr = fullPath.c_str();
   55|       |			_leafPtr = _pathPtr + leafOffset;
   56|       |		#endif
   57|  16.6k|	};
_ZN8IterInfoC2EjPK7XMPMeta:
   80|  2.37k|	IterInfo ( XMP_OptionBits _options, const XMPMeta * _xmpObj ) : options(_options), xmpObj(_xmpObj)
   81|  2.37k|	{
   82|       |		#if 0	// *** XMP_DebugBuild
   83|       |			_schemaPtr = 0;
   84|       |		#endif
   85|  2.37k|	};

_ZN7XMPMeta11SetPropertyEPKcS1_S1_j:
  454|  4.33k|{
  455|  4.33k|	XMP_Assert ( (schemaNS != 0) && (propName != 0) );	// Enforced by wrapper.
  ------------------
  |  |  142|  4.33k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  456|       |
  457|  4.33k|	options = VerifySetOptions ( options, propValue );
  458|       |
  459|  4.33k|	XMP_ExpandedXPath expPath;
  460|  4.33k|	ExpandXPath ( schemaNS, propName, &expPath );
  461|       |
  462|  4.33k|	XMP_Node * propNode = FindNode ( &tree, expPath, kXMP_CreateNodes, options );
  ------------------
  |  |  295|  4.33k|#define kXMP_CreateNodes	true
  ------------------
  463|  4.33k|	if ( propNode == 0 ) XMP_Throw ( "Specified property does not exist", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (463:7): [True: 0, False: 4.33k]
  ------------------
  464|       |	
  465|  4.33k|	SetNode ( propNode, propValue, options );
  466|       |	
  467|  4.33k|}	// SetProperty
_ZN7XMPMeta15AppendArrayItemEPKcS1_jS1_j:
  503|     66|{
  504|     66|	XMP_Assert ( (schemaNS != 0) && (arrayName != 0) );	// Enforced by wrapper.
  ------------------
  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  ------------------
  505|       |
  506|     66|	arrayOptions = VerifySetOptions ( arrayOptions, 0 );
  507|     66|	if ( (arrayOptions & ~kXMP_PropArrayFormMask) != 0 ) {
  ------------------
  |  Branch (507:7): [True: 0, False: 66]
  ------------------
  508|      0|		XMP_Throw ( "Only array form flags allowed for arrayOptions", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  509|      0|	}
  510|       |	
  511|       |	// Locate or create the array. If it already exists, make sure the array form from the options
  512|       |	// parameter is compatible with the current state.
  513|       |	
  514|     66|	XMP_ExpandedXPath arrayPath;
  515|     66|	ExpandXPath ( schemaNS, arrayName, &arrayPath );
  516|     66|	XMP_Node * arrayNode = FindNode ( &tree, arrayPath, kXMP_ExistingOnly );	// Just lookup, don't try to create.
  ------------------
  |  |  296|     66|#define kXMP_ExistingOnly	false
  ------------------
  517|       |	
  518|     66|	if ( arrayNode != 0 ) {
  ------------------
  |  Branch (518:7): [True: 4, False: 62]
  ------------------
  519|       |		// The array exists, make sure the form is compatible. Zero arrayForm means take what exists.
  520|      4|		if ( ! (arrayNode->options & kXMP_PropValueIsArray) ) {
  ------------------
  |  Branch (520:8): [True: 0, False: 4]
  ------------------
  521|      0|			XMP_Throw ( "The named property is not an array", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  522|      0|		}
  523|       |		#if 0
  524|       |			// *** Disable for now. Need to do some general rethinking of semantic checks.
  525|       |			if ( (arrayOptions != 0) && (arrayOptions != (arrayNode->options & kXMP_PropArrayFormMask)) ) {
  526|       |				XMP_Throw ( "Mismatch of existing and specified array form", kXMPErr_BadOptions );
  527|       |			}
  528|       |		#endif
  529|     62|	} else {
  530|       |		// The array does not exist, try to create it.
  531|     62|		if ( arrayOptions == 0 ) XMP_Throw ( "Explicit arrayOptions required to create new array", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (531:8): [True: 0, False: 62]
  ------------------
  532|     62|		arrayNode = FindNode ( &tree, arrayPath, kXMP_CreateNodes, arrayOptions );
  ------------------
  |  |  295|     62|#define kXMP_CreateNodes	true
  ------------------
  533|     62|		if ( arrayNode == 0 ) XMP_Throw ( "Failure creating array node", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (533:8): [True: 0, False: 62]
  ------------------
  534|     62|	}
  535|       |	
  536|     66|	DoSetArrayItem ( arrayNode, kXMP_ArrayLastItem, itemValue, (options | kXMP_InsertAfterItem) );
  537|       |	
  538|     66|}	// AppendArrayItem
_ZN7XMPMeta12SetQualifierEPKcS1_S1_S1_S1_j:
  575|     66|{
  576|     66|	XMP_Assert ( (schemaNS != 0) && (propName != 0) && (qualNS != 0) && (qualName != 0) );	// Enforced by wrapper.
  ------------------
  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  ------------------
  577|       |
  578|     66|	XMP_StringPtr	qualPath;
  579|     66|	XMP_StringLen	pathLen;
  580|       |
  581|     66|	XMP_ExpandedXPath expPath;
  582|     66|	ExpandXPath ( schemaNS, propName, &expPath );
  583|     66|	XMP_Node * propNode = FindNode ( &tree, expPath, kXMP_ExistingOnly );
  ------------------
  |  |  296|     66|#define kXMP_ExistingOnly	false
  ------------------
  584|     66|	if ( propNode == 0 ) XMP_Throw ( "Specified property does not exist", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (584:7): [True: 0, False: 66]
  ------------------
  585|       |
  586|     66|	XMPUtils::ComposeQualifierPath ( schemaNS, propName, qualNS, qualName, &qualPath, &pathLen );
  587|     66|	SetProperty ( schemaNS, qualPath, qualValue, options );
  588|       |
  589|     66|}	// SetQualifier
XMPMeta-GetSet.cpp:_ZL7SetNodeP8XMP_NodePKcj:
  117|  4.40k|{
  118|  4.40k|	if ( options & kXMP_DeleteExisting ) {
  ------------------
  |  Branch (118:7): [True: 0, False: 4.40k]
  ------------------
  119|      0|		XMP_ClearOption ( options, kXMP_DeleteExisting );
  120|      0|		node->options = options;
  121|      0|		node->value.erase();
  122|      0|		node->RemoveChildren();
  123|      0|		node->RemoveQualifiers();
  124|      0|	}
  125|       |	
  126|  4.40k|	node->options |= options;	// Keep options set by FindNode when creating a new node.
  127|       |
  128|  4.40k|	if ( value != 0 ) {
  ------------------
  |  Branch (128:7): [True: 3.75k, False: 651]
  ------------------
  129|       |	
  130|       |		// This is setting the value of a leaf node.
  131|  3.75k|		if ( node->options & kXMP_PropCompositeMask ) XMP_Throw ( "Composite nodes can't have values", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (131:8): [True: 0, False: 3.75k]
  ------------------
  132|  3.75k|		XMP_Assert ( node->children.empty() );
  ------------------
  |  |  142|  3.75k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  133|  3.75k|		SetNodeValue ( node, value );
  134|       |	
  135|  3.75k|	} else {
  136|       |	
  137|       |		// This is setting up an array or struct.
  138|    651|		if ( ! node->value.empty() ) XMP_Throw ( "Composite nodes can't have values", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (138:8): [True: 0, False: 651]
  ------------------
  139|    651|		if ( node->options & kXMP_PropCompositeMask ) {	// Can't change an array to a struct, or vice versa.
  ------------------
  |  Branch (139:8): [True: 524, False: 127]
  ------------------
  140|    524|			if ( (options & kXMP_PropCompositeMask) != (node->options & kXMP_PropCompositeMask) ) {
  ------------------
  |  Branch (140:9): [True: 0, False: 524]
  ------------------
  141|      0|				XMP_Throw ( "Requested and existing composite form mismatch", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  142|      0|			}
  143|    524|		}
  144|    651|		node->RemoveChildren();
  145|       |	
  146|    651|	}
  147|       |	
  148|  4.40k|}	// SetNode
XMPMeta-GetSet.cpp:_ZL14DoSetArrayItemP8XMP_NodeiPKcj:
  160|     66|{
  161|     66|	XMP_OptionBits itemLoc = options & kXMP_PropArrayLocationMask;
  162|     66|	XMP_Index      arraySize = arrayNode->children.size();
  163|       |	
  164|     66|	options &= ~kXMP_PropArrayLocationMask;
  165|     66|	options = VerifySetOptions ( options, itemValue );
  166|       |	
  167|       |	// Now locate or create the item node and set the value. Note the index parameter is one-based!
  168|       |	// The index can be in the range [0..size+1] or "last", normalize it and check the insert flags.
  169|       |	// The order of the normalization checks is important. If the array is empty we end up with an
  170|       |	// index and location to set item size+1.
  171|       |	
  172|     66|	XMP_Node * itemNode = 0;
  173|       |	
  174|     66|	if ( itemIndex == kXMP_ArrayLastItem ) itemIndex = arraySize;
  ------------------
  |  Branch (174:7): [True: 66, False: 0]
  ------------------
  175|     66|	if ( (itemIndex == 0) && (itemLoc == kXMP_InsertAfterItem) ) {
  ------------------
  |  Branch (175:7): [True: 62, False: 4]
  |  Branch (175:27): [True: 62, False: 0]
  ------------------
  176|     62|		itemIndex = 1;
  177|     62|		itemLoc = kXMP_InsertBeforeItem;
  178|     62|	}
  179|     66|	if ( (itemIndex == arraySize) && (itemLoc == kXMP_InsertAfterItem) ) {
  ------------------
  |  Branch (179:7): [True: 4, False: 62]
  |  Branch (179:35): [True: 4, False: 0]
  ------------------
  180|      4|		itemIndex += 1;
  181|      4|		itemLoc = 0;
  182|      4|	}
  183|     66|	if ( (itemIndex == arraySize+1) && (itemLoc == kXMP_InsertBeforeItem) ) itemLoc = 0;
  ------------------
  |  Branch (183:7): [True: 66, False: 0]
  |  Branch (183:37): [True: 62, False: 4]
  ------------------
  184|       |	
  185|     66|	if ( itemIndex == arraySize+1 ) {
  ------------------
  |  Branch (185:7): [True: 66, False: 0]
  ------------------
  186|       |
  187|     66|		if ( itemLoc != 0 ) XMP_Throw ( "Can't insert before or after implicit new item", kXMPErr_BadIndex );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (187:8): [True: 0, False: 66]
  ------------------
  188|     66|		itemNode = new XMP_Node ( arrayNode, kXMP_ArrayItemName, 0 );
  ------------------
  |  |  293|     66|#define kXMP_ArrayItemName	"[]"
  ------------------
  189|     66|		arrayNode->children.push_back ( itemNode );
  190|       |
  191|     66|	} else {
  192|       |
  193|      0|		if ( (itemIndex < 1) || (itemIndex > arraySize) ) XMP_Throw ( "Array index out of bounds", kXMPErr_BadIndex );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (193:8): [True: 0, False: 0]
  |  Branch (193:27): [True: 0, False: 0]
  ------------------
  194|      0|		--itemIndex;	// ! Convert the index to a C zero-based value!
  195|      0|		if ( itemLoc == 0 ) {
  ------------------
  |  Branch (195:8): [True: 0, False: 0]
  ------------------
  196|      0|			itemNode = arrayNode->children[itemIndex];
  197|      0|		} else {
  198|      0|			XMP_NodePtrPos itemPos = arrayNode->children.begin() + itemIndex;
  199|      0|			if ( itemLoc == kXMP_InsertAfterItem ) ++itemPos;
  ------------------
  |  Branch (199:9): [True: 0, False: 0]
  ------------------
  200|      0|			itemNode = new XMP_Node ( arrayNode, kXMP_ArrayItemName, 0 );
  ------------------
  |  |  293|      0|#define kXMP_ArrayItemName	"[]"
  ------------------
  201|      0|			itemPos = arrayNode->children.insert ( itemPos, itemNode );
  202|      0|		}
  203|       |
  204|      0|	}
  205|       |	
  206|     66|	SetNode ( itemNode, itemValue, options );
  207|       |	
  208|     66|}	// DoSetArrayItem
XMPMeta-GetSet.cpp:_ZL12SetNodeValueP8XMP_NodePKc:
   76|  3.75k|{
   77|       |
   78|       |	#if XMP_DebugBuild	// ! Hack to force an assert.
   79|       |		if ( (node->name == "xmp:TestAssertNotify") && XMP_LitMatch ( value, "DoIt!" ) ) {
   80|       |			XMP_Assert ( node->name != "xmp:TestAssertNotify" );
   81|       |		}
   82|       |	#endif
   83|       |	
   84|  3.75k|	node->value = value;
   85|       |	
   86|  3.75k|	XMP_Uns8* chPtr = (XMP_Uns8*) node->value.c_str();	// Check for valid UTF-8, replace ASCII controls with a space.
   87|  8.93k|	while ( *chPtr != 0 ) {
  ------------------
  |  Branch (87:10): [True: 5.18k, False: 3.75k]
  ------------------
   88|   137k|		while ( (*chPtr != 0) && (*chPtr < 0x80) ) {
  ------------------
  |  Branch (88:11): [True: 133k, False: 3.73k]
  |  Branch (88:28): [True: 132k, False: 1.45k]
  ------------------
   89|   132k|			if ( *chPtr < 0x20 ) {
  ------------------
  |  Branch (89:9): [True: 1.06k, False: 131k]
  ------------------
   90|  1.06k|				if ( (*chPtr != kTab) && (*chPtr != kLF) && (*chPtr != kCR) ) *chPtr = 0x20;
  ------------------
  |  |  100|  1.06k|#define kTab ((char)0x09)
  ------------------
              				if ( (*chPtr != kTab) && (*chPtr != kLF) && (*chPtr != kCR) ) *chPtr = 0x20;
  ------------------
  |  |  101|    313|#define kLF ((char)0x0A)
  ------------------
              				if ( (*chPtr != kTab) && (*chPtr != kLF) && (*chPtr != kCR) ) *chPtr = 0x20;
  ------------------
  |  |  102|      0|#define kCR ((char)0x0D)
  ------------------
  |  Branch (90:10): [True: 313, False: 754]
  |  Branch (90:30): [True: 0, False: 313]
  |  Branch (90:49): [True: 0, False: 0]
  ------------------
   91|   131k|			} else if (*chPtr == 0x7F ) {
  ------------------
  |  Branch (91:15): [True: 0, False: 131k]
  ------------------
   92|      0|				*chPtr = 0x20;
   93|      0|			}
   94|   132k|			++chPtr;
   95|   132k|		}
   96|  5.18k|		XMP_Assert ( (*chPtr == 0) || (*chPtr >= 0x80) );
  ------------------
  |  |  142|  5.18k|	#define XMP_Assert(c)	((void) 0)
  ------------------
   97|  5.18k|		if ( *chPtr != 0 ) (void) GetCodePoint ( (const XMP_Uns8 **) &chPtr );	// Throws for bad UTF-8.
  ------------------
  |  Branch (97:8): [True: 1.45k, False: 3.73k]
  ------------------
   98|  5.18k|	}
   99|       |
  100|  3.75k|	if ( XMP_PropIsQualifier(node->options) && (node->name == "xml:lang") ) NormalizeLangValue ( &node->value );
  ------------------
  |  Branch (100:7): [True: 174, False: 3.57k]
  |  Branch (100:45): [True: 116, False: 58]
  ------------------
  101|       |
  102|       |	#if 0	// *** XMP_DebugBuild
  103|       |		node->_valuePtr = node->value.c_str();
  104|       |	#endif
  105|       |	
  106|  3.75k|}	// SetNodeValue

_ZN7XMPMeta15ParseFromBufferEPKcjj:
 1096|  2.20k|{
 1097|  2.20k|	if ( (buffer == 0) && (xmpSize != 0) ) XMP_Throw ( "Null parse buffer", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1097:7): [True: 0, False: 2.20k]
  |  Branch (1097:24): [True: 0, False: 0]
  ------------------
 1098|  2.20k|	if ( xmpSize == kXMP_UseNullTermination ) xmpSize = strlen ( buffer );
  ------------------
  |  Branch (1098:7): [True: 0, False: 2.20k]
  ------------------
 1099|       |	
 1100|  2.20k|	const bool lastClientCall = ((options & kXMP_ParseMoreBuffers) == 0);	// *** Could use FlagIsSet & FlagIsClear macros.
 1101|       |	
 1102|  2.20k|	this->tree.ClearNode();	// Make sure the target XMP object is totally empty.
 1103|       |
 1104|  2.20k|	if ( this->xmlParser == 0 ) {
  ------------------
  |  Branch (1104:7): [True: 2.20k, False: 0]
  ------------------
 1105|  2.20k|		if ( (xmpSize == 0) && lastClientCall ) return;	// Tolerate empty parse. Expat complains if there are no XML elements.
  ------------------
  |  Branch (1105:8): [True: 0, False: 2.20k]
  |  Branch (1105:26): [True: 0, False: 0]
  ------------------
 1106|  2.20k|		this->xmlParser = XMP_NewExpatAdapter();
 1107|  2.20k|	}
 1108|       |	
 1109|  2.20k|	XMLParserAdapter& parser = *this->xmlParser;
 1110|       |	
 1111|       |	#if 0	// XMP_DebugBuild
 1112|       |		if ( parser.parseLog != 0 ) {
 1113|       |			char message [200];	// AUDIT: Using sizeof(message) below for snprintf length is safe.
 1114|       |			snprintf ( message, sizeof(message), "<!-- ParseFromBuffer, length = %d, options = %X%s -->",	// AUDIT: See above.
 1115|       |					   xmpSize, options, (lastClientCall ? " (last)" : "") );
 1116|       |			fwrite ( message, 1, strlen(message), parser.parseLog );
 1117|       |			fflush ( parser.parseLog );
 1118|       |		}
 1119|       |	#endif
 1120|       |		
 1121|  2.20k|	try {	// Cleanup the tree and xmlParser if anything fails.
 1122|       |	
 1123|       |		// Determine the character encoding before doing any real parsing. This is needed to do the
 1124|       |		// 8-bit special processing.
 1125|       |		
 1126|  2.20k|		if ( parser.charEncoding == XMP_OptionBits(-1) ) {
  ------------------
  |  Branch (1126:8): [True: 2.20k, False: 0]
  ------------------
 1127|       |
 1128|  2.20k|			if ( (parser.pendingCount == 0) && (xmpSize >= kXMLPendingInputMax) ) {
  ------------------
  |  Branch (1128:9): [True: 2.20k, False: 0]
  |  Branch (1128:39): [True: 2.19k, False: 4]
  ------------------
 1129|       |
 1130|       |				// This ought to be the common case, the first buffer is big enough.
 1131|  2.19k|				parser.charEncoding = DetermineInputEncoding ( (XMP_Uns8*)buffer, xmpSize );
 1132|       |
 1133|  2.19k|			} else {
 1134|       |			
 1135|       |				// Try to fill the pendingInput buffer before calling DetermineInputEncoding.
 1136|       |
 1137|      4|				size_t pendingOverlap = kXMLPendingInputMax - parser.pendingCount;
 1138|      4|				if ( pendingOverlap > xmpSize ) pendingOverlap = xmpSize;
  ------------------
  |  Branch (1138:10): [True: 4, False: 0]
  ------------------
 1139|       |
 1140|      4|				memcpy ( &parser.pendingInput[parser.pendingCount], buffer, pendingOverlap );	// AUDIT: Count is safe.
 1141|      4|				buffer += pendingOverlap;
 1142|      4|				xmpSize -= pendingOverlap;
 1143|      4|				parser.pendingCount += pendingOverlap;
 1144|       |
 1145|      4|				if ( (! lastClientCall) && (parser.pendingCount < kXMLPendingInputMax) ) return;
  ------------------
  |  Branch (1145:10): [True: 0, False: 4]
  |  Branch (1145:32): [True: 0, False: 0]
  ------------------
 1146|      4|				parser.charEncoding = DetermineInputEncoding ( parser.pendingInput, parser.pendingCount );
 1147|       |				
 1148|       |				#if Trace_ParsingHackery
 1149|       |					fprintf ( stderr, "XMP Character encoding is %d\n", parser.charEncoding );
 1150|       |				#endif
 1151|       |			
 1152|      4|			}
 1153|       |
 1154|  2.20k|		}
 1155|       |		
 1156|       |		// We have the character encoding. Process UTF-16 and UTF-32 as is. UTF-8 needs special
 1157|       |		// handling to take care of things like ISO Latin-1 or unescaped ASCII controls.
 1158|       |
 1159|  2.20k|		XMP_Assert ( parser.charEncoding != XMP_OptionBits(-1) );
  ------------------
  |  |  142|  2.20k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1160|       |
 1161|  2.20k|		if ( parser.charEncoding != kXMP_EncodeUTF8 ) {
  ------------------
  |  Branch (1161:8): [True: 0, False: 2.20k]
  ------------------
 1162|       |		
 1163|      0|			if ( parser.pendingCount > 0 ) {
  ------------------
  |  Branch (1163:9): [True: 0, False: 0]
  ------------------
 1164|       |				// Might have pendingInput from the above portion to determine the character encoding.
 1165|      0|				parser.ParseBuffer ( parser.pendingInput, parser.pendingCount, false );
 1166|      0|			}
 1167|      0|			parser.ParseBuffer ( buffer, xmpSize, lastClientCall );
 1168|       |			
 1169|  2.20k|		} else {
 1170|       |
 1171|       |			#if Trace_ParsingHackery
 1172|       |				fprintf ( stderr, "Parsing %d bytes @ %.8X, %s, %d pending, context: %.8s\n",
 1173|       |						  xmpSize, buffer, (lastClientCall ? "last" : "not last"), parser.pendingCount, buffer );
 1174|       |			#endif
 1175|       |
 1176|       |			// The UTF-8 processing is a bit complex due to the need to tolerate ISO Latin-1 input.
 1177|       |			// This is done by scanning the input for byte sequences that are not valid UTF-8,
 1178|       |			// assuming they are Latin-1 characters in the range 0x80..0xFF. This requires saving a
 1179|       |			// pending input buffer to handle partial UTF-8 sequences at the end of a buffer.
 1180|       |			
 1181|  2.20k|			while ( parser.pendingCount > 0 ) {
  ------------------
  |  Branch (1181:12): [True: 4, False: 2.20k]
  ------------------
 1182|       |			
 1183|       |				// We've got some leftover input, process it first then continue with the current
 1184|       |				// buffer. Try to fill the pendingInput buffer before parsing further. We use a loop
 1185|       |				// for weird edge cases like a 2 byte input buffer, using 1 byte for pendingInput,
 1186|       |				// then having a partial UTF-8 end and need to absorb more.
 1187|       |				
 1188|      4|				size_t pendingOverlap = kXMLPendingInputMax - parser.pendingCount;
 1189|      4|				if ( pendingOverlap > xmpSize ) pendingOverlap = xmpSize;
  ------------------
  |  Branch (1189:10): [True: 4, False: 0]
  ------------------
 1190|       |				
 1191|      4|				memcpy ( &parser.pendingInput[parser.pendingCount], buffer, pendingOverlap );	// AUDIT: Count is safe.
 1192|      4|				parser.pendingCount += pendingOverlap;
 1193|      4|				buffer += pendingOverlap;
 1194|      4|				xmpSize -= pendingOverlap;
 1195|       |
 1196|      4|				if ( (! lastClientCall) && (parser.pendingCount < kXMLPendingInputMax) ) return;
  ------------------
  |  Branch (1196:10): [True: 0, False: 4]
  |  Branch (1196:32): [True: 0, False: 0]
  ------------------
 1197|      4|				size_t bytesDone = ProcessUTF8Portion ( &parser, parser.pendingInput, parser.pendingCount, lastClientCall );
 1198|      4|				size_t bytesLeft = parser.pendingCount - bytesDone;
 1199|       |
 1200|       |				#if Trace_ParsingHackery
 1201|       |					fprintf ( stderr, "   ProcessUTF8Portion handled %d pending bytes\n", bytesDone );
 1202|       |				#endif
 1203|       |				
 1204|      4|				if ( bytesDone == parser.pendingCount ) {
  ------------------
  |  Branch (1204:10): [True: 4, False: 0]
  ------------------
 1205|       |
 1206|       |					// Done with all of the pending input, move on to the current buffer.
 1207|      4|					parser.pendingCount = 0;
 1208|       |
 1209|      4|				} else if ( bytesLeft <= pendingOverlap ) {
  ------------------
  |  Branch (1209:17): [True: 0, False: 0]
  ------------------
 1210|       |
 1211|       |					// The leftover pending input all came from the current buffer. Exit this loop.
 1212|      0|					buffer -= bytesLeft;
 1213|      0|					xmpSize += bytesLeft;
 1214|      0|					parser.pendingCount = 0;
 1215|       |
 1216|      0|				} else if ( xmpSize > 0 ) {
  ------------------
  |  Branch (1216:17): [True: 0, False: 0]
  ------------------
 1217|       |
 1218|       |					// Pull more of the current buffer into the pending input and try again.
 1219|       |					// Backup by this pass's overlap so the loop entry code runs OK.
 1220|      0|					parser.pendingCount -= pendingOverlap;
 1221|      0|					buffer -= pendingOverlap;
 1222|      0|					xmpSize += pendingOverlap;
 1223|       |
 1224|      0|				} else {
 1225|       |
 1226|       |					// There is no more of the current buffer. Wait for more. Partial sequences at
 1227|       |					// the end of the last buffer should be treated as Latin-1 by ProcessUTF8Portion.
 1228|      0|					XMP_Assert ( ! lastClientCall );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1229|      0|					parser.pendingCount = bytesLeft;
 1230|      0|					memcpy ( &parser.pendingInput[0], &parser.pendingInput[bytesDone], bytesLeft );	// AUDIT: Count is safe.
 1231|      0|					return;
 1232|       |
 1233|      0|				}
 1234|       |			
 1235|      4|			}
 1236|       |			
 1237|       |			// Done with the pending input, process the current buffer.
 1238|       |
 1239|  2.20k|			size_t bytesDone = ProcessUTF8Portion ( &parser, (XMP_Uns8*)buffer, xmpSize, lastClientCall );
 1240|       |
 1241|       |			#if Trace_ParsingHackery
 1242|       |				fprintf ( stderr, "   ProcessUTF8Portion handled %d additional bytes\n", bytesDone );
 1243|       |			#endif
 1244|       |			
 1245|  2.20k|			if ( bytesDone < xmpSize ) {
  ------------------
  |  Branch (1245:9): [True: 0, False: 2.20k]
  ------------------
 1246|       |
 1247|      0|				XMP_Assert ( ! lastClientCall );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1248|      0|				size_t bytesLeft = xmpSize - bytesDone;
 1249|      0|				if ( bytesLeft > kXMLPendingInputMax ) XMP_Throw ( "Parser bytesLeft too large", kXMPErr_InternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1249:10): [True: 0, False: 0]
  ------------------
 1250|       |
 1251|      0|				memcpy ( parser.pendingInput, &buffer[bytesDone], bytesLeft );	// AUDIT: Count is safe.
 1252|      0|				parser.pendingCount = bytesLeft;
 1253|      0|				return;	// Wait for the next buffer.
 1254|       |
 1255|      0|			}
 1256|       |
 1257|  2.20k|		}
 1258|       |		
 1259|  2.20k|		if ( lastClientCall ) {
  ------------------
  |  Branch (1259:8): [True: 2.19k, False: 4]
  ------------------
 1260|       |		
 1261|       |			#if XMP_DebugBuild && DumpXMLParseTree
 1262|       |				if ( parser.parseLog == 0 ) parser.parseLog = stdout;
 1263|       |				DumpXMLTree ( parser.parseLog, parser.tree, 0 );
 1264|       |			#endif
 1265|       |
 1266|  2.19k|			const XML_Node * xmlRoot = FindRootNode ( this, *this->xmlParser, options );
 1267|       |
 1268|  2.19k|			if ( xmlRoot != 0 ) {
  ------------------
  |  Branch (1268:9): [True: 1.95k, False: 239]
  ------------------
 1269|       |
 1270|  1.95k|				ProcessRDF ( &this->tree, *xmlRoot, options );
 1271|  1.95k|				NormalizeDCArrays ( &this->tree );
 1272|  1.95k|				if ( this->tree.options & kXMP_PropHasAliases ) MoveExplicitAliases ( &this->tree, options );
  ------------------
  |  Branch (1272:10): [True: 0, False: 1.95k]
  ------------------
 1273|  1.95k|				TouchUpDataModel ( this );
 1274|       |				
 1275|       |				// Delete empty schema nodes. Do this last, other cleanup can make empty schema.
 1276|  1.95k|				size_t schemaNum = 0;
 1277|  4.67k|				while ( schemaNum < this->tree.children.size() ) {
  ------------------
  |  Branch (1277:13): [True: 2.71k, False: 1.95k]
  ------------------
 1278|  2.71k|					XMP_Node * currSchema = this->tree.children[schemaNum];
 1279|  2.71k|					if ( currSchema->children.size() > 0 ) {
  ------------------
  |  Branch (1279:11): [True: 2.71k, False: 0]
  ------------------
 1280|  2.71k|						++schemaNum;
 1281|  2.71k|					} else {
 1282|      0|						delete this->tree.children[schemaNum];	// ! Delete the schema node itself.
 1283|      0|						this->tree.children.erase ( this->tree.children.begin() + schemaNum );
 1284|      0|					}
 1285|  2.71k|				}
 1286|       |				
 1287|  1.95k|			}
 1288|       |
 1289|  2.19k|			delete this->xmlParser;
 1290|  2.19k|			this->xmlParser = 0;
 1291|       |
 1292|  2.19k|		}
 1293|       |		
 1294|  2.20k|	} catch ( ... ) {
 1295|       |
 1296|    633|		delete this->xmlParser;
 1297|    633|		this->xmlParser = 0;
 1298|    633|		prevTkVer = 0;
 1299|    633|		this->tree.ClearNode();
 1300|    633|		throw;
 1301|       |
 1302|    633|	}
 1303|       |	
 1304|  2.20k|}	// ParseFromBuffer
XMPMeta-Parse.cpp:_ZL22DetermineInputEncodingPKhm:
  810|  2.20k|{
  811|  2.20k|	if ( length < 2 ) return kXMP_EncodeUTF8;
  ------------------
  |  Branch (811:7): [True: 0, False: 2.20k]
  ------------------
  812|       |	
  813|  2.20k|	XMP_Uns8 * uniChar = (XMP_Uns8*)buffer;	// ! Make sure comparisons are unsigned.
  814|       |	
  815|  2.20k|	if ( uniChar[0] == 0 ) {
  ------------------
  |  Branch (815:7): [True: 0, False: 2.20k]
  ------------------
  816|       |	
  817|       |		// These cases are:
  818|       |		//   00 nn -- -- - Big endian UTF-16
  819|       |		//   00 00 00 nn - Big endian UTF-32
  820|       |		//   00 00 FE FF - Big endian UTF 32
  821|       |
  822|      0|		if ( (length < 4) || (uniChar[1] != 0) ) return kXMP_EncodeUTF16Big;
  ------------------
  |  Branch (822:8): [True: 0, False: 0]
  |  Branch (822:24): [True: 0, False: 0]
  ------------------
  823|      0|		return kXMP_EncodeUTF32Big;
  824|       |		
  825|  2.20k|	} else if ( uniChar[0] < 0x80 ) {
  ------------------
  |  Branch (825:14): [True: 2.20k, False: 0]
  ------------------
  826|       |	
  827|       |		// These cases are:
  828|       |		//   nn mm -- -- - UTF-8, includes EF BB BF case
  829|       |		//   nn 00 00 00 - Little endian UTF-32
  830|       |		//   nn 00 -- -- - Little endian UTF-16
  831|       |
  832|  2.20k|		if ( uniChar[1] != 0 )  return kXMP_EncodeUTF8;
  ------------------
  |  Branch (832:8): [True: 2.20k, False: 0]
  ------------------
  833|      0|		if ( (length < 4) || (uniChar[2] != 0) ) return kXMP_EncodeUTF16Little;
  ------------------
  |  Branch (833:8): [True: 0, False: 0]
  |  Branch (833:24): [True: 0, False: 0]
  ------------------
  834|      0|		return kXMP_EncodeUTF32Little;
  835|       |
  836|      0|	} else {
  837|       |	
  838|       |		// These cases are:
  839|       |		//   EF BB BF -- - UTF-8
  840|       |		//   FE FF -- -- - Big endian UTF-16
  841|       |		//   FF FE 00 00 - Little endian UTF-32
  842|       |		//   FF FE -- -- - Little endian UTF-16
  843|       |
  844|      0|		if ( uniChar[0] == 0xEF ) return kXMP_EncodeUTF8;
  ------------------
  |  Branch (844:8): [True: 0, False: 0]
  ------------------
  845|      0|		if ( uniChar[0] == 0xFE ) return kXMP_EncodeUTF16Big;
  ------------------
  |  Branch (845:8): [True: 0, False: 0]
  ------------------
  846|      0|		if ( (length < 4) || (uniChar[2] != 0) ) return kXMP_EncodeUTF16Little;
  ------------------
  |  Branch (846:8): [True: 0, False: 0]
  |  Branch (846:24): [True: 0, False: 0]
  ------------------
  847|      0|		return kXMP_EncodeUTF32Little;
  848|       |
  849|      0|	}
  850|       |		
  851|  2.20k|}	// DetermineInputEncoding
XMPMeta-Parse.cpp:_ZL18ProcessUTF8PortionP16XMLParserAdapterPKhmb:
  976|  2.20k|{
  977|  2.20k|	const XMP_Uns8 * bufEnd = buffer + length;
  978|       |	
  979|  2.20k|	const XMP_Uns8 * spanEnd;
  980|       |
  981|       |	// `buffer` is copied into this std::string. If `buffer` only
  982|       |	// contains valid UTF-8 and no escape characters, then the copy
  983|       |	// will be identical to the original, but invalid characters are
  984|       |	// replaced - usually with a space character.  This std::string was
  985|       |	// added as a performance fix for:
  986|       |	// https://github.com/Exiv2/exiv2/security/advisories/GHSA-w8mv-g8qq-36mj
  987|       |	// Previously, the code was repeatedly calling
  988|       |	// `xmlParser->ParseBuffer()`, which turned out to have quadratic
  989|       |	// complexity, because expat kept reparsing the entire string from
  990|       |	// the beginning.
  991|  2.20k|	std::string copy;
  992|       |		
  993|  3.59M|	for ( spanEnd = buffer; spanEnd < bufEnd; ++spanEnd ) {
  ------------------
  |  Branch (993:26): [True: 3.58M, False: 2.20k]
  ------------------
  994|       |
  995|  3.58M|		if ( (0x20 <= *spanEnd) && (*spanEnd <= 0x7E) && (*spanEnd != '&') ) {
  ------------------
  |  Branch (995:8): [True: 3.54M, False: 41.9k]
  |  Branch (995:30): [True: 3.50M, False: 41.6k]
  |  Branch (995:52): [True: 3.47M, False: 32.9k]
  ------------------
  996|  3.47M|			copy.push_back(*spanEnd);
  997|  3.47M|			continue;	// A regular ASCII character.
  998|  3.47M|		}
  999|       |
 1000|   116k|		if ( *spanEnd >= 0x80 ) {
  ------------------
  |  Branch (1000:8): [True: 36.3k, False: 80.1k]
  ------------------
 1001|       |		
 1002|       |			// See if this is a multi-byte UTF-8 sequence, or a Latin-1 character to replace.
 1003|       |
 1004|  36.3k|			int uniLen = CountUTF8 ( spanEnd, bufEnd );
 1005|       |
 1006|  36.3k|			if ( uniLen > 0 ) {
  ------------------
  |  Branch (1006:9): [True: 36.3k, False: 0]
  ------------------
 1007|       |
 1008|       |				// A valid UTF-8 character, keep it as-is.
 1009|  36.3k|				copy.append((const char*)spanEnd, uniLen);
 1010|  36.3k|				spanEnd += uniLen - 1;	// ! The loop increment will put back the +1.
 1011|       |
 1012|  36.3k|			} else if ( (uniLen < 0) && (! last) ) {
  ------------------
  |  Branch (1012:16): [True: 0, False: 0]
  |  Branch (1012:32): [True: 0, False: 0]
  ------------------
 1013|       |
 1014|       |				// Have a partial UTF-8 character at the end of the buffer and more input coming.
 1015|      0|				xmlParser->ParseBuffer ( copy.c_str(), copy.size(), false );
 1016|      0|				return (spanEnd - buffer);
 1017|       |
 1018|      0|			} else {
 1019|       |
 1020|       |				// Not a valid UTF-8 sequence. Replace the first byte with the Latin-1 equivalent.
 1021|      0|				const char * replacement = kReplaceLatin1 [ *spanEnd - 0x80 ];
 1022|      0|				copy.append ( replacement );
 1023|       |
 1024|      0|			}
 1025|       |		
 1026|  80.1k|		} else if ( (*spanEnd < 0x20) || (*spanEnd == 0x7F) ) {
  ------------------
  |  Branch (1026:15): [True: 41.9k, False: 38.2k]
  |  Branch (1026:36): [True: 5.24k, False: 32.9k]
  ------------------
 1027|       |
 1028|       |			// Replace ASCII controls other than tab, LF, and CR with a space.
 1029|       |
 1030|  47.1k|			if ( (*spanEnd == kTab) || (*spanEnd == kLF) || (*spanEnd == kCR) ) {
  ------------------
  |  |  100|  47.1k|#define kTab ((char)0x09)
  ------------------
              			if ( (*spanEnd == kTab) || (*spanEnd == kLF) || (*spanEnd == kCR) ) {
  ------------------
  |  |  101|  44.1k|#define kLF ((char)0x0A)
  ------------------
              			if ( (*spanEnd == kTab) || (*spanEnd == kLF) || (*spanEnd == kCR) ) {
  ------------------
  |  |  102|  10.1k|#define kCR ((char)0x0D)
  ------------------
  |  Branch (1030:9): [True: 3.04k, False: 44.1k]
  |  Branch (1030:31): [True: 33.9k, False: 10.1k]
  |  Branch (1030:52): [True: 4.94k, False: 5.24k]
  ------------------
 1031|  41.9k|				copy.push_back(*spanEnd);
 1032|  41.9k|				continue;
 1033|  41.9k|			}
 1034|       |
 1035|  5.24k|			copy.push_back(' ');
 1036|       |		
 1037|  32.9k|		} else {
 1038|       |		
 1039|       |			// See if this is a numeric escape sequence for a prohibited ASCII control.
 1040|       |			
 1041|  32.9k|			XMP_Assert ( *spanEnd == '&' );
  ------------------
  |  |  142|  32.9k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1042|  32.9k|			int escLen = CountControlEscape ( spanEnd, bufEnd );
 1043|       |			
 1044|  32.9k|			if ( escLen < 0 ) {
  ------------------
  |  Branch (1044:9): [True: 6, False: 32.9k]
  ------------------
 1045|       |
 1046|       |				// Have a partial numeric escape in this buffer, wait for more input.
 1047|      6|				if ( last ) {
  ------------------
  |  Branch (1047:10): [True: 6, False: 0]
  ------------------
 1048|      6|					copy.push_back('&');
 1049|      6|					continue;	// No more buffers, not an escape, absorb as normal input.
 1050|      6|				}
 1051|      0|				xmlParser->ParseBuffer ( copy.c_str(), copy.size(), false );
 1052|      0|				return (spanEnd - buffer);
 1053|       |
 1054|  32.9k|			} else if ( escLen > 0 ) {
  ------------------
  |  Branch (1054:16): [True: 1.37k, False: 31.6k]
  ------------------
 1055|       |
 1056|       |				// Have a complete numeric escape to replace.
 1057|  1.37k|				copy.push_back(' ');
 1058|  1.37k|				spanEnd = spanEnd + escLen - 1;	// ! The loop continuation will increment spanEnd!
 1059|       |
 1060|  31.6k|			} else {
 1061|  31.6k|				copy.push_back('&');
 1062|  31.6k|			}
 1063|       |
 1064|  32.9k|		}
 1065|       |		
 1066|   116k|	}
 1067|       |	
 1068|  2.20k|	XMP_Assert ( spanEnd == bufEnd );
  ------------------
  |  |  142|  2.20k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1069|  2.20k|	copy.push_back(' ');
 1070|  2.20k|	xmlParser->ParseBuffer ( copy.c_str(), copy.size(), true );
 1071|  2.20k|	return length;
 1072|       |
 1073|  2.20k|}	// ProcessUTF8Portion
XMPMeta-Parse.cpp:_ZL9CountUTF8PKhS0_:
  867|  36.3k|{
  868|  36.3k|	XMP_Assert ( charStart < bufEnd );		// Catch this in debug builds.
  ------------------
  |  |  142|  36.3k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  869|  36.3k|	if ( charStart >= bufEnd ) return 0;	// Don't run-on in release builds.
  ------------------
  |  Branch (869:7): [True: 0, False: 36.3k]
  ------------------
  870|  36.3k|	if ( (*charStart & 0xC0) != 0xC0 ) return 0;	// Must have at least 2 high bits set.
  ------------------
  |  Branch (870:7): [True: 0, False: 36.3k]
  ------------------
  871|       |	
  872|  36.3k|	int byteCount = 2;
  873|  36.3k|	XMP_Uns8 firstByte = *charStart;
  874|  39.4k|	for ( firstByte = firstByte << 2; (firstByte & 0x80) != 0; firstByte = firstByte << 1 ) ++byteCount;
  ------------------
  |  Branch (874:36): [True: 3.04k, False: 36.3k]
  ------------------
  875|       |	
  876|  36.3k|	if ( (charStart + byteCount) > bufEnd ) return -byteCount;
  ------------------
  |  Branch (876:7): [True: 0, False: 36.3k]
  ------------------
  877|       |
  878|  75.7k|	for ( int i = 1; i < byteCount; ++i ) {
  ------------------
  |  Branch (878:19): [True: 39.4k, False: 36.3k]
  ------------------
  879|  39.4k|		if ( (charStart[i] & 0xC0) != 0x80 ) return 0;
  ------------------
  |  Branch (879:8): [True: 0, False: 39.4k]
  ------------------
  880|  39.4k|	}
  881|       |	
  882|  36.3k|	return byteCount;
  883|       |	
  884|  36.3k|}	// CountUTF8
XMPMeta-Parse.cpp:_ZL18CountControlEscapePKhS0_:
  897|  32.9k|{
  898|  32.9k|	XMP_Assert ( escStart < bufEnd );	// Catch this in debug builds.
  ------------------
  |  |  142|  32.9k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  899|  32.9k|	if ( escStart >= bufEnd ) return 0;	// Don't run-on in release builds.
  ------------------
  |  Branch (899:7): [True: 0, False: 32.9k]
  ------------------
  900|  32.9k|	XMP_Assert ( *escStart == '&' );
  ------------------
  |  |  142|  32.9k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  901|       |	
  902|  32.9k|	size_t tailLen = bufEnd - escStart;
  903|  32.9k|	if ( tailLen < 5 ) return -1;	// Don't need a more thorough check, we'll catch it on the next pass.
  ------------------
  |  Branch (903:7): [True: 6, False: 32.9k]
  ------------------
  904|       |	
  905|  32.9k|	if ( strncmp ( (char*)escStart, "&#x", 3 ) != 0 ) return 0;
  ------------------
  |  Branch (905:7): [True: 21.7k, False: 11.2k]
  ------------------
  906|       |	
  907|  11.2k|	XMP_Uns8 escValue = 0;
  908|  11.2k|	const XMP_Uns8 * escPos = escStart + 3;
  909|       |	
  910|  11.2k|	if ( ('0' <= *escPos) && (*escPos <= '9') ) {
  ------------------
  |  Branch (910:7): [True: 10.1k, False: 1.14k]
  |  Branch (910:27): [True: 839, False: 9.26k]
  ------------------
  911|    839|		escValue = *escPos - '0';
  912|    839|		++escPos;
  913|  10.4k|	} else if ( ('A' <= *escPos) && (*escPos <= 'F') ) {
  ------------------
  |  Branch (913:14): [True: 8.42k, False: 1.98k]
  |  Branch (913:34): [True: 4.79k, False: 3.63k]
  ------------------
  914|  4.79k|		escValue = *escPos - 'A' + 10;
  915|  4.79k|		++escPos;
  916|  5.61k|	} else if ( ('a' <= *escPos) && (*escPos <= 'f') ) {
  ------------------
  |  Branch (916:14): [True: 2.80k, False: 2.80k]
  |  Branch (916:34): [True: 2.52k, False: 278]
  ------------------
  917|  2.52k|		escValue = *escPos - 'a' + 10;
  918|  2.52k|		++escPos;
  919|  2.52k|	}
  920|       |	
  921|  11.2k|	if ( ('0' <= *escPos) && (*escPos <= '9') ) {
  ------------------
  |  Branch (921:7): [True: 9.18k, False: 2.05k]
  |  Branch (921:27): [True: 599, False: 8.58k]
  ------------------
  922|    599|		escValue = (escValue << 4) + (*escPos - '0');
  923|    599|		++escPos;
  924|  10.6k|	} else if ( ('A' <= *escPos) && (*escPos <= 'F') ) {
  ------------------
  |  Branch (924:14): [True: 6.58k, False: 4.06k]
  |  Branch (924:34): [True: 1.28k, False: 5.29k]
  ------------------
  925|  1.28k|		escValue = (escValue << 4) + (*escPos - 'A' + 10);
  926|  1.28k|		++escPos;
  927|  9.35k|	} else if ( ('a' <= *escPos) && (*escPos <= 'f') ) {
  ------------------
  |  Branch (927:14): [True: 4.17k, False: 5.18k]
  |  Branch (927:34): [True: 3.52k, False: 646]
  ------------------
  928|  3.52k|		escValue = (escValue << 4) + (*escPos - 'a' + 10);
  929|  3.52k|		++escPos;
  930|  3.52k|	}
  931|       |	
  932|  11.2k|	if ( escPos == bufEnd ) return -1;	// Partial escape.
  ------------------
  |  Branch (932:7): [True: 0, False: 11.2k]
  ------------------
  933|  11.2k|	if ( *escPos != ';' ) return 0;
  ------------------
  |  Branch (933:7): [True: 8.16k, False: 3.08k]
  ------------------
  934|       |	
  935|  3.08k|	size_t escLen = escPos - escStart + 1;
  936|  3.08k|	if ( escLen < 5 ) return 0;	// ! Catch "&#x;".
  ------------------
  |  Branch (936:7): [True: 539, False: 2.54k]
  ------------------
  937|       |	
  938|  2.54k|	if ( (escValue == kTab) || (escValue == kLF) || (escValue == kCR) ) return 0;	// An allowed escape.
  ------------------
  |  |  100|  2.54k|#define kTab ((char)0x09)
  ------------------
              	if ( (escValue == kTab) || (escValue == kLF) || (escValue == kCR) ) return 0;	// An allowed escape.
  ------------------
  |  |  101|  2.26k|#define kLF ((char)0x0A)
  ------------------
              	if ( (escValue == kTab) || (escValue == kLF) || (escValue == kCR) ) return 0;	// An allowed escape.
  ------------------
  |  |  102|  1.89k|#define kCR ((char)0x0D)
  ------------------
  |  Branch (938:7): [True: 280, False: 2.26k]
  |  Branch (938:29): [True: 374, False: 1.89k]
  |  Branch (938:50): [True: 515, False: 1.37k]
  ------------------
  939|       |	
  940|  1.37k|	return escLen;	// Found a full "prohibited" numeric escape.
  941|       |	
  942|  2.54k|}	// CountControlEscape
XMPMeta-Parse.cpp:_ZL12FindRootNodeP7XMPMetaRK16XMLParserAdapterj:
  151|  2.19k|{
  152|  2.19k|	const XML_Node * rootNode = xmlParser.rootNode;
  153|       |	
  154|  2.19k|	if ( xmlParser.rootCount > 1 ) rootNode = PickBestRoot ( xmlParser.tree, options );
  ------------------
  |  Branch (154:7): [True: 63, False: 2.13k]
  ------------------
  155|  2.19k|	if ( rootNode == 0 ) return 0;
  ------------------
  |  Branch (155:7): [True: 239, False: 1.95k]
  ------------------
  156|       |	
  157|       |	// We have a root node. Try to extract previous toolkit version number.
  158|       |	
  159|  1.95k|	XMP_StringPtr verStr = "";
  160|       |	
  161|  1.95k|		XMP_Assert ( rootNode->name == "rdf:RDF" );
  ------------------
  |  |  142|  1.95k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  162|       |	
  163|  1.95k|		if ( (options & kXMP_RequireXMPMeta) &&
  ------------------
  |  Branch (163:8): [True: 0, False: 1.95k]
  ------------------
  164|      0|		     ((rootNode->parent == 0) ||
  ------------------
  |  Branch (164:9): [True: 0, False: 0]
  ------------------
  165|      0|		      ((rootNode->parent->name != "x:xmpmeta") && (rootNode->parent->name != "x:xapmeta"))) ) return 0;
  ------------------
  |  Branch (165:10): [True: 0, False: 0]
  |  Branch (165:53): [True: 0, False: 0]
  ------------------
  166|       |
  167|  2.27k|		for ( size_t attrNum = 0, attrLim = rootNode->parent->attrs.size(); attrNum < attrLim; ++attrNum ) {
  ------------------
  |  Branch (167:71): [True: 490, False: 1.78k]
  ------------------
  168|    490|			const XML_Node * currAttr =rootNode->parent->attrs[attrNum];
  169|    490|			if ( (currAttr->name == "x:xmptk") || (currAttr->name == "x:xaptk") ) {
  ------------------
  |  Branch (169:9): [True: 160, False: 330]
  |  Branch (169:42): [True: 12, False: 318]
  ------------------
  170|    172|				verStr = currAttr->value.c_str();
  171|    172|				break;
  172|    172|			}
  173|    490|		}
  174|       |		
  175|       |	// Decode the version number into MMmmuubbb digits. If any part is too big, peg it at 99 or 999.
  176|       |	
  177|  1.95k|	unsigned long part;
  178|  3.34k|	while ( (*verStr != 0) && ((*verStr < '0') || (*verStr > '9')) ) ++verStr;
  ------------------
  |  Branch (178:10): [True: 1.51k, False: 1.82k]
  |  Branch (178:29): [True: 392, False: 1.12k]
  |  Branch (178:48): [True: 992, False: 130]
  ------------------
  179|       |	
  180|  1.95k|	part = 0;
  181|  2.40k|	while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) {
  ------------------
  |  Branch (181:10): [True: 575, False: 1.83k]
  |  Branch (181:28): [True: 481, False: 94]
  |  Branch (181:48): [True: 450, False: 31]
  ------------------
  182|    450|		part = (part * 10) + (*verStr - '0');
  183|    450|		++verStr;
  184|    450|	}
  185|  1.95k|	if ( part > 99 ) part = 99;
  ------------------
  |  Branch (185:7): [True: 27, False: 1.93k]
  ------------------
  186|  1.95k|	thiz->prevTkVer = part * 100*100*1000;
  187|       |	
  188|  1.95k|	part = 0;
  189|  1.95k|	if ( *verStr == '.' ) ++verStr;
  ------------------
  |  Branch (189:7): [True: 72, False: 1.88k]
  ------------------
  190|  2.09k|	while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) {
  ------------------
  |  Branch (190:10): [True: 260, False: 1.83k]
  |  Branch (190:28): [True: 169, False: 91]
  |  Branch (190:48): [True: 136, False: 33]
  ------------------
  191|    136|		part = (part * 10) + (*verStr - '0');
  192|    136|		++verStr;
  193|    136|	}
  194|  1.95k|	if ( part > 99 ) part = 99;
  ------------------
  |  Branch (194:7): [True: 12, False: 1.94k]
  ------------------
  195|  1.95k|	thiz->prevTkVer += part * 100*1000;
  196|       |	
  197|  1.95k|	part = 0;
  198|  1.95k|	if ( *verStr == '.' ) ++verStr;
  ------------------
  |  Branch (198:7): [True: 47, False: 1.91k]
  ------------------
  199|  2.11k|	while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) {
  ------------------
  |  Branch (199:10): [True: 279, False: 1.83k]
  |  Branch (199:28): [True: 195, False: 84]
  |  Branch (199:48): [True: 156, False: 39]
  ------------------
  200|    156|		part = (part * 10) + (*verStr - '0');
  201|    156|		++verStr;
  202|    156|	}
  203|  1.95k|	if ( part > 99 ) part = 99;
  ------------------
  |  Branch (203:7): [True: 6, False: 1.95k]
  ------------------
  204|  1.95k|	thiz->prevTkVer += part * 1000;
  205|       |	
  206|  1.95k|	part = 0;
  207|  1.95k|	if ( *verStr == '-' ) ++verStr;
  ------------------
  |  Branch (207:7): [True: 63, False: 1.89k]
  ------------------
  208|  2.30k|	while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) {
  ------------------
  |  Branch (208:10): [True: 436, False: 1.86k]
  |  Branch (208:28): [True: 413, False: 23]
  |  Branch (208:48): [True: 348, False: 65]
  ------------------
  209|    348|		part = (part * 10) + (*verStr - '0');
  210|    348|		++verStr;
  211|    348|	}
  212|  1.95k|	if ( part > 999 ) part = 999;
  ------------------
  |  Branch (212:7): [True: 7, False: 1.95k]
  ------------------
  213|  1.95k|	thiz->prevTkVer += part;
  214|       |	
  215|  1.95k|	return rootNode;
  216|       |	
  217|  1.95k|}	// FindRootNode
XMPMeta-Parse.cpp:_ZL12PickBestRootRK8XML_Nodej:
  111|  1.80k|{
  112|       |
  113|       |	// Look among this parent's content for x:xmpmeta. The recursion for x:xmpmeta is broader than
  114|       |	// the strictly defined choice, but gives us smaller code.
  115|  10.6k|	for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (115:66): [True: 8.94k, False: 1.70k]
  ------------------
  116|  8.94k|		const XML_Node * childNode = xmlParent.content[childNum];
  117|  8.94k|		if ( childNode->kind != kElemNode ) continue;
  ------------------
  |  Branch (117:8): [True: 8.18k, False: 762]
  ------------------
  118|    762|		if ( (childNode->name == "x:xmpmeta") || (childNode->name == "x:xapmeta") ) return PickBestRoot ( *childNode, 0 );
  ------------------
  |  Branch (118:8): [True: 100, False: 662]
  |  Branch (118:44): [True: 0, False: 662]
  ------------------
  119|    762|	}
  120|       |	// Look among this parent's content for a bare rdf:RDF if that is allowed.
  121|  1.70k|	if ( ! (options & kXMP_RequireXMPMeta) ) {
  ------------------
  |  Branch (121:7): [True: 1.70k, False: 0]
  ------------------
  122|  10.3k|		for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (122:67): [True: 8.70k, False: 1.65k]
  ------------------
  123|  8.70k|			const XML_Node * childNode = xmlParent.content[childNum];
  124|  8.70k|			if ( childNode->kind != kElemNode ) continue;
  ------------------
  |  Branch (124:9): [True: 8.05k, False: 655]
  ------------------
  125|    655|			if ( childNode->name == "rdf:RDF" ) return childNode;
  ------------------
  |  Branch (125:9): [True: 54, False: 601]
  ------------------
  126|    655|		}
  127|  1.70k|	}
  128|       |	
  129|       |	// Recurse into the content.
  130|  3.29k|	for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (130:66): [True: 1.64k, False: 1.65k]
  ------------------
  131|  1.64k|		const XML_Node * foundRoot = PickBestRoot ( *xmlParent.content[childNum], options );
  132|  1.64k|		if ( foundRoot != 0 ) return foundRoot;
  ------------------
  |  Branch (132:8): [True: 0, False: 1.64k]
  ------------------
  133|  1.64k|	}
  134|       |	
  135|  1.65k|	return 0;
  136|       |
  137|  1.65k|}	// PickBestRoot
XMPMeta-Parse.cpp:_ZL17NormalizeDCArraysP8XMP_Node:
  231|  1.32k|{
  232|  1.32k|	XMP_Node * dcSchema = FindSchemaNode ( xmpTree, kXMP_NS_DC, kXMP_ExistingOnly );
  ------------------
  |  |  296|  1.32k|#define kXMP_ExistingOnly	false
  ------------------
  233|  1.32k|	if ( dcSchema == 0 ) return;
  ------------------
  |  Branch (233:7): [True: 1.18k, False: 148]
  ------------------
  234|       |	
  235|    407|	for ( size_t propNum = 0, propLimit = dcSchema->children.size(); propNum < propLimit; ++propNum ) {
  ------------------
  |  Branch (235:67): [True: 259, False: 148]
  ------------------
  236|    259|		XMP_Node *     currProp  = dcSchema->children[propNum];
  237|    259|		XMP_OptionBits arrayForm = 0;
  238|       |		
  239|    259|		if ( ! XMP_PropIsSimple ( currProp->options ) ) continue;	// Nothing to do if not simple.
  ------------------
  |  Branch (239:8): [True: 59, False: 200]
  ------------------
  240|       |		
  241|    200|		if ( (currProp->name == "dc:creator" )     ||	// See if it is supposed to be an array.
  ------------------
  |  Branch (241:8): [True: 16, False: 184]
  ------------------
  242|    184|		     (currProp->name == "dc:date" ) ) {			// *** Think about an array of char* and a loop.
  ------------------
  |  Branch (242:8): [True: 0, False: 184]
  ------------------
  243|     16|			arrayForm = kXMP_PropArrayIsOrdered;
  244|    184|		} else if (
  245|    184|		     (currProp->name == "dc:description" ) ||
  ------------------
  |  Branch (245:8): [True: 5, False: 179]
  ------------------
  246|    179|		     (currProp->name == "dc:rights" )      ||
  ------------------
  |  Branch (246:8): [True: 0, False: 179]
  ------------------
  247|    179|		     (currProp->name == "dc:title" ) ) {
  ------------------
  |  Branch (247:8): [True: 0, False: 179]
  ------------------
  248|      5|			arrayForm = kXMP_PropArrayIsAltText;
  249|    179|		} else if (
  250|    179|		     (currProp->name == "dc:contributor" ) ||
  ------------------
  |  Branch (250:8): [True: 0, False: 179]
  ------------------
  251|    179|		     (currProp->name == "dc:language" )    ||
  ------------------
  |  Branch (251:8): [True: 3, False: 176]
  ------------------
  252|    176|		     (currProp->name == "dc:publisher" )   ||
  ------------------
  |  Branch (252:8): [True: 3, False: 173]
  ------------------
  253|    173|		     (currProp->name == "dc:relation" )    ||
  ------------------
  |  Branch (253:8): [True: 7, False: 166]
  ------------------
  254|    166|		     (currProp->name == "dc:subject" )     ||
  ------------------
  |  Branch (254:8): [True: 0, False: 166]
  ------------------
  255|    166|		     (currProp->name == "dc:type" ) ) {
  ------------------
  |  Branch (255:8): [True: 3, False: 163]
  ------------------
  256|     16|			arrayForm = kXMP_PropValueIsArray;
  257|     16|		}
  258|    200|		if ( arrayForm == 0 ) continue;	// Nothing to do if it isn't supposed to be an array.
  ------------------
  |  Branch (258:8): [True: 163, False: 37]
  ------------------
  259|       |		
  260|     37|		arrayForm = VerifySetOptions ( arrayForm, 0 );	// Set the implicit array bits.
  261|     37|		XMP_Node * newArray = new XMP_Node ( dcSchema, currProp->name.c_str(), arrayForm );
  262|     37|		dcSchema->children[propNum] = newArray;
  263|     37|		newArray->children.push_back ( currProp );
  264|     37|		currProp->parent = newArray;
  265|     37|		currProp->name = kXMP_ArrayItemName;
  ------------------
  |  |  293|     37|#define kXMP_ArrayItemName	"[]"
  ------------------
  266|       |		
  267|     37|		if ( XMP_ArrayIsAltText ( arrayForm ) && (! (currProp->options & kXMP_PropHasLang)) ) {
  ------------------
  |  Branch (267:8): [True: 5, False: 32]
  |  Branch (267:44): [True: 5, False: 0]
  ------------------
  268|      5|			XMP_Node * newLang = new XMP_Node ( currProp, "xml:lang", "x-default", kXMP_PropIsQualifier );
  269|      5|			currProp->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang);
  270|      5|			if ( currProp->qualifiers.empty() ) {	// *** Need a util?
  ------------------
  |  Branch (270:9): [True: 5, False: 0]
  ------------------
  271|      5|				currProp->qualifiers.push_back ( newLang );
  272|      5|			} else {
  273|      0|				currProp->qualifiers.insert ( currProp->qualifiers.begin(), newLang );
  274|      0|			}
  275|      5|		}
  276|       |
  277|     37|	}
  278|       |	
  279|    148|}	// NormalizeDCArrays
XMPMeta-Parse.cpp:_ZL16TouchUpDataModelP7XMPMeta:
  665|  1.32k|{
  666|  1.32k|	XMP_Node & tree = xmp->tree;
  667|       |	
  668|       |	// Do special case touch ups for certain schema.
  669|       |
  670|  1.32k|	XMP_Node * currSchema = 0;
  671|       |
  672|  1.32k|	currSchema = FindSchemaNode ( &tree, kXMP_NS_EXIF, kXMP_ExistingOnly );
  ------------------
  |  |  296|  1.32k|#define kXMP_ExistingOnly	false
  ------------------
  673|  1.32k|	if ( currSchema != 0 ) {
  ------------------
  |  Branch (673:7): [True: 15, False: 1.31k]
  ------------------
  674|       |
  675|       |		// Do a special case fix for exif:GPSTimeStamp.
  676|     15|		XMP_Node * gpsDateTime = FindChildNode ( currSchema, "exif:GPSTimeStamp", kXMP_ExistingOnly );
  ------------------
  |  |  296|     15|#define kXMP_ExistingOnly	false
  ------------------
  677|     15|		if ( gpsDateTime != 0 ) FixGPSTimeStamp ( currSchema, gpsDateTime );
  ------------------
  |  Branch (677:8): [True: 0, False: 15]
  ------------------
  678|       |	
  679|       |		// *** Should probably have RepairAltText change simple values to LangAlt with 'x-default' item.
  680|       |		// *** For now just do this for exif:UserComment, the one case we know about, late in cycle fix.
  681|     15|		XMP_Node * userComment = FindChildNode ( currSchema, "exif:UserComment", kXMP_ExistingOnly );
  ------------------
  |  |  296|     15|#define kXMP_ExistingOnly	false
  ------------------
  682|     15|		if ( (userComment != 0) && XMP_PropIsSimple ( userComment->options ) ) {
  ------------------
  |  Branch (682:8): [True: 0, False: 15]
  |  Branch (682:30): [True: 0, False: 0]
  ------------------
  683|      0|			XMP_Node * newChild = new XMP_Node ( userComment, kXMP_ArrayItemName,
  ------------------
  |  |  293|      0|#define kXMP_ArrayItemName	"[]"
  ------------------
  684|      0|												 userComment->value.c_str(), userComment->options );
  685|      0|			newChild->qualifiers.swap ( userComment->qualifiers );
  686|      0|			if ( ! XMP_PropHasLang ( newChild->options ) ) {
  ------------------
  |  Branch (686:9): [True: 0, False: 0]
  ------------------
  687|      0|				XMP_Node * langQual = new XMP_Node ( newChild, "xml:lang", "x-default", kXMP_PropIsQualifier );
  688|      0|				newChild->qualifiers.insert ( newChild->qualifiers.begin(), langQual );
  689|      0|				newChild->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang);
  690|      0|			}
  691|      0|			userComment->value.erase();
  692|      0|			userComment->options = kXMP_PropArrayFormMask;	// ! Happens to have all the right bits.
  693|      0|			userComment->children.push_back ( newChild );
  694|      0|		}
  695|       |
  696|     15|	}
  697|       |
  698|  1.32k|	currSchema = FindSchemaNode ( &tree, kXMP_NS_DM, kXMP_ExistingOnly );
  ------------------
  |  |  296|  1.32k|#define kXMP_ExistingOnly	false
  ------------------
  699|  1.32k|	if ( currSchema != 0 ) {
  ------------------
  |  Branch (699:7): [True: 0, False: 1.32k]
  ------------------
  700|       |		// Do a special case migration of xmpDM:copyright to dc:rights['x-default']. Do this before
  701|       |		// the dc: touch up since it can affect the dc: schema.
  702|      0|		XMP_Node * dmCopyright = FindChildNode ( currSchema, "xmpDM:copyright", kXMP_ExistingOnly );
  ------------------
  |  |  296|      0|#define kXMP_ExistingOnly	false
  ------------------
  703|      0|		if ( dmCopyright != 0 ) MigrateAudioCopyright ( xmp, dmCopyright );
  ------------------
  |  Branch (703:8): [True: 0, False: 0]
  ------------------
  704|      0|	}
  705|       |
  706|  1.32k|	currSchema = FindSchemaNode ( &tree, kXMP_NS_DC, kXMP_ExistingOnly );
  ------------------
  |  |  296|  1.32k|#define kXMP_ExistingOnly	false
  ------------------
  707|  1.32k|	if ( currSchema != 0 ) {
  ------------------
  |  Branch (707:7): [True: 148, False: 1.18k]
  ------------------
  708|       |		// Do a special case fix for dc:subject, make sure it is an unordered array.
  709|    148|		XMP_Node * dcSubject = FindChildNode ( currSchema, "dc:subject", kXMP_ExistingOnly );
  ------------------
  |  |  296|    148|#define kXMP_ExistingOnly	false
  ------------------
  710|    148|		if ( dcSubject != 0 ) {
  ------------------
  |  Branch (710:8): [True: 16, False: 132]
  ------------------
  711|     16|                        XMP_OptionBits keepMask = static_cast<XMP_OptionBits>(~(kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText));
  712|     16|			dcSubject->options &= keepMask;	// Make sure any ordered array bits are clear.
  713|     16|		}
  714|    148|	}
  715|       |	
  716|       |	// Fix any broken AltText arrays that we know about.
  717|       |	
  718|  1.32k|	RepairAltText ( tree, kXMP_NS_DC, "dc:description" );	// ! Note inclusion of prefixes for direct node lookup!
  719|  1.32k|	RepairAltText ( tree, kXMP_NS_DC, "dc:rights" );
  720|  1.32k|	RepairAltText ( tree, kXMP_NS_DC, "dc:title" );
  721|  1.32k|	RepairAltText ( tree, kXMP_NS_XMP_Rights, "xmpRights:UsageTerms" );
  722|  1.32k|	RepairAltText ( tree, kXMP_NS_EXIF, "exif:UserComment" );
  723|       |	
  724|       |	// Tweak old XMP: Move an instance ID from rdf:about to the xmpMM:InstanceID property. An old
  725|       |	// instance ID usually looks like "uuid:bac965c4-9d87-11d9-9a30-000d936b79c4", plus InDesign
  726|       |	// 3.0 wrote them like "bac965c4-9d87-11d9-9a30-000d936b79c4". If the name looks like a UUID
  727|       |	// simply move it to xmpMM:InstanceID, don't worry about any existing xmpMM:InstanceID. Both
  728|       |	// will only be present when a newer file with the xmpMM:InstanceID property is updated by an
  729|       |	// old app that uses rdf:about.
  730|       |	
  731|  1.32k|	if ( ! tree.name.empty() ) {
  ------------------
  |  Branch (731:7): [True: 217, False: 1.11k]
  ------------------
  732|       |
  733|    217|		bool nameIsUUID = false;
  734|    217|		XMP_StringPtr nameStr = tree.name.c_str();
  735|       |
  736|    217|		if ( XMP_LitNMatch ( nameStr, "uuid:", 5 ) ) {
  ------------------
  |  |   97|    217|#define XMP_LitNMatch(s,l,n)	(std::strncmp((s),(l),(n)) == 0)
  |  |  ------------------
  |  |  |  Branch (97:30): [True: 24, False: 193]
  |  |  ------------------
  ------------------
  737|       |
  738|     24|			nameIsUUID = true;
  739|       |
  740|    193|		} else if ( tree.name.size() == 36 ) {
  ------------------
  |  Branch (740:15): [True: 102, False: 91]
  ------------------
  741|       |
  742|    102|			nameIsUUID = true;	// ! Assume true, we'll set it to false below if not.
  743|  1.83k|			for ( int i = 0;  i < 36; ++i ) {
  ------------------
  |  Branch (743:22): [True: 1.81k, False: 27]
  ------------------
  744|  1.81k|				char ch = nameStr[i];
  745|  1.81k|				if ( ch == '-' ) {
  ------------------
  |  Branch (745:10): [True: 52, False: 1.76k]
  ------------------
  746|     52|					if ( (i == 8) || (i == 13) || (i == 18) || (i == 23) ) continue;
  ------------------
  |  Branch (746:11): [True: 14, False: 38]
  |  Branch (746:23): [True: 6, False: 32]
  |  Branch (746:36): [True: 6, False: 26]
  |  Branch (746:49): [True: 6, False: 20]
  ------------------
  747|     20|					nameIsUUID = false;
  748|     20|					break;
  749|  1.76k|				} else {
  750|  1.76k|					if ( (('0' <= ch) && (ch <= '9')) || (('a' <= ch) && (ch <= 'z')) ) continue;
  ------------------
  |  Branch (750:12): [True: 1.74k, False: 17]
  |  Branch (750:27): [True: 558, False: 1.18k]
  |  Branch (750:44): [True: 1.16k, False: 39]
  |  Branch (750:59): [True: 1.14k, False: 16]
  ------------------
  751|     55|					nameIsUUID = false;
  752|     55|					break;
  753|  1.76k|				}
  754|  1.81k|			}
  755|       |
  756|    102|		}
  757|       |		
  758|    217|		if ( nameIsUUID ) {
  ------------------
  |  Branch (758:8): [True: 51, False: 166]
  ------------------
  759|       |
  760|     51|			XMP_ExpandedXPath expPath;
  761|     51|			ExpandXPath ( kXMP_NS_XMP_MM, "InstanceID", &expPath );
  762|     51|			XMP_Node * idNode = FindNode ( &tree, expPath, kXMP_CreateNodes, 0 );
  ------------------
  |  |  295|     51|#define kXMP_CreateNodes	true
  ------------------
  763|     51|			if ( idNode == 0 ) XMP_Throw ( "Failure creating xmpMM:InstanceID", kXMPErr_InternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (763:9): [True: 0, False: 51]
  ------------------
  764|       |
  765|     51|			idNode->options = 0;	// Clobber any existing xmpMM:InstanceID.
  766|     51|			idNode->value = tree.name;
  767|     51|			idNode->RemoveChildren();
  768|     51|			idNode->RemoveQualifiers();
  769|       |
  770|     51|			tree.name.erase();
  771|       |
  772|     51|		}
  773|       |
  774|    217|	}
  775|       |
  776|  1.32k|}	// TouchUpDataModel
XMPMeta-Parse.cpp:_ZL13RepairAltTextR8XMP_NodePKcS2_:
  609|  6.64k|{
  610|  6.64k|	XMP_Node * schemaNode = FindSchemaNode ( &tree, schemaNS, kXMP_ExistingOnly );
  ------------------
  |  |  296|  6.64k|#define kXMP_ExistingOnly	false
  ------------------
  611|  6.64k|	if ( schemaNode == 0 ) return;
  ------------------
  |  Branch (611:7): [True: 6.16k, False: 471]
  ------------------
  612|       |	
  613|    471|	XMP_Node * arrayNode = FindChildNode ( schemaNode, arrayName, kXMP_ExistingOnly );
  ------------------
  |  |  296|    471|#define kXMP_ExistingOnly	false
  ------------------
  614|    471|	if ( (arrayNode == 0) || XMP_ArrayIsAltText ( arrayNode->options ) ) return;	// Already OK.
  ------------------
  |  Branch (614:7): [True: 413, False: 58]
  |  Branch (614:27): [True: 30, False: 28]
  ------------------
  615|       |	
  616|     28|	if ( ! XMP_PropIsArray ( arrayNode->options ) ) return;	// ! Not even an array, leave it alone.
  ------------------
  |  Branch (616:7): [True: 0, False: 28]
  ------------------
  617|       |	// *** Should probably change simple values to LangAlt with 'x-default' item.
  618|       |	
  619|     28|	arrayNode->options |= (kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText);
  620|       |	
  621|     63|	for ( int i = arrayNode->children.size()-1; i >= 0; --i ) {	// ! Need a signed index type.
  ------------------
  |  Branch (621:46): [True: 35, False: 28]
  ------------------
  622|       |
  623|     35|		XMP_Node * currChild = arrayNode->children[i];
  624|       |
  625|     35|		if ( ! XMP_PropIsSimple ( currChild->options ) ) {
  ------------------
  |  Branch (625:8): [True: 10, False: 25]
  ------------------
  626|       |
  627|       |			// Delete non-simple children.
  628|     10|			delete ( currChild );
  629|     10|			arrayNode->children.erase ( arrayNode->children.begin() + i );
  630|       |
  631|     25|		} else if ( ! XMP_PropHasLang ( currChild->options ) ) {
  ------------------
  |  Branch (631:15): [True: 18, False: 7]
  ------------------
  632|       |		
  633|     18|			if ( currChild->value.empty() ) {
  ------------------
  |  Branch (633:9): [True: 0, False: 18]
  ------------------
  634|       |
  635|       |				// Delete empty valued children that have no xml:lang.
  636|      0|				delete ( currChild );
  637|      0|				arrayNode->children.erase ( arrayNode->children.begin() + i );
  638|       |
  639|     18|			} else {
  640|       |
  641|       |				// Add an xml:lang qualifier with the value "x-repair".
  642|     18|				XMP_Node * repairLang = new XMP_Node ( currChild, "xml:lang", "x-repair", kXMP_PropIsQualifier );
  643|     18|				if ( currChild->qualifiers.empty() ) {
  ------------------
  |  Branch (643:10): [True: 18, False: 0]
  ------------------
  644|     18|					currChild->qualifiers.push_back ( repairLang );
  645|     18|				} else {
  646|      0|					currChild->qualifiers.insert ( currChild->qualifiers.begin(), repairLang );
  647|      0|				}
  648|     18|				currChild->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang);
  649|       |
  650|     18|			}
  651|       |
  652|     18|		}
  653|       |
  654|     35|	}
  655|       |
  656|     28|}	// RepairAltText

_ZNK7XMPMeta17SerializeToBufferEPPKcPjjjS1_S1_i:
 1170|    182|{
 1171|    182|	XMP_Assert ( (rdfString != 0) && (rdfSize != 0) && (newline != 0) && (indentStr != 0) );
  ------------------
  |  |  142|    182|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1172|       |
 1173|       |	// Fix up some default parameters.
 1174|       |	
 1175|    182|	enum { kDefaultPad = 2048 };
 1176|    182|	size_t unicodeUnitSize = 1;
 1177|    182|	XMP_OptionBits charEncoding = options & kXMP_EncodingMask;
 1178|       |
 1179|    182|	if ( charEncoding != kXMP_EncodeUTF8 ) {
  ------------------
  |  Branch (1179:7): [True: 0, False: 182]
  ------------------
 1180|      0|		if ( options & _XMP_UTF16_Bit ) {
  ------------------
  |  Branch (1180:8): [True: 0, False: 0]
  ------------------
 1181|      0|			if ( options & _XMP_UTF32_Bit ) XMP_Throw ( "Can't use both _XMP_UTF16_Bit and _XMP_UTF32_Bit", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1181:9): [True: 0, False: 0]
  ------------------
 1182|      0|			unicodeUnitSize = 2;
 1183|      0|		} else if ( options & _XMP_UTF32_Bit ) {
  ------------------
  |  Branch (1183:15): [True: 0, False: 0]
  ------------------
 1184|      0|			unicodeUnitSize = 4;
 1185|      0|		} else {
 1186|      0|			XMP_Throw ( "Can't use _XMP_LittleEndian_Bit by itself", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1187|      0|		}
 1188|      0|	}
 1189|       |	
 1190|    182|	if ( options & kXMP_OmitAllFormatting ) {
  ------------------
  |  Branch (1190:7): [True: 54, False: 128]
  ------------------
 1191|     54|		newline = " ";	// ! Yes, a space for "newline". This ensures token separation.
 1192|     54|		indentStr = "";
 1193|    128|	} else {
 1194|    128|		if ( *newline == 0 ) newline = "\xA";	// Linefeed
  ------------------
  |  Branch (1194:8): [True: 128, False: 0]
  ------------------
 1195|    128|		if ( *indentStr == 0 ) {
  ------------------
  |  Branch (1195:8): [True: 128, False: 0]
  ------------------
 1196|    128|			indentStr = " ";
 1197|    128|			if ( ! (options & kXMP_UseCompactFormat) ) indentStr  = "   ";
  ------------------
  |  Branch (1197:9): [True: 0, False: 128]
  ------------------
 1198|    128|		}
 1199|    128|	}
 1200|       |	
 1201|    182|	if ( options & kXMP_ExactPacketLength ) {
  ------------------
  |  Branch (1201:7): [True: 0, False: 182]
  ------------------
 1202|      0|		if ( options & (kXMP_OmitPacketWrapper | kXMP_IncludeThumbnailPad) ) {
  ------------------
  |  Branch (1202:8): [True: 0, False: 0]
  ------------------
 1203|      0|			XMP_Throw ( "Inconsistent options for exact size serialize", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1204|      0|		}
 1205|      0|		if ( (padding & (unicodeUnitSize-1)) != 0 ) {
  ------------------
  |  Branch (1205:8): [True: 0, False: 0]
  ------------------
 1206|      0|			XMP_Throw ( "Exact size must be a multiple of the Unicode element", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1207|      0|		}
 1208|    182|	} else if ( options & kXMP_ReadOnlyPacket ) {
  ------------------
  |  Branch (1208:14): [True: 0, False: 182]
  ------------------
 1209|      0|		if ( options & (kXMP_OmitPacketWrapper | kXMP_IncludeThumbnailPad) ) {
  ------------------
  |  Branch (1209:8): [True: 0, False: 0]
  ------------------
 1210|      0|			XMP_Throw ( "Inconsistent options for read-only packet", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1211|      0|		}
 1212|      0|		padding = 0;
 1213|    182|	} else if ( options & kXMP_OmitPacketWrapper ) {
  ------------------
  |  Branch (1213:14): [True: 0, False: 182]
  ------------------
 1214|      0|		if ( options & kXMP_IncludeThumbnailPad ) {
  ------------------
  |  Branch (1214:8): [True: 0, False: 0]
  ------------------
 1215|      0|			XMP_Throw ( "Inconsistent options for non-packet serialize", kXMPErr_BadOptions );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1216|      0|		}
 1217|      0|		padding = 0;
 1218|    182|	} else {
 1219|    182|		if ( padding == 0 ) padding = kDefaultPad * unicodeUnitSize;
  ------------------
  |  Branch (1219:8): [True: 182, False: 0]
  ------------------
 1220|    182|		if ( options & kXMP_IncludeThumbnailPad ) {
  ------------------
  |  Branch (1220:8): [True: 0, False: 182]
  ------------------
 1221|      0|			if ( ! this->DoesPropertyExist ( kXMP_NS_XMP, "Thumbnails" ) ) padding += (10000 * unicodeUnitSize);	// *** Need a better estimate.
  ------------------
  |  Branch (1221:9): [True: 0, False: 0]
  ------------------
 1222|      0|		}
 1223|    182|	}
 1224|       |
 1225|       |	// Serialize as UTF-8, then convert to UTF-16 or UTF-32 if necessary, and assemble with the padding and tail.
 1226|       |	
 1227|    182|	std::string tailStr;
 1228|       |
 1229|    182|	SerializeAsRDF ( *this, *sOutputStr, tailStr, options, newline, indentStr, baseIndent );
 1230|    182|	if ( charEncoding == kXMP_EncodeUTF8 ) {
  ------------------
  |  Branch (1230:7): [True: 182, False: 0]
  ------------------
 1231|       |
 1232|    182|		if ( options & kXMP_ExactPacketLength ) {
  ------------------
  |  Branch (1232:8): [True: 0, False: 182]
  ------------------
 1233|      0|			size_t minSize = sOutputStr->size() + tailStr.size();
 1234|      0|			if ( minSize > padding ) XMP_Throw ( "Can't fit into specified packet size", kXMPErr_BadSerialize );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1234:9): [True: 0, False: 0]
  ------------------
 1235|      0|			padding -= minSize;	// Now the actual amount of padding to add.
 1236|      0|		}
 1237|       |		
 1238|    182|		size_t newlineLen = strlen ( newline );
 1239|       |	
 1240|    182|		if ( padding < newlineLen ) {
  ------------------
  |  Branch (1240:8): [True: 0, False: 182]
  ------------------
 1241|      0|			sOutputStr->append ( padding, ' ' );
 1242|    182|		} else {
 1243|    182|			padding -= newlineLen;	// Write this newline last.
 1244|  3.82k|			while ( padding >= (100 + newlineLen) ) {
  ------------------
  |  Branch (1244:12): [True: 3.64k, False: 182]
  ------------------
 1245|  3.64k|				sOutputStr->append ( 100, ' ' );
 1246|  3.64k|				*sOutputStr += newline;
 1247|  3.64k|				padding -= (100 + newlineLen);
 1248|  3.64k|			}
 1249|    182|			sOutputStr->append ( padding, ' ' );
 1250|    182|			*sOutputStr += newline;
 1251|    182|		}
 1252|       |
 1253|    182|		*sOutputStr += tailStr;
 1254|       |	
 1255|    182|	} else {
 1256|       |	
 1257|       |		// Need to convert the encoding. Swap the UTF-8 into a local string and convert back. Assemble everything.
 1258|       |		
 1259|      0|		XMP_VarString utf8Str, newlineStr;
 1260|      0|		bool bigEndian = ((charEncoding & _XMP_LittleEndian_Bit) == 0);
 1261|       |		
 1262|      0|		if ( charEncoding & _XMP_UTF16_Bit ) {
  ------------------
  |  Branch (1262:8): [True: 0, False: 0]
  ------------------
 1263|       |
 1264|      0|			std::string padStr ( "  " );  padStr[0] = 0;	// Assume big endian.
 1265|       |			
 1266|      0|			utf8Str.swap ( *sOutputStr );
 1267|      0|			ToUTF16 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), sOutputStr, bigEndian );
 1268|      0|			utf8Str.swap ( tailStr );
 1269|      0|			ToUTF16 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &tailStr, bigEndian );
 1270|       |
 1271|      0|			if ( options & kXMP_ExactPacketLength ) {
  ------------------
  |  Branch (1271:9): [True: 0, False: 0]
  ------------------
 1272|      0|				size_t minSize = sOutputStr->size() + tailStr.size();
 1273|      0|				if ( minSize > padding ) XMP_Throw ( "Can't fit into specified packet size", kXMPErr_BadSerialize );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1273:10): [True: 0, False: 0]
  ------------------
 1274|      0|				padding -= minSize;	// Now the actual amount of padding to add (in bytes).
 1275|      0|			}
 1276|       |
 1277|      0|			utf8Str.assign ( newline );
 1278|      0|			ToUTF16 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &newlineStr, bigEndian );
 1279|      0|			size_t newlineLen = newlineStr.size();
 1280|       |	
 1281|      0|			if ( padding < newlineLen ) {
  ------------------
  |  Branch (1281:9): [True: 0, False: 0]
  ------------------
 1282|      0|				for ( int i = padding/2; i > 0; --i ) *sOutputStr += padStr;
  ------------------
  |  Branch (1282:30): [True: 0, False: 0]
  ------------------
 1283|      0|			} else {
 1284|      0|				padding -= newlineLen;	// Write this newline last.
 1285|      0|				while ( padding >= (200 + newlineLen) ) {
  ------------------
  |  Branch (1285:13): [True: 0, False: 0]
  ------------------
 1286|      0|					for ( int i = 100; i > 0; --i ) *sOutputStr += padStr;
  ------------------
  |  Branch (1286:25): [True: 0, False: 0]
  ------------------
 1287|      0|					*sOutputStr += newlineStr;
 1288|      0|					padding -= (200 + newlineLen);
 1289|      0|				}
 1290|      0|				for ( int i = padding/2; i > 0; --i ) *sOutputStr += padStr;
  ------------------
  |  Branch (1290:30): [True: 0, False: 0]
  ------------------
 1291|      0|				*sOutputStr += newlineStr;
 1292|      0|			}
 1293|       |
 1294|      0|			*sOutputStr += tailStr;
 1295|       |
 1296|      0|		} else {
 1297|       |
 1298|      0|			std::string padStr ( "    " );  padStr[0] = padStr[1] = padStr[2] = 0;	// Assume big endian.
 1299|       |//			UTF8_to_UTF32_Proc Converter = UTF8_to_UTF32BE;
 1300|       |
 1301|      0|			if ( charEncoding & _XMP_LittleEndian_Bit ) {
  ------------------
  |  Branch (1301:9): [True: 0, False: 0]
  ------------------
 1302|      0|				padStr[0] = ' '; padStr[1] = padStr[2] = padStr[3] = 0;
 1303|       |//				Converter = UTF8_to_UTF32LE;
 1304|      0|			}
 1305|       |			
 1306|      0|			utf8Str.swap ( *sOutputStr );
 1307|      0|			ToUTF32 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), sOutputStr, bigEndian );
 1308|      0|			utf8Str.swap ( tailStr );
 1309|      0|			ToUTF32 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &tailStr, bigEndian );
 1310|       |
 1311|      0|			if ( options & kXMP_ExactPacketLength ) {
  ------------------
  |  Branch (1311:9): [True: 0, False: 0]
  ------------------
 1312|      0|				size_t minSize = sOutputStr->size() + tailStr.size();
 1313|      0|				if ( minSize > padding ) XMP_Throw ( "Can't fit into specified packet size", kXMPErr_BadSerialize );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1313:10): [True: 0, False: 0]
  ------------------
 1314|      0|				padding -= minSize;	// Now the actual amount of padding to add (in bytes).
 1315|      0|			}
 1316|       |
 1317|      0|			utf8Str.assign ( newline );
 1318|      0|			ToUTF32 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &newlineStr, bigEndian );
 1319|      0|			size_t newlineLen = newlineStr.size();
 1320|       |	
 1321|      0|			if ( padding < newlineLen ) {
  ------------------
  |  Branch (1321:9): [True: 0, False: 0]
  ------------------
 1322|      0|				for ( int i = padding/4; i > 0; --i ) *sOutputStr += padStr;
  ------------------
  |  Branch (1322:30): [True: 0, False: 0]
  ------------------
 1323|      0|			} else {
 1324|      0|				padding -= newlineLen;	// Write this newline last.
 1325|      0|				while ( padding >= (400 + newlineLen) ) {
  ------------------
  |  Branch (1325:13): [True: 0, False: 0]
  ------------------
 1326|      0|					for ( int i = 100; i > 0; --i ) *sOutputStr += padStr;
  ------------------
  |  Branch (1326:25): [True: 0, False: 0]
  ------------------
 1327|      0|					*sOutputStr += newlineStr;
 1328|      0|					padding -= (400 + newlineLen);
 1329|      0|				}
 1330|      0|				for ( int i = padding/4; i > 0; --i ) *sOutputStr += padStr;
  ------------------
  |  Branch (1330:30): [True: 0, False: 0]
  ------------------
 1331|      0|				*sOutputStr += newlineStr;
 1332|      0|			}
 1333|       |
 1334|      0|			*sOutputStr += tailStr;
 1335|       |
 1336|      0|		}
 1337|       |	
 1338|      0|	}
 1339|       |
 1340|       |	// Return the finished string.
 1341|       |	
 1342|    182|	*rdfString = sOutputStr->c_str();
 1343|    182|	*rdfSize   = sOutputStr->size();
 1344|       |
 1345|    182|}	// SerializeToBuffer
XMPMeta-Serialize.cpp:_ZL14SerializeAsRDFRK7XMPMetaRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES9_jPKcSB_i:
 1063|    182|{
 1064|    182|	const size_t treeNameLen = xmpObj.tree.name.size();
 1065|    182|	const size_t indentLen   = strlen ( indentStr );
 1066|       |
 1067|       |	// First estimate the worst case space and reserve room in the output string. This optimization
 1068|       |	// avoids reallocating and copying the output as it grows. The initial count does not look at
 1069|       |	// the values of properties, so it does not account for character entities, e.g. &#xA; for newline.
 1070|       |	// Since there can be a lot of these in things like the base 64 encoding of a large thumbnail,
 1071|       |	// inflate the count by 1/4 (easy to do) to accommodate.
 1072|       |	
 1073|       |	// *** Need to include estimate for alias comments.
 1074|       |	
 1075|    182|	size_t outputLen = 2 * (strlen(kPacketHeader) + strlen(kRDF_XMPMetaStart) + strlen(kRDF_RDFStart) + 3*baseIndent*indentLen);
 1076|       |	
 1077|    787|	for ( size_t schemaNum = 0, schemaLim = xmpObj.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) {
  ------------------
  |  Branch (1077:71): [True: 605, False: 182]
  ------------------
 1078|    605|		const XMP_Node * currSchema = xmpObj.tree.children[schemaNum];
 1079|    605|		outputLen += 2*(baseIndent+2)*indentLen + strlen(kRDF_SchemaStart) + treeNameLen + strlen(kRDF_SchemaEnd) + 2;
 1080|    605|		outputLen += EstimateRDFSize ( currSchema, baseIndent+2, indentLen );
 1081|    605|	}
 1082|       |	
 1083|    182|	outputLen += (outputLen >> 2);	// Inflate by 1/4, an empirical fudge factor.
 1084|       |	
 1085|       |	// Now generate the RDF into the head string as UTF-8.
 1086|       |	
 1087|    182|	XMP_Index level;
 1088|       |	
 1089|    182|	headStr.erase();
 1090|    182|	headStr.reserve ( outputLen );
 1091|       |	
 1092|       |	// Write the packet header PI.
 1093|    182|	if ( ! (options & kXMP_OmitPacketWrapper) ) {
  ------------------
  |  Branch (1093:7): [True: 182, False: 0]
  ------------------
 1094|    182|		for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
  ------------------
  |  Branch (1094:29): [True: 0, False: 182]
  ------------------
 1095|    182|		headStr += kPacketHeader;
 1096|    182|		headStr += newline;
 1097|    182|	}
 1098|       |
 1099|       |	// Write the xmpmeta element's start tag.
 1100|    182|	if ( ! (options & kXMP_OmitXMPMetaElement) ) {
  ------------------
  |  Branch (1100:7): [True: 182, False: 0]
  ------------------
 1101|    182|		for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
  ------------------
  |  Branch (1101:29): [True: 0, False: 182]
  ------------------
 1102|    182|		headStr += kRDF_XMPMetaStart;
 1103|    182|		headStr += kXMPCore_VersionMessage "\">";
  ------------------
  |  |  134|    182|	#define kXMPCore_VersionMessage	kXMPCoreName " " XMP_API_VERSION_STRING
  |  |  ------------------
  |  |  |  |  133|    182|	#define kXMPCoreName "XMP Core"
  |  |  ------------------
  ------------------
 1104|    182|		headStr += newline;
 1105|    182|	}
 1106|       |
 1107|       |	// Write the rdf:RDF start tag.
 1108|    364|	for ( level = baseIndent+1; level > 0; --level ) headStr += indentStr;
  ------------------
  |  Branch (1108:30): [True: 182, False: 182]
  ------------------
 1109|    182|	headStr += kRDF_RDFStart;
 1110|    182|	headStr += newline;
 1111|       |	
 1112|       |	// Write all of the properties.
 1113|    182|	if ( options & kXMP_UseCompactFormat ) {
  ------------------
  |  Branch (1113:7): [True: 182, False: 0]
  ------------------
 1114|    182|		SerializeCompactRDFSchemas ( xmpObj.tree, headStr, newline, indentStr, baseIndent );
 1115|    182|	} else {
 1116|      0|		if ( xmpObj.tree.children.size() > 0 ) {
  ------------------
  |  Branch (1116:8): [True: 0, False: 0]
  ------------------
 1117|      0|			for ( size_t schemaNum = 0, schemaLim = xmpObj.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) {
  ------------------
  |  Branch (1117:73): [True: 0, False: 0]
  ------------------
 1118|      0|				const XMP_Node * currSchema = xmpObj.tree.children[schemaNum];
 1119|      0|				SerializePrettyRDFSchema ( xmpObj.tree.name, currSchema, headStr, options, newline, indentStr, baseIndent );
 1120|      0|			}
 1121|      0|		} else {
 1122|      0|			for ( XMP_Index level = baseIndent+2; level > 0; --level ) headStr += indentStr;
  ------------------
  |  Branch (1122:42): [True: 0, False: 0]
  ------------------
 1123|      0|			headStr += kRDF_SchemaStart;	// Special case an empty XMP object.
 1124|      0|			headStr += '"';
 1125|      0|			headStr += xmpObj.tree.name;
 1126|      0|			headStr += "\"/>";
 1127|      0|			headStr += newline;
 1128|      0|		}
 1129|      0|	}
 1130|       |
 1131|       |	// Write the rdf:RDF end tag.
 1132|    364|	for ( level = baseIndent+1; level > 0; --level ) headStr += indentStr;
  ------------------
  |  Branch (1132:30): [True: 182, False: 182]
  ------------------
 1133|    182|	headStr += kRDF_RDFEnd;
 1134|    182|	headStr += newline;
 1135|       |
 1136|       |	// Write the xmpmeta end tag.
 1137|    182|	if ( ! (options & kXMP_OmitXMPMetaElement) ) {
  ------------------
  |  Branch (1137:7): [True: 182, False: 0]
  ------------------
 1138|    182|		for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
  ------------------
  |  Branch (1138:29): [True: 0, False: 182]
  ------------------
 1139|    182|		headStr += kRDF_XMPMetaEnd;
 1140|    182|		headStr += newline;
 1141|    182|	}
 1142|       |	
 1143|       |	// Write the packet trailer PI into the tail string as UTF-8.
 1144|    182|	tailStr.erase();
 1145|    182|	if ( ! (options & kXMP_OmitPacketWrapper) ) {
  ------------------
  |  Branch (1145:7): [True: 182, False: 0]
  ------------------
 1146|    182|		tailStr.reserve ( strlen(kPacketTrailer) + (strlen(indentStr) * baseIndent) );
 1147|    182|		for ( level = baseIndent; level > 0; --level ) tailStr += indentStr;
  ------------------
  |  Branch (1147:29): [True: 0, False: 182]
  ------------------
 1148|    182|		tailStr += kPacketTrailer;
 1149|    182|		if ( options & kXMP_ReadOnlyPacket ) tailStr[tailStr.size()-4] = 'r';
  ------------------
  |  Branch (1149:8): [True: 0, False: 182]
  ------------------
 1150|    182|	}
 1151|       |	
 1152|       |	// ! This assert is just a performance check, to see if the reserve was enough.
 1153|       |	// *** XMP_Assert ( headStr.size() <= outputLen );
 1154|       |	// *** Don't use an assert. Think of some way to track this without risk of aborting the client.
 1155|       |	
 1156|    182|}	// SerializeAsRDF
XMPMeta-Serialize.cpp:_ZL15EstimateRDFSizePK8XMP_Nodeim:
   83|  5.07k|{
   84|  5.07k|	size_t outputLen = 2 * (indent*indentLen + currNode->name.size() + 4);	// The property element tags.
   85|       |	
   86|  5.07k|	if ( ! currNode->qualifiers.empty() ) {
  ------------------
  |  Branch (86:7): [True: 134, False: 4.93k]
  ------------------
   87|       |		// This node has qualifiers, assume it is written using rdf:value and estimate the qualifiers.
   88|       |
   89|    134|		indent += 2;	// Everything else is indented inside the rdf:Description element.
   90|    134|		outputLen += 2 * ((indent-1)*indentLen + strlen(kRDF_StructStart) + 2);	// The rdf:Description tags.
   91|    134|		outputLen += 2 * (indent*indentLen + strlen(kRDF_ValueStart) + 2);		// The rdf:value tags.
   92|       |
   93|    311|		for ( size_t qualNum = 0, qualLim = currNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) {
  ------------------
  |  Branch (93:68): [True: 177, False: 134]
  ------------------
   94|    177|			const XMP_Node * currQual = currNode->qualifiers[qualNum];
   95|    177|			outputLen += EstimateRDFSize ( currQual, indent, indentLen );
   96|    177|		}
   97|       |
   98|    134|	}
   99|       |	
  100|  5.07k|	if ( currNode->options & kXMP_PropValueIsStruct ) {
  ------------------
  |  Branch (100:7): [True: 144, False: 4.92k]
  ------------------
  101|    144|		indent += 1;
  102|    144|		outputLen += 2 * (indent*indentLen + strlen(kRDF_StructStart) + 2);	// The rdf:Description tags.
  103|  4.92k|	} else if ( currNode->options & kXMP_PropValueIsArray ) {
  ------------------
  |  Branch (103:14): [True: 442, False: 4.48k]
  ------------------
  104|    442|		indent += 2;
  105|    442|		outputLen += 2 * ((indent-1)*indentLen + strlen(kRDF_BagStart) + 2);		// The rdf:Bag/Seq/Alt tags.
  106|    442|		outputLen += 2 * currNode->children.size() * (strlen(kRDF_ItemStart) + 2);	// The rdf:li tags, indent counted in children.
  107|  4.48k|	} else if ( ! (currNode->options & kXMP_SchemaNode) ) {
  ------------------
  |  Branch (107:14): [True: 3.88k, False: 605]
  ------------------
  108|  3.88k|		outputLen += currNode->value.size();	// This is a leaf value node.
  109|  3.88k|	}
  110|       |
  111|  9.36k|	for ( size_t childNum = 0, childLim = currNode->children.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (111:67): [True: 4.28k, False: 5.07k]
  ------------------
  112|  4.28k|		const XMP_Node * currChild = currNode->children[childNum];
  113|  4.28k|		outputLen += EstimateRDFSize ( currChild, indent+1, indentLen );
  114|  4.28k|	}
  115|       |
  116|  5.07k|	return outputLen;
  117|       |	
  118|  5.07k|}	// EstimateRDFSize
XMPMeta-Serialize.cpp:_ZL26SerializeCompactRDFSchemasRK8XMP_NodeRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKcSB_i:
  978|    182|{
  979|    182|	XMP_Index level;
  980|    182|	size_t schema, schemaLim;
  981|       |	
  982|       |	// Begin the rdf:Description start tag.
  983|    546|	for ( level = baseIndent+2; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (983:30): [True: 364, False: 182]
  ------------------
  984|    182|	outputStr += kRDF_SchemaStart;
  985|    182|	outputStr += '"';
  986|    182|	outputStr += xmpTree.name;
  987|    182|	outputStr += '"';
  988|       |	
  989|       |	// Write all necessary xmlns attributes.
  990|       |	
  991|    182|	size_t totalLen = 8;	// Start at 8 for "xml:rdf:".
  992|    182|	XMP_cStringMapPos currPos = sNamespacePrefixToURIMap->begin();
  993|    182|	XMP_cStringMapPos endPos  = sNamespacePrefixToURIMap->end();
  994|  36.2k|	for ( ; currPos != endPos; ++currPos ) totalLen += currPos->first.size();
  ------------------
  |  Branch (994:10): [True: 36.0k, False: 182]
  ------------------
  995|       |
  996|    182|	XMP_VarString usedNS;
  997|    182|	usedNS.reserve ( totalLen );
  998|    182|	usedNS = "xml:rdf:";
  999|       |
 1000|    787|	for ( schema = 0, schemaLim = xmpTree.children.size(); schema != schemaLim; ++schema ) {
  ------------------
  |  Branch (1000:57): [True: 605, False: 182]
  ------------------
 1001|    605|		const XMP_Node * currSchema = xmpTree.children[schema];
 1002|    605|		DeclareUsedNamespaces ( currSchema, usedNS, outputStr, newline, indentStr, baseIndent+4 );
 1003|    605|	}
 1004|       |	
 1005|       |	// Write the top level "attrProps" and close the rdf:Description start tag.
 1006|    182|	bool allAreAttrs = true;
 1007|    787|	for ( schema = 0, schemaLim = xmpTree.children.size(); schema != schemaLim; ++schema ) {
  ------------------
  |  Branch (1007:57): [True: 605, False: 182]
  ------------------
 1008|    605|		const XMP_Node * currSchema = xmpTree.children[schema];
 1009|    605|		allAreAttrs &= SerializeCompactRDFAttrProps ( currSchema, outputStr, newline, indentStr, baseIndent+3 );
 1010|    605|	}
 1011|    182|	if ( ! allAreAttrs ) {
  ------------------
  |  Branch (1011:7): [True: 101, False: 81]
  ------------------
 1012|    101|		outputStr += ">";
 1013|    101|		outputStr += newline;
 1014|    101|	} else {
 1015|     81|		outputStr += "/>";
 1016|     81|		outputStr += newline;
 1017|     81|		return;	// ! Done if all properties in all schema are written as attributes.
 1018|     81|	}
 1019|       |
 1020|       |	// Write the remaining properties for each schema.
 1021|    548|	for ( schema = 0, schemaLim = xmpTree.children.size(); schema != schemaLim; ++schema ) {
  ------------------
  |  Branch (1021:57): [True: 447, False: 101]
  ------------------
 1022|    447|		const XMP_Node * currSchema = xmpTree.children[schema];
 1023|    447|		SerializeCompactRDFElemProps ( currSchema, outputStr, newline, indentStr, baseIndent+3 );
 1024|    447|	}
 1025|       |	
 1026|       |	// Write the rdf:Description end tag.
 1027|       |	// *** Elide the end tag if everything (all props in all schema) is an attr.
 1028|    303|	for ( level = baseIndent+2; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (1028:30): [True: 202, False: 101]
  ------------------
 1029|    101|	outputStr += kRDF_SchemaEnd;
 1030|    101|	outputStr += newline;
 1031|       |
 1032|    101|}	// SerializeCompactRDFSchemas
XMPMeta-Serialize.cpp:_ZL21DeclareUsedNamespacesPK8XMP_NodeRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES9_PKcSB_i:
  196|  5.07k|{
  197|       |
  198|  5.07k|	if ( currNode->options & kXMP_SchemaNode ) {
  ------------------
  |  Branch (198:7): [True: 605, False: 4.46k]
  ------------------
  199|       |		// The schema node name is the URI, the value is the prefix.
  200|    605|		DeclareOneNamespace ( currNode->value, currNode->name, usedNS, outputStr, newline, indentStr, indent );
  201|  4.46k|	} else if ( currNode->options & kXMP_PropValueIsStruct ) {
  ------------------
  |  Branch (201:14): [True: 144, False: 4.32k]
  ------------------
  202|    557|		for ( size_t fieldNum = 0, fieldLim = currNode->children.size(); fieldNum < fieldLim; ++fieldNum ) {
  ------------------
  |  Branch (202:68): [True: 413, False: 144]
  ------------------
  203|    413|			const XMP_Node * currField = currNode->children[fieldNum];
  204|    413|			DeclareElemNamespace ( currField->name, usedNS, outputStr, newline, indentStr, indent );
  205|    413|		}
  206|    144|	}
  207|       |
  208|  9.36k|	for ( size_t childNum = 0, childLim = currNode->children.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (208:67): [True: 4.28k, False: 5.07k]
  ------------------
  209|  4.28k|		const XMP_Node * currChild = currNode->children[childNum];
  210|  4.28k|		DeclareUsedNamespaces ( currChild, usedNS, outputStr, newline, indentStr, indent );
  211|  4.28k|	}
  212|       |
  213|  5.24k|	for ( size_t qualNum = 0, qualLim = currNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) {
  ------------------
  |  Branch (213:67): [True: 177, False: 5.07k]
  ------------------
  214|    177|		const XMP_Node * currQual = currNode->qualifiers[qualNum];
  215|    177|		DeclareElemNamespace ( currQual->name, usedNS, outputStr, newline, indentStr, indent );
  216|    177|		DeclareUsedNamespaces ( currQual, usedNS, outputStr, newline, indentStr, indent );
  217|    177|	}
  218|       |	
  219|  5.07k|}	// DeclareUsedNamespaces
XMPMeta-Serialize.cpp:_ZL19DeclareOneNamespaceRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_RS5_S8_PKcSA_i:
  133|  1.19k|{
  134|  1.19k|	XMP_VarString boundedPrefix = ":";
  135|  1.19k|	boundedPrefix += nsPrefix;
  136|  1.19k|	size_t nsPos = usedNS.find ( boundedPrefix );
  137|       |
  138|  1.19k|	if ( nsPos == XMP_VarString::npos ) {
  ------------------
  |  Branch (138:7): [True: 636, False: 559]
  ------------------
  139|       |		
  140|    636|		outputStr += newline;
  141|  3.18k|		for ( ; indent > 0; --indent ) outputStr += indentStr;
  ------------------
  |  Branch (141:11): [True: 2.54k, False: 636]
  ------------------
  142|    636|		outputStr += "xmlns:";
  143|    636|		outputStr += nsPrefix;
  144|    636|		if (outputStr[outputStr.size ( ) - 1] == ':')
  ------------------
  |  Branch (144:7): [True: 636, False: 0]
  ------------------
  145|    636|			outputStr[outputStr.size ( ) - 1] = '=';	// Change the colon to =.
  146|      0|		else
  147|      0|			outputStr += '=';
  148|    636|		outputStr += '"';
  149|    636|		outputStr += nsURI;
  150|    636|		outputStr += '"';
  151|       |
  152|    636|		usedNS += nsPrefix;
  153|       |
  154|    636|	}
  155|       |
  156|  1.19k|}	// DeclareOneNamespace
XMPMeta-Serialize.cpp:_ZL20DeclareElemNamespaceRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERS5_S8_PKcSA_i:
  170|    590|{
  171|    590|	size_t colonPos = elemName.find ( ':' );
  172|       |
  173|    590|	if ( colonPos != XMP_VarString::npos ) {
  ------------------
  |  Branch (173:7): [True: 590, False: 0]
  ------------------
  174|    590|		XMP_VarString nsPrefix ( elemName.substr ( 0, colonPos+1 ) );
  175|    590|		XMP_StringMapPos prefixPos = sNamespacePrefixToURIMap->find ( nsPrefix );
  176|    590|		XMP_Enforce ( prefixPos != sNamespacePrefixToURIMap->end() );
  ------------------
  |  |  148|    590|		if ( ! (c) ) {																				\
  |  |  ------------------
  |  |  |  Branch (148:8): [True: 0, False: 590]
  |  |  ------------------
  |  |  149|      0|			const char * assert_msg = _NotifyMsg ( XMP_Enforce, (c), __FILE__, __LINE__ );			\
  |  |  ------------------
  |  |  |  |  139|      0|#define _NotifyMsg(n,c,f,l)	#n " failed: " #c " in " f " at line " _MakeStr(l)
  |  |  |  |  ------------------
  |  |  |  |  |  |  138|      0|#define _MakeStr(p)			#p
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|      0|			XMP_Throw ( assert_msg , kXMPErr_EnforceFailure );										\
  |  |  ------------------
  |  |  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  |  |  ------------------
  |  |  151|      0|		}
  ------------------
  177|    590|		DeclareOneNamespace ( nsPrefix, prefixPos->second, usedNS, outputStr, newline, indentStr, indent );
  178|    590|	}
  179|       |
  180|    590|}	// DeclareElemNamespace
XMPMeta-Serialize.cpp:_ZL28SerializeCompactRDFAttrPropsPK8XMP_NodeRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKcSB_i:
  687|    749|{
  688|    749|	size_t prop, propLim;
  689|    749|	bool allAreAttrs = true;
  690|       |
  691|  4.11k|	for ( prop = 0, propLim = parentNode->children.size(); prop != propLim; ++prop ) {
  ------------------
  |  Branch (691:57): [True: 3.36k, False: 749]
  ------------------
  692|       |
  693|  3.36k|		const XMP_Node * currProp = parentNode->children[prop];
  694|  3.36k|		if ( ! CanBeRDFAttrProp ( currProp ) ) {
  ------------------
  |  Branch (694:8): [True: 523, False: 2.84k]
  ------------------
  695|    523|			allAreAttrs = false;
  696|    523|			continue;
  697|    523|		}
  698|       |		
  699|  2.84k|		outputStr += newline;
  700|  12.4k|		for ( XMP_Index level = indent; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (700:35): [True: 9.57k, False: 2.84k]
  ------------------
  701|  2.84k|		outputStr += currProp->name;
  702|  2.84k|		outputStr += "=\"";
  703|  2.84k|		AppendNodeValue ( outputStr, currProp->value, kForAttribute );
  704|  2.84k|		outputStr += '"';
  705|       |
  706|  2.84k|	}
  707|       |	
  708|    749|	return allAreAttrs;
  709|       |
  710|    749|}	// SerializeCompactRDFAttrProps
XMPMeta-Serialize.cpp:_ZL16CanBeRDFAttrPropPK8XMP_Node:
  346|  7.45k|{
  347|       |	
  348|  7.45k|	if ( propNode->name[0] == '[' ) return false;
  ------------------
  |  Branch (348:7): [True: 925, False: 6.53k]
  ------------------
  349|  6.53k|	if ( ! propNode->qualifiers.empty() ) return false;
  ------------------
  |  Branch (349:7): [True: 70, False: 6.46k]
  ------------------
  350|  6.46k|	if ( propNode->options & kXMP_PropValueIsURI ) return false;
  ------------------
  |  Branch (350:7): [True: 0, False: 6.46k]
  ------------------
  351|  6.46k|	if ( propNode->options & kXMP_PropCompositeMask ) return false;
  ------------------
  |  Branch (351:7): [True: 976, False: 5.48k]
  ------------------
  352|       |	
  353|  5.48k|	return true;
  354|       |	
  355|  6.46k|}	// CanBeRDFAttrProp
XMPMeta-Serialize.cpp:_ZL15AppendNodeValueRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKS5_b:
  286|  3.87k|{
  287|       |
  288|  3.87k|	unsigned char * runStart = (unsigned char *) value.c_str();
  289|  3.87k|	unsigned char * runLimit  = runStart + value.size();
  290|  3.87k|	unsigned char * runEnd;
  291|  3.87k|	unsigned char   ch=0;
  292|       |	
  293|  9.95k|	while ( runStart < runLimit ) {
  ------------------
  |  Branch (293:10): [True: 6.08k, False: 3.87k]
  ------------------
  294|       |	
  295|   138k|		for ( runEnd = runStart; runEnd < runLimit; ++runEnd ) {
  ------------------
  |  Branch (295:28): [True: 135k, False: 3.73k]
  ------------------
  296|   135k|			ch = *runEnd;
  297|   135k|			if ( forAttribute && (ch == '"') ) break;
  ------------------
  |  Branch (297:9): [True: 58.0k, False: 77.1k]
  |  Branch (297:25): [True: 70, False: 57.9k]
  ------------------
  298|   135k|			if ( (ch < 0x20) || (ch == '&') || (ch == '<') || (ch == '>') ) break;
  ------------------
  |  Branch (298:9): [True: 1.06k, False: 134k]
  |  Branch (298:24): [True: 0, False: 134k]
  |  Branch (298:39): [True: 0, False: 134k]
  |  Branch (298:54): [True: 1.20k, False: 132k]
  ------------------
  299|   135k|		}
  300|       |		
  301|  6.08k|		outputStr.append ( (char *) runStart, (runEnd - runStart) );
  302|       |		
  303|  6.08k|		if ( runEnd < runLimit ) {
  ------------------
  |  Branch (303:8): [True: 2.34k, False: 3.73k]
  ------------------
  304|       |
  305|  2.34k|			if ( ch < 0x20 ) {
  ------------------
  |  Branch (305:9): [True: 1.06k, False: 1.27k]
  ------------------
  306|       |			
  307|  1.06k|				XMP_Assert ( (ch == kTab) || (ch == kLF) || (ch == kCR) );
  ------------------
  |  |  142|  1.06k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  308|       |
  309|  1.06k|				char hexBuf[16];
  310|  1.06k|				memcpy ( hexBuf, "&#xn;", 5 );
  311|  1.06k|				hexBuf[3] = kHexDigits[ch&0xF];
  ------------------
  |  |   94|  1.06k|#define kHexDigits "0123456789ABCDEF"
  ------------------
  312|  1.06k|				outputStr.append ( hexBuf, 5 );
  313|       |
  314|  1.27k|			} else {
  315|       |
  316|  1.27k|				if ( ch == '"' ) {
  ------------------
  |  Branch (316:10): [True: 70, False: 1.20k]
  ------------------
  317|     70|					outputStr += "&quot;";
  318|  1.20k|				} else if ( ch == '<' ) {
  ------------------
  |  Branch (318:17): [True: 0, False: 1.20k]
  ------------------
  319|      0|					outputStr += "&lt;";
  320|  1.20k|				} else if ( ch == '>' ) {
  ------------------
  |  Branch (320:17): [True: 1.20k, False: 0]
  ------------------
  321|  1.20k|					outputStr += "&gt;";
  322|  1.20k|				} else {
  323|      0|					XMP_Assert ( ch == '&' );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
  324|      0|					outputStr += "&amp;";
  325|      0|				}
  326|       |
  327|  1.27k|			}
  328|       |
  329|  2.34k|			++runEnd;
  330|       |
  331|  2.34k|		}
  332|       |		
  333|  6.08k|		runStart = runEnd;
  334|       |	
  335|  6.08k|	}
  336|       |
  337|  3.87k|}	// AppendNodeValue
XMPMeta-Serialize.cpp:_ZL28SerializeCompactRDFElemPropsPK8XMP_NodeRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKcSB_i:
  758|    889|{
  759|    889|	XMP_Index level;
  760|       |
  761|  4.56k|	for ( size_t prop = 0, propLim = parentNode->children.size(); prop != propLim; ++prop ) {
  ------------------
  |  Branch (761:64): [True: 3.67k, False: 889]
  ------------------
  762|       |
  763|  3.67k|		const XMP_Node * propNode = parentNode->children[prop];
  764|  3.67k|		if ( CanBeRDFAttrProp ( propNode ) ) continue;
  ------------------
  |  Branch (764:8): [True: 2.23k, False: 1.44k]
  ------------------
  765|       |
  766|  1.44k|		bool emitEndTag = true;
  767|  1.44k|		bool indentEndTag = true;
  768|       |
  769|  1.44k|		XMP_OptionBits propForm = propNode->options & kXMP_PropCompositeMask;
  770|       |
  771|       |		// -----------------------------------------------------------------------------------
  772|       |		// Determine the XML element name, write the name part of the start tag. Look over the
  773|       |		// qualifiers to decide on "normal" versus "rdf:value" form. Emit the attribute
  774|       |		// qualifiers at the same time.
  775|       |		
  776|  1.44k|		XMP_StringPtr elemName = propNode->name.c_str();
  777|  1.44k|		if ( *elemName == '[' ) elemName = "rdf:li";
  ------------------
  |  Branch (777:8): [True: 925, False: 523]
  ------------------
  778|       |
  779|  7.64k|		for ( level = indent; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (779:25): [True: 6.19k, False: 1.44k]
  ------------------
  780|  1.44k|		outputStr += '<';
  781|  1.44k|		outputStr += elemName;
  782|       |
  783|  1.44k|		#define isCompact	false
  784|  1.44k|		bool hasGeneralQualifiers = isCompact;	// Might also become true later.
  ------------------
  |  |  783|  1.44k|		#define isCompact	false
  ------------------
  785|  1.44k|		bool hasRDFResourceQual   = false;
  786|       |
  787|  1.62k|		for ( size_t qualNum = 0, qualLim = propNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) {
  ------------------
  |  Branch (787:68): [True: 177, False: 1.44k]
  ------------------
  788|    177|			const XMP_Node * currQual = propNode->qualifiers[qualNum];
  789|    177|			if ( ! IsRDFAttrQualifier ( currQual->name ) ) {
  ------------------
  |  Branch (789:9): [True: 61, False: 116]
  ------------------
  790|     61|				hasGeneralQualifiers = true;
  791|    116|			} else {
  792|    116|				if ( currQual->name == "rdf:resource" ) hasRDFResourceQual = true;
  ------------------
  |  Branch (792:10): [True: 0, False: 116]
  ------------------
  793|    116|				outputStr += ' ';
  794|    116|				outputStr += currQual->name;
  795|    116|				outputStr += "=\"";
  796|    116|				AppendNodeValue ( outputStr, currQual->value, kForAttribute );
  797|    116|				outputStr += '"';
  798|    116|			}
  799|    177|		}
  800|       |		
  801|       |		// --------------------------------------------------------
  802|       |		// Process the property according to the standard patterns.
  803|       |	
  804|  1.44k|		if ( hasGeneralQualifiers ) {
  ------------------
  |  Branch (804:8): [True: 18, False: 1.43k]
  ------------------
  805|       |		
  806|       |			// -------------------------------------------------------------------------------------
  807|       |			// The node has general qualifiers, ones that can't be attributes on a property element.
  808|       |			// Emit using the qualified property pseudo-struct form. The value is output by a call
  809|       |			// to SerializePrettyRDFProperty with emitAsRDFValue set.
  810|       |			
  811|       |			// *** We're losing compactness in the calls to SerializePrettyRDFProperty.
  812|       |			// *** Should refactor to have SerializeCompactRDFProperty that does one node.
  813|       |
  814|     18|			outputStr += " rdf:parseType=\"Resource\">";
  815|     18|			outputStr += newline;
  816|       |
  817|     18|			SerializePrettyRDFProperty ( propNode, outputStr, newline, indentStr, indent+1, true );
  818|       |		
  819|     18|			size_t qualNum = 0;
  820|     18|			size_t qualLim = propNode->qualifiers.size();
  821|     18|			if ( propNode->options & kXMP_PropHasLang ) ++qualNum;
  ------------------
  |  Branch (821:9): [True: 0, False: 18]
  ------------------
  822|       |			
  823|     79|			for ( ; qualNum < qualLim; ++qualNum ) {
  ------------------
  |  Branch (823:12): [True: 61, False: 18]
  ------------------
  824|     61|				const XMP_Node * currQual = propNode->qualifiers[qualNum];
  825|     61|				SerializePrettyRDFProperty ( currQual, outputStr, newline, indentStr, indent+1 );
  826|     61|			}
  827|       |			
  828|  1.43k|		} else {
  829|       |
  830|       |			// --------------------------------------------------------------------
  831|       |			// This node has only attribute qualifiers. Emit as a property element.
  832|       |			
  833|  1.43k|			if ( propForm == 0 ) {
  ------------------
  |  Branch (833:9): [True: 844, False: 586]
  ------------------
  834|       |			
  835|       |				// --------------------------
  836|       |				// This is a simple property.
  837|       |				
  838|    844|				if ( propNode->options & kXMP_PropValueIsURI ) {
  ------------------
  |  Branch (838:10): [True: 0, False: 844]
  ------------------
  839|      0|					outputStr += " rdf:resource=\"";
  840|      0|					AppendNodeValue ( outputStr, propNode->value, kForAttribute );
  841|      0|					outputStr += "\"/>";
  842|      0|					outputStr += newline;
  843|      0|					emitEndTag = false;
  844|    844|				} else if ( propNode->value.empty() ) {
  ------------------
  |  Branch (844:17): [True: 1, False: 843]
  ------------------
  845|      1|					outputStr += "/>";
  846|      1|					outputStr += newline;
  847|      1|					emitEndTag = false;
  848|    843|				} else {
  849|    843|					outputStr += '>';
  850|    843|					AppendNodeValue ( outputStr, propNode->value, kForElement );
  851|    843|					indentEndTag = false;
  852|    843|				}
  853|       |				
  854|    844|			} else if ( propForm & kXMP_PropValueIsArray ) {
  ------------------
  |  Branch (854:16): [True: 442, False: 144]
  ------------------
  855|       |
  856|       |				// -----------------
  857|       |				// This is an array.
  858|       |				
  859|    442|				outputStr += '>';
  860|    442|				outputStr += newline;
  861|    442|				EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsStartTag );
  862|       |			
  863|    442|				if ( XMP_ArrayIsAltText(propNode->options) ) NormalizeLangArray ( (XMP_Node*)propNode );
  ------------------
  |  Branch (863:10): [True: 0, False: 442]
  ------------------
  864|    442|				SerializeCompactRDFElemProps ( propNode, outputStr, newline, indentStr, indent+2 );
  865|       |
  866|    442|				EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsEndTag );
  867|       |
  868|    442|			} else {
  869|       |
  870|       |				// ----------------------
  871|       |				// This must be a struct.
  872|       |				
  873|    144|				XMP_Assert ( propForm & kXMP_PropValueIsStruct );
  ------------------
  |  |  142|    144|	#define XMP_Assert(c)	((void) 0)
  ------------------
  874|       |
  875|    144|				bool hasAttrFields = false;
  876|    144|				bool hasElemFields = false;
  877|       |			
  878|    144|				size_t field, fieldLim;
  879|    557|				for ( field = 0, fieldLim = propNode->children.size(); field != fieldLim; ++field ) {
  ------------------
  |  Branch (879:60): [True: 413, False: 144]
  ------------------
  880|    413|					XMP_Node * currField = propNode->children[field];
  881|    413|					if ( CanBeRDFAttrProp ( currField ) ) {
  ------------------
  |  Branch (881:11): [True: 413, False: 0]
  ------------------
  882|    413|						hasAttrFields = true;
  883|    413|						if ( hasElemFields ) break;	// No sense looking further.
  ------------------
  |  Branch (883:12): [True: 0, False: 413]
  ------------------
  884|    413|					} else {
  885|      0|						hasElemFields = true;
  886|      0|						if ( hasAttrFields ) break;	// No sense looking further.
  ------------------
  |  Branch (886:12): [True: 0, False: 0]
  ------------------
  887|      0|					}
  888|    413|				}
  889|       |				
  890|    144|				if ( hasRDFResourceQual && hasElemFields ) {
  ------------------
  |  Branch (890:10): [True: 0, False: 144]
  |  Branch (890:32): [True: 0, False: 0]
  ------------------
  891|      0|					XMP_Throw ( "Can't mix rdf:resource qualifier and element fields", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  892|      0|				}
  893|       |				
  894|    144|				if ( propNode->children.size() == 0 ) {
  ------------------
  |  Branch (894:10): [True: 0, False: 144]
  ------------------
  895|       |				
  896|       |					// Catch an empty struct as a special case. The case below would emit an empty
  897|       |					// XML element, which gets reparsed as a simple property with an empty value.
  898|      0|					outputStr += " rdf:parseType=\"Resource\"/>";
  899|      0|					outputStr += newline;
  900|      0|					emitEndTag = false;
  901|       |				
  902|    144|				} else if ( ! hasElemFields ) {
  ------------------
  |  Branch (902:17): [True: 144, False: 0]
  ------------------
  903|       |
  904|       |					// All fields can be attributes, use the emptyPropertyElt form.
  905|    144|					SerializeCompactRDFAttrProps ( propNode, outputStr, newline, indentStr, indent+1 );
  906|    144|					outputStr += "/>";
  907|    144|					outputStr += newline;
  908|    144|					emitEndTag = false;
  909|       |
  910|    144|				} else if ( ! hasAttrFields ) {
  ------------------
  |  Branch (910:17): [True: 0, False: 0]
  ------------------
  911|       |				
  912|       |					// All fields must be elements, use the parseTypeResourcePropertyElt form.
  913|      0|					outputStr += " rdf:parseType=\"Resource\">";
  914|      0|					outputStr += newline;
  915|      0|					SerializeCompactRDFElemProps ( propNode, outputStr, newline, indentStr, indent+1 );
  916|       |				
  917|      0|				} else {
  918|       |				
  919|       |					// Have a mix of attributes and elements, use an inner rdf:Description.
  920|      0|					outputStr += '>';
  921|      0|					outputStr += newline;
  922|      0|					for ( level = indent+1; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (922:30): [True: 0, False: 0]
  ------------------
  923|      0|					outputStr += "<rdf:Description";
  924|      0|					SerializeCompactRDFAttrProps ( propNode, outputStr, newline, indentStr, indent+2 );
  925|      0|					outputStr += ">";
  926|      0|					outputStr += newline;
  927|      0|					SerializeCompactRDFElemProps ( propNode, outputStr, newline, indentStr, indent+1 );
  928|      0|					for ( level = indent+1; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (928:30): [True: 0, False: 0]
  ------------------
  929|      0|					outputStr += kRDF_StructEnd;
  930|      0|					outputStr += newline;
  931|       |
  932|      0|				}
  933|       |
  934|    144|			}
  935|       |
  936|  1.43k|		}
  937|       |		
  938|       |		// ----------------------------------
  939|       |		// Emit the property element end tag.
  940|       |		
  941|  1.44k|		if ( emitEndTag ) {
  ------------------
  |  Branch (941:8): [True: 1.30k, False: 145]
  ------------------
  942|  1.87k|			if ( indentEndTag ) for ( level = indent; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (942:9): [True: 460, False: 843]
  |  Branch (942:46): [True: 1.41k, False: 460]
  ------------------
  943|  1.30k|			outputStr += "</";
  944|  1.30k|			outputStr += elemName;
  945|  1.30k|			outputStr += '>';
  946|  1.30k|			outputStr += newline;
  947|  1.30k|		}
  948|       |
  949|  1.44k|	}
  950|       |	
  951|    889|}	// SerializeCompactRDFElemProps
XMPMeta-Serialize.cpp:_ZL18IsRDFAttrQualifierNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
  366|    238|{
  367|       |
  368|    848|	for ( size_t i = 0; *sAttrQualifiers[i] != 0; ++i ) {
  ------------------
  |  Branch (368:22): [True: 726, False: 122]
  ------------------
  369|    726|		if ( qualName == sAttrQualifiers[i] ) return true;
  ------------------
  |  Branch (369:8): [True: 116, False: 610]
  ------------------
  370|    726|	}
  371|       |
  372|    122|	return false;
  373|       |	
  374|    238|}	// IsRDFAttrQualifier
XMPMeta-Serialize.cpp:_ZL26SerializePrettyRDFPropertyPK8XMP_NodeRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKcSB_ib:
  415|     79|{
  416|     79|	XMP_Index level;
  417|     79|	bool emitEndTag   = true;
  418|     79|	bool indentEndTag = true;
  419|       |
  420|     79|	XMP_OptionBits propForm = propNode->options & kXMP_PropCompositeMask;
  421|       |
  422|       |	// ------------------------------------------------------------------------------------------
  423|       |	// Determine the XML element name. Open the start tag with the name and attribute qualifiers.
  424|       |	
  425|     79|	XMP_StringPtr elemName = propNode->name.c_str();
  426|     79|	if ( emitAsRDFValue ) {
  ------------------
  |  Branch (426:7): [True: 18, False: 61]
  ------------------
  427|     18|		elemName= "rdf:value";
  428|     61|	} else if ( *elemName == '[' ) {
  ------------------
  |  Branch (428:14): [True: 0, False: 61]
  ------------------
  429|      0|		elemName = "rdf:li";
  430|      0|	}
  431|       |
  432|    553|	for ( level = indent; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (432:24): [True: 474, False: 79]
  ------------------
  433|     79|	outputStr += '<';
  434|     79|	outputStr += elemName;
  435|       |	
  436|     79|	#define isCompact	false
  437|     79|	bool hasGeneralQualifiers = isCompact;	// Might also become true later.
  ------------------
  |  |  436|     79|	#define isCompact	false
  ------------------
  438|     79|	bool hasRDFResourceQual   = false;
  439|       |	
  440|    140|	for ( size_t qualNum = 0, qualLim = propNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) {
  ------------------
  |  Branch (440:67): [True: 61, False: 79]
  ------------------
  441|     61|		const XMP_Node * currQual = propNode->qualifiers[qualNum];
  442|     61|		if ( ! IsRDFAttrQualifier ( currQual->name ) ) {
  ------------------
  |  Branch (442:8): [True: 61, False: 0]
  ------------------
  443|     61|			hasGeneralQualifiers = true;
  444|     61|		} else {
  445|      0|			if ( currQual->name == "rdf:resource" ) hasRDFResourceQual = true;
  ------------------
  |  Branch (445:9): [True: 0, False: 0]
  ------------------
  446|      0|			if ( ! emitAsRDFValue ) {
  ------------------
  |  Branch (446:9): [True: 0, False: 0]
  ------------------
  447|      0|				outputStr += ' ';
  448|      0|				outputStr += currQual->name;
  449|      0|				outputStr += "=\"";
  450|      0|				AppendNodeValue ( outputStr, currQual->value, kForAttribute );
  451|      0|				outputStr += '"';
  452|      0|			}
  453|      0|		}
  454|     61|	}
  455|       |	
  456|       |	// --------------------------------------------------------
  457|       |	// Process the property according to the standard patterns.
  458|       |	
  459|     79|	if ( hasGeneralQualifiers && (! emitAsRDFValue) ) {
  ------------------
  |  Branch (459:7): [True: 18, False: 61]
  |  Branch (459:31): [True: 0, False: 18]
  ------------------
  460|       |	
  461|       |		// -----------------------------------------------------------------------------------------
  462|       |		// This node has general, non-attribute, qualifiers. Emit using the qualified property form.
  463|       |		// ! The value is output by a recursive call ON THE SAME NODE with emitAsRDFValue set.
  464|       |
  465|      0|		if ( hasRDFResourceQual ) {
  ------------------
  |  Branch (465:8): [True: 0, False: 0]
  ------------------
  466|      0|			XMP_Throw ( "Can't mix rdf:resource and general qualifiers", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  467|      0|		}
  468|       |		
  469|      0|		outputStr += " rdf:parseType=\"Resource\">";
  470|      0|		outputStr += newline;
  471|       |
  472|      0|		SerializePrettyRDFProperty ( propNode, outputStr, newline, indentStr, indent+1, true );
  473|       |		
  474|      0|		for ( size_t qualNum = 0, qualLim = propNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) {
  ------------------
  |  Branch (474:68): [True: 0, False: 0]
  ------------------
  475|      0|			const XMP_Node * currQual = propNode->qualifiers[qualNum];
  476|      0|			if ( IsRDFAttrQualifier ( currQual->name ) ) continue;
  ------------------
  |  Branch (476:9): [True: 0, False: 0]
  ------------------
  477|      0|			SerializePrettyRDFProperty ( currQual, outputStr, newline, indentStr, indent+1 );
  478|      0|		}
  479|       |		
  480|     79|	} else {
  481|       |
  482|       |		// --------------------------------------------------------------------
  483|       |		// This node has no general qualifiers. Emit using an unqualified form.
  484|       |		
  485|     79|		if ( propForm == 0 ) {
  ------------------
  |  Branch (485:8): [True: 79, False: 0]
  ------------------
  486|       |		
  487|       |			// --------------------------
  488|       |			// This is a simple property.
  489|       |			
  490|     79|			if ( propNode->options & kXMP_PropValueIsURI ) {
  ------------------
  |  Branch (490:9): [True: 0, False: 79]
  ------------------
  491|      0|				outputStr += " rdf:resource=\"";
  492|      0|				AppendNodeValue ( outputStr, propNode->value, kForAttribute );
  493|      0|				outputStr += "\"/>";
  494|      0|				outputStr += newline;
  495|      0|				emitEndTag = false;
  496|     79|			} else if ( propNode->value.empty() ) {
  ------------------
  |  Branch (496:16): [True: 3, False: 76]
  ------------------
  497|      3|				outputStr += "/>";
  498|      3|				outputStr += newline;
  499|      3|				emitEndTag = false;
  500|     76|			} else {
  501|     76|				outputStr += '>';
  502|     76|				AppendNodeValue ( outputStr, propNode->value, kForElement );
  503|     76|				indentEndTag = false;
  504|     76|			}
  505|       |			
  506|     79|		} else if ( propForm & kXMP_PropValueIsArray ) {
  ------------------
  |  Branch (506:15): [True: 0, False: 0]
  ------------------
  507|       |		
  508|       |			// This is an array.
  509|      0|			outputStr += '>';
  510|      0|			outputStr += newline;
  511|      0|			EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsStartTag );
  512|      0|			if ( XMP_ArrayIsAltText(propNode->options) ) NormalizeLangArray ( (XMP_Node*)propNode );
  ------------------
  |  Branch (512:9): [True: 0, False: 0]
  ------------------
  513|      0|			for ( size_t childNum = 0, childLim = propNode->children.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (513:69): [True: 0, False: 0]
  ------------------
  514|      0|				const XMP_Node * currChild = propNode->children[childNum];
  515|      0|				SerializePrettyRDFProperty ( currChild, outputStr, newline, indentStr, indent+2 );
  516|      0|			}
  517|      0|			EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsEndTag );
  518|       |		
  519|       |		
  520|      0|		} else if ( ! hasRDFResourceQual ) {
  ------------------
  |  Branch (520:15): [True: 0, False: 0]
  ------------------
  521|       |		
  522|       |			// This is a "normal" struct, use the rdf:parseType="Resource" form.
  523|      0|			XMP_Assert ( propForm & kXMP_PropValueIsStruct );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
  524|      0|			if ( propNode->children.size() == 0 ) {
  ------------------
  |  Branch (524:9): [True: 0, False: 0]
  ------------------
  525|      0|				outputStr += " rdf:parseType=\"Resource\"/>";
  526|      0|				outputStr += newline;
  527|      0|				emitEndTag = false;
  528|      0|			} else {
  529|      0|				outputStr += " rdf:parseType=\"Resource\">";
  530|      0|				outputStr += newline;
  531|      0|				for ( size_t childNum = 0, childLim = propNode->children.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (531:70): [True: 0, False: 0]
  ------------------
  532|      0|					const XMP_Node * currChild = propNode->children[childNum];
  533|      0|					SerializePrettyRDFProperty ( currChild, outputStr, newline, indentStr, indent+1 );
  534|      0|				}
  535|      0|			}
  536|       |		
  537|      0|		} else {
  538|       |		
  539|       |			// This is a struct with an rdf:resource attribute, use the "empty property element" form.
  540|      0|			XMP_Assert ( propForm & kXMP_PropValueIsStruct );
  ------------------
  |  |  142|      0|	#define XMP_Assert(c)	((void) 0)
  ------------------
  541|      0|			for ( size_t childNum = 0, childLim = propNode->children.size(); childNum < childLim; ++childNum ) {
  ------------------
  |  Branch (541:69): [True: 0, False: 0]
  ------------------
  542|      0|				const XMP_Node * currChild = propNode->children[childNum];
  543|      0|				if ( ! CanBeRDFAttrProp ( currChild ) ) {
  ------------------
  |  Branch (543:10): [True: 0, False: 0]
  ------------------
  544|      0|					XMP_Throw ( "Can't mix rdf:resource and complex fields", kXMPErr_BadRDF );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  545|      0|				}
  546|      0|				outputStr += newline;
  547|      0|				for ( level = indent+1; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (547:29): [True: 0, False: 0]
  ------------------
  548|      0|				outputStr += ' ';
  549|      0|				outputStr += currChild->name;
  550|      0|				outputStr += "=\"";
  551|      0|				outputStr += currChild->value;
  552|      0|				outputStr += '"';
  553|      0|			}
  554|      0|			outputStr += "/>";
  555|      0|			outputStr += newline;
  556|      0|			emitEndTag = false;
  557|       |		
  558|      0|		}
  559|       |		
  560|     79|	}
  561|       |	
  562|       |	// ----------------------------------
  563|       |	// Emit the property element end tag.
  564|       |	
  565|     79|	if ( emitEndTag ) {
  ------------------
  |  Branch (565:7): [True: 76, False: 3]
  ------------------
  566|     76|		if ( indentEndTag ) for ( level = indent; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (566:8): [True: 0, False: 76]
  |  Branch (566:45): [True: 0, False: 0]
  ------------------
  567|     76|		outputStr += "</";
  568|     76|		outputStr += elemName;
  569|     76|		outputStr += '>';
  570|     76|		outputStr += newline;
  571|     76|	}
  572|       |	
  573|     79|}	// SerializePrettyRDFProperty
XMPMeta-Serialize.cpp:_ZL15EmitRDFArrayTagjRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPKcS8_iib:
  240|    884|{
  241|    884|	if ( (! isStartTag) && (arraySize == 0) ) return;
  ------------------
  |  Branch (241:7): [True: 442, False: 442]
  |  Branch (241:25): [True: 3, False: 439]
  ------------------
  242|       |	
  243|  4.40k|	for ( XMP_Index level = indent; level > 0; --level ) outputStr += indentStr;
  ------------------
  |  Branch (243:34): [True: 3.52k, False: 881]
  ------------------
  244|    881|	if ( isStartTag ) {
  ------------------
  |  Branch (244:7): [True: 442, False: 439]
  ------------------
  245|    442|		outputStr += "<rdf:";
  246|    442|	} else {
  247|    439|		outputStr += "</rdf:";
  248|    439|	}
  249|       |
  250|    881|	if ( arrayForm & kXMP_PropArrayIsAlternate ) {
  ------------------
  |  Branch (250:7): [True: 180, False: 701]
  ------------------
  251|    180|		outputStr += "Alt";
  252|    701|	} else if ( arrayForm & kXMP_PropArrayIsOrdered ) {
  ------------------
  |  Branch (252:14): [True: 589, False: 112]
  ------------------
  253|    589|		outputStr += "Seq";
  254|    589|	} else {
  255|    112|		outputStr += "Bag";
  256|    112|	}
  257|       |	
  258|    881|	if ( isStartTag && (arraySize == 0) ) outputStr += '/';
  ------------------
  |  Branch (258:7): [True: 442, False: 439]
  |  Branch (258:21): [True: 3, False: 439]
  ------------------
  259|    881|	outputStr += '>';
  260|    881|	outputStr += newline;
  261|       |
  262|    881|}	// EmitRDFArrayTag

_ZN7XMPMetaC2Ev:
  588|  2.38k|XMPMeta::XMPMeta() : clientRefs(0), prevTkVer(0), tree(XMP_Node(0,"",0)), xmlParser(0)
  589|  2.38k|{
  590|       |	// Nothing more to do, clientRefs is incremented in wrapper.
  591|       |	#if XMP_TraceCTorDTor
  592|       |		printf ( "Default construct XMPMeta @ %.8X\n", this );
  593|       |	#endif
  594|  2.38k|}	// XMPMeta
_ZN7XMPMetaD2Ev:
  599|  2.38k|{
  600|       |	#if XMP_TraceCTorDTor
  601|       |		printf ( "Destruct XMPMeta @ %.8X\n", this );
  602|       |	#endif
  603|       |
  604|  2.38k|	XMP_Assert ( this->clientRefs <= 0 );
  ------------------
  |  |  142|  2.38k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  605|  2.38k|	if ( xmlParser != 0 ) delete ( xmlParser );
  ------------------
  |  Branch (605:7): [True: 0, False: 2.38k]
  ------------------
  606|  2.38k|	xmlParser = 0;
  607|       |
  608|  2.38k|}	// ~XMPMeta
_ZN7XMPMeta10InitializeEv:
  644|      1|{
  645|       |	// Allocate and initialize static objects.
  646|       |	
  647|      1|	++sXMP_InitCount;
  648|      1|	if ( sXMP_InitCount > 1 ) return true;
  ------------------
  |  Branch (648:7): [True: 0, False: 1]
  ------------------
  649|       |	
  650|       |	#if TraceXMPCalls
  651|       |		// xmpOut = fopen ( "xmp.out", "w" );	// Coordinate with client glue in WXMP_Common.hpp
  652|       |		fprintf ( xmpOut, "XMP initializing\n" ); fflush ( xmpOut );
  653|       |	#endif
  654|       |	
  655|      1|	sExceptionMessage = new XMP_VarString();
  656|      1|	XMP_InitMutex ( &sXMPCoreLock );
  657|      1|    sOutputNS  = new XMP_VarString;
  658|      1|    sOutputStr = new XMP_VarString;
  659|       |
  660|      1|	xdefaultName = new XMP_VarString ( "x-default" );
  661|       |	
  662|      1|	sNamespaceURIToPrefixMap	= new XMP_StringMap;
  663|      1|	sNamespacePrefixToURIMap	= new XMP_StringMap;
  664|      1|	sRegisteredAliasMap			= new XMP_AliasMap;
  665|       |	
  666|      1|	InitializeUnicodeConversions();
  667|       |	
  668|       |	// Register standard namespaces and aliases.
  669|      1|	RegisterNamespace ( kXMP_NS_XML, "xml" );
  670|      1|	RegisterNamespace ( kXMP_NS_RDF, "rdf" );
  671|      1|	RegisterNamespace ( kXMP_NS_DC, "dc" );
  672|       |
  673|      1|	RegisterNamespace ( kXMP_NS_XMP, "xmp" );
  674|      1|	RegisterNamespace ( kXMP_NS_PDF, "pdf" );
  675|      1|	RegisterNamespace ( kXMP_NS_Photoshop, "photoshop" );
  676|      1|	RegisterNamespace ( kXMP_NS_PSAlbum, "album" );
  677|      1|	RegisterNamespace ( kXMP_NS_EXIF, "exif" );
  678|      1|	RegisterNamespace ( kXMP_NS_EXIF_Aux, "aux" );
  679|      1|	RegisterNamespace ( kXMP_NS_TIFF, "tiff" );
  680|      1|	RegisterNamespace ( kXMP_NS_PNG, "png" );
  681|      1|	RegisterNamespace ( kXMP_NS_JPEG, "jpeg" );
  682|      1|	RegisterNamespace ( kXMP_NS_JP2K, "jp2k" );
  683|      1|	RegisterNamespace ( kXMP_NS_CameraRaw, "crs" );
  684|      1|	RegisterNamespace ( kXMP_NS_ASF, "asf" );
  685|      1|	RegisterNamespace ( kXMP_NS_WAV, "wav" );
  686|       |
  687|      1|	RegisterNamespace ( kXMP_NS_AdobeStockPhoto, "bmsp" );
  688|      1|	RegisterNamespace ( kXMP_NS_CreatorAtom, "creatorAtom" );
  689|       |
  690|      1|	RegisterNamespace ( kXMP_NS_XMP_Rights, "xmpRights" );
  691|      1|	RegisterNamespace ( kXMP_NS_XMP_MM, "xmpMM" );
  692|      1|	RegisterNamespace ( kXMP_NS_XMP_BJ, "xmpBJ" );
  693|      1|	RegisterNamespace ( kXMP_NS_XMP_Note, "xmpNote" );
  694|       |
  695|      1|	RegisterNamespace ( kXMP_NS_DM, "xmpDM" );
  696|      1|	RegisterNamespace ( kXMP_NS_XMP_Text, "xmpT" );
  697|      1|	RegisterNamespace ( kXMP_NS_XMP_PagedFile, "xmpTPg" );
  698|      1|	RegisterNamespace ( kXMP_NS_XMP_Graphics, "xmpG" );
  699|      1|	RegisterNamespace ( kXMP_NS_XMP_Image, "xmpGImg" );
  700|       |
  701|      1|	RegisterNamespace ( kXMP_NS_XMP_Font, "stFnt" );
  702|      1|	RegisterNamespace ( kXMP_NS_XMP_Dimensions, "stDim" );
  703|      1|	RegisterNamespace ( kXMP_NS_XMP_ResourceEvent, "stEvt" );
  704|      1|	RegisterNamespace ( kXMP_NS_XMP_ResourceRef, "stRef" );
  705|      1|	RegisterNamespace ( kXMP_NS_XMP_ST_Version, "stVer" );
  706|      1|	RegisterNamespace ( kXMP_NS_XMP_ST_Job, "stJob" );
  707|      1|	RegisterNamespace ( kXMP_NS_XMP_ManifestItem, "stMfs" );
  708|       |
  709|      1|	RegisterNamespace ( kXMP_NS_XMP_IdentifierQual, "xmpidq" );
  710|       |
  711|      1|	RegisterNamespace ( kXMP_NS_IPTCCore, "Iptc4xmpCore" );
  712|      1|	RegisterNamespace ( kXMP_NS_DICOM, "DICOM" );
  713|       |
  714|      1|	RegisterNamespace ( kXMP_NS_PDFA_Schema, "pdfaSchema" );
  715|      1|	RegisterNamespace ( kXMP_NS_PDFA_Property, "pdfaProperty" );
  716|      1|	RegisterNamespace ( kXMP_NS_PDFA_Type, "pdfaType" );
  717|      1|	RegisterNamespace ( kXMP_NS_PDFA_Field, "pdfaField" );
  718|      1|	RegisterNamespace ( kXMP_NS_PDFA_ID, "pdfaid" );
  719|      1|	RegisterNamespace ( kXMP_NS_PDFA_Extension, "pdfaExtension" );
  720|       |
  721|      1|	RegisterNamespace ( kXMP_NS_PDFX, "pdfx" );
  722|      1|	RegisterNamespace ( kXMP_NS_PDFX_ID, "pdfxid" );
  723|       |	
  724|      1|	RegisterNamespace ( "adobe:ns:meta/", "x" );
  725|      1|	RegisterNamespace ( "http://ns.adobe.com/iX/1.0/", "iX" );
  726|       |
  727|       |// 06-Oct-07, ahu: Do not use aliases. They result in unexpected behaviour.
  728|       |//	XMPMeta::RegisterStandardAliases ( "" );
  729|       |	
  730|       |	// Initialize the other core classes.
  731|       |	
  732|      1|	if ( ! XMPIterator::Initialize() ) XMP_Throw ( "Failure from XMPIterator::Initialize", kXMPErr_InternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (732:7): [True: 0, False: 1]
  ------------------
  733|      1|	if ( ! XMPUtils::Initialize() ) XMP_Throw ( "Failure from XMPUtils::Initialize", kXMPErr_InternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (733:7): [True: 0, False: 1]
  ------------------
  734|       |	// Do miscelaneous semantic checks of types and arithmetic.
  735|       |
  736|      1|	XMP_Assert ( sizeof(XMP_Int8) == 1 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  737|      1|	XMP_Assert ( sizeof(XMP_Int16) == 2 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  738|      1|	XMP_Assert ( sizeof(XMP_Int32) == 4 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  739|      1|	XMP_Assert ( sizeof(XMP_Int64) == 8 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  740|      1|	XMP_Assert ( sizeof(XMP_Uns8) == 1 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  741|      1|	XMP_Assert ( sizeof(XMP_Uns16) == 2 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  742|      1|	XMP_Assert ( sizeof(XMP_Uns32) == 4 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  743|      1|	XMP_Assert ( sizeof(XMP_Uns64) == 8 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  744|       |	
  745|      1|	XMP_Assert ( sizeof(XMP_OptionBits) == 4 );	// Check that option masking work on all 32 bits.
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  746|      1|	XMP_OptionBits flag = ~0;
  747|       |
  748|      1|	XMP_Assert ( flag == (XMP_OptionBits)(-1L) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  749|      1|	XMP_Assert ( (flag ^ kXMP_PropHasLang) == 0xFFFFFFBFUL );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  750|      1|	XMP_Assert ( (flag & ~kXMP_PropHasLang) == 0xFFFFFFBFUL );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  751|       |	
  752|      1|	XMP_OptionBits opt1 = 0;	// Check the general option bit macros.
  753|      1|	XMP_OptionBits opt2 = flag;
  754|      1|	XMP_SetOption ( opt1, kXMP_PropValueIsArray );
  755|      1|	XMP_ClearOption ( opt2, kXMP_PropValueIsArray );
  756|      1|	XMP_Assert ( opt1 == ~opt2 );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  757|      1|	XMP_Assert ( XMP_TestOption ( opt1, kXMP_PropValueIsArray ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  758|      1|	XMP_Assert ( ! XMP_TestOption ( opt2, kXMP_PropValueIsArray ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  759|       |	
  760|      1|	XMP_Assert ( XMP_PropIsSimple ( ~kXMP_PropCompositeMask ) );	// Check the special option bit macros.
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  761|      1|	XMP_Assert ( ! XMP_PropIsSimple ( kXMP_PropValueIsStruct ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  762|      1|	XMP_Assert ( ! XMP_PropIsSimple ( kXMP_PropValueIsArray ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  763|       |
  764|      1|	XMP_Assert ( XMP_PropIsStruct ( kXMP_PropValueIsStruct ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  765|      1|	XMP_Assert ( XMP_PropIsArray  ( kXMP_PropValueIsArray ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  766|      1|	XMP_Assert ( ! XMP_PropIsStruct ( ~kXMP_PropValueIsStruct ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  767|      1|	XMP_Assert ( ! XMP_PropIsArray  ( ~kXMP_PropValueIsArray ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  768|       |	
  769|      1|	XMP_Assert ( XMP_ArrayIsUnordered ( ~kXMP_PropArrayIsOrdered ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  770|      1|	XMP_Assert ( XMP_ArrayIsOrdered   ( kXMP_PropArrayIsOrdered ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  771|      1|	XMP_Assert ( XMP_ArrayIsAlternate ( kXMP_PropArrayIsAlternate ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  772|      1|	XMP_Assert ( XMP_ArrayIsAltText   ( kXMP_PropArrayIsAltText ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  773|      1|	XMP_Assert ( ! XMP_ArrayIsUnordered ( kXMP_PropArrayIsOrdered ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  774|      1|	XMP_Assert ( ! XMP_ArrayIsOrdered   ( ~kXMP_PropArrayIsOrdered ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  775|      1|	XMP_Assert ( ! XMP_ArrayIsAlternate ( ~kXMP_PropArrayIsAlternate ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  776|      1|	XMP_Assert ( ! XMP_ArrayIsAltText   ( ~kXMP_PropArrayIsAltText ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  777|       |	
  778|      1|	XMP_Assert ( XMP_PropHasQualifiers ( kXMP_PropHasQualifiers ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  779|      1|	XMP_Assert ( XMP_PropIsQualifier   ( kXMP_PropIsQualifier ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  780|      1|	XMP_Assert ( XMP_PropHasLang       ( kXMP_PropHasLang ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  781|      1|	XMP_Assert ( ! XMP_PropHasQualifiers ( ~kXMP_PropHasQualifiers ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  782|      1|	XMP_Assert ( ! XMP_PropIsQualifier   ( ~kXMP_PropIsQualifier ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  783|      1|	XMP_Assert ( ! XMP_PropHasLang       ( ~kXMP_PropHasLang ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  784|       |	
  785|      1|	XMP_Assert ( XMP_NodeIsSchema ( kXMP_SchemaNode ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  786|      1|	XMP_Assert ( XMP_PropIsAlias  ( kXMP_PropIsAlias ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  787|      1|	XMP_Assert ( ! XMP_NodeIsSchema ( ~kXMP_SchemaNode ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  788|      1|	XMP_Assert ( ! XMP_PropIsAlias  ( ~kXMP_PropIsAlias ) );
  ------------------
  |  |  142|      1|	#define XMP_Assert(c)	((void) 0)
  ------------------
  789|       |	
  790|       |	#if 0	// Generally off, enable to hand check generated code.
  791|       |		extern XMP_OptionBits opt3, opt4;
  792|       |		if ( XMP_TestOption ( opt3, kXMP_PropValueIsArray ) ) opt4 = opt3;
  793|       |		if ( ! XMP_TestOption ( opt3, kXMP_PropValueIsStruct ) ) opt4 = opt3;
  794|       |		static bool ok1 = XMP_TestOption ( opt4, kXMP_PropValueIsArray );
  795|       |		static bool ok2 = ! XMP_TestOption ( opt4, kXMP_PropValueIsStruct );
  796|       |	#endif
  797|       |	
  798|       |	// Make sure the embedded info strings are referenced and kept.
  799|      1|	if ( (kXMPCore_EmbeddedVersion[0] == 0) || (kXMPCore_EmbeddedCopyright[0] == 0) ) return false;
  ------------------
  |  Branch (799:7): [True: 0, False: 1]
  |  Branch (799:45): [True: 0, False: 1]
  ------------------
  800|      1|	return true;
  801|       |
  802|      1|}	// Initialize
_ZN7XMPMeta9TerminateEv:
  813|      1|{
  814|      1|	--sXMP_InitCount;
  815|      1|	if ( sXMP_InitCount > 0 ) return;
  ------------------
  |  Branch (815:7): [True: 0, False: 1]
  ------------------
  816|       |
  817|       |	#if TraceXMPCalls
  818|       |		fprintf ( xmpOut, "XMP terminating\n" ); fflush ( xmpOut );
  819|       |		// fclose ( xmpOut );	// Coordinate with fopen in XMPMeta::Initialize.
  820|       |	#endif
  821|       |	
  822|      1|	XMPIterator::Terminate();
  823|      1|	XMPUtils::Terminate();
  824|      1|	EliminateGlobal ( sNamespaceURIToPrefixMap );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  825|      1|	EliminateGlobal ( sNamespacePrefixToURIMap );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  826|      1|	EliminateGlobal ( sRegisteredAliasMap );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  827|       |    
  828|      1|    EliminateGlobal ( xdefaultName );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  829|      1|    EliminateGlobal ( sOutputNS );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  830|      1|    EliminateGlobal ( sOutputStr );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  831|      1|	EliminateGlobal ( sExceptionMessage );
  ------------------
  |  |  809|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  832|       |
  833|      1|	XMP_TermMutex ( sXMPCoreLock );
  834|       |	
  835|      1|}	// Terminate
_ZN7XMPMeta6UnlockEj:
  844|  27.4k|{
  845|  27.4k|	UNUSED(options);
  846|       |
  847|       |    #if TraceXMPLocking
  848|       |    	fprintf ( xmpOut, "  Unlocking XMP toolkit, count = %d\n", sLockCount ); fflush ( xmpOut );
  849|       |	#endif
  850|  27.4k|    --sLockCount;
  851|  27.4k|    XMP_Assert ( sLockCount == 0 );
  ------------------
  |  |  142|  27.4k|	#define XMP_Assert(c)	((void) 0)
  ------------------
  852|  27.4k|	XMP_ExitCriticalRegion ( sXMPCoreLock );
  853|       |
  854|  27.4k|}	// Unlock
_ZNK7XMPMeta12UnlockObjectEj:
  863|    182|{
  864|    182|	UNUSED(options);
  865|       |
  866|    182|	XMPMeta::Unlock ( 0 );
  867|       |
  868|    182|}	// UnlockObject
_ZN7XMPMeta17RegisterNamespaceEPKcS1_:
 1041|  7.35k|{
 1042|  7.35k|	if ( (*namespaceURI == 0) || (*prefix == 0) ) {
  ------------------
  |  Branch (1042:7): [True: 0, False: 7.35k]
  |  Branch (1042:31): [True: 0, False: 7.35k]
  ------------------
 1043|      0|		XMP_Throw ( "Empty namespace URI or prefix", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1044|      0|	}
 1045|       |	
 1046|  7.35k|	XMP_VarString	nsURI ( namespaceURI );
 1047|  7.35k|	XMP_VarString	prfix ( prefix );
 1048|  7.35k|	if ( prfix[prfix.size()-1] != ':' ) prfix += ':';
  ------------------
  |  Branch (1048:7): [True: 7.35k, False: 0]
  ------------------
 1049|  7.35k|	VerifySimpleXMLName ( prefix, prefix+prfix.size()-1 );	// Exclude the colon.
 1050|       |	
 1051|       |        // Set the new namespace in both maps.
 1052|  7.35k|        (*sNamespaceURIToPrefixMap)[nsURI] = prfix;
 1053|  7.35k|        (*sNamespacePrefixToURIMap)[prfix] = nsURI;
 1054|       |	
 1055|  7.35k|}	// RegisterNamespace
_ZN7XMPMeta18GetNamespacePrefixEPKcPS1_Pj:
 1066|  38.9k|{
 1067|  38.9k|	bool	found	= false;
 1068|       |	
 1069|  38.9k|	XMP_Assert ( *namespaceURI != 0 ); 	// ! Enforced by wrapper.
  ------------------
  |  |  142|  38.9k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1070|  38.9k|	XMP_Assert ( (namespacePrefix != 0) && (prefixSize != 0) );	// ! Enforced by wrapper.
  ------------------
  |  |  142|  38.9k|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1071|       |
 1072|  38.9k|	XMP_VarString    nsURI ( namespaceURI );
 1073|  38.9k|	XMP_StringMapPos uriPos	= sNamespaceURIToPrefixMap->find ( nsURI );
 1074|       |	
 1075|  38.9k|	if ( uriPos != sNamespaceURIToPrefixMap->end() ) {
  ------------------
  |  Branch (1075:7): [True: 38.9k, False: 3]
  ------------------
 1076|  38.9k|		*namespacePrefix = uriPos->second.c_str();
 1077|  38.9k|		*prefixSize = uriPos->second.size();
 1078|  38.9k|		found = true;
 1079|  38.9k|	}
 1080|       |	
 1081|  38.9k|	return found;
 1082|       |	
 1083|  38.9k|}	// GetNamespacePrefix
_ZN7XMPMeta15DeleteNamespaceEPKc:
 1126|     25|{
 1127|     25|	XMP_StringMapPos uriPos = sNamespaceURIToPrefixMap->find ( namespaceURI );
 1128|     25|	if ( uriPos == sNamespaceURIToPrefixMap->end() ) return;
  ------------------
  |  Branch (1128:7): [True: 3, False: 22]
  ------------------
 1129|       |
 1130|     22|	XMP_StringMapPos prefixPos = sNamespacePrefixToURIMap->find ( uriPos->second );
 1131|     22|	if ( prefixPos == sNamespacePrefixToURIMap->end() ) return;
  ------------------
  |  Branch (1131:7): [True: 0, False: 22]
  ------------------
 1132|       |	
 1133|     22|	sNamespaceURIToPrefixMap->erase ( uriPos );
 1134|     22|	sNamespacePrefixToURIMap->erase ( prefixPos );
 1135|       |
 1136|     22|}	// DeleteNamespace
_ZNK7XMPMeta15CountArrayItemsEPKcS1_:
 1510|    835|{
 1511|    835|	XMP_Assert ( (schemaNS != 0) && (arrayName != 0) );	// Enforced by wrapper.
  ------------------
  |  |  142|    835|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1512|       |
 1513|    835|	XMP_ExpandedXPath	expPath;
 1514|    835|	ExpandXPath ( schemaNS, arrayName, &expPath );
 1515|       |	
 1516|    835|	const XMP_Node * arrayNode = FindConstNode ( &tree, expPath );
  ------------------
  |  |  301|    835|#define FindConstNode(t,p)		FindNode ( const_cast<XMP_Node*>(t), p, kXMP_ExistingOnly, 0 )
  |  |  ------------------
  |  |  |  |  296|    835|#define kXMP_ExistingOnly	false
  |  |  ------------------
  ------------------
 1517|       |
 1518|    835|	if ( arrayNode == 0 ) return 0;
  ------------------
  |  Branch (1518:7): [True: 0, False: 835]
  ------------------
 1519|    835|	if ( ! (arrayNode->options & kXMP_PropValueIsArray) ) XMP_Throw ( "The named property is not an array", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1519:7): [True: 0, False: 835]
  ------------------
 1520|    835|	return arrayNode->children.size();
 1521|       |	
 1522|    835|}	// CountArrayItems

_ZN8XMPUtils10InitializeEv:
  640|      1|{
  641|      1|	sComposedPath	= new XMP_VarString();
  642|      1|	sConvertedValue = new XMP_VarString();
  643|      1|	sBase64Str		= new XMP_VarString();
  644|      1|	sCatenatedItems = new XMP_VarString();
  645|      1|	sStandardXMP    = new XMP_VarString();
  646|      1|	sExtendedXMP    = new XMP_VarString();
  647|      1|	sExtendedDigest = new XMP_VarString();
  648|       |
  649|       |	#if XMP_MacBuild && __MWERKS__
  650|       |		LookupTimeProcs();
  651|       |	#endif
  652|       |
  653|      1|	return true;
  654|       |
  655|      1|}	// Initialize
_ZN8XMPUtils9TerminateEv:
  666|      1|{
  667|      1|	EliminateGlobal ( sComposedPath );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  668|      1|	EliminateGlobal ( sConvertedValue );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  669|      1|	EliminateGlobal ( sBase64Str );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  670|      1|	EliminateGlobal ( sCatenatedItems );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  671|      1|	EliminateGlobal ( sStandardXMP );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  672|      1|	EliminateGlobal ( sExtendedXMP );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  673|      1|	EliminateGlobal ( sExtendedDigest );
  ------------------
  |  |  662|      1|#define EliminateGlobal(g) delete ( g ); g = 0
  ------------------
  674|       |
  675|      1|	return;
  676|       |
  677|      1|}	// Terminate
_ZN8XMPUtils20ComposeQualifierPathEPKcS1_S1_S1_PS1_Pj:
  790|     66|{
  791|     66|	XMP_Assert ( (schemaNS != 0) && (qualNS != 0) );		// Enforced by wrapper.
  ------------------
  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  ------------------
  792|     66|	XMP_Assert ( (*propName != 0) && (*qualName != 0) );	// Enforced by wrapper.
  ------------------
  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  ------------------
  793|     66|	XMP_Assert ( (fullPath != 0) && (pathSize != 0) );		// Enforced by wrapper.
  ------------------
  |  |  142|     66|	#define XMP_Assert(c)	((void) 0)
  ------------------
  794|       |
  795|     66|	XMP_ExpandedXPath expPath;	// Just for side effects to check namespace and basic path.
  796|     66|	ExpandXPath ( schemaNS, propName, &expPath );
  797|       |
  798|     66|	XMP_ExpandedXPath qualPath;
  799|     66|	ExpandXPath ( qualNS, qualName, &qualPath );
  800|     66|	if ( qualPath.size() != 2 ) XMP_Throw ( "The qualifier name must be simple", kXMPErr_BadXPath );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (800:7): [True: 0, False: 66]
  ------------------
  801|       |
  802|     66|	XMP_StringLen reserveLen = strlen(propName) + qualPath[kRootPropStep].step.size() + 2;
  803|       |
  804|     66|	sComposedPath->erase();
  805|     66|	sComposedPath->reserve ( reserveLen );
  806|     66|	*sComposedPath = propName;
  807|     66|	*sComposedPath += "/?";
  808|     66|	*sComposedPath += qualPath[kRootPropStep].step;
  809|       |
  810|     66|	*fullPath = sComposedPath->c_str();
  811|     66|	*pathSize = sComposedPath->size();
  812|       |
  813|     66|}	// ComposeQualifierPath
_ZN8XMPUtils13ConvertToDateEPKcP12XMP_DateTime:
 1293|    148|{
 1294|    148|	if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue);
  ------------------
  |  |  199|      1|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1294:7): [True: 0, False: 148]
  |  Branch (1294:26): [True: 1, False: 147]
  ------------------
 1295|       |
 1296|    147|	size_t	 pos = 0;
 1297|    147|	XMP_Int32 temp;
 1298|       |
 1299|    147|	XMP_Assert ( sizeof(*binValue) == sizeof(XMP_DateTime) );
  ------------------
  |  |  142|    147|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1300|    147|	(void) memset ( binValue, 0, sizeof(*binValue) );	// AUDIT: Safe, using sizeof destination.
 1301|       |
 1302|    147|	bool timeOnly = ( (strValue[0] == 'T') ||
  ------------------
  |  Branch (1302:20): [True: 67, False: 80]
  ------------------
 1303|     80|					  ((strlen(strValue) >= 2) && (strValue[1] == ':')) ||
  ------------------
  |  Branch (1303:9): [True: 79, False: 1]
  |  Branch (1303:36): [True: 16, False: 63]
  ------------------
 1304|     64|					  ((strlen(strValue) >= 3) && (strValue[2] == ':')) );
  ------------------
  |  Branch (1304:9): [True: 61, False: 3]
  |  Branch (1304:36): [True: 1, False: 60]
  ------------------
 1305|       |
 1306|    147|	if ( ! timeOnly ) {
  ------------------
  |  Branch (1306:7): [True: 63, False: 84]
  ------------------
 1307|       |
 1308|     63|		if ( strValue[0] == '-' ) pos = 1;
  ------------------
  |  Branch (1308:8): [True: 35, False: 28]
  ------------------
 1309|       |
 1310|     63|		temp = GatherInt ( strValue, &pos, "Invalid year in date string" ); // Extract the year.
 1311|     63|		if ( (strValue[pos] != 0) && (strValue[pos] != '-') ) XMP_Throw ( "Invalid date string, after year", kXMPErr_BadParam );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1311:8): [True: 41, False: 22]
  |  Branch (1311:32): [True: 3, False: 38]
  ------------------
 1312|     60|		if ( strValue[0] == '-' ) temp = -temp;
  ------------------
  |  Branch (1312:8): [True: 30, False: 30]
  ------------------
 1313|     60|		binValue->year = temp;
 1314|     60|		if ( strValue[pos] == 0 ) return;
  ------------------
  |  Branch (1314:8): [True: 14, False: 46]
  ------------------
 1315|       |
 1316|     46|		++pos;
 1317|     46|		temp = GatherInt ( strValue, &pos, "Invalid month in date string" );	// Extract the month.
 1318|     46|		if ( (temp < 1) || (temp > 12) ) XMP_Throw ( "Month is out of range", kXMPErr_BadParam );
  ------------------
  |  |  199|      6|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1318:8): [True: 15, False: 31]
  |  Branch (1318:22): [True: 5, False: 26]
  ------------------
 1319|     40|		if ( (strValue[pos] != 0) && (strValue[pos] != '-') ) XMP_Throw ( "Invalid date string, after month", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1319:8): [True: 15, False: 25]
  |  Branch (1319:32): [True: 0, False: 15]
  ------------------
 1320|     40|		binValue->month = temp;
 1321|     40|		if ( strValue[pos] == 0 ) return;
  ------------------
  |  Branch (1321:8): [True: 11, False: 29]
  ------------------
 1322|       |
 1323|     29|		++pos;
 1324|     29|		temp = GatherInt ( strValue, &pos, "Invalid day in date string" );	// Extract the day.
 1325|     29|		if ( (temp < 1) || (temp > 31) ) XMP_Throw ( "Day is out of range", kXMPErr_BadParam );
  ------------------
  |  |  199|      5|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1325:8): [True: 18, False: 11]
  |  Branch (1325:22): [True: 4, False: 7]
  ------------------
 1326|     24|		if ( (strValue[pos] != 0) && (strValue[pos] != 'T') ) XMP_Throw ( "Invalid date string, after day", kXMPErr_BadParam );
  ------------------
  |  |  199|      1|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1326:8): [True: 2, False: 22]
  |  Branch (1326:32): [True: 1, False: 1]
  ------------------
 1327|     23|		binValue->day = temp;
 1328|     23|		if ( strValue[pos] == 0 ) return;
  ------------------
  |  Branch (1328:8): [True: 5, False: 18]
  ------------------
 1329|       |
 1330|       |		// Allow year, month, and day to all be zero; implies the date portion is missing.
 1331|     18|		if ( (binValue->year != 0) || (binValue->month != 0) || (binValue->day != 0) ) {
  ------------------
  |  Branch (1331:8): [True: 18, False: 0]
  |  Branch (1331:33): [True: 0, False: 0]
  |  Branch (1331:59): [True: 0, False: 0]
  ------------------
 1332|       |			// Temporary fix for bug 1269463, silently fix out of range month or day.
 1333|       |			// if ( (binValue->month < 1) || (binValue->month > 12) ) XMP_Throw ( "Month is out of range", kXMPErr_BadParam );
 1334|       |			// if ( (binValue->day < 1) || (binValue->day > 31) ) XMP_Throw ( "Day is out of range", kXMPErr_BadParam );
 1335|      1|			if ( binValue->month < 1 ) binValue->month = 1;
  ------------------
  |  Branch (1335:9): [True: 0, False: 1]
  ------------------
 1336|      1|			if ( binValue->month > 12 ) binValue->month = 12;
  ------------------
  |  Branch (1336:9): [True: 0, False: 1]
  ------------------
 1337|      1|			if ( binValue->day < 1 ) binValue->day = 1;
  ------------------
  |  Branch (1337:9): [True: 0, False: 1]
  ------------------
 1338|      1|			if ( binValue->day > 31 ) binValue->day = 31;
  ------------------
  |  Branch (1338:9): [True: 0, False: 1]
  ------------------
 1339|      1|		}
 1340|       |
 1341|     18|	}
 1342|       |
 1343|    102|	if ( strValue[pos] == 'T' ) {
  ------------------
  |  Branch (1343:7): [True: 68, False: 34]
  ------------------
 1344|     68|		++pos;
 1345|     68|	} else if ( ! timeOnly ) {
  ------------------
  |  Branch (1345:14): [True: 0, False: 34]
  ------------------
 1346|      0|		XMP_Throw ( "Invalid date string, missing 'T' after date", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1347|      0|	}
 1348|       |
 1349|    102|	temp = GatherInt ( strValue, &pos, "Invalid hour in date string" ); // Extract the hour.
 1350|    102|	if ( strValue[pos] != ':' ) XMP_Throw ( "Invalid date string, after hour", kXMPErr_BadParam );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1350:7): [True: 3, False: 99]
  ------------------
 1351|     99|	if ( temp < 0 || temp > 23 ) temp = 23;	// *** 1269463: XMP_Throw ( "Hour is out of range", kXMPErr_BadParam );
  ------------------
  |  Branch (1351:7): [True: 22, False: 77]
  |  Branch (1351:19): [True: 50, False: 27]
  ------------------
 1352|     99|	binValue->hour = temp;
 1353|       |	// Don't check for done, we have to work up to the time zone.
 1354|       |
 1355|     99|	++pos;
 1356|     99|	temp = GatherInt ( strValue, &pos, "Invalid minute in date string" );	// And the minute.
 1357|     99|	if ( (strValue[pos] != ':') && (strValue[pos] != 'Z') &&
  ------------------
  |  Branch (1357:7): [True: 30, False: 69]
  |  Branch (1357:33): [True: 27, False: 3]
  ------------------
 1358|     96|		 (strValue[pos] != '+') && (strValue[pos] != '-') && (strValue[pos] != 0) ) XMP_Throw ( "Invalid date string, after minute", kXMPErr_BadParam );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1358:4): [True: 17, False: 10]
  |  Branch (1358:30): [True: 11, False: 6]
  |  Branch (1358:56): [True: 3, False: 8]
  ------------------
 1359|     96|	if ( temp < 0 || temp > 59 ) temp = 59;	// *** 1269463: XMP_Throw ( "Minute is out of range", kXMPErr_BadParam );
  ------------------
  |  Branch (1359:7): [True: 26, False: 70]
  |  Branch (1359:19): [True: 42, False: 28]
  ------------------
 1360|     96|	binValue->minute = temp;
 1361|       |	// Don't check for done, we have to work up to the time zone.
 1362|       |
 1363|     96|	if ( strValue[pos] == ':' ) {
  ------------------
  |  Branch (1363:7): [True: 43, False: 53]
  ------------------
 1364|       |
 1365|     43|		++pos;
 1366|     43|		temp = GatherInt ( strValue, &pos, "Invalid whole seconds in date string" );	// Extract the whole seconds.
 1367|     43|		if ( (strValue[pos] != '.') && (strValue[pos] != 'Z') &&
  ------------------
  |  Branch (1367:8): [True: 12, False: 31]
  |  Branch (1367:34): [True: 11, False: 1]
  ------------------
 1368|     11|			 (strValue[pos] != '+') && (strValue[pos] != '-') && (strValue[pos] != 0) ) {
  ------------------
  |  Branch (1368:5): [True: 10, False: 1]
  |  Branch (1368:31): [True: 7, False: 3]
  |  Branch (1368:57): [True: 3, False: 4]
  ------------------
 1369|      3|			XMP_Throw ( "Invalid date string, after whole seconds", kXMPErr_BadParam );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1370|      0|		}
 1371|     40|		if ( temp < 0 || temp > 59 ) temp = 59;	// *** 1269463: XMP_Throw ( "Whole second is out of range", kXMPErr_BadParam );
  ------------------
  |  Branch (1371:8): [True: 5, False: 35]
  |  Branch (1371:20): [True: 6, False: 29]
  ------------------
 1372|     40|		binValue->second = temp;
 1373|       |		// Don't check for done, we have to work up to the time zone.
 1374|       |
 1375|     40|		if ( strValue[pos] == '.' ) {
  ------------------
  |  Branch (1375:8): [True: 26, False: 14]
  ------------------
 1376|       |
 1377|     26|			++pos;
 1378|     26|			size_t digits = pos;	// Will be the number of digits later.
 1379|       |
 1380|     26|			temp = GatherInt ( strValue, &pos, "Invalid fractional seconds in date string" );	// Extract the fractional seconds.
 1381|     26|			if ( (strValue[pos] != 'Z') && (strValue[pos] != '+') && (strValue[pos] != '-') && (strValue[pos] != 0) ) {
  ------------------
  |  Branch (1381:9): [True: 22, False: 4]
  |  Branch (1381:35): [True: 19, False: 3]
  |  Branch (1381:61): [True: 15, False: 4]
  |  Branch (1381:87): [True: 2, False: 13]
  ------------------
 1382|      2|				XMP_Throw ( "Invalid date string, after fractional second", kXMPErr_BadParam );
  ------------------
  |  |  199|      2|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1383|      0|			}
 1384|       |
 1385|     24|			digits = pos - digits;
 1386|    493|			for ( ; digits > 9; --digits ) temp = temp / 10;
  ------------------
  |  Branch (1386:12): [True: 469, False: 24]
  ------------------
 1387|     54|			for ( ; digits < 9; ++digits ) temp = temp * 10;
  ------------------
  |  Branch (1387:12): [True: 30, False: 24]
  ------------------
 1388|       |
 1389|     24|			if ( temp < 0 || temp >= 1000*1000*1000 ) XMP_Throw ( "Fractional second is out of range", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1389:9): [True: 3, False: 21]
  |  Branch (1389:21): [True: 0, False: 21]
  ------------------
 1390|     24|			binValue->nanoSecond = temp;
 1391|       |			// Don't check for done, we have to work up to the time zone.
 1392|       |
 1393|     24|		}
 1394|       |
 1395|     40|	}
 1396|       |
 1397|     91|	if ( strValue[pos] == 'Z' ) {
  ------------------
  |  Branch (1397:7): [True: 5, False: 86]
  ------------------
 1398|       |
 1399|      5|		++pos;
 1400|       |
 1401|     86|	} else if ( strValue[pos] != 0 ) {
  ------------------
  |  Branch (1401:14): [True: 27, False: 59]
  ------------------
 1402|       |
 1403|     27|		if ( strValue[pos] == '+' ) {
  ------------------
  |  Branch (1403:8): [True: 14, False: 13]
  ------------------
 1404|     14|			binValue->tzSign = kXMP_TimeEastOfUTC;
 1405|     14|		} else if ( strValue[pos] == '-' ) {
  ------------------
  |  Branch (1405:15): [True: 13, False: 0]
  ------------------
 1406|     13|			binValue->tzSign = kXMP_TimeWestOfUTC;
 1407|     13|		} else {
 1408|      0|			XMP_Throw ( "Time zone must begin with 'Z', '+', or '-'", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1409|      0|		}
 1410|       |
 1411|     27|		++pos;
 1412|     27|		temp = GatherInt ( strValue, &pos, "Invalid time zone hour in date string" );	// Extract the time zone hour.
 1413|     27|		if ( strValue[pos] != ':' ) XMP_Throw ( "Invalid date string, after time zone hour", kXMPErr_BadParam );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1413:8): [True: 3, False: 24]
  ------------------
 1414|     24|		if ( temp < 0 || temp > 23 ) XMP_Throw ( "Time zone hour is out of range", kXMPErr_BadParam );
  ------------------
  |  |  199|      1|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1414:8): [True: 5, False: 19]
  |  Branch (1414:20): [True: 1, False: 18]
  ------------------
 1415|     23|		binValue->tzHour = temp;
 1416|       |
 1417|     23|		++pos;
 1418|     23|		temp = GatherInt ( strValue, &pos, "Invalid time zone minute in date string" ); // Extract the time zone minute.
 1419|     23|		if ( temp < 0 || temp > 59 ) XMP_Throw ( "Time zone minute is out of range", kXMPErr_BadParam );
  ------------------
  |  |  199|      3|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1419:8): [True: 8, False: 15]
  |  Branch (1419:20): [True: 3, False: 12]
  ------------------
 1420|     20|		binValue->tzMinute = temp;
 1421|       |
 1422|     59|	} else {
 1423|       |
 1424|     59|		XMPUtils::SetTimeZone( binValue );
 1425|       |
 1426|     59|	}
 1427|       |
 1428|     84|	if ( strValue[pos] != 0 ) XMP_Throw ( "Invalid date string, extra chars at end", kXMPErr_BadParam );
  ------------------
  |  |  199|     12|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1428:7): [True: 12, False: 72]
  ------------------
 1429|       |
 1430|     72|}	// ConvertToDate
_ZN8XMPUtils11SetTimeZoneEP12XMP_DateTime:
 1946|     85|{
 1947|     85|	XMP_Assert ( xmpTime != 0 );	// ! Enforced by wrapper.
  ------------------
  |  |  142|     85|	#define XMP_Assert(c)	((void) 0)
  ------------------
 1948|       |
 1949|     85|	if ( (xmpTime->tzSign != 0) || (xmpTime->tzHour != 0) || (xmpTime->tzMinute != 0) ) {
  ------------------
  |  Branch (1949:7): [True: 0, False: 85]
  |  Branch (1949:33): [True: 0, False: 85]
  |  Branch (1949:59): [True: 0, False: 85]
  ------------------
 1950|      0|		XMP_Throw ( "SetTimeZone can only be used on \"zoneless\" times", kXMPErr_BadParam );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1951|      0|	}
 1952|       |
 1953|       |	// Create ansi_tt form of the input time. Need the ansi_tm form to make the ansi_tt form.
 1954|       |
 1955|     85|	ansi_tt ttTime;
 1956|     85|	ansi_tm tmLocal, tmUTC;
 1957|       |
 1958|     85|	if ( (xmpTime->year == 0) && (xmpTime->month == 0) && (xmpTime->day == 0) ) {
  ------------------
  |  Branch (1958:7): [True: 55, False: 30]
  |  Branch (1958:31): [True: 52, False: 3]
  |  Branch (1958:56): [True: 52, False: 0]
  ------------------
 1959|     52|		ansi_tt now = ansi_time(0);
  ------------------
  |  |   69|     52|	#define ansi_time		time
  ------------------
 1960|     52|		if ( now == -1 ) XMP_Throw ( "Failure from ANSI C time function", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1960:8): [True: 0, False: 52]
  ------------------
 1961|     52|		ansi_localtime ( &now, &tmLocal );
  ------------------
  |  |   74|     52|	#define ansi_localtime	localtime_r
  ------------------
 1962|     52|	} else {
 1963|     33|		if (xmpTime->year < std::numeric_limits<decltype(tmLocal.tm_year)>::min() + 1900) {
  ------------------
  |  Branch (1963:7): [True: 0, False: 33]
  ------------------
 1964|      0|			XMP_Throw ( "Invalid year", kXMPErr_BadParam);
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1965|     33|		} else if (xmpTime->year > std::numeric_limits<decltype(tmLocal.tm_year)>::max()) {
  ------------------
  |  Branch (1965:14): [True: 0, False: 33]
  ------------------
 1966|      0|			XMP_Throw ( "Invalid year", kXMPErr_BadParam);
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
 1967|     33|		} else {
 1968|     33|			tmLocal.tm_year = xmpTime->year - 1900;
 1969|     33|		}
 1970|     33|		tmLocal.tm_mon	 = xmpTime->month - 1;
 1971|     33|		tmLocal.tm_mday	 = xmpTime->day;
 1972|     33|	}
 1973|       |
 1974|     85|	tmLocal.tm_hour = xmpTime->hour;
 1975|     85|	tmLocal.tm_min = xmpTime->minute;
 1976|     85|	tmLocal.tm_sec = xmpTime->second;
 1977|     85|	tmLocal.tm_isdst = -1;	// Don't know if daylight time is in effect.
 1978|       |
 1979|     85|	ttTime = ansi_mktime ( &tmLocal );
  ------------------
  |  |   70|     85|	#define ansi_mktime		mktime
  ------------------
 1980|     85|	if ( ttTime == -1 ) XMP_Throw ( "Failure from ANSI C mktime function", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (1980:7): [True: 0, False: 85]
  ------------------
 1981|       |
 1982|       |	// Convert back to a localized ansi_tm time and get the corresponding UTC ansi_tm time.
 1983|       |
 1984|     85|	ansi_localtime ( &ttTime, &tmLocal );
  ------------------
  |  |   74|     85|	#define ansi_localtime	localtime_r
  ------------------
 1985|     85|	ansi_gmtime ( &ttTime, &tmUTC );
  ------------------
  |  |   73|     85|	#define ansi_gmtime		gmtime_r
  ------------------
 1986|       |
 1987|       |	// Get the offset direction and amount.
 1988|       |
 1989|     85|	ansi_tm tmx = tmLocal;	// ! Note that mktime updates the ansi_tm parameter, messing up difftime!
 1990|     85|	ansi_tm tmy = tmUTC;
 1991|     85|	tmx.tm_isdst = tmy.tm_isdst = 0;
 1992|     85|	ansi_tt ttx = ansi_mktime ( &tmx );
  ------------------
  |  |   70|     85|	#define ansi_mktime		mktime
  ------------------
 1993|     85|	ansi_tt tty = ansi_mktime ( &tmy );
  ------------------
  |  |   70|     85|	#define ansi_mktime		mktime
  ------------------
 1994|     85|	double diffSecs;
 1995|       |
 1996|     85|	if ( (ttx != -1) && (tty != -1) ) {
  ------------------
  |  Branch (1996:7): [True: 85, False: 0]
  |  Branch (1996:22): [True: 85, False: 0]
  ------------------
 1997|     85|		diffSecs = ansi_difftime ( ttx, tty );
  ------------------
  |  |   71|     85|	#define ansi_difftime	difftime
  ------------------
 1998|     85|	} else {
 1999|       |		#if XMP_MacBuild
 2000|       |			// Looks like Apple's mktime is buggy - see W1140533. But the offset is visible.
 2001|       |			diffSecs = tmLocal.tm_gmtoff;
 2002|       |		#else
 2003|       |			// Win and UNIX don't have a visible offset. Make sure we know about the failure,
 2004|       |			// then try using the current date/time as a close fallback.
 2005|      0|			ttTime = ansi_time(0);
  ------------------
  |  |   69|      0|	#define ansi_time		time
  ------------------
 2006|      0|			if ( ttTime == -1 ) XMP_Throw ( "Failure from ANSI C time function", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (2006:9): [True: 0, False: 0]
  ------------------
 2007|      0|			ansi_localtime ( &ttTime, &tmx );
  ------------------
  |  |   74|      0|	#define ansi_localtime	localtime_r
  ------------------
 2008|      0|			ansi_gmtime ( &ttTime, &tmy );
  ------------------
  |  |   73|      0|	#define ansi_gmtime		gmtime_r
  ------------------
 2009|      0|			tmx.tm_isdst = tmy.tm_isdst = 0;
 2010|      0|			ttx = ansi_mktime ( &tmx );
  ------------------
  |  |   70|      0|	#define ansi_mktime		mktime
  ------------------
 2011|      0|			tty = ansi_mktime ( &tmy );
  ------------------
  |  |   70|      0|	#define ansi_mktime		mktime
  ------------------
 2012|      0|			if ( (ttx == -1) || (tty == -1) ) XMP_Throw ( "Failure from ANSI C mktime function", kXMPErr_ExternalFailure );
  ------------------
  |  |  199|      0|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (2012:9): [True: 0, False: 0]
  |  Branch (2012:24): [True: 0, False: 0]
  ------------------
 2013|      0|			diffSecs = ansi_difftime ( ttx, tty );
  ------------------
  |  |   71|      0|	#define ansi_difftime	difftime
  ------------------
 2014|      0|		#endif
 2015|      0|	}
 2016|       |
 2017|     85|	if ( diffSecs > 0.0 ) {
  ------------------
  |  Branch (2017:7): [True: 0, False: 85]
  ------------------
 2018|      0|		xmpTime->tzSign = kXMP_TimeEastOfUTC;
 2019|     85|	} else if ( diffSecs == 0.0 ) {
  ------------------
  |  Branch (2019:14): [True: 85, False: 0]
  ------------------
 2020|     85|		xmpTime->tzSign = kXMP_TimeIsUTC;
 2021|     85|	} else {
 2022|      0|		xmpTime->tzSign = kXMP_TimeWestOfUTC;
 2023|      0|		diffSecs = -diffSecs;
 2024|      0|	}
 2025|     85|	xmpTime->tzHour = XMP_Int32 ( diffSecs / 3600.0 );
 2026|     85|	xmpTime->tzMinute = XMP_Int32 ( (diffSecs / 60.0) - (xmpTime->tzHour * 60.0) );
 2027|       |
 2028|       |	// *** Save the tm_isdst flag in a qualifier?
 2029|       |
 2030|     85|	XMP_Assert ( (0 <= xmpTime->tzHour) && (xmpTime->tzHour <= 23) );
  ------------------
  |  |  142|     85|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2031|     85|	XMP_Assert ( (0 <= xmpTime->tzMinute) && (xmpTime->tzMinute <= 59) );
  ------------------
  |  |  142|     85|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2032|     85|	XMP_Assert ( (-1 <= xmpTime->tzSign) && (xmpTime->tzSign <= +1) );
  ------------------
  |  |  142|     85|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2033|     85|	XMP_Assert ( (xmpTime->tzSign == 0) ? ((xmpTime->tzHour == 0) && (xmpTime->tzMinute == 0)) :
  ------------------
  |  |  142|     85|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2034|     85|										  ((xmpTime->tzHour != 0) || (xmpTime->tzMinute != 0)) );
 2035|       |
 2036|     85|}	// SetTimeZone
_ZN8XMPUtils16ConvertToUTCTimeEP12XMP_DateTime:
 2045|     60|{
 2046|     60|	XMP_Assert ( time != 0 );	// ! Enforced by wrapper.
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2047|       |
 2048|     60|	XMP_Assert ( (0 <= time->tzHour) && (time->tzHour <= 23) );
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2049|     60|	XMP_Assert ( (0 <= time->tzMinute) && (time->tzMinute <= 59) );
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2050|     60|	XMP_Assert ( (-1 <= time->tzSign) && (time->tzSign <= +1) );
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2051|     60|	XMP_Assert ( (time->tzSign == 0) ? ((time->tzHour == 0) && (time->tzMinute == 0)) :
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2052|     60|									   ((time->tzHour != 0) || (time->tzMinute != 0)) );
 2053|       |
 2054|     60|	if ( time->tzSign == kXMP_TimeEastOfUTC ) {
  ------------------
  |  Branch (2054:7): [True: 3, False: 57]
  ------------------
 2055|       |		// We are before (east of) GMT, subtract the offset from the time.
 2056|      3|		time->hour -= time->tzHour;
 2057|      3|		time->minute -= time->tzMinute;
 2058|     57|	} else if ( time->tzSign == kXMP_TimeWestOfUTC ) {
  ------------------
  |  Branch (2058:14): [True: 2, False: 55]
  ------------------
 2059|       |		// We are behind (west of) GMT, add the offset to the time.
 2060|      2|		time->hour += time->tzHour;
 2061|      2|		time->minute += time->tzMinute;
 2062|      2|	}
 2063|       |
 2064|     60|	AdjustTimeOverflow ( time );
 2065|     60|	time->tzSign = time->tzHour = time->tzMinute = 0;
 2066|       |
 2067|     60|}	// ConvertToUTCTime
_ZN8XMPUtils18ConvertToLocalTimeEP12XMP_DateTime:
 2076|     60|{
 2077|     60|	XMP_Assert ( time != 0 );	// ! Enforced by wrapper.
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2078|       |
 2079|     60|	XMP_Assert ( (0 <= time->tzHour) && (time->tzHour <= 23) );
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2080|     60|	XMP_Assert ( (0 <= time->tzMinute) && (time->tzMinute <= 59) );
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2081|     60|	XMP_Assert ( (-1 <= time->tzSign) && (time->tzSign <= +1) );
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2082|     60|	XMP_Assert ( (time->tzSign == 0) ? ((time->tzHour == 0) && (time->tzMinute == 0)) :
  ------------------
  |  |  142|     60|	#define XMP_Assert(c)	((void) 0)
  ------------------
 2083|     60|									   ((time->tzHour != 0) || (time->tzMinute != 0)) );
 2084|       |
 2085|     60|	ConvertToUTCTime ( time );	// The existing time zone might not be the local one.
 2086|     60|	SetTimeZone ( time );		// Fill in the local timezone offset, then adjust the time.
 2087|       |
 2088|     60|	if ( time->tzSign > 0 ) {
  ------------------
  |  Branch (2088:7): [True: 0, False: 60]
  ------------------
 2089|       |		// We are before (east of) GMT, add the offset to the time.
 2090|      0|		time->hour += time->tzHour;
 2091|      0|		time->minute += time->tzMinute;
 2092|     60|	} else if ( time->tzSign < 0 ) {
  ------------------
  |  Branch (2092:14): [True: 0, False: 60]
  ------------------
 2093|       |		// We are behind (west of) GMT, subtract the offset from the time.
 2094|      0|		time->hour -= time->tzHour;
 2095|      0|		time->minute -= time->tzMinute;
 2096|      0|	}
 2097|       |
 2098|     60|	AdjustTimeOverflow ( time );
 2099|       |
 2100|     60|}	// ConvertToLocalTime
XMPUtils.cpp:_ZL9GatherIntPKcPmS0_:
  368|    392|{
  369|    392|	size_t	 pos   = *_pos;
  370|    392|	XMP_Int32 value = 0;
  371|       |
  372|       |	// Limits for overflow checking. Assuming that the maximum value of XMP_Int32
  373|       |	// is 2147483647, then tens_upperbound == 214748364 and ones_upperbound == 7.
  374|       |	// Most of the time, we can just check that value < tens_upperbound to confirm
  375|       |	// that the calculation won't overflow, which makes the bounds checking more
  376|       |	// efficient for the common case.
  377|    392|	const XMP_Int32 tens_upperbound = std::numeric_limits<XMP_Int32>::max() / 10;
  378|    392|	const XMP_Int32 ones_upperbound = std::numeric_limits<XMP_Int32>::max() % 10;
  379|       |
  380|  3.66k|	for ( char ch = strValue[pos]; ('0' <= ch) && (ch <= '9'); ++pos, ch = strValue[pos] ) {
  ------------------
  |  Branch (380:33): [True: 3.46k, False: 198]
  |  Branch (380:48): [True: 3.29k, False: 172]
  ------------------
  381|  3.29k|		const XMP_Int32 digit = ch - '0';
  382|  3.29k|		if (value >= tens_upperbound) {
  ------------------
  |  Branch (382:7): [True: 42, False: 3.25k]
  ------------------
  383|     42|			if (value > tens_upperbound || digit > ones_upperbound) {
  ------------------
  |  Branch (383:8): [True: 18, False: 24]
  |  Branch (383:35): [True: 4, False: 20]
  ------------------
  384|     22|				XMP_Throw ( errMsg, kXMPErr_BadParam );
  ------------------
  |  |  199|     22|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  385|      0|			}
  386|     42|		}
  387|  3.27k|		value = (value * 10) + digit;
  388|  3.27k|	}
  389|       |
  390|    370|	if ( pos == *_pos ) XMP_Throw ( errMsg, kXMPErr_BadParam );
  ------------------
  |  |  199|     20|#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
  ------------------
  |  Branch (390:7): [True: 20, False: 350]
  ------------------
  391|    350|	*_pos = pos;
  392|    350|	return value;
  393|       |
  394|    370|}	// GatherInt
XMPUtils.cpp:_ZL18AdjustTimeOverflowP12XMP_DateTime:
  214|    120|{
  215|    120|	enum { kBillion = 1000*1000*1000L };
  216|       |
  217|       |	// ----------------------------------------------------------------------------------------------
  218|       |	// To be safe against pathalogical overflow we first adjust from month to second, then from
  219|       |	// nanosecond back up to month. This leaves each value closer to zero before propagating into it.
  220|       |	// For example if the hour and minute are both near max, adjusting minutes first can cause the
  221|       |	// hour to overflow.
  222|       |
  223|       |	// ! Photoshop 8 creates "time only" values with zeros for year, month, and day.
  224|       |
  225|    120|	if ( (time->year != 0) || (time->month != 0) || (time->day != 0) ) {
  ------------------
  |  Branch (225:7): [True: 57, False: 63]
  |  Branch (225:28): [True: 5, False: 58]
  |  Branch (225:50): [True: 0, False: 58]
  ------------------
  226|       |
  227|     75|		while ( time->month < 1 ) {
  ------------------
  |  Branch (227:11): [True: 13, False: 62]
  ------------------
  228|     13|			time->year -= 1;
  229|     13|			time->month += 12;
  230|     13|		}
  231|       |
  232|     62|		while ( time->month > 12 ) {
  ------------------
  |  Branch (232:11): [True: 0, False: 62]
  ------------------
  233|      0|			time->year += 1;
  234|      0|			time->month -= 12;
  235|      0|		}
  236|       |
  237|     86|		while ( time->day < 1 ) {
  ------------------
  |  Branch (237:11): [True: 24, False: 62]
  ------------------
  238|     24|			time->month -= 1;
  239|     24|			if ( time->month < 1 ) {	// ! Keep the months in range for indexing daysInMonth!
  ------------------
  |  Branch (239:9): [True: 2, False: 22]
  ------------------
  240|      2|				time->year -= 1;
  241|      2|				time->month += 12;
  242|      2|			}
  243|     24|			time->day += DaysInMonth ( time->year, time->month );	// ! Decrement month before so index here is right!
  244|     24|		}
  245|       |
  246|     66|		while ( time->day > DaysInMonth ( time->year, time->month ) ) {
  ------------------
  |  Branch (246:11): [True: 4, False: 62]
  ------------------
  247|      4|			time->day -= DaysInMonth ( time->year, time->month );	// ! Increment month after so index here is right!
  248|      4|			time->month += 1;
  249|      4|			if ( time->month > 12 ) {
  ------------------
  |  Branch (249:9): [True: 0, False: 4]
  ------------------
  250|      0|				time->year += 1;
  251|      0|				time->month -= 12;
  252|      0|			}
  253|      4|		}
  254|       |
  255|     62|	}
  256|       |
  257|    121|	while ( time->hour < 0 ) {
  ------------------
  |  Branch (257:10): [True: 1, False: 120]
  ------------------
  258|      1|		time->day -= 1;
  259|      1|		time->hour += 24;
  260|      1|	}
  261|       |
  262|    121|	while ( time->hour >= 24 ) {
  ------------------
  |  Branch (262:10): [True: 1, False: 120]
  ------------------
  263|      1|		time->day += 1;
  264|      1|		time->hour -= 24;
  265|      1|	}
  266|       |
  267|    123|	while ( time->minute < 0 ) {
  ------------------
  |  Branch (267:10): [True: 3, False: 120]
  ------------------
  268|      3|		time->hour -= 1;
  269|      3|		time->minute += 60;
  270|      3|	}
  271|       |
  272|    122|	while ( time->minute >= 60 ) {
  ------------------
  |  Branch (272:10): [True: 2, False: 120]
  ------------------
  273|      2|		time->hour += 1;
  274|      2|		time->minute -= 60;
  275|      2|	}
  276|       |
  277|    120|	while ( time->second < 0 ) {
  ------------------
  |  Branch (277:10): [True: 0, False: 120]
  ------------------
  278|      0|		time->minute -= 1;
  279|      0|		time->second += 60;
  280|      0|	}
  281|       |
  282|    120|	while ( time->second >= 60 ) {
  ------------------
  |  Branch (282:10): [True: 0, False: 120]
  ------------------
  283|      0|		time->minute += 1;
  284|      0|		time->second -= 60;
  285|      0|	}
  286|       |
  287|    120|	while ( time->nanoSecond < 0 ) {
  ------------------
  |  Branch (287:10): [True: 0, False: 120]
  ------------------
  288|      0|		time->second -= 1;
  289|      0|		time->nanoSecond += kBillion;
  290|      0|	}
  291|       |
  292|    120|	while ( time->nanoSecond >= kBillion ) {
  ------------------
  |  Branch (292:10): [True: 0, False: 120]
  ------------------
  293|      0|		time->second += 1;
  294|      0|		time->nanoSecond -= kBillion;
  295|      0|	}
  296|       |
  297|    120|	while ( time->second < 0 ) {
  ------------------
  |  Branch (297:10): [True: 0, False: 120]
  ------------------
  298|      0|		time->minute -= 1;
  299|      0|		time->second += 60;
  300|      0|	}
  301|       |
  302|    120|	while ( time->second >= 60 ) {
  ------------------
  |  Branch (302:10): [True: 0, False: 120]
  ------------------
  303|      0|		time->minute += 1;
  304|      0|		time->second -= 60;
  305|      0|	}
  306|       |
  307|    120|	while ( time->minute < 0 ) {
  ------------------
  |  Branch (307:10): [True: 0, False: 120]
  ------------------
  308|      0|		time->hour -= 1;
  309|      0|		time->minute += 60;
  310|      0|	}
  311|       |
  312|    120|	while ( time->minute >= 60 ) {
  ------------------
  |  Branch (312:10): [True: 0, False: 120]
  ------------------
  313|      0|		time->hour += 1;
  314|      0|		time->minute -= 60;
  315|      0|	}
  316|       |
  317|    121|	while ( time->hour < 0 ) {
  ------------------
  |  Branch (317:10): [True: 1, False: 120]
  ------------------
  318|      1|		time->day -= 1;
  319|      1|		time->hour += 24;
  320|      1|	}
  321|       |
  322|    121|	while ( time->hour >= 24 ) {
  ------------------
  |  Branch (322:10): [True: 1, False: 120]
  ------------------
  323|      1|		time->day += 1;
  324|      1|		time->hour -= 24;
  325|      1|	}
  326|       |
  327|    120|	if ( (time->year != 0) || (time->month != 0) || (time->day != 0) ) {
  ------------------
  |  Branch (327:7): [True: 56, False: 64]
  |  Branch (327:28): [True: 6, False: 58]
  |  Branch (327:50): [True: 4, False: 54]
  ------------------
  328|       |
  329|     70|		while ( time->month < 1 ) { // Make sure the months are OK first, for DaysInMonth.
  ------------------
  |  Branch (329:11): [True: 4, False: 66]
  ------------------
  330|      4|			time->year -= 1;
  331|      4|			time->month += 12;
  332|      4|		}
  333|       |
  334|     66|		while ( time->month > 12 ) {
  ------------------
  |  Branch (334:11): [True: 0, False: 66]
  ------------------
  335|      0|			time->year += 1;
  336|      0|			time->month -= 12;
  337|      0|		}
  338|       |
  339|     68|		while ( time->day < 1 ) {
  ------------------
  |  Branch (339:11): [True: 2, False: 66]
  ------------------
  340|      2|			time->month -= 1;
  341|      2|			if ( time->month < 1 ) {
  ------------------
  |  Branch (341:9): [True: 0, False: 2]
  ------------------
  342|      0|				time->year -= 1;
  343|      0|				time->month += 12;
  344|      0|			}
  345|      2|			time->day += DaysInMonth ( time->year, time->month );
  346|      2|		}
  347|       |
  348|     66|		while ( time->day > DaysInMonth ( time->year, time->month ) ) {
  ------------------
  |  Branch (348:11): [True: 0, False: 66]
  ------------------
  349|      0|			time->day -= DaysInMonth ( time->year, time->month );
  350|      0|			time->month += 1;
  351|      0|			if ( time->month > 12 ) {
  ------------------
  |  Branch (351:9): [True: 0, False: 0]
  ------------------
  352|      0|				time->year += 1;
  353|      0|				time->month -= 12;
  354|      0|			}
  355|      0|		}
  356|       |
  357|     66|	}
  358|       |
  359|    120|}	// AdjustTimeOverflow
XMPUtils.cpp:_ZL11DaysInMonthii:
  195|    162|{
  196|       |
  197|    162|	static short	daysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  198|       |									   // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
  199|       |
  200|    162|	int days = daysInMonth [ month ];
  201|    162|	if ( (month == 2) && IsLeapYear ( year ) ) days += 1;
  ------------------
  |  Branch (201:7): [True: 57, False: 105]
  |  Branch (201:23): [True: 28, False: 29]
  ------------------
  202|       |
  203|    162|	return days;
  204|       |
  205|    162|}	// DaysInMonth
XMPUtils.cpp:_ZL10IsLeapYearl:
  176|     57|{
  177|       |	// This code uses the Gregorian calendar algorithm:
  178|       |	// https://en.wikipedia.org/wiki/Leap_year#Algorithm
  179|       |
  180|     57|	if ( (year % 4) != 0 ) return false;	// Not a multiple of 4.
  ------------------
  |  Branch (180:7): [True: 22, False: 35]
  ------------------
  181|     35|	if ( (year % 100) != 0 ) return true;	// A multiple of 4 but not a multiple of 100.
  ------------------
  |  Branch (181:7): [True: 17, False: 18]
  ------------------
  182|     18|	if ( (year % 400) == 0 ) return true;	// A multiple of 400.
  ------------------
  |  Branch (182:7): [True: 11, False: 7]
  ------------------
  183|       |
  184|      7|	return false;							// A multiple of 100 but not a multiple of 400.
  185|       |
  186|     18|}	// IsLeapYear

