code: private static DecoderResult createDecoderResultFromAmbiguousValues(int ecLevel,
                                                                        int[] codewords,
                                                                        int[] erasureArray,
                                                                        int[] ambiguousIndexes,
                                                                        int[][] ambiguousIndexValues)
        throws FormatException, ChecksumException {
      int[] ambiguousIndexCount = new int[ambiguousIndexes.length];
  
      int tries = 100;
      while (tries-- > 0) {
        for (int i = 0; i < ambiguousIndexCount.length; i++) {
          codewords[ambiguousIndexes[i]] = ambiguousIndexValues[i][ambiguousIndexCount[i]];
        }
        try {
          return decodeCodewords(codewords, ecLevel, erasureArray);
        } catch (ChecksumException ignored) {
          //
        }
        if (ambiguousIndexCount.length == 0) {
          throw ChecksumException.getChecksumInstance();
        }
        for (int i = 0; i < ambiguousIndexCount.length; i++) {
          if (ambiguousIndexCount[i] < ambiguousIndexValues[i].length - 1) {
            ambiguousIndexCount[i]++;
            break;
          } else {
            ambiguousIndexCount[i] = 0;
            if (i == ambiguousIndexCount.length - 1) {
              throw ChecksumException.getChecksumInstance();
            }
          }
        }
      }
      throw ChecksumException.getChecksumInstance();
    }
docs: This method deals with the fact, that the decoding process doesn't always yield a single most likely value. The
  current error correction implementation doesn't deal with erasures very well, so it's better to provide a value
  for these ambiguous codewords instead of treating it as an erasure. The problem is that we don't know which of
  the ambiguous values to choose. We try decode using the first value, and if that fails, we use another of the
  ambiguous values and try to decode again. This usually only happens on very hard to read and decode barcodes,
  so decoding the normal barcodes is not affected by this.
  
  @param erasureArray contains the indexes of erasures
  @param ambiguousIndexes array with the indexes that have more than one most likely value
  @param ambiguousIndexValues two dimensional array that contains the ambiguous values. The first dimension must
  be the same length as the ambiguousIndexes array